diff options
author | marha <marha@users.sourceforge.net> | 2011-01-19 10:14:56 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-01-19 10:14:56 +0000 |
commit | e75ba771a1b0e80ef8413d368213a942455a7e2e (patch) | |
tree | eda0e3b99b6ef7da7474c3b5aad38eb322372d22 | |
parent | 36c829ccf632f2f3adc6d13313406d6383b33993 (diff) | |
parent | 6e3cfc5bc8ca969856e4d56dec01870df709d75a (diff) | |
download | vcxsrv-e75ba771a1b0e80ef8413d368213a942455a7e2e.tar.gz vcxsrv-e75ba771a1b0e80ef8413d368213a942455a7e2e.tar.bz2 vcxsrv-e75ba771a1b0e80ef8413d368213a942455a7e2e.zip |
svn merge ^/branches/released .
450 files changed, 98988 insertions, 0 deletions
diff --git a/fontconfig/.gitignore b/fontconfig/.gitignore new file mode 100644 index 000000000..4c336d2a3 --- /dev/null +++ b/fontconfig/.gitignore @@ -0,0 +1,96 @@ +tags +TAGS +*.tar.gz +.libs +.deps +*.o +*.lo +*.la +*~ +*.orig +*.rej +ChangeLog +ChangeLog-* +Makefile +Makefile.in +aclocal.m4 +autom4te.cache +config.guess +config.h +config.h.in +config.log +config.status +config.sub +configure +depcomp +fontconfig-zip +fontconfig.pc +fontconfig.spec +fonts.conf +install-sh +doltcompile +libtool +ltmain.sh +missing +stamp-h1 +manpage.log +doc/*.3 +doc/confdir.sgml +doc/edit-sgml +doc/fcatomic.sgml +doc/fcblanks.sgml +doc/fccache.sgml +doc/fccharset.sgml +doc/fcconfig.sgml +doc/fcconstant.sgml +doc/fcdircache.sgml +doc/fcfile.sgml +doc/fcformat.sgml +doc/fcfontset.sgml +doc/fcfreetype.sgml +doc/fclangset.sgml +doc/fcinit.sgml +doc/fcmatrix.sgml +doc/fcobjectset.sgml +doc/fcobjecttype.sgml +doc/fcpattern.sgml +doc/fcstring.sgml +doc/fcstrset.sgml +doc/fcvalue.sgml +doc/fontconfig-devel.pdf +doc/fontconfig-devel.txt +doc/fontconfig-devel +doc/fontconfig-user.html +doc/fontconfig-user.pdf +doc/fontconfig-user.txt +doc/fonts-conf.5 +doc/func.refs +doc/local-fontconfig-devel.sgml +doc/local-fontconfig-user.sgml +doc/version.sgml +doc/devel-man +fc-arch/fc-arch +fc-arch/fcarch.h +fc-cache/fc-cache +fc-cache/fc-cache.1 +fc-case/fc-case +fc-case/fccase.h +fc-cat/fc-cat +fc-cat/fc-cat.1 +fc-glyphname/fc-glyphname +fc-glyphname/fcglyphname.h +fc-lang/fc-lang +fc-lang/fclang.h +fc-list/fc-list +fc-list/fc-list.1 +fc-match/fc-match +fc-match/fc-match.1 +fc-query/fc-query +fc-query/fc-query.1 +fc-scan/fc-scan +fc-scan/fc-scan.1 +src/fontconfig.def +fcalias.h +fcaliastail.h +src/fcftalias.h +src/fcftaliastail.h diff --git a/fontconfig/AUTHORS b/fontconfig/AUTHORS new file mode 100644 index 000000000..5ef888548 --- /dev/null +++ b/fontconfig/AUTHORS @@ -0,0 +1,3 @@ +Keith Packard <keithp@keithp.com> +Patrick Lam <plam@mit.edu> + diff --git a/fontconfig/COPYING b/fontconfig/COPYING new file mode 100644 index 000000000..d68372289 --- /dev/null +++ b/fontconfig/COPYING @@ -0,0 +1,22 @@ +fontconfig/COPYING + +Copyright © 2001,2003 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/fontconfig/INSTALL b/fontconfig/INSTALL new file mode 100644 index 000000000..0017eed40 --- /dev/null +++ b/fontconfig/INSTALL @@ -0,0 +1,37 @@ +Fontconfig is built with the traditional configure script: + + $ ./configure --sysconfdir=/etc --prefix=/usr --mandir=/usr/share/man + +This should generate valid Makefiles, then: + + $ make + $ make install + +If you're going to package fontconfig for release, there are several +important steps: + + 1. Create new version + sh new-version.sh 2.xx.xx + + 2. rebuild the configuration files with autogen.sh + sh autogen.sh --sysconfdir=/etc --prefix=/usr --mandir=/usr/share/man --localstatedir=/var + + 3. make distcheck (NB: won't work without docbook-utils -PL) + + 4. Copy ChangeLog-2.x.y and fontconfig-2.x.y.tar.gz to + + freedesktop.org:/srv/fontconfig.freedesktop.org/www/release + + 5. Update the Fontconfig Devel wiki page + http://fontconfig.org/wiki/Devel + + 6. Update the fontconfig documentation + + scp -rp doc/fontconfig-user.html doc/fontconfig-devel fontconfig.org:/srv/fontconfig.freedesktop.org/www + + 7. Compute md5sums for release files: + md5sum fontconfig-2.4.x.tar.gz ChangeLog-2.4.x + + 8. Post a note to fontconfig@fontconfig.org. Include the md5sums. + gpg sign the message. + diff --git a/fontconfig/Makefile.am b/fontconfig/Makefile.am new file mode 100644 index 000000000..e08857e59 --- /dev/null +++ b/fontconfig/Makefile.am @@ -0,0 +1,141 @@ +# +# fontconfig/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOCSRC=@DOCSRC@ +SUBDIRS=fontconfig fc-case fc-lang fc-glyphname fc-arch src \ + fc-cache fc-cat fc-list fc-match fc-query fc-scan conf.d $(DOCSRC) test + +EXTRA_DIST = \ + fontconfig.pc.in \ + fonts.conf.in \ + fonts.dtd \ + fontconfig.spec.in \ + fontconfig.spec \ + fontconfig-zip.in +CLEANFILES = fonts.conf +DISTCLEANFILES = config.cache doltcompile +MAINTAINERCLEANFILES = \ + $(srcdir)/aclocal.m4 \ + $(srcdir)/autoscan.log \ + $(srcdir)/compile \ + $(srcdir)/config.guess \ + $(srcdir)/config.h.in \ + $(srcdir)/config.sub \ + $(srcdir)/configure.scan \ + $(srcdir)/depcomp \ + $(srcdir)/install-sh \ + $(srcdir)/ltmain.sh \ + $(srcdir)/missing \ + $(srcdir)/mkinstalldirs \ + `find "$(srcdir)" -type f -name Makefile.in -print` + +pkgconfigdir=$(libdir)/pkgconfig +pkgconfig_DATA = fontconfig.pc + +configdir=$(CONFDIR) +config_DATA=fonts.dtd + +if CROSS_COMPILING + RUN_FC_CACHE_TEST=false +else + RUN_FC_CACHE_TEST=test -z "$(DESTDIR)" +endif + +# Creating ChangeLog from git log: + +MAINTAINERCLEANFILES += $(srcdir)/ChangeLog +EXTRA_DIST += ChangeLog +ChangeLog: $(srcdir)/ChangeLog +$(srcdir)/ChangeLog: + if test -d "$(srcdir)/.git"; then \ + (GIT_DIR=$(top_srcdir)/.git ./missing --run git log --stat) | fmt --split-only > $@.tmp \ + && mv -f $@.tmp $@ \ + || ($(RM) $@.tmp; \ + echo Failed to generate ChangeLog, your ChangeLog may be outdated >&2; \ + (test -f $@ || echo git-log is required to generate this file >> $@)); \ + else \ + test -f $@ || \ + (echo A git checkout and git-log is required to generate ChangeLog >&2 && \ + echo A git checkout and git-log is required to generate this file >> $@); \ + fi + +.PHONY: ChangeLog + +fonts.conf: fonts.conf.in Makefile + sed \ + -e 's,@FC_CACHEDIR\@,$(FC_CACHEDIR),g' \ + -e 's,@FC_DEFAULT_FONTS\@,$(FC_DEFAULT_FONTS),g' \ + -e 's,@FC_FONTPATH\@,$(FC_FONTPATH),g' \ + -e 's,@PACKAGE\@,$(PACKAGE),g' \ + -e 's,@VERSION\@,$(VERSION),g' \ + $< > $@.tmp && \ + mv $@.tmp $@ + +install-data-local: fonts.conf + $(mkinstalldirs) $(DESTDIR)$(configdir) $(DESTDIR)$(fc_cachedir) + if [ -f $(DESTDIR)$(configdir)/fonts.conf ]; then \ + echo "backing up existing $(DESTDIR)$(configdir)/fonts.conf"; \ + mv $(DESTDIR)$(configdir)/fonts.conf $(DESTDIR)$(configdir)/fonts.conf.bak; \ + fi + if [ -f $(srcdir)/fonts.conf ]; then \ + echo " $(INSTALL_DATA) $(srcdir)/fonts.conf $(DESTDIR)$(configdir)/fonts.conf"; \ + $(INSTALL_DATA) $(srcdir)/fonts.conf $(DESTDIR)$(configdir)/fonts.conf; \ + else if [ -f fonts.conf ]; then \ + echo " $(INSTALL_DATA) fonts.conf $(DESTDIR)$(configdir)/fonts.conf"; \ + $(INSTALL_DATA) fonts.conf $(DESTDIR)$(configdir)/fonts.conf; \ + fi; fi + @(if $(RUN_FC_CACHE_TEST); then \ + echo " $(bindir)/fc-cache -s -f -v"; \ + $(bindir)/fc-cache -s -f -v; \ + else \ + echo "***"; \ + echo "*** Warning: fonts.cache not built"; \ + echo "***"; \ + echo "*** Generate this file manually on host system using fc-cache"; \ + echo "***"; \ + fi) + +uninstall-local: + if [ -f $(srcdir)/fonts.conf ]; then \ + if cmp -s $(srcdir)/fonts.conf $(DESTDIR)$(configdir)/fonts.conf; then \ + echo " uninstall standard $(DESTDIR)$(configdir)/fonts.conf"; \ + rm -f $(DESTDIR)$(configdir)/fonts.conf; \ + fi; \ + else if [ -f fonts.conf ]; then \ + if cmp -s fonts.conf $(DESTDIR)$(configdir)/fonts.conf; then \ + echo " uninstall standard $(DESTDIR)$(configdir)/fonts.conf"; \ + rm -f $(DESTDIR)$(configdir)/fonts.conf; \ + fi; \ + fi; fi + +debuild debuild-signed: debuild-dirs + (cd $(distdir)/debian && debuild) + +debuild-unsigned: debuild-dirs + (cd $(distdir)/debian && debuild -us -uc) + +debuild-dirs: distdir + rm -f $(PACKAGE)_$(VERSION).orig.tar.gz + rm -rf $(distdir).orig + cp -a $(distdir) $(distdir).orig + rm -rf $(distdir).orig/debian diff --git a/fontconfig/NEWS b/fontconfig/NEWS new file mode 100644 index 000000000..e69de29bb --- /dev/null +++ b/fontconfig/NEWS diff --git a/fontconfig/README b/fontconfig/README new file mode 100644 index 000000000..adbaf3679 --- /dev/null +++ b/fontconfig/README @@ -0,0 +1,929 @@ + Fontconfig + Font configuration and customization library + Version 2.8 + 2009-11-18 + + +Check INSTALL for compilation and installation instructions. +Report bugs to https://bugs.freedesktop.org in the fontconfig module. + +2.8 + +Behdad Esfahbod (24): + Clarify default confdir and cachedir better. + Move FcAlign to fcint.h + [fc-arch] Add FcAlign to arch signature + [int] Define MIN/MAX/ABS macros + Bump cache version up from 2 to 3 and fix FcLangSet caching/crash + Remove unused macros + [int] Remove fc_storage_type() in favor of direct access to v->type + [int] Remove fc_value_* macros that did nothing other than renaming + Enable automake silent rules + [int] Remove more unused macros + [xml] Remove unused code + [arch] Try to ensure proper FcLangSet alignment in arch + [lang] Fix serializing LangSet from older versions + Make sure fclang.h and fcarch.h are built + Remove bogus comment + [fc-glyphname] Cleanup Makefile.am + [src] Create fcglyphname.h automatically + [fc-glyphname] Rename internal arrays to prefix with _fc_ + Clean up Makefile's a bit + [fc-glyphname] Remove Adobe glyphlist + [fc-case] Update CaseFolding.txt to Unicode 5.2.0 + [fc-arch] Beautify the arch template + [fc-arch] Rename architecture names to better reflect what they are + Bump libtool revision in preparation for release + +2.7.3 + +Behdad Esfahbod (2): + Use default config in FcFileScan() and FcDirScan() + Bump libtool version in preparation for release + +Roozbeh Pournader (2): + Correct Ewe (ee) orthography to use U+025B (bug #20711) + Updated Arabic, Persian, and Urdu orthographies + +2.7.2 + +Behdad Esfahbod (6): + Improve charset printing + [ja.orth] Comment out FULLWIDTH YEN SIGN (#22942) + Bug 22037 - No Fonts installed on a default install on Windows Server 2003 + Bug 23419 - "contains" expression seems not working on the fontconfig rule + Revert "Fix FcNameUnparseLangSet()" and redo it + Bump libtool version for release + +Tor Lillqvist (3): + Fix MinGW compilation + Fix heap corruption on Windows in FcEndElement() + Use multi-byte codepage aware string function on Windows + +2.7.1 + +Behdad Esfahbod (16): + git-tag -s again + Fix win32 build + Replace spaces with tabs in conf files + Remove unused ftglue code + Add Inconsolata to monospace config (#22710) + Fix leak with string VStack objects + Improve libtool version parsing (#22122) + Use GetSystemWindowsDirectory() instead of GetWindowsDirectory() (#22037) + Remove unused macros + Fix FcNameUnparseLangSet() + Fix doc syntax (#22902) + TT_MS_ID_UCS_4 is really UTF-16BE, not UTF-32 + [doc] Add ~/fonts.conf.d to user docs + Hardcode /etc/fonts instead of @CONFDIR@ in docs (#22911) + Bump libtool versions that 2.7.0 (I forgot to do back then) + Update .gitignore + +Karl Tomlinson (1): + Don't change the order of names unnecessarily (#20128) + +2.7 + +Alexey Khoroshilov (1): + Use human-readable file names in the docs (bug #16278) + +Behdad Esfahbod (119): + Avoid C99ism in Win32 code (#16651) + [doc] Fix inaccuracy in FcFontRenderPrepare docs (#16985) + When canonizing filenames, squash // and remove final / (#bug 16286) + Add orth file for Maithili mai.orth (#15821) + Replace RCS Id tags with the file name + [doc] Fix signatures of FcPatternGetFTFace and FcPatternGetLangSet (#16272) + Update Thai default families (#16223) + Add ~/.fonts.conf.d to default config (#17100) + [fc-match] Fix list of getopt options in --help + Update man pages + Add fc-query (#13019) + Implement fc-list --verbose (#13015) + [doc] Add const decorator for FcPatternDuplicate() + Add FcPatternFilter() (#13016) + [doc] Document that a zero rescanInterval disables automatic checks (#17103) + Get rid of $Id$ tags + [doc] Fix signature of FcConfigHome() + Fix docs re 'orig' argument of FcPatternBuild and family + Update sr.orth to actul subset of Cyrillic used by Serbian (#17208) + Add Sindhi .orth file. (#17140) + Add WenQuanYi fonts to default conf (#17262, from Mandriva) + Handle -h and --help according to GNU Coding Standards (#17104) + Document when config can be NULL (#17105) + Add FcConfigReference() (#17124) + Document how to free return value of FcNameUnparse() + Don't leak FcValues string loaded through fcxml.c (#17661) + Don't call FcPatternGetCharSet in FcSortWalk unless we need to (#17361) + Fix two more doc typos + [.gitignore] Update + Cleanup symlinks in "make uninstall" (bug #18885) + [fccache] Consistently use FcStat() over stat() (bug #18195) + Consistently use FcStat() over stat() in all places + Use __builtin_popcount() when available (bug #17592) + Fix compile with old FreeType that doesn't have FT_Select_Size() (bug #17498) + Implement fc-list --quiet ala grep (bug #17141) + [65-fonts-persian.conf] Set foundry in target=scan instead of target=font + Don't use identifier named complex + Explicitly chmod() directories (bug #18934) + Remove special-casing of FC_FILE in FcPatternPrint() + [.gitignore] Update + Implement FcPatternFormat and use it in cmdline tools (bug #17107) + Fix comparison of family names to ignore leading space properly + [fcmatch.c] Fix debug formatting + [fcmatch] Use larger multipliers to enforce order + [fcmatch] When matching, reserve score 0 for when elements don't exist + [fcmatch] Move FcFontSetMatch() functionality into FcFontSetMatchInternal() + [doc] Note that fontset returned by FcConfigGetFonts should not be modified + Make FcCharSetMerge() public + Don't use FcCharSetCopy in FcCharSetMerge + Oops. Fix usage output. + Revive FcConfigScan() (bug #17121) + Add fc-scan too that runs FcFileScan/FcDirScan + Oops, fix FcPatternFilter + [fc-match] Accept list of elements like fc-list (bug #13017) + Cleanup all manpage.* files + [fcmatch] Fix crash when no fonts are available. + [fcfreetype] Fix typo in GB2312 encoding name string (#19845) + Add ICONV_LIBS to fontconfig.pc.in (#19606) + [win32] Fix usage of GetFullPathName() + [win32] Expand "APPSHAREFONTDIR" to ../share/fonts relative to binary location + [win32] Do not remove leading '\\' such that network paths work + [fccache] Make sure the cache is current when reusing from open caches + Update Sinhala orthography (#19288) + [cache] After writing cache to file, update the internal copy to reflect this + Further update Sinhala orthography (#19288) + [fcformat] Add support for width modifiers + [fcformat] Refactor and restructure code for upcoming changes + [fcformat] Add support for subexpressions + [fcformat] Add element filtering and deletion + [fcformat] Add conditionals + [fcformat] Add simple converters + [fcformat] Implement 'cescape', 'shescape', and 'xmlescape' converters + [FcStrBuf] better handle malloc failure + [fcformat] Add value-count syntax + [fcformat] Implement 'delete', 'escape', and 'translate' filter functions + [fcformat] Start adding builtins + [fcformat] Refactor code to avoid malloc + [fcformat] Add support for builtin formats + [fcformat] Support indexing simple tags + [fcformat] Support 'default value' for simple tags + [fcformat] Implement array enumeration + [fclang] Implement FcLangSetGetLangs() (#18846) + [fcformat] Enumerate langsets like we do arrays of values + [fcformat] Add a 'pkgkit' builtin that prints tags for font packages + [fcformat] Add list of undocumented language features + [fc-lang] Continue parsing after an "include" (#20179) + Fix Fanti (fat) orth file (#20390) + Fix Makefile's to not create target file in case of failure + [fcstr.c] Embed a static 64-byte buffer in FcStrBuf + [fcstr,fcxml] Don't copy FcStrBuf contents when we would free it soon + [fcxml] Don't allocate attr array if there are no attributes + [fcxml] Embed 8 static FcPStack objects in FcConfigParse + [fcxml] Embed 64 static FcVStack objects in FcConfigParse + [fcxml.c] Embed a static 64-byte attr buffer in FcPStack + Call git tools using "git cmd" instead of "git-cmd" syntax + Replace 'KEITH PACKARD' with 'THE AUTHOR(S)' in license text in all files + [fcformat] Fix default-value handling + Document FcPatternFormat() format + [Makefile.am] Don't clean ChangeLog in distclean + Revert "[conf] Disable hinting when emboldening (#19904)" (#20599) + [fc-lang] Fix bug in country map generation + [fcstr] Remove unused variable + [fc-lang] Make LangSet representation in the cache files stable + [fc-cache] Remove obsolete sentence from man page + Detect TrueType Collections by checking the font data header + Mark matchers array const (#21935) + Use/prefer WWS family/style (name table id 21/22) + Simplify FcValueSave() semantics + Add XXX note about Unicode Plane 16 + Always set *changed in FcCharsetMerge + [charset] Grow internal FcCharset arrays exponentially + Remove unused prototypes and function + [xml] Centralize FcExpr allocation + [xml] Mark more symbols static + [xml] Allocate FcExpr's in a pool in FcConfig + [xml] Intern more strings + Bug 22154 -- fontconfig.pc doesn't include libxml2 link flags + Fix distcheck + Remove keithp's GPG key id + +Benjamin Close (1): + Remove build manpage logfile if it exists + +Chris Wilson (1): + Reduce number of allocations during FcSortWalk(). + +Dan Nicholson (1): + Let make expand fc_cachedir/FC_CACHEDIR (bug #18675) + +Harald Fernengel (1): + Don't use variables named 'bool' (bug #18851) + +Harshula Jayasuriya (1): + Fix Sinhala coverage (bug #19288) + +Karl Tomlinson (1): + Change FcCharSetMerge API + +Mike FABIAN (1): + [conf] Disable hinting when emboldening (#19904) + +Peter (1): + Make sure alias files are built first (bug 16464) + +Rahul Bhalerao (1): + Add config for new Indic fonts (bug #17856) + +Roozbeh Pournader (60): + Correct Sindhi orthography to use Arabic script (bug #17140) + Remove Sinhala characters not in modern use (bug #19288) + Add Filipino orth, alias Tagalog to Filipino (bug #19846) + Split Mongolian orth to Mongolia and China (bug #19847) + Fix doubly encoded UTF-8 in comments (bug #19848) + Change Turkmen orth from Cyrillic to Latin (bug #19849) + Rename Venda from "ven" to "ve" (bug #19852) + Rename "ku" to "ku_am", add "ku_iq" (bug #19853). + Add Kashubian (csb) orth file (bug #19866) + Add Malay (ms) orthography (bug #19867) + Add Kinyarwanda (rw) orthography (bug #19868) + Add Upper Sorbian (hsb) orthography (bug #19870) + Add Berber orthographies in Latin and Tifinagh scripts (bug #19881) + Renamed az to az_az (bug #19889) + Rename Igbo from "ibo" to "ig" (bug #19892) + Remove punctuation symbols from Asturian orthography (bug #19893) + Add Chhattisgarhi (hne) orthography (bug #19891) + Use newly added Cyrillic letters for Kurdish (bug #20049) + Add Kurdish in Turkey (ku_tr) orthography (bug #19891) + Add Aragonese (an) orthography (bug #19891) + Add Haitian Creole (ht) orthography (bug #19891) + Ad Ganda (lg) orthography (bug #19891) + Add Limburgan (li) orthography (bug #19891) + Add Sardinian (sc) orthography (bug #19891) + Add Sidamo (sid) and Wolaitta (wal) orthographies (bug #19891) + Fix Bengali (bn) and Assamese (as) orthographies (bug #22924) + Remove Euro Sign from all orthographies (bug #19865) + Add Ottoman Turkish (ota) orthography (bug #20114) + Divide Panjabi (pa) to that of Pakistan and India (bug #19890) + Add Blin (byn) orthography (bug #19891) + Add Papiamento (pap_aw, pap_an) orthographies (bug #19891) + Add Crimean Tatar (crh) orthography (bug #19891) + Switch Uzbek (uz) orthography to Latin (bug #19851) + Update Azerbaijani in Latin (az_az) to present usage (bug #20173) + Rename Avaric orthography from 'ava' to 'av' (bug #20174) + Rename Bambara orthography from 'bam' to 'bm' (bug #20175) + Rename Fulah orthography from 'ful' to 'ff' (bug #20177) + Change Kashmiri (ks) orthography to Arabic script (bug #20200) + Tighten Central Khmer (km) orthography (bug #20202) + Remove digits and symbols from some Indic orthographies (bug #20204) + Add Divehi (dv) orthography (bug #20207) + Extend Crimean Tatar (crh) orthography (bug #19891) + Update Serbo-Croatian (sh) orthography (bug #20368) + Add Ewe (ee) orthography (bug #20386) + Add Herero (hz) orthograhy (bug #20387) + Add Akan (ak) and Fanti (fat) orthographies (bug #20390) + Added Quechua (qu) orthography (bug #20392) + Add Sango (sg) orthography (bug #20393) + Add Tahitian (ty) orthography (bug #20391) + Add Navajo (nv) orthography (bug #20395) + Add Rundi (rn) orthography (bug #20398) + Add Zhuang (za) orthography (bug #20399) + Add orthographies for Oshiwambo languages (bug #20401) + Add Shona (sn) orthography (bug #20394) + Add Sichuan Yi (ii) orthography (bug #20402) + Add Javanese (jv) orthography (bug #20403) + Add Nauru (na) orthography (bug #20418) + Add Kanuri (kr) orthography (bug #20438) + Add Sundanese (su) orthography (bug #20440) + Reorganize Panjabi/Punjabi and Lahnda orthographies (bug #19890) + +Serge van den Boom (1): + Correctly handle mmap() failure (#21062) + +2.6 + +2.5.93 (2.6 RC3) + +Alexey Khoroshilov (1): + Fix FcStrDirname documentation. (bug 16068) + +Behdad Esfahbod (1): + Persian conf update. (bug 16066). + +Evgeniy Stepanov (1): + Fix index/offset for 'decorative' matcher. Bug 15890. + +Glen Low (1): + Fix Win32 build error: install tries to run fc-cache locally (bug 15928). + +Keith Packard (8): + Call FcFini to make memory debugging easier + Fix a few memory tracking mistakes. + Add extended, caps, dunhill style mappings. + Freetype 2.3.5 (2007-jul-02) fixes indic font hinting. re-enable (bug 15822) + Add a copy of dolt.m4 to acinclude.m4. + Libs.private needs freetype libraries + Oops. Fix for bug 15928 used wrong path for installed fc-cache. + Ignore empty <dir></dir> elements + +Neskie Manuel (1): + Add Secwepemctsin Orthography. Bug 15996. + +Sayamindu Dasgupta (1): + FcConfigUptoDate breaks if directory mtime is in the future. Bug 14424. + +2.5.92 (2.6 RC2) + +Carlo Bramini (1): + Add FreeType-dependent functions to fontconfig.def file. (bug 15415) + +Changwoo Ryu (1): + Korean font in the default config - replacing baekmuk with un (bug 13569) + +Dennis Schridde (1): + Proper config path for static libraries in win32 + +Eric Anholt (1): + Fix build with !ENABLE_DOCS and no built manpages. + +Frederic Crozat (1): + Merge some of Mandriva configuration into upstream configuration. Bug 13247 + +Keith Packard (11): + Use DOLT if available + Work around for bitmap-only TrueType fonts that are missing the glyf table. + Remove size and dpi values from bitmap fonts. Bug 8765. + Add some sample cursive and fantasy families. + Add --all flag to fc-match to show the untrimmed list. Bug 13018. + Remove doltcompile in distclean + Use of ":=" in src/Makefile.am is unportable (bug 14420) + Make fc-match behave better when style is unknown (bug 15332) + Deal with libtool 2.2 which doesn't let us use LT_ variables. (bug 15692) + Allow for RC versions in README update + git ignore doltcompile + +Ryan Schmidt (1): + fontconfig build fails if "head" is missing or unusable (bug 14304) + +Sylvain Pasche (1): + Fontconfig options for freetype sub-pixel filter configuration + +2.5.91 (2.6 RC1) + +Hongbo Zhao (1): + Not_contain should use strstr, not strcmp on strings. (bug 13632) + +Keith Packard (11): + Move conf.avail/README to conf.d/README (bug 13392) + Fix OOM failure case in FcPStackPush. + Remove freetype requirement for build-time applications. + Include fcftaliastail.h so that the freetype funcs are exported. + Eliminate references to freetype from utility Makefile.am's + Distribute new fcftint.h file + Create new-version.sh to help with releases, update INSTALL instructions + Distribute khmer font aliases + Add more files to .gitignore + new-version.sh was mis-editing files + git-tag requires space after -m flag + +2.5 + +Keith Packard (4): + Document several function return values (Bug 13145). + Document that Match calls FcFontRenderPrepare (bug 13162). + Document that FcConfigGetFonts returns the internal fontset (bug 13197) + Revert "Remove fcprivate.h, move the remaining macros to fcint.h." + +Tor Lillqvist (1): + Workaround for stat() brokenness in Microsoft's C library (bug 8526) + +2.4.92 (2.5 RC2) + +Behdad Esfahbod (14): + Make fc-match --sort call FcFontRenderPrepare. + Port fonts-persian.conf to new alias syntax with binding="same" + Fix trivial bugs in edit-sgml.c + Add FcGetLangs() and FcLangGetCharSet(). + Add/update config files from Fedora. + Split 40-generic.conf into 40-nonlatin.conf and 45-latin.conf + Use binding="same" in 30-urw-aliases.conf and remove duplicate entries. + Remove redundant/obsolete comments from conf files. + Remove 20-lohit-gujarati.conf. It's covered by 25-unhint-nonlatin.conf now. + Oops, fix Makefile.am. + Remove 25-unhint-nonlatin.conf from default configuration by not linking it. + Fix documented conf-file naming format in README + Remove list of available conf files from README. + Simplify/improve 30-metric-aliases.conf + +Keith Packard (25): + Also check configDirs mtimes in FcConfigUptoDate + Respect "binding" attribute in <alias> entries. + Correct documentation for FcAtomicLock (Bug 12947). + Remove fcprivate.h, move the remaining macros to fcint.h. + Correct documentation for FcConfigUptoDate (bug 12948). + Document skipping of fonts from FcFileScan/FcDirScan. + Make file_stat argument to FcDirCacheLoadFile optional. + Clean up exported names in fontconfig.h. + Track line numbers in sgml edit tool input. + Typo error in function name: Inverval -> interval + Don't check cache file time stamps when cleaning cache dir. + Use FcLangDifferentTerritory instead of FcLangDifferentCountry. + Verify documentation covers exposed symbols. + Document previously undocumented functions. (bug 12963) + Update documentation for FcStrCopyFilename (bug 12964). + Update documentation for stale FcConfigGetConfig function. + Have FcConfigSetCurrent accept the current configuration and simply return + Remove references to FcConfigParse and FcConfigLoad. + Replace incorrect documentation uses of 'char' with 'FcChar8' (bug 13002). + Fix formatting syntax in doc/fccache.fncs + Generate fccache.sgml, fcdircache.sgml and fclangset.sgml. + Formatting syntax mistake in doc/fclangset.fncs. + Link new function documentation into the fontconfig-devel.sgml + Ignore new generated documentation + Export FcConfig{G,S}etRescanInverval from .so, mark as deprecated. + +2.4.91 (2.5 RC1) + +Behdad Esfahbod (1): + Update CaseFolding.txt to Unicode 5.1.0 + +Dwayne Bailey (1): + Add/fix *.orth files for South African languages + +Hideki Yamane (1): + Handle Japanese fonts better. (debian bug #435971) + +Keith Packard (32): + rehash increment could be zero, causing rehash infinite loop. + Work around FreeType bug when glyph name buffer is too small. + Free temporary string in FcDirCacheUnlink (Bug #11758) + Fix ChangeLog generation to avoid circular make dependency + Store font directory mtime in cache file. + Comment about mmaping cache files was misleading. + Make FC_FULLNAME include all fullname entries, elide nothing. [bug 12827] + Remove unneeded call to access(2) in fc-cache. + Improve verbose messages from fc-cache. + Verbose message about cleaning directories was imprecise + Don't use X_OK bit when checking for writable directories (bug 12438) + Have fc-cache remove invalid cache files from cache directories. + FcConfigParseAndLoad doc was missing the last param. + Place language name in constant array instead of pointer. + Must not insert cache into hash table before completely validating. + Eliminate relocations for glyph name table. + Eliminate relocations from FcCodePageRange structure (bug 10982). + Leave generated headers out of distribution (bug 12734). + Move <cachedir> elements to the end of fonts.conf. + Add BRAILLE PATTERN BLANK to list of blank glyphs. + Replace makealias pattern with something supported by POSIX grep (bug 11083) + FcInit should return FcFalse when FcInitLoadConfigAndFonts fails. (bug 10976) + There is no U+1257 (bug 10899). + Spelling errors in documentation. (bug 10879). + Oops. Left debugging printf in previous commit. + Handle UltraBlack weight. + Fix parallel build in fontconfig/docs (bug 10481). + Distribute man source files for command line programs (bug 9678). + Ensure weight/slant values present even when style is supplied (bug 9313). + fontconfig needs configure option to use gnu iconv (bug 4083). + Match 'ultra' on word boundaries to detect ultra bold fonts. (bug 2511) + Build fix for Solaris 10 with GCC. + +Mike FABIAN (1): + Avoid crashes if config files contain junk. + +Stephan Kulow (1): + Make FcPatternDuplicate copy the binding instead of always using Strong. + +Tilman Sauerbeck (2): + Store FcNoticeFoundries in read-only memory. + Store FcVendorFoundries in read-only memory. + +2.4.2 + +Han-Wen Nienhuys: + FcStrCanonFileName buggy for mingw. (bug 8311) + More fixes for Win32 building (bug 8311) + +Kean Johnston: + Don't use varargs CPP macros in fccache.c. (bug 8733) + +Keith Packard: + Remove documentation for non-existant FcConfigNormalizeFontDir. + Build fontconfig.def from header files when needed. + Detect and use available random number generator (bug 8308) + Add sparc64 architecture string. + FcStrCanonAbsoluteFilename should be static. + Use explicit platform/nameid order when scanning ttf files. + Warn (and recover) from config file without <cachedir> elements. + Avoid writing uninitialized structure pad bytes to cache files. + Fix grep pattern in makealias to work on non-Gnu grep (bug 8368). + Add FcFreeTypeQueryFace external API. Bug #7311. + Segfault scanning non-font files. Disallow scan edit of user vars. (#8767) + Add space between type and formal in devel man pages (bug 8935) + +Mike FABIAN: + Do not clean cache files for different architectures + +Peter Breitenlohner: + A VPATH build of fontconfig-2.4.1 fails for various reasons. Bug 8933. + Use <literal> instead of <sgmltag> when documenting fonts.conf. Bug 8935. + Fix fc-cat documentation (bug 8935). + + +2.4.1 + +Keith Packard: + Update installation notes for 2.4 base. + Add ppc64 signature. Bug 8227 + Add signatures for m68k and mipsel (thanks debian buildd) + Add warning flags to fc-cache build. Clean up warnings in fc-cache. + Reimplement FcConfigAppFontAddDir; function was lost in 2.4.0. + +2.4.0 + +David Turner: + Replace character discovery loop with simpler, faster version. + +James Cloos: + Move files from conf.d to conf.avail + Standardize conf.avail number prefixing convention + Support all five possibilities for sub-pixel + Move user and local conf file loading into conf.avail files + Number the remaining conf.avail files + Update Makefile.am to match conf.avail changes + Replace load of conf.d in fonts.conf.in + Make room for chunks from fonts.conf in conf.avail + Re-order old conf.d files + Move some section from fonts.conf into conf.avail files + Update Makefile.am files + Make conf.avail and conf.d work + +Keith Packard: + Create fc_cachedir at install time. Bug 8157. + Reference patterns in FcCacheCopySet. + Replace gnu-specific sed command with simple grep. + Attempt to fix makealias usage for build on Mac OS X. + Accept locale environment variables that do not contain territory. + Merge branch 'jhcloos' + Insert newly created caches into reference data structure. + Add XML headers to new conf files. Move link make commands to conf.avail dir + Rename conf.avail to conf.d + Fix conf.d directory sorting. + Include cachedir in fonts.dtd. + Don't display tests for DESTDIR on make install. + Split much of the configuration into separate files. Renumber files + +2.3.97 + +Carl Worth: + Rename FcPatternThawAll to FcPatternFini. + Add a configuration file that disables hinting for the Lohit Gujarati font + +Keith Packard: + Various GCC 4 cleanups for signed vs unsigned char + Finish INSTALL changes. .gitignore ChangeLog + Merge branch 'fc-2_4_branch' to master + Remove all .cvsignore files + Hide private functions in shared library. Export functionality for utilities. + Hide FreeType glue code from library ABI. + Can't typecheck values for objects with no known type. + Leave cache files mapped permanently. + Reference count cache objects. + Make cache reference counting more efficient. + Oops, fc-lang broke when I added cache referencing. + Correct reference count when sharing cache file objects. + Eliminate .so PLT entries for local symbols. (thanks to Arjan van de Ven) + Update architecture signatures for x86-64 and ppc. + Parallel build fix for fcalias.h and fcaliastail.h + Charset hashing depended on uniqueness of leaves. + +Patrick Lam: + file Makefile.am was initially added on branch fc-2_4_branch. + Modify config file to use Greek fonts before Asian fonts with Greek glyphs. + Use libtool -no-undefined flag on all platforms. + file ftglue.c was initially added on branch fc-2_4_branch. + 2005-11-23 Frederic Crozat <fcrozat@mandriva.com>: reviewed by: plam + file 10-fonts-persian.conf was initially added on branch fc-2_4_branch. + Sort directory entries while scanning them from disk; prevents Heisenbugs + file ln.orth was initially added on branch fc-2_4_branch. + Fix typos in orth files. Reported by Denis Jacquerye. + On Windows, unlink before rename. Reported by Tim Evans. + file fc-match.sgml was initially added on branch fc-2_4_branch. + +2.3.96 + +Keith Packard: + Make path names in cache files absolute (NB, cache format change) Stop + Eliminate pattern freezing + Add .gitignore + Construct short architecture name from architecture signature. + Write caches to first directory with permission. Valid cache in FcDirCacheOpen. + Eliminate NormalizeDir. Eliminate gratuitous stat/access calls per dir. + Add architecture to cache filename. + Eliminate global cache. Eliminate multi-arch cache code. + Fix up fc-cache and fc-cat for no global cache changes. + Eliminate ./ and ../ elements from font directory names when scanning. + Regenerate x86 line in fcarch.tmpl.h to match change in cache data. + Add x86-64 architecture and signature. + During test run, remove cache directory to avoid stale cache usage. + Add ppc architecture + Revert to original FcFontSetMatch algorithm to avoid losing fonts. + Rework cache files to use offsets for all data structures. + Fix build problems caused by cache rework. + FcCharSetSerialize was using wrong offset for leaves. Make fc-cat work. + Rework Object name database to unify typechecking and object lookup. + Skip broken caches. Cache files are auto-written, don't rewrite in fc-cache. + Fix fc-cat again. Sigh. + Use intptr_t instead of off_t inside FcCache structure. + Serialized value lists were only including one value. + Automatically remove invalid cache files. + With no args, fc-cat now dumps all directories. + Revert ABI changes from version 2.3 + Change $(pkgcachedir) to $(fc_cachedir) in fc-cat and fc-cache Makefile.am + Allow FcTypeLangSet to match either FcTypeLangSet or FcTypeString. + Remove stale architecture signatures. + Pass directory information around in FcCache structure. Freeze charsets. + Fix fc-lang to use new charset freezer API. + Fontset pattern references are relative to fontset, not array. + Add some ignores + Only rebuild caches for system fonts at make install time. + Fix memory leaks in fc-cache directory cleaning code. + Add @EXPAT_LIBS@ to Libs.private in fontconfig.pc (bug 7683) + Avoid #warning directives on non-GCC compilers. (bug 7683) + Chinese/Macau needs the Hong Kong orthography instead of Taiwan (bug 7884) + Add Assamese orthography (as.orth). Bug #8050 + Really only rebuild caches for system fonts at make install time. + Fonts matching lang not territory should satisfy sort pattern lang. + Prefer Bitstream Vera to DejaVu families. + Guess that mac roman names with lots of high bits are actually SJIS. + Document FC_DEBUG values (bug 6393). Document name \ escape syntax. + Move Free family names to bottom of respective aliases. (bug 7429) + Unify directory canonicalization into FcStrAddFilename. + Allow font caches to contain newer version numbers + Add FcMatchScan to resolve Delicious font matching issues (bug #6769) + Fix missing initialization/destruction of new 'scan' target subst list. + Don't segfault when string values can't be parsed as charsets or langsets. + Using uninitialized (and wrong) variable in FcStrCopyFilename. + Oops; missed the 60-delicious.conf file. + +Patrick Lam: + Keith Packard <keithp@keithp.com> + 2006-04-27 Paolo Borelli (pborelli@katamail.com) reviewed by: plam + 2006-05-31 Yong Li (rigel863@gmail.com) reviewed by: plam, Bedhad Esfahbod + 2006-07-19 Jon Burgess (jburgess@uklinux.net) reviewed by: plam + 2006-08-04 Keith Packard (keithp@keithp.com) reviewed by: plam + +2.3.95 + +Match 'Standard Symbols L' for 'Symbol'. Add URW fonts as aliases for +all of the PostScript fonts. (reported by Miguel Rodriguez). Fix a +number of Coverity defects (Frederic Crozat). Speed up FcFontSort +(fix suggested by Kenichi Handa). Fix error with charsets. Survive +missing docbook2pdf. Compile on HP-UX, AIX, SGI and Windows (Cygwin, +MinGW). Fix intel compiler warnings. Fix multiarch support (don't +destroy multiarch files!) Require pkg-config. (Thanks Behdad; better +solution wanted for libxml2 detection!) Fix typos in orth files and +add orth for Lingala (reported by Denis Jacquerye). Remove debian/ +directory. Add a configuration file that disables hinting for the +Lohit Gujarati font (since the hinting distorts some glyphs quite +badly). Sort directory entries while scanning them from disk; +prevents Heisenbugs due to file ordering in a directory (due to Egmont +Koblinger). Fix Wine's problem with finding fonts. (Reported by +Bernhard Rosenkraenzer.) Fix the issues with GNU libiconv vs. libc +iconv (which especially appear on Solarii); patch by Behdad Esfahbod, +approach suggested by Tim Mooney. + +2.3.94 + +fc-cat can take directories as input and creates old-style fonts.cache +listings. +fc-cache takes -r --really-force which blows away all old caches and +regenerates. +Robustness fixes, integer overflow fixes (notably to cache handling +code), toast broken global cache files. +Change binary format to make it compatible with static langset +information (thanks to Takashi Iwai). +Open hashed caches before fonts.cache-2 (Takashi Iwai). +Fix FcFontSetMatch's algorithm, which used to unjustly kill fonts for +not declaring certain elements (Takashi Iwai). +Fix matching bug when multiple elements match; don't use +the sum of all scores, but the best score (James Su). +Make fc-lang more friendly to Windows systems. +Remove archaic chars from Georgian charset; add Euro character to +charsets for European languages. +Fix treatment of broken PCF fonts that don't declare family names. +Pass O_BINARY to open if appropriate (reported by Doodle). +Normalize font directories to the form in which they appear in +config files. +Add a record of the cached directory to the cache file. +Perf optimizations (Dirk Mueller; some reported by Michael Meeks.) +Don't loop infinitely on recursive symlinks. +Make 'make distcheck' work with automake 1.6.3. +Replace 'stamp' target with mkinstalldirs. +Don't stop scanning if a directory in fonts.conf doesn't exist, +because subsequent directories might exist. +Put directory names into global cache (reported by Ronny V. Vindenes). +Treat zh-hk fonts differently from zh-tw fonts. This patch may cause +fontconfig to treat A-X fonts differently from A-Y fonts; please mail +the fontconfig list if this causes any problems. +Fix for unaligned memory accesses (Andreas Schwab). +Fix treatment of cache directory as read from cache file; don't use +string equality to determine if we have the right file, use inode +equality. +Properly skip past dir caches that contain zero fonts, as occurs +in global caches (reported by Mike Fabian). +Print out full pathname in fc-match -v (reported by Frederic Crozat). +Fix bug where fc-match crashes when given __DUMMY__ property to +match on. + +2.3.93 + +Create cache files in /var/cache/fontconfig with hashed filenames, if +possible, for added FHS compliance. +Make fc-cat read both per-directory and global cache files. +Add config file for Persian fonts from Sharif FarsiWeb, Inc. +Major performance improvements by Dirk Mueller, Stephen Kulow, and Michael Matz at SuSE: in particular, speed up FcFontSetMatch, and inline many functions. +Fix treatment of globs in config files, broken since 2.3.2 and discovered by Mathias Clasen. +Don't use freetype internal headers (patch by Matthias Clasen). +Further space improvements: create langsets statically, so that they can live in .rodata. +Properly align mmapped data structures to make e.g. ia64 happy. +Bug fixes. + +2.3.92 + +Fix corrupted caches bugs from 2.3.91 (reported by Mike Fabian). +Store only basename in the cache, reconstitute on demand +(reported by James Cloos). +Change the rule for artificial emboldening in fonts.conf.in. This +enables the support for artificial emboldening included in cairo +(patch by Zhe Su). +Add FC_EMBEDDED_BITMAP object type to tell Xft/Cairo whether +to load embedded bitmaps or not (patch by Jinghua Luo). +Fix GCC4 warnings (some by Behdad Esfahbod). +Support localized font family and style names; this has been reported +to break old apps like xfd, but modern (gtk+/qt/mozilla) apps work +fine (patch by Zhe Su). +Prevent fc-list from escaping strings when printing them (reported by +Matthias Clasen). +Add valist sentinel markup for FcObjectSetBuild and +FcPatternBuild (patch by Marcus Meissner). +Add consts to variables so as to move arrays into .rodata (patch by +Ross Burton). +Modify config file to use Greek fonts before Asian fonts with +Greek glyphs. (patch by Simos Xenitellis). +Use libtool -no-undefined flag on all platforms (patch by Christian +Biesinger). + +2.3.91 + +Use libxml2 if requested or if expat not available. (Mathias Hasselmann) +Fix multi-arch cache files: compute the position for the +block to be added using info from OrigFile, not NewFile. (plam) +Cast results of sizeof() to unsigned int to get rid of +warnings on x86_64 (reported by Matthias Clasen). +Use FcAtomic to rewrite cache files; don't unlink the fonts.cache-2 +file even if there's no data to write; just write an empty cache file. +(Reported by Lubos Lunak) +Allocate room for the subdirectory names in each directory cache. +(Reported by James Cloos) + +2.3.90 + +Development release of mmap patch: load pattern information +directly from cache files. (Patrick Lam) + +2.3.2 + +Patch memory leaks in using iconv. (Reported by Chris Capoccia) +Patch memory leaks in fc-cache. (Reported by Chris Capoccia) +Fetch bitmap glyphs to get widths during font evaluation. (keithp) +Share strings through FcObjectStaticName (Ross Burton) +Windows build updates (Tor Lillqvist) + +2.3.1 + +Be more careful about broken GSUB/GPOS tables (Manish Singh) +Include debian packaging stuff in CVS (Josselin Mouette) +Add more conf.d examples (Keith Packard) +Make manuals build again (Keith Packard) +Johap -> Johab (Funda Wang) + +2.3.0 + +Fix memory leak of patterns rejected by configuration (#2518) + +Create prototype /etc/fonts/conf.d directory and populate it with a few +sample files. These samples are unused as the file names don't start with +numbers. + +Update documentation. + +2.2.99 + +Verify cache for FC_FILE and FC_FAMILY in every entry (#2219) + +Update blanks list from recent Unicode docs (#86) + +Various small build fixes (#280, #2278, + +Documentation fixes (#2085, #2284, #2285) + +Add polite typechecking to config file loader (#229) + +2.2.98 + +Share object name strings (Michael Meeks) + +Eliminate a couple of codepoints from Russian orthography (John Thacker) + +Add synthetic emboldening configuration changes (Jakub Pavelek) + +Change FcFontSetSort to ignore language after fonts with the requested +languages have been found. (Owen Taylor) + +Add some RedHat font configuration changes (Owen Tayler). + +Add full Unicode case folding support to case-ignoring string functions +(Keith Packard) + +Remove Han characters from Korean orthography (Tor Andersson) + +2.2.97 + +Fc-cache sleeps before exiting to ensure filesystem timestamps are well +ordered. + +Added Punjai orthography. + +The timestamp in fonts.conf is gone now. Too many problems. + +The default font path includes all of the X fonts; use selectfont/rejectfont +to eliminate bitmaps, as shown in the sample local.conf file. + +<include> configuration elements may now reference a directory. Files +in that directory matching [0-9]* are loaded in UTF-8 collating sequence order. + +<selectfont> configuration added to control which fonts are used. + +fontformat font pattern elements built from the FT_Get_X11_Font_Format +function in newer versions of FreeType. + +'capability' list constructed from gsub/gpos and silf values in TrueType +files. + +Multi-lingual names (style, family, fullname) extracted and stored with +parallel <foo>lang properties marking language. + +2.2.96 + +Fix FcConfigUpToDate to actually check all font directories and eliminate +a typo which completely prevented it from working (Lubos Lunak +<l.lunak@suse.cz>) + +Remove comma at end of FcResult enum definition for picky compilers. + +2.2.95 + +Add FcResultOutOfMemory so FcFontSetMatch can return accurate error. + +Replace MIN/MAX/ABS macros which happened to be in old FreeType releases +with FC_MIN/FC_MAX/FC_ABS macros owned by fontconfig. + +2.2.94 + +The 2.2.93 release was prepared with a broken libtool which created +the shared library without the '.so' in the file names. + +2.2.93 + +This is the third prerelease of fontconfig 2.3. Significant changes from +2.2.92 are: + + o Use new FreeType #include syntax + o use y_ppem field instead of 'height' in bitmap sizes rec - + FreeType changed the semantics. Still uses height for + older versions of FreeType + o Don't construct program manuals unless docbook is available + +2.2.92 + + o make distcheck work + +2.2.91 + + o Switch to SGML manuals + o Add FC_DUAL width spacing value + o Add FcFini to close out fontconfig and release all memory + +2.2 + +This is the third public release of fontconfig, a font configuration and +customization library. Fontconfig is designed to locate fonts within the +system and select them according to requirements specified by applications. + +Fontconfig is not a rasterization library, nor does it impose a particular +rasterization library on the application. The X-specific library +'Xft' uses fontconfig along with freetype to specify and rasterize fonts. + +Keith Packard +keithp@keithp.com diff --git a/fontconfig/acinclude.m4 b/fontconfig/acinclude.m4 new file mode 100644 index 000000000..1195da380 --- /dev/null +++ b/fontconfig/acinclude.m4 @@ -0,0 +1,137 @@ +dnl dolt, a replacement for libtool +dnl Copyright © 2007-2008 Josh Triplett <josh@freedesktop.org> +dnl Copying and distribution of this file, with or without modification, +dnl are permitted in any medium without royalty provided the copyright +dnl notice and this notice are preserved. +dnl +dnl To use dolt, invoke the DOLT macro immediately after the libtool macros. +dnl Optionally, copy this file into acinclude.m4, to avoid the need to have it +dnl installed when running autoconf on your project. + +AC_DEFUN([DOLT], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +# dolt, a replacement for libtool +# Josh Triplett <josh@freedesktop.org> +AC_PATH_PROG(DOLT_BASH, bash) +AC_MSG_CHECKING([if dolt supports this host]) +dolt_supported=yes +if test x$DOLT_BASH = x; then + dolt_supported=no +fi +if test x$GCC != xyes; then + dolt_supported=no +fi +case $host in +i?86-*-linux*|x86_64-*-linux*|powerpc-*-linux*) ;; +amd64-*-freebsd*|i?86-*-freebsd*|ia64-*-freebsd*) ;; +*) dolt_supported=no ;; +esac +if test x$dolt_supported = xno ; then + AC_MSG_RESULT([no, falling back to libtool]) + LTCOMPILE='$(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(COMPILE)' + LTCXXCOMPILE='$(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXXCOMPILE)' +else + AC_MSG_RESULT([yes, replacing libtool]) + +dnl Start writing out doltcompile. + cat <<__DOLTCOMPILE__EOF__ >doltcompile +#!$DOLT_BASH +__DOLTCOMPILE__EOF__ + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +args=("$[]@") +for ((arg=0; arg<${#args@<:@@@:>@}; arg++)) ; do + if test x"${args@<:@$arg@:>@}" = x-o ; then + objarg=$((arg+1)) + break + fi +done +if test x$objarg = x ; then + echo 'Error: no -o on compiler command line' 1>&2 + exit 1 +fi +lo="${args@<:@$objarg@:>@}" +obj="${lo%.lo}" +if test x"$lo" = x"$obj" ; then + echo "Error: libtool object file name \"$lo\" does not end in .lo" 1>&2 + exit 1 +fi +objbase="${obj##*/}" +__DOLTCOMPILE__EOF__ + +dnl Write out shared compilation code. + if test x$enable_shared = xyes; then + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +libobjdir="${obj%$objbase}.libs" +if test ! -d "$libobjdir" ; then + mkdir_out="$(mkdir "$libobjdir" 2>&1)" + mkdir_ret=$? + if test "$mkdir_ret" -ne 0 && test ! -d "$libobjdir" ; then + echo "$mkdir_out" 1>&2 + exit $mkdir_ret + fi +fi +pic_object="$libobjdir/$objbase.o" +args@<:@$objarg@:>@="$pic_object" +"${args@<:@@@:>@}" -fPIC -DPIC || exit $? +__DOLTCOMPILE__EOF__ + fi + +dnl Write out static compilation code. +dnl Avoid duplicate compiler output if also building shared objects. + if test x$enable_static = xyes; then + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +non_pic_object="$obj.o" +args@<:@$objarg@:>@="$non_pic_object" +__DOLTCOMPILE__EOF__ + if test x$enable_shared = xyes; then + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +"${args@<:@@@:>@}" >/dev/null 2>&1 || exit $? +__DOLTCOMPILE__EOF__ + else + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +"${args@<:@@@:>@}" || exit $? +__DOLTCOMPILE__EOF__ + fi + fi + +dnl Write out the code to write the .lo file. +dnl The second line of the .lo file must match "^# Generated by .*libtool" + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +{ +echo "# $lo - a libtool object file" +echo "# Generated by doltcompile, not libtool" +__DOLTCOMPILE__EOF__ + + if test x$enable_shared = xyes; then + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +echo "pic_object='$pic_object'" +__DOLTCOMPILE__EOF__ + else + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +echo pic_object=none +__DOLTCOMPILE__EOF__ + fi + + if test x$enable_static = xyes; then + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +echo "non_pic_object='$non_pic_object'" +__DOLTCOMPILE__EOF__ + else + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +echo non_pic_object=none +__DOLTCOMPILE__EOF__ + fi + + cat <<'__DOLTCOMPILE__EOF__' >>doltcompile +} > "$lo" +__DOLTCOMPILE__EOF__ + +dnl Done writing out doltcompile; substitute it for libtool compilation. + chmod +x doltcompile + LTCOMPILE='$(top_builddir)/doltcompile $(COMPILE)' + LTCXXCOMPILE='$(top_builddir)/doltcompile $(CXXCOMPILE)' +fi +AC_SUBST(LTCOMPILE) +AC_SUBST(LTCXXCOMPILE) +# end dolt +]) diff --git a/fontconfig/autogen.sh b/fontconfig/autogen.sh new file mode 100644 index 000000000..820c457fe --- /dev/null +++ b/fontconfig/autogen.sh @@ -0,0 +1,123 @@ +#!/bin/sh +# Run this to generate all the initial makefiles, etc. + +set -e + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +case "$1" in +--noconf*) + AUTOGEN_SUBDIR_MODE="true" + shift + ;; +esac + +ORIGDIR=`pwd` +cd $srcdir +PROJECT=Fontconfig +TEST_TYPE=-f +FILE=fontconfig/fontconfig.h +ACLOCAL=${ACLOCAL-aclocal} +LIBTOOLIZE=${LIBTOOLIZE-libtoolize} +AUTOMAKE=${AUTOMAKE-automake} +AUTOHEADER=${AUTOHEADER-autoheader} +AUTOCONF=${AUTOCONF-autoconf} +LIBTOOLIZE_FLAGS="--copy --force" + +DIE=0 + +have_libtool=false +if $LIBTOOLIZE --version < /dev/null > /dev/null 2>&1 ; then + libtool_version=`$LIBTOOLIZE --version | sed 's/^.* \([0-9][.][0-9.]*\)[^ ]*$/\1/'` + case $libtool_version in + 1.4*|1.5*|1.6*|1.7*|2*) + have_libtool=true + ;; + esac +fi +if $have_libtool ; then : ; else + echo + echo "You must have libtool 1.4 installed to compile $PROJECT." + echo "Install the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +fi + +($AUTOCONF --version) < /dev/null > /dev/null 2>&1 || { + echo + echo "You must have autoconf installed to compile $PROJECT." + echo "libtool the appropriate package for your distribution," + echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" + DIE=1 +} + +have_automake=false +need_libtoolize=true +if $AUTOMAKE --version < /dev/null > /dev/null 2>&1 ; then + automake_version=`$AUTOMAKE --version | grep 'automake (GNU automake)' | sed 's/^[^0-9]*\(.*\)/\1/'` + case $automake_version in + 1.2*|1.3*|1.4) + ;; + 1.4*) + have_automake=true + need_libtoolize=false + ;; + *) + have_automake=true + ;; + esac +fi +if $have_automake ; then : ; else + echo + echo "You must have automake 1.4-p1 installed to compile $PROJECT." + echo "Get ftp://ftp.gnu.org/pub/gnu/automake/automake-1.4-p1.tar.gz" + echo "(or a newer version if it is available)" + DIE=1 +fi + +if test "$DIE" -eq 1; then + exit 1 +fi + +test $TEST_TYPE $FILE || { + echo "You must run this script in the top-level $PROJECT directory" + exit 1 +} + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + if test -z "$*"; then + echo "I am going to run ./configure with no arguments - if you wish " + echo "to pass any to it, please specify them on the $0 command line." + fi +fi + +echo Running $ACLOCAL $ACLOCAL_FLAGS +$ACLOCAL $ACLOCAL_FLAGS + +# optionally run autoheader +if $AUTOHEADER --version < /dev/null > /dev/null 2>&1; then + echo Running $AUTOHEADER + $AUTOHEADER +fi + +case $need_libtoolize in + true) + echo Running $LIBTOOLIZE $LIBTOOLIZE_FLAGS + $LIBTOOLIZE $LIBTOOLIZE_FLAGS + ;; +esac + +echo Running $AUTOMAKE -a $am_opt +$AUTOMAKE -a $am_opt +echo Running $AUTOCONF +$AUTOCONF +cd $ORIGDIR + +if test -z "$AUTOGEN_SUBDIR_MODE"; then + echo Running $srcdir/configure --enable-maintainer-mode "$@" + $srcdir/configure --enable-maintainer-mode "$@" + + echo + echo "Now type 'make' to compile $PROJECT." +fi diff --git a/fontconfig/conf.d/10-autohint.conf b/fontconfig/conf.d/10-autohint.conf new file mode 100644 index 000000000..c597bf41d --- /dev/null +++ b/fontconfig/conf.d/10-autohint.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Use the Autohinter --> + <match target="font"> + <edit name="autohint" mode="assign"><bool>true</bool></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-no-sub-pixel.conf b/fontconfig/conf.d/10-no-sub-pixel.conf new file mode 100644 index 000000000..87ada4ef2 --- /dev/null +++ b/fontconfig/conf.d/10-no-sub-pixel.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Enable sub-pixel rendering --> + <match target="font"> + <edit name="rgba" mode="assign"><const>none</const></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-sub-pixel-bgr.conf b/fontconfig/conf.d/10-sub-pixel-bgr.conf new file mode 100644 index 000000000..e1f64fd33 --- /dev/null +++ b/fontconfig/conf.d/10-sub-pixel-bgr.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Enable sub-pixel rendering --> + <match target="font"> + <edit name="rgba" mode="assign"><const>bgr</const></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-sub-pixel-rgb.conf b/fontconfig/conf.d/10-sub-pixel-rgb.conf new file mode 100644 index 000000000..2b49fe3d2 --- /dev/null +++ b/fontconfig/conf.d/10-sub-pixel-rgb.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Enable sub-pixel rendering --> + <match target="font"> + <edit name="rgba" mode="assign"><const>rgb</const></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-sub-pixel-vbgr.conf b/fontconfig/conf.d/10-sub-pixel-vbgr.conf new file mode 100644 index 000000000..5947650df --- /dev/null +++ b/fontconfig/conf.d/10-sub-pixel-vbgr.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Enable sub-pixel rendering --> + <match target="font"> + <edit name="rgba" mode="assign"><const>vbgr</const></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-sub-pixel-vrgb.conf b/fontconfig/conf.d/10-sub-pixel-vrgb.conf new file mode 100644 index 000000000..84481bde2 --- /dev/null +++ b/fontconfig/conf.d/10-sub-pixel-vrgb.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Enable sub-pixel rendering --> + <match target="font"> + <edit name="rgba" mode="assign"><const>vrgb</const></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/10-unhinted.conf b/fontconfig/conf.d/10-unhinted.conf new file mode 100644 index 000000000..025ae2a82 --- /dev/null +++ b/fontconfig/conf.d/10-unhinted.conf @@ -0,0 +1,8 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Disable hinting --> + <match target="font"> + <edit name="hinting" mode="assign"><bool>false</bool></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/20-fix-globaladvance.conf b/fontconfig/conf.d/20-fix-globaladvance.conf new file mode 100644 index 000000000..2a9c06325 --- /dev/null +++ b/fontconfig/conf.d/20-fix-globaladvance.conf @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + Some Asian fonts misadvertise themselves as monospaced when + in fact they are dual-spaced (half and full). This makes + FreeType very confused as it forces all widths to match. + Undo this magic by disabling the width forcing code --> + <match target="font"> + <test name="family"><string>GulimChe</string></test> + <edit name="globaladvance"><bool>false</bool></edit> + </match> + + <match target="font"> + <test name="family"><string>DotumChe</string></test> + <edit name="globaladvance"><bool>false</bool></edit> + </match> + + <match target="font"> + <test name="family"><string>BatangChe</string></test> + <edit name="globaladvance"><bool>false</bool></edit> + </match> + + <match target="font"> + <test name="family"><string>GungsuhChe</string></test> + <edit name="globaladvance"><bool>false</bool></edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/20-unhint-small-vera.conf b/fontconfig/conf.d/20-unhint-small-vera.conf new file mode 100644 index 000000000..c4ebee9d4 --- /dev/null +++ b/fontconfig/conf.d/20-unhint-small-vera.conf @@ -0,0 +1,48 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + The Bitstream Vera fonts have GASP entries suggesting that hinting be + disabled below 8 ppem, but FreeType ignores those, preferring to use + the data found in the instructed hints. The initial Vera release + didn't include the right instructions in the 'prep' table. Fix this + by disabling hinting manually at smaller sizes (< 8ppem) + --> + + <match target="font"> + <test name="family"> + <string>Bitstream Vera Sans</string> + </test> + <test name="pixelsize" compare="less"> + <double>7.5</double> + </test> + <edit name="hinting"> + <bool>false</bool> + </edit> + </match> + + <match target="font"> + <test name="family"> + <string>Bitstream Vera Serif</string> + </test> + <test name="pixelsize" compare="less"> + <double>7.5</double> + </test> + <edit name="hinting"> + <bool>false</bool> + </edit> + </match> + + <match target="font"> + <test name="family"> + <string>Bitstream Vera Sans Mono</string> + </test> + <test name="pixelsize" compare="less"> + <double>7.5</double> + </test> + <edit name="hinting"> + <bool>false</bool> + </edit> + </match> + +</fontconfig> diff --git a/fontconfig/conf.d/25-unhint-nonlatin.conf b/fontconfig/conf.d/25-unhint-nonlatin.conf new file mode 100644 index 000000000..ffb70c69f --- /dev/null +++ b/fontconfig/conf.d/25-unhint-nonlatin.conf @@ -0,0 +1,128 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + +<!-- We can't hint CJK fonts well, so turn off hinting for CJK fonts. --> + + <match target="font"> + <test name="family" compare="eq"> + <string>Kochi Mincho</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Kochi Gothic</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Sazanami Mincho</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Sazanami Gothic</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Baekmuk Batang</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Baekmuk Dotum</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Baekmuk Gulim</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>Baekmuk Headline</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL Mingti2L Big5</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL ShanHeiSun Uni</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL KaitiM Big5</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL ZenKai Uni</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL SungtiL GB</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>AR PL KaitiM GB</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + <match target="font"> + <test name="family" compare="eq"> + <string>ZYSong18030</string> + </test> + <edit name="hinting" mode="assign"> + <bool>false</bool> + </edit> + </match> + +</fontconfig> diff --git a/fontconfig/conf.d/30-metric-aliases.conf b/fontconfig/conf.d/30-metric-aliases.conf new file mode 100644 index 000000000..702a495ea --- /dev/null +++ b/fontconfig/conf.d/30-metric-aliases.conf @@ -0,0 +1,211 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + + <!-- Alias similar/metric-compatible families from various sources: + + PostScript fonts: + Helvetica + Times + Courier + URW fonts: + Nimbus Sans L + Nimbus Roman No9 L + Nimbus Mono L + + Microsoft fonts: + Arial + Times New Roman + Courier New + Liberation fonts: + Liberation Sans + Liberation Serif + Liberation Mono + StarOffice fonts: + Albany + Thorndale + Cumberland + AMT fonts: + Albany AMT + Thorndale AMT + Cumberland AMT + + Of these, URW fonts are design compatible with PostScrict fonts, + and the Liberation, StarOffice, and AMT ones are compatible with + Microsoft fonts. + + We want for each of them to fallback to any of these + available, but in an order preferring similar designs + first. We do this in three steps: + + 1) Alias each specific to it's generic family. + eg. Liberation Sans to Arial + + 2) Weak alias each generic to the other generic of its family. + eg. Arial to Helvetica + + 3) Alias each generic to its specifics. + eg. Arial to Liberation Sans, Albany, and Albany AMT + --> + +<!-- Map specifics to generics --> + + <!-- PostScript --> + <alias binding="same"> + <family>Nimbus Sans L</family> + <default> + <family>Helvetica</family> + </default> + </alias> + + <alias binding="same"> + <family>Nimbus Roman No9 L</family> + <default> + <family>Times</family> + </default> + </alias> + + <alias binding="same"> + <family>Nimbus Mono L</family> + <default> + <family>Courier</family> + </default> + </alias> + + + <!-- Microsoft --> + <alias binding="same"> + <family>Liberation Sans</family> + <family>Albany</family> + <family>Albany AMT</family> + <default> + <family>Arial</family> + </default> + </alias> + + <alias binding="same"> + <family>Liberation Serif</family> + <family>Thorndale</family> + <family>Thorndale AMT</family> + <default> + <family>Times New Roman</family> + </default> + </alias> + + <alias binding="same"> + <family>Liberation Mono</family> + <family>Cumberland</family> + <family>Cumberland AMT</family> + <default> + <family>Courier New</family> + </default> + </alias> + + + +<!-- Accept the other group as fallback --> + + + <!-- PostScript --> + <alias> + <family>Helvetica</family> + <default> + <family>Arial</family> + </default> + </alias> + + <alias> + <family>Times</family> + <default> + <family>Times New Roman</family> + </default> + </alias> + + <alias> + <family>Courier</family> + <default> + <family>Courier New</family> + </default> + </alias> + + + <!-- Microsoft --> + <alias> + <family>Arial</family> + <default> + <family>Helvetica</family> + </default> + </alias> + + <alias> + <family>Times New Roman</family> + <default> + <family>Times</family> + </default> + </alias> + + <alias> + <family>Courier New</family> + <default> + <family>Courier</family> + </default> + </alias> + + + +<!-- Map generics to specifics --> + + + <!-- PostScript --> + <alias binding="same"> + <family>Helvetica</family> + <accept> + <family>Nimbus Sans L</family> + </accept> + </alias> + + <alias binding="same"> + <family>Times</family> + <accept> + <family>Nimbus Roman No9 L</family> + </accept> + </alias> + + <alias binding="same"> + <family>Courier</family> + <accept> + <family>Nimbus Mono L</family> + </accept> + </alias> + + + <!-- Microsoft --> + <alias binding="same"> + <family>Arial</family> + <accept> + <family>Liberation Sans</family> + <family>Albany</family> + <family>Albany AMT</family> + </accept> + </alias> + + <alias binding="same"> + <family>Times New Roman</family> + <accept> + <family>Liberation Serif</family> + <family>Thorndale</family> + <family>Thorndale AMT</family> + </accept> + </alias> + + <alias binding="same"> + <family>Courier New</family> + <accept> + <family>Liberation Mono</family> + <family>Cumberland</family> + <family>Cumberland AMT</family> + </accept> + </alias> + + +</fontconfig> diff --git a/fontconfig/conf.d/30-urw-aliases.conf b/fontconfig/conf.d/30-urw-aliases.conf new file mode 100644 index 000000000..9d5920306 --- /dev/null +++ b/fontconfig/conf.d/30-urw-aliases.conf @@ -0,0 +1,40 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + URW provides metric and shape compatible fonts for some Adobe families. + Helvetica, Courier, and Times are handled in 30-metric-aliases.conf. + --> + <alias binding="same"> + <family>Avant Garde</family> + <accept><family>URW Gothic L</family></accept> + </alias> + <alias binding="same"> + <family>Bookman</family> + <accept><family>URW Bookman L</family></accept> + </alias> + <alias binding="same"> + <family>New Century Schoolbook</family> + <accept><family>Century Schoolbook L</family></accept> + </alias> + <alias binding="same"> + <family>Palatino</family> + <accept><family>URW Palladio L</family></accept> + </alias> + <alias binding="same"> + <family>Zapf Chancery</family> + <accept><family>URW Chancery L</family></accept> + </alias> + <alias binding="same"> + <family>Zapf Dingbats</family> + <accept><family>Dingbats</family></accept> + </alias> + <match target="pattern"> + <test name="family"> + <string>Symbol</string> + </test> + <edit name="family" mode="append" binding="same"> + <string>Standard Symbols L</string> + </edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/40-nonlatin.conf b/fontconfig/conf.d/40-nonlatin.conf new file mode 100644 index 000000000..a875db08c --- /dev/null +++ b/fontconfig/conf.d/40-nonlatin.conf @@ -0,0 +1,90 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + Mark common families with their generics so we'll get + something reasonable +--> + +<!-- + Serif faces + --> + <alias> + <family>Nazli</family> + <family>Lotoos</family> + <family>Mitra</family> + <family>Ferdosi</family> + <family>Badr</family> + <family>Zar</family> + <family>Titr</family> + <family>Jadid</family> + <family>Kochi Mincho</family> + <family>AR PL SungtiL GB</family> + <family>AR PL Mingti2L Big5</family> + <family>MS 明朝</family> + <family>UnBatang</family> + <family>Baekmuk Batang</family> + <family>MgOpen Canonica</family> + <family>Sazanami Mincho</family> + <family>AR PL ZenKai Uni</family> + <family>ZYSong18030</family> + <family>FreeSerif</family> + <default><family>serif</family></default> + </alias> +<!-- + Sans-serif faces + --> + <alias> + <family>Arshia</family> + <family>Elham</family> + <family>Farnaz</family> + <family>Nasim</family> + <family>Sina</family> + <family>Roya</family> + <family>Koodak</family> + <family>Terafik</family> + <family>Kochi Gothic</family> + <family>AR PL KaitiM GB</family> + <family>AR PL KaitiM Big5</family> + <family>MS ゴシック</family> + <family>UnDotum</family> + <family>Baekmuk Dotum</family> + <family>SimSun</family> + <family>MgOpen Modata</family> + <family>Sazanami Gothic</family> + <family>AR PL ShanHeiSun Uni</family> + <family>ZYSong18030</family> + <family>FreeSans</family> + <default><family>sans-serif</family></default> + </alias> +<!-- + Monospace faces + --> + <alias> + <family>NSimSun</family> + <family>ZYSong18030</family> + <family>FreeMono</family> + <default><family>monospace</family></default> + </alias> + +<!-- + Fantasy faces + --> + <alias> + <family>Homa</family> + <family>Kamran</family> + <family>Fantezi</family> + <family>Tabassom</family> + <default><family>fantasy</family></default> + </alias> + +<!-- + Cursive faces + --> + <alias> + <family>IranNastaliq</family> + <family>Nafees Nastaleeq</family> + <default><family>cursive</family></default> + </alias> + +</fontconfig> diff --git a/fontconfig/conf.d/45-latin.conf b/fontconfig/conf.d/45-latin.conf new file mode 100644 index 000000000..7e4126468 --- /dev/null +++ b/fontconfig/conf.d/45-latin.conf @@ -0,0 +1,77 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + Mark common families with their generics so we'll get + something reasonable +--> + +<!-- + Serif faces + --> + <alias> + <family>Bitstream Vera Serif</family> + <family>DejaVu Serif</family> + <family>Liberation Serif</family> + <family>Times New Roman</family> + <family>Times</family> + <family>Nimbus Roman No9 L</family> + <family>Luxi Serif</family> + <family>Thorndale AMT</family> + <family>Thorndale</family> + <default><family>serif</family></default> + </alias> +<!-- + Sans-serif faces + --> + <alias> + <family>Bitstream Vera Sans</family> + <family>DejaVu Sans</family> + <family>Liberation Sans</family> + <family>Arial</family> + <family>Helvetica</family> + <family>Verdana</family> + <family>Albany AMT</family> + <family>Albany</family> + <family>Nimbus Sans L</family> + <family>Luxi Sans</family> + <default><family>sans-serif</family></default> + </alias> +<!-- + Monospace faces + --> + <alias> + <family>Bitstream Vera Sans Mono</family> + <family>DejaVu Sans Mono</family> + <family>Liberation Mono</family> + <family>Inconsolata</family> + <family>Courier New</family> + <family>Courier</family> + <family>Andale Mono</family> + <family>Luxi Mono</family> + <family>Cumberland AMT</family> + <family>Cumberland</family> + <family>Nimbus Mono L</family> + <default><family>monospace</family></default> + </alias> +<!-- + Fantasy faces + --> + <alias> + <family>Impact</family> + <family>Copperplate Gothic Std</family> + <family>Cooper Std</family> + <family>Bauhaus Std</family> + <default><family>fantasy</family></default> + </alias> +<!-- + Cursive faces + --> + <alias> + <family>ITC Zapf Chancery Std</family> + <family>Zapfino</family> + <family>Comic Sans MS</family> + <default><family>cursive</family></default> + </alias> + +</fontconfig> diff --git a/fontconfig/conf.d/49-sansserif.conf b/fontconfig/conf.d/49-sansserif.conf new file mode 100644 index 000000000..c6209a7d3 --- /dev/null +++ b/fontconfig/conf.d/49-sansserif.conf @@ -0,0 +1,21 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + If the font still has no generic name, add sans-serif + --> + <match target="pattern"> + <test qual="all" name="family" compare="not_eq"> + <string>sans-serif</string> + </test> + <test qual="all" name="family" compare="not_eq"> + <string>serif</string> + </test> + <test qual="all" name="family" compare="not_eq"> + <string>monospace</string> + </test> + <edit name="family" mode="append_last"> + <string>sans-serif</string> + </edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/50-user.conf b/fontconfig/conf.d/50-user.conf new file mode 100644 index 000000000..3f8901296 --- /dev/null +++ b/fontconfig/conf.d/50-user.conf @@ -0,0 +1,7 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <!-- Load per-user customization file --> + <include ignore_missing="yes">~/.fonts.conf.d</include> + <include ignore_missing="yes">~/.fonts.conf</include> +</fontconfig> diff --git a/fontconfig/conf.d/51-local.conf b/fontconfig/conf.d/51-local.conf new file mode 100644 index 000000000..ca9fbe195 --- /dev/null +++ b/fontconfig/conf.d/51-local.conf @@ -0,0 +1,6 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <!-- Load local system customization file --> + <include ignore_missing="yes">local.conf</include> +</fontconfig> diff --git a/fontconfig/conf.d/60-latin.conf b/fontconfig/conf.d/60-latin.conf new file mode 100644 index 000000000..2107e31e4 --- /dev/null +++ b/fontconfig/conf.d/60-latin.conf @@ -0,0 +1,70 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <alias> + <family>serif</family> + <prefer> + <family>Bitstream Vera Serif</family> + <family>DejaVu Serif</family> + <family>Times New Roman</family> + <family>Thorndale AMT</family> + <family>Luxi Serif</family> + <family>Nimbus Roman No9 L</family> + <family>Times</family> + </prefer> + </alias> + <alias> + <family>sans-serif</family> + <prefer> + <family>Bitstream Vera Sans</family> + <family>DejaVu Sans</family> + <family>Verdana</family> + <family>Arial</family> + <family>Albany AMT</family> + <family>Luxi Sans</family> + <family>Nimbus Sans L</family> + <family>Helvetica</family> + <family>Lucida Sans Unicode</family> + <family>BPG Glaho International</family> <!-- lat,cyr,arab,geor --> + <family>Tahoma</family> <!-- lat,cyr,greek,heb,arab,thai --> + </prefer> + </alias> + <alias> + <family>monospace</family> + <prefer> + <family>Bitstream Vera Sans Mono</family> + <family>DejaVu Sans Mono</family> + <family>Inconsolata</family> + <family>Andale Mono</family> + <family>Courier New</family> + <family>Cumberland AMT</family> + <family>Luxi Mono</family> + <family>Nimbus Mono L</family> + <family>Courier</family> + </prefer> + </alias> +<!-- + Fantasy faces + --> + <alias> + <family>fantasy</family> + <prefer> + <family>Impact</family> + <family>Copperplate Gothic Std</family> + <family>Cooper Std</family> + <family>Bauhaus Std</family> + </prefer> + </alias> +<!-- + Cursive faces + --> + <alias> + <family>cursive</family> + <prefer> + <family>ITC Zapf Chancery Std</family> + <family>Zapfino</family> + <family>Comic Sans MS</family> + </prefer> + </alias> + +</fontconfig> diff --git a/fontconfig/conf.d/65-fonts-persian.conf b/fontconfig/conf.d/65-fonts-persian.conf new file mode 100644 index 000000000..0033675a4 --- /dev/null +++ b/fontconfig/conf.d/65-fonts-persian.conf @@ -0,0 +1,419 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<!-- + fonts-persian.conf + To configure Persian fonts from The FarsiWeb Project. + + Copyright (C) 2005 Sharif FarsiWeb, Inc. <license@farsiweb.info> + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Sharif FarsiWeb, Inc. not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Sharif FarsiWeb, Inc. makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + SHARIF FARSIWEB, INC. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + + ChangeLog: + 2005-04-03 Behdad Esfahbod: Initial revision. + 2005-10-09 Behdad Esfahbod: Turned off back-slant and Tahoma sections. + 2005-11-30 Behdad Esfahbod: Set Titr susbtitution size to 24 points. + 2008 Behdad Esfahbod: Cleanup. Add fantasy and cursive. + --> +<fontconfig> + + +<!-- Deprecated fonts are discouraged --> + + <!-- Nesf[2] is officially deprecated and has problematic tables --> + <alias binding="same"> + <family>Nesf</family> + <accept><family>Nesf2</family></accept> + </alias> + <alias binding="same"> + <family>Nesf2</family> + <accept><family>Persian_sansserif_default</family></accept> + </alias> + +<!-- Name changes and spelling variant aliases --> + + <alias binding="same"> + <family>Nazanin</family> + <accept><family>Nazli</family></accept> + </alias> + <alias binding="same"> + <family>Lotus</family> + <accept><family>Lotoos</family></accept> + </alias> + <alias binding="same"> + <family>Yaqut</family> + <accept><family>Yaghoot</family></accept> + </alias> + <alias binding="same"> + <family>Yaghut</family> + <accept><family>Yaghoot</family></accept> + </alias> + <alias binding="same"> + <family>Traffic</family> + <accept><family>Terafik</family></accept> + </alias> + <alias binding="same"> + <family>Ferdowsi</family> + <accept><family>Ferdosi</family></accept> + </alias> + <alias binding="same"> + <family>Fantezy</family> + <accept><family>Fantezi</family></accept> + </alias> + + +<!-- Classify fonts. --> + + <!-- Persian_title class --> + <alias binding="same"> + <family>Jadid</family> + <accept><family>Persian_title</family></accept> + </alias> + <alias binding="same"> + <family>Titr</family> + <accept><family>Persian_title</family></accept> + </alias> + + <!-- Persian_fantasy class --> + <alias binding="same"> + <family>Kamran</family> + <accept> + <family>Persian_fantasy</family> + <family>Homa</family> + </accept> + </alias> + <alias binding="same"> + <family>Homa</family> + <accept> + <family>Persian_fantasy</family> + <family>Kamran</family> + </accept> + </alias> + <alias binding="same"> + <family>Fantezi</family> + <accept><family>Persian_fantasy</family></accept> + </alias> + <alias binding="same"> + <family>Tabassom</family> + <accept><family>Persian_fantasy</family></accept> + </alias> + + <!-- Persian_square class --> + <alias binding="same"> + <family>Arshia</family> + <accept><family>Persian_square</family></accept> + </alias> + <alias binding="same"> + <family>Nasim</family> + <accept><family>Persian_square</family></accept> + </alias> + <alias binding="same"> + <family>Elham</family> + <accept> + <family>Persian_square</family> + <family>Farnaz</family> + </accept> + </alias> + <alias binding="same"> + <family>Farnaz</family> + <accept> + <family>Persian_square</family> + <family>Elham</family> + </accept> + </alias> + <alias binding="same"> + <family>Sina</family> + <accept><family>Persian_square</family></accept> + </alias> + +<!-- Font ordering per class --> + + <!-- Persian_title class --> + <alias binding="same"> + <family>Persian_title</family> + <accept> + <family>Titr</family> + <family>Jadid</family> + <family>Persian_serif</family> + </accept> + </alias> + + <!-- Persian_fantasy class --> + <alias binding="same"> + <family>Persian_fantasy</family> + <accept> + <family>Homa</family> + <family>Kamran</family> + <family>Fantezi</family> + <family>Tabassom</family> + <family>Persian_square</family> + </accept> + </alias> + + <!-- Persian_square class --> + <alias binding="same"> + <family>Persian_square</family> + <accept> + <family>Arshia</family> + <family>Elham</family> + <family>Farnaz</family> + <family>Nasim</family> + <family>Sina</family> + <family>Persian_serif</family> + </accept> + </alias> + +<!-- Register the fonts that we actually do have --> + + <match target="scan"> + <test name="family"> + <string>Elham</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Homa</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Koodak</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Nazli</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Roya</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Terafik</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + <match target="scan"> + <test name="family"> + <string>Titr</string> + </test> + <edit name="foundry"> + <string>farsiweb</string> + </edit> + </match> + + +<!-- Our fonts should oblique to the other side (TURNED-OFF) --> + + <match target="font"> + <test name="foundry"> + <!--string>farsiweb</string--> + <string>TURNED-OFF</string> + </test> + <test name="foundry"> + <string>farsiweb</string> + </test> + <!-- check to see if the font is roman --> + <test name="slant"> + <const>roman</const> + </test> + <!-- check to see if the pattern requested non-roman --> + <test target="pattern" name="slant" compare="not_eq"> + <const>roman</const> + </test> + <!-- multiply the matrix to slant the font --> + <edit name="matrix" mode="assign"> + <times> + <name>matrix</name> + <matrix><double>1</double><double>-0.2</double> + <double>0</double><double>1</double> + </matrix> + </times> + </edit> + <!-- pretend the font is oblique now --> + <edit name="slant" mode="assign"> + <const>oblique</const> + </edit> + </match> + + +<!-- + We can't hint our fonts well, so turn off hinting. + Moreover, the bitmaps we have designed (well, they + have designed), suck, so disable them too. + --> + + <match target="font"> + <test name="foundry"> + <string>farsiweb</string> + </test> + <edit name="autohint"> + <bool>false</bool> + </edit> + <edit name="hinting"> + <bool>false</bool> + </edit> + <edit name="embeddedbitmap"> + <bool>false</bool> + </edit> + </match> + + +<!-- Alias our fonts to common families --> + + <!-- Persian serif fonts --> + <alias> + <family>serif</family> + <accept> + <family>Nazli</family> + <family>Lotoos</family> + <family>Mitra</family> + <family>Ferdosi</family> + <family>Badr</family> + <family>Zar</family> + </accept> + </alias> + + <!-- Persian sans-serif fonts --> + <alias> + <family>sans-serif</family> + <accept> + <family>Roya</family> + <family>Koodak</family> + <family>Terafik</family> + </accept> + </alias> + + <!-- Persian monospace fonts --> + <alias> + <family>monospace</family> + <accept> + <!-- Not really monospace --> + <family>Terafik</family> + </accept> + </alias> + + <!-- Persian fantasy fonts --> + <alias> + <family>fantasy</family> + <accept> + <family>Homa</family> + <family>Kamran</family> + <family>Fantezi</family> + <family>Tabassom</family> + </accept> + </alias> + + <!-- Persian (and Urdu) Nastaliq/cursive fonts --> + <alias> + <family>cursive</family> + <accept> + <family>IranNastaliq</family> + <family>Nafees Nastaleeq</family> + </accept> + </alias> + +<!-- Use Titr in titles --> + + <!-- Both serif... --> + <match> + <test name="family"> + <string>serif</string> + </test> + <test name="weight" compare="more_eq"> + <int>200</int> + </test> + <test name="size" compare="more_eq"> + <double>24</double> + </test> + <edit name="family" mode="prepend"> + <string>Titr</string> + </edit> + </match> + + <!-- and sans-serif. --> + <match> + <test name="family"> + <string>sans-serif</string> + </test> + <test name="weight" compare="more_eq"> + <int>200</int> + </test> + <test name="size" compare="more_eq"> + <double>24</double> + </test> + <edit name="family" mode="prepend"> + <string>Titr</string> + </edit> + </match> + + <!-- and more. --> + <match> + <test name="family"> + <string>Persian_sansserif_default</string> + </test> + <test name="weight" compare="more_eq"> + <int>200</int> + </test> + <test name="size" compare="more_eq"> + <double>24</double> + </test> + <edit name="family" mode="prepend" binding="same"> + <string>Titr</string> + </edit> + </match> + + +<!-- Default substituted for deprecated sans-serif fonts --> + + <match> + <test name="family"> + <string>Persian_sansserif_default</string> + </test> + <edit name="family" mode="assign" binding="same"> + <string>Roya</string> + </edit> + </match> + +</fontconfig> diff --git a/fontconfig/conf.d/65-khmer.conf b/fontconfig/conf.d/65-khmer.conf new file mode 100644 index 000000000..f9d06f2a9 --- /dev/null +++ b/fontconfig/conf.d/65-khmer.conf @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <alias> + <family>serif</family> + <prefer> + <family>Khmer OS"</family> + </prefer> + </alias> + <alias> + <family>sans-serif</family> + <prefer> + <family>Khmer OS"</family> + </prefer> + </alias> +</fontconfig> diff --git a/fontconfig/conf.d/65-nonlatin.conf b/fontconfig/conf.d/65-nonlatin.conf new file mode 100644 index 000000000..53ac064b0 --- /dev/null +++ b/fontconfig/conf.d/65-nonlatin.conf @@ -0,0 +1,195 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <alias> + <family>serif</family> + <prefer> + <family>Artsounk</family> <!-- armenian --> + <family>BPG UTF8 M</family> <!-- georgian --> + <family>Kinnari</family> <!-- thai --> + <family>Norasi</family> <!-- thai --> + <family>Frank Ruehl</family> <!-- hebrew --> + <family>Dror</family> <!-- hebrew --> + <family>JG LaoTimes</family> <!-- lao --> + <family>Saysettha Unicode</family> <!-- lao --> + <family>Pigiarniq</family> <!-- canadian syllabics --> + <family>B Davat</family> <!-- arabic (fa) --> + <family>B Compset</family> <!-- arabic (fa) --> + <family>Kacst-Qr</family> <!-- arabic (ar) --> + <family>Urdu Nastaliq Unicode</family> <!-- arabic (ur) --> + <family>Raghindi</family> <!-- devanagari --> + <family>Mukti Narrow</family> <!-- bengali --> + <family>malayalam</family> <!-- malayalam --> + <family>Sampige</family> <!-- kannada --> + <family>padmaa</family> <!-- gujarati --> + <family>Hapax Berbère</family> <!-- tifinagh --> + <family>MS Gothic</family> <!-- han (ja) --> + <family>UmePlus P Gothic</family> <!-- han (ja) --> + <family>SimSun</family> <!-- han (zh-cn,zh-tw) --> + <family>PMingLiu</family> <!-- han (zh-tw) --> + <family>WenQuanYi Zen Hei</family> <!-- han (zh-cn,zh-tw) --> + <family>WenQuanYi Bitmap Song</family> <!-- han (zh-cn,zh-tw) --> + <family>AR PL ShanHeiSun Uni</family> <!-- han (ja,zh-cn,zh-tw) --> + <family>AR PL New Sung</family> <!-- han (zh-cn,zh-tw) --> + <family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) --> + <family>HanyiSong</family> <!-- han (zh-cn,zh-tw) --> + <family>MgOpen Canonica</family> + <family>Sazanami Mincho</family> + <family>IPAMonaMincho</family> + <family>IPAMincho</family> + <family>Kochi Mincho</family> + <family>AR PL SungtiL GB</family> + <family>AR PL Mingti2L Big5</family> + <family>AR PL Zenkai Uni</family> + <family>MS 明朝</family> + <family>ZYSong18030</family> + <family>UnBatang</family> + <family>Baekmuk Batang</family> + <family>KacstQura</family> + <family>Frank Ruehl CLM</family> + <family>Lohit Bengali</family> + <family>Lohit Gujarati</family> + <family>Lohit Hindi</family> + <family>Lohit Marathi</family> + <family>Lohit Maithili</family> + <family>Lohit Kashmiri</family> + <family>Lohit Konkani</family> + <family>Lohit Nepali</family> + <family>Lohit Sindhi</family> + <family>Lohit Punjabi</family> + <family>Lohit Tamil</family> + <family>Meera</family> + <family>Lohit Malayalam</family> + <family>Lohit Kannada</family> + <family>Lohit Telugu</family> + <family>Lohit Oriya</family> + <family>LKLUG</family> + </prefer> + </alias> + <alias> + <family>sans-serif</family> + <prefer> + <family>Nachlieli</family> <!-- hebrew --> + <family>Lucida Sans Unicode</family> + <family>Yudit Unicode</family> + <family>Kerkis</family> <!-- greek --> + <family>ArmNet Helvetica</family> <!-- armenian --> + <family>Artsounk</family> <!-- armenian --> + <family>BPG UTF8 M</family> <!-- georgian --> + <family>Waree</family> <!-- thai --> + <family>Loma</family> <!-- thai --> + <family>Garuda</family> <!-- thai --> + <family>Umpush</family> <!-- thai --> + <family>Saysettha Unicode</family> <!-- lao? --> + <family>JG Lao Old Arial</family> <!-- lao --> + <family>GF Zemen Unicode</family> <!-- ethiopic --> + <family>Pigiarniq</family> <!-- canadian syllabics --> + <family>B Davat</family> <!-- arabic (fa) --> + <family>B Compset</family> <!-- arabic (fa) --> + <family>Kacst-Qr</family> <!-- arabic (ar) --> + <family>Urdu Nastaliq Unicode</family> <!-- arabic (ur) --> + <family>Raghindi</family> <!-- devanagari --> + <family>Mukti Narrow</family> <!-- bengali --> + <family>malayalam</family> <!-- malayalam --> + <family>Sampige</family> <!-- kannada --> + <family>padmaa</family> <!-- gujarati --> + <family>Hapax Berbère</family> <!-- tifinagh --> + <family>MS Gothic</family> <!-- han (ja) --> + <family>UmePlus P Gothic</family> <!-- han (ja) --> + <!-- chinese fonts are actually serifed --> + <family>SimSun</family> <!-- han (zh-cn,zh-tw) --> + <family>PMingLiu</family> <!-- han (zh-tw) --> + <family>WenQuanYi Zen Hei</family> <!-- han (zh-cn,zh-tw) --> + <family>WenQuanYi Bitmap Song</family> <!-- han (zh-cn,zh-tw) --> + <family>AR PL ShanHeiSun Uni</family> <!--han (ja,zh-cn,zh-tw) --> + <family>AR PL New Sung</family> <!-- han (zh-cn,zh-tw) --> + <family>MgOpen Modata</family> + <family>VL Gothic</family> + <family>IPAMonaGothic</family> + <family>IPAGothic</family> + <family>Sazanami Gothic</family> + <family>Kochi Gothic</family> + <family>AR PL KaitiM GB</family> + <family>AR PL KaitiM Big5</family> + <family>AR PL ShanHeiSun Uni</family> + <family>AR PL SungtiL GB</family> + <family>AR PL Mingti2L Big5</family> + <family>MS ゴシック</family> + <family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) --> + <family>TSCu_Paranar</family> <!-- tamil --> + <family>UnDotum</family> + <family>Baekmuk Dotum</family> + <family>Baekmuk Gulim</family> + <family>KacstQura</family> + <family>Lohit Bengali</family> + <family>Lohit Gujarati</family> + <family>Lohit Hindi</family> + <family>Lohit Marathi</family> + <family>Lohit Maithili</family> + <family>Lohit Kashmiri</family> + <family>Lohit Konkani</family> + <family>Lohit Nepali</family> + <family>Lohit Sindhi</family> + <family>Lohit Punjabi</family> + <family>Lohit Tamil</family> + <family>Meera</family> + <family>Lohit Malayalam</family> + <family>Lohit Kannada</family> + <family>Lohit Telugu</family> + <family>Lohit Oriya</family> + <family>LKLUG</family> + </prefer> + </alias> + <alias> + <family>monospace</family> + <prefer> + <family>Miriam Mono</family> <!-- hebrew --> + <family>VL Gothic</family> + <family>IPAMonaGothic</family> + <family>IPAGothic</family> + <family>Sazanami Gothic</family> + <family>Kochi Gothic</family> + <family>AR PL KaitiM GB</family> + <family>MS Gothic</family> <!-- han (ja) --> + <family>UmePlus Gothic</family> <!-- han (ja) --> + <family>NSimSun</family> <!-- han (zh-cn,zh-tw) --> + <family>MingLiu</family> <!-- han (zh-tw) --> + <family>AR PL ShanHeiSun Uni</family> <!-- han (ja,zh-cn,zh-tw) --> + <family>AR PL New Sung Mono</family> <!-- han (zh-cn,zh-tw) --> + <family>HanyiSong</family> <!-- han (zh-cn) --> + <family>AR PL SungtiL GB</family> + <family>AR PL Mingti2L Big5</family> + <family>ZYSong18030</family> <!-- han (zh-cn,zh-tw) --> + <family>UnBatang</family> + <family>UnDotum</family> + <family>Baekmuk Batang</family> <!-- hangul --> + <family>Baekmuk Dotum</family> + <family>Baekmuk Gulim</family> + <family>TlwgTypo</family> <!-- thai --> + <family>TlwgTypist</family> <!-- thai --> + <family>TlwgTypewriter</family> <!-- thai --> + <family>TlwgMono</family> <!-- thai --> + <family>Hasida</family> <!-- hebrew --> + <family>Mitra Mono</family> <!-- bengali --> + <family>GF Zemen Unicode</family> <!-- ethiopic --> + <family>Hapax Berbère</family> <!-- tifinagh --> + <family>Lohit Bengali</family> + <family>Lohit Gujarati</family> + <family>Lohit Hindi</family> + <family>Lohit Marathi</family> + <family>Lohit Maithili</family> + <family>Lohit Kashmiri</family> + <family>Lohit Konkani</family> + <family>Lohit Nepali</family> + <family>Lohit Sindhi</family> + <family>Lohit Punjabi</family> + <family>Lohit Tamil</family> + <family>Meera</family> + <family>Lohit Malayalam</family> + <family>Lohit Kannada</family> + <family>Lohit Telugu</family> + <family>Lohit Oriya</family> + <family>LKLUG</family> + </prefer> + </alias> +</fontconfig> diff --git a/fontconfig/conf.d/69-unifont.conf b/fontconfig/conf.d/69-unifont.conf new file mode 100644 index 000000000..177dec5d4 --- /dev/null +++ b/fontconfig/conf.d/69-unifont.conf @@ -0,0 +1,28 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <alias> + <family>serif</family> + <prefer> + <family>FreeSerif</family> + <family>Code2000</family> + <family>Code2001</family> <!-- plane1 and beyond --> + </prefer> + </alias> + <alias> + <family>sans-serif</family> + <prefer> + <family>FreeSans</family> + <family>Arial Unicode MS</family> + <family>Arial Unicode</family> + <family>Code2000</family> <!-- almost everything; serif actually --> + <family>Code2001</family> <!-- plane1 and beyond --> + </prefer> + </alias> + <alias> + <family>monospace</family> + <prefer> + <family>FreeMono</family> + </prefer> + </alias> +</fontconfig> diff --git a/fontconfig/conf.d/70-no-bitmaps.conf b/fontconfig/conf.d/70-no-bitmaps.conf new file mode 100644 index 000000000..6b506e82a --- /dev/null +++ b/fontconfig/conf.d/70-no-bitmaps.conf @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Reject bitmap fonts --> + <selectfont> + <rejectfont> + <pattern> + <patelt name="scalable"><bool>false</bool></patelt> + </pattern> + </rejectfont> + </selectfont> +</fontconfig> diff --git a/fontconfig/conf.d/70-yes-bitmaps.conf b/fontconfig/conf.d/70-yes-bitmaps.conf new file mode 100644 index 000000000..c153aebdc --- /dev/null +++ b/fontconfig/conf.d/70-yes-bitmaps.conf @@ -0,0 +1,12 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Accept bitmap fonts --> + <selectfont> + <acceptfont> + <pattern> + <patelt name="scalable"><bool>false</bool></patelt> + </pattern> + </acceptfont> + </selectfont> +</fontconfig> diff --git a/fontconfig/conf.d/80-delicious.conf b/fontconfig/conf.d/80-delicious.conf new file mode 100644 index 000000000..728f50cae --- /dev/null +++ b/fontconfig/conf.d/80-delicious.conf @@ -0,0 +1,19 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- Fix-ups for Delicious family --> + +<!-- Delicious 'heavy' variant says its Medium weight --> +<match target="scan"> + <test name="family"> + <string>Delicious</string> + </test> + <test name="style"> + <string>Heavy</string> + </test> + <edit name="weight"> + <const>heavy</const> + </edit> +</match> + +</fontconfig> diff --git a/fontconfig/conf.d/90-synthetic.conf b/fontconfig/conf.d/90-synthetic.conf new file mode 100644 index 000000000..b8d1e85e1 --- /dev/null +++ b/fontconfig/conf.d/90-synthetic.conf @@ -0,0 +1,64 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> +<!-- + Artificial oblique for fonts without an italic or oblique version + --> + + <match target="font"> + <!-- check to see if the font is roman --> + <test name="slant"> + <const>roman</const> + </test> + <!-- check to see if the pattern requested non-roman --> + <test target="pattern" name="slant" compare="not_eq"> + <const>roman</const> + </test> + <!-- multiply the matrix to slant the font --> + <edit name="matrix" mode="assign"> + <times> + <name>matrix</name> + <matrix><double>1</double><double>0.2</double> + <double>0</double><double>1</double> + </matrix> + </times> + </edit> + <!-- pretend the font is oblique now --> + <edit name="slant" mode="assign"> + <const>oblique</const> + </edit> + <!-- and disable embedded bitmaps for artificial oblique --> + <edit name="embeddedbitmap" mode="assign"> + <bool>false</bool> + </edit> + </match> + +<!-- + Synthetic emboldening for fonts that do not have bold face available + --> + + <match target="font"> + <!-- check to see if the font is just regular --> + <test name="weight" compare="less_eq"> + <const>medium</const> + </test> + <!-- check to see if the pattern requests bold --> + <test target="pattern" name="weight" compare="more"> + <const>medium</const> + </test> + <!-- + set the embolden flag + needed for applications using cairo, e.g. gucharmap, gedit, ... + --> + <edit name="embolden" mode="assign"> + <bool>true</bool> + </edit> + <!-- + set weight to bold + needed for applications using Xft directly, e.g. Firefox, ... + --> + <edit name="weight" mode="assign"> + <const>bold</const> + </edit> + </match> +</fontconfig> diff --git a/fontconfig/conf.d/Makefile.am b/fontconfig/conf.d/Makefile.am new file mode 100644 index 000000000..bff1171c1 --- /dev/null +++ b/fontconfig/conf.d/Makefile.am @@ -0,0 +1,96 @@ +# +# fontconfig/conf.d/Makefile.am +# +# Copyright © 2005 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOC_FILES= \ + README + +CONF_FILES = \ + 10-autohint.conf \ + 10-no-sub-pixel.conf \ + 10-sub-pixel-bgr.conf \ + 10-sub-pixel-rgb.conf \ + 10-sub-pixel-vbgr.conf \ + 10-sub-pixel-vrgb.conf \ + 10-unhinted.conf \ + 20-fix-globaladvance.conf \ + 20-unhint-small-vera.conf \ + 25-unhint-nonlatin.conf \ + 30-urw-aliases.conf \ + 30-metric-aliases.conf \ + 40-nonlatin.conf \ + 45-latin.conf \ + 49-sansserif.conf \ + 50-user.conf \ + 51-local.conf \ + 60-latin.conf \ + 65-fonts-persian.conf \ + 65-khmer.conf \ + 65-nonlatin.conf \ + 69-unifont.conf \ + 70-no-bitmaps.conf \ + 70-yes-bitmaps.conf \ + 80-delicious.conf \ + 90-synthetic.conf + +CONF_LINKS = \ + 20-fix-globaladvance.conf \ + 20-unhint-small-vera.conf \ + 30-urw-aliases.conf \ + 30-metric-aliases.conf \ + 40-nonlatin.conf \ + 45-latin.conf \ + 49-sansserif.conf \ + 50-user.conf \ + 51-local.conf \ + 60-latin.conf \ + 65-fonts-persian.conf \ + 65-nonlatin.conf \ + 69-unifont.conf \ + 80-delicious.conf \ + 90-synthetic.conf + +EXTRA_DIST = $(CONF_FILES) $(DOC_FILES) + +configdir=$(CONFDIR) +confavaildir=$(configdir)/conf.avail +confddir=$(configdir)/conf.d + +confavail_DATA=$(CONF_FILES) +confd_DATA=$(DOC_FILES) + +install-data-local: + mkdir -p ${DESTDIR}${confddir} + @(echo cd ${DESTDIR}${confddir}; \ + cd ${DESTDIR}${confddir}; \ + for i in ${CONF_LINKS}; do \ + rm -f $$i; \ + echo rm -f $$i";" ln -s ../conf.avail/$$i .; \ + ln -s ../conf.avail/$$i .; \ + done) +uninstall-local: + @(echo cd ${DESTDIR}${confddir}; \ + cd ${DESTDIR}${confddir}; \ + for i in ${CONF_LINKS}; do \ + echo rm -f $$i; \ + rm -f $$i; \ + done) diff --git a/fontconfig/conf.d/README b/fontconfig/conf.d/README new file mode 100644 index 000000000..c2fb52c3b --- /dev/null +++ b/fontconfig/conf.d/README @@ -0,0 +1,23 @@ +conf.d/README + +Each file in this directory is a fontconfig configuration file. Fontconfig +scans this directory, loading all files of the form [0-9][0-9]*.conf. +These files are normally installed in ../conf.avail and then symlinked here, +allowing them to be easily installed and then enabled/disabled by adjusting +the symlinks. + +The files are loaded in numeric order, the structure of the configuration +has led to the following conventions in usage: + + Files begining with: Contain: + + 00 through 09 Font directories + 10 through 19 system rendering defaults (AA, etc) + 20 through 29 font rendering options + 30 through 39 family substitution + 40 through 49 generic identification, map family->generic + 50 through 59 alternate config file loading + 60 through 69 generic aliases, map generic->family + 70 through 79 select font (adjust which fonts are available) + 80 through 89 match target="scan" (modify scanned patterns) + 90 through 99 font synthesis diff --git a/fontconfig/config/Makedefs.in b/fontconfig/config/Makedefs.in new file mode 100644 index 000000000..da156b6f2 --- /dev/null +++ b/fontconfig/config/Makedefs.in @@ -0,0 +1,76 @@ +# +# fontconfig/config/Makedefs.in +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +SHELL = @SHELL@ + +srcdir=@srcdir@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +bindir=@bindir@ +datadir=@datadir@ +includedir=@includedir@ +sysconfdir=@sysconfdir@ +confdir=@confdir@ + +DSO_LDOPTS=@DSO_LDOPTS@ +DSO_CFLAGS=@DSO_CFLAGS@ +DSO_PIC_CFLAGS=@DSO_PIC_CFLAGS@ + +INSTALL=@INSTALL@ +INSTALL_PROGRAM=@INSTALL_PROGRAM@ +INSTALL_SCRIPT=@INSTALL_SCRIPT@ +INSTALL_DATA=@INSTALL_DATA@ +MKSHLIB=@MKSHLIB@ +LN_S=@LN_S@ + +# shared libraries +LIBDIR=$(libdir) +# programs +BINDIR=$(bindir) +# font configuration files +CONFDIR=@CONFDIR@ +# include files +INCLUDEDIR=$(includedir)/fontconfig + +X_FONT_DIR=@X_FONT_DIR@ +FC_DEFAULT_FONTS=@FC_DEFAULT_FONTS@ +FCPATH_DEF=-DFONTCONFIG_PATH=\"$(CONFDIR)\" + +CDEBUGFLAGS=@CFLAGS@ + +INCLUDES=-I$(TOPDIR) -I$(srcdir) @CPPFLAGS@ + +CFLAGS=$(CDEBUGFLAGS) @DEFS@ $(FCPATH_DEF) $(INCLUDES) + +LIBBASE=libfontconfig.so +LIBFILE=$(LIBBASE).@PACKAGE_MAJOR@.@PACKAGE_MINOR@ +LIBMAJOR=$(LIBBASE).@PACKAGE_MAJOR@ + +LIBFONTCONFIG=-L$(SRCDIR) -lfontconfig + +SRCDIR=$(TOPDIR)/src + +INCDIR=$(TOPDIR)/fontconfig +HEADERS=$(INCDIR)/fontconfig.h $(INCDIR)/fcfreetype.h $(INCDIR)/fcprivate.h diff --git a/fontconfig/config/config-subst b/fontconfig/config/config-subst new file mode 100644 index 000000000..5907e0328 --- /dev/null +++ b/fontconfig/config/config-subst @@ -0,0 +1,10 @@ +#!/bin/sh +script=config-subst.$$ +trap "rm $script" 0 +rm -f $script +for i in ${1+"$@"}; do + var="`echo "$i" | sed 's/=.*$//'`" + val="`echo "$i" | sed 's/^[^=]*=//'`" + echo "s;@$var@;$val;" >> $script +done +sed -f $script diff --git a/fontconfig/config/config.guess b/fontconfig/config/config.guess new file mode 100644 index 000000000..c38553dc7 --- /dev/null +++ b/fontconfig/config/config.guess @@ -0,0 +1,1497 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2006-02-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 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner <per@bothner.com>. +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +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 <config-patches@gnu.org>." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) 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 __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + 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:SunOS:5.*:*) + echo i386-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 <stdio.h> /* 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 <sys/systemcfg.h> + + 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:*:[45]) + 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 <stdlib.h> + #include <unistd.h> + + 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 __LP64__ >/dev/null + 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 <unistd.h> + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:MSYS_NT-*:*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + x86:Interix*:[345]*) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + EM64T:Interix*:[345]*) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^CPU/{ + s: ::g + p + }'`" + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + 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 ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${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-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include <features.h> + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__sun) + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' + /^LIBC/{ + s: ::g + p + }'`" + test x"${LIBC}" != x && { + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit + } + test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; 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.0*:*) + 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' </usr/options/cb.name` + echo ${UNAME_MACHINE}-pc-isc$UNAME_REL + elif /bin/uname -X 2>/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 i386. + echo i386-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; } ;; + 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.0*:*) + 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 <Richard.M.Bartel@ccMail.Census.GOV> + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes <hewes@openmarket.com>. + # 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 ;; + 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 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c <<EOF +#ifdef _SEQUENT_ +# include <sys/types.h> +# include <sys/utsname.h> +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include <sys/param.h> + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include <sys/param.h> +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 <<EOF +$0: unable to guess system type + +This script, last modified $timestamp, has failed to recognize +the operating system you are using. It is advised that you +download the most up to date version of the config scripts from + + http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess +and + http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub + +If the version you run ($0) is already up to date, please +send the following data and any information you think might be +pertinent to <config-patches@gnu.org> in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/fontconfig/config/config.sub b/fontconfig/config/config.sub new file mode 100644 index 000000000..ad9f39571 --- /dev/null +++ b/fontconfig/config/config.sub @@ -0,0 +1,1608 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. + +timestamp='2006-02-23' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to <config-patches@gnu.org>. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# 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 <config-patches@gnu.org>." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ + uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | maxq | mb | microblaze | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m32c) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + m32c-*) + ;; + # 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 + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + 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 + ;; + cr16c) + basic_machine=cr16c-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 + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + 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[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + 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. + -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* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -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 + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + 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 + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/fontconfig/config/install.sh b/fontconfig/config/install.sh new file mode 100644 index 000000000..ddbcef3d9 --- /dev/null +++ b/fontconfig/config/install.sh @@ -0,0 +1,240 @@ +#! /bin/sh +# +# fontconfig/config/install.sh +# +# install - install a program, script, or datafile +# This comes from X11R5. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. +# + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +tranformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/fontconfig/configure.in b/fontconfig/configure.in new file mode 100644 index 000000000..589b0c4f8 --- /dev/null +++ b/fontconfig/configure.in @@ -0,0 +1,554 @@ +dnl +dnl fontconfig/configure.in +dnl +dnl Copyright © 2003 Keith Packard +dnl +dnl Permission to use, copy, modify, distribute, and sell this software and its +dnl documentation for any purpose is hereby granted without fee, provided that +dnl the above copyright notice appear in all copies and that both that +dnl copyright notice and this permission notice appear in supporting +dnl documentation, and that the name of Keith Packard not be used in +dnl advertising or publicity pertaining to distribution of the software without +dnl specific, written prior permission. Keith Packard makes no +dnl representations about the suitability of this software for any purpose. It +dnl is provided "as is" without express or implied warranty. +dnl +dnl THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +dnl EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +dnl PERFORMANCE OF THIS SOFTWARE. +dnl +dnl Process this file with autoconf to create configure. + +AC_INIT(fonts.dtd) + +dnl ========================================================================== +dnl Versioning +dnl ========================================================================== + +dnl This is the package version number, not the shared library +dnl version. This same version number must appear in fontconfig/fontconfig.h +dnl Yes, it is a pain to synchronize version numbers. Unfortunately, it's +dnl not possible to extract the version number here from fontconfig.h +AM_INIT_AUTOMAKE(fontconfig, 2.8.0) +m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) +AM_MAINTAINER_MODE + +dnl libtool versioning + +dnl bump revision when fixing bugs +dnl bump current and age, reset revision to zero when adding APIs +dnl bump current, leave age, reset revision to zero when changing/removing APIS +LIBT_CURRENT=5 +LIBT_REVISION=4 +AC_SUBST(LIBT_CURRENT) +AC_SUBST(LIBT_REVISION) +LIBT_AGE=4 + +LIBT_VERSION_INFO="$LIBT_CURRENT:$LIBT_REVISION:$LIBT_AGE" +AC_SUBST(LIBT_VERSION_INFO) + +LIBT_CURRENT_MINUS_AGE=`expr $LIBT_CURRENT - $LIBT_AGE` +AC_SUBST(LIBT_CURRENT_MINUS_AGE) + +dnl ========================================================================== + +AM_CONFIG_HEADER(config.h) + +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_LN_S +AC_LIBTOOL_WIN32_DLL +AM_PROG_LIBTOOL +DOLT +AC_PROG_MAKE_SET + +dnl ========================================================================== + +case "$host" in + *-*-mingw*) + os_win32=yes + ;; + *) + os_win32=no +esac +AM_CONDITIONAL(OS_WIN32, test "$os_win32" = "yes") + +if test "$os_win32" = "yes"; then + AC_CHECK_PROG(ms_librarian, lib.exe, yes, no) +fi +AM_CONDITIONAL(MS_LIB_AVAILABLE, test x$ms_librarian = xyes) + +WARN_CFLAGS="" +if test "x$GCC" = "xyes"; then + WARN_CFLAGS="-Wall -Wpointer-arith -Wstrict-prototypes \ + -Wmissing-prototypes -Wmissing-declarations \ + -Wnested-externs -fno-strict-aliasing" + AC_DEFINE_UNQUOTED(HAVE_WARNING_CPP_DIRECTIVE,1, + [Can use #warning in C files]) +fi +AC_SUBST(WARN_CFLAGS) + + +dnl ========================================================================== + +AM_CONDITIONAL(CROSS_COMPILING, test $cross_compiling = yes) + +dnl ========================================================================== + +# Setup for compiling build tools (fc-glyphname, etc) +AC_MSG_CHECKING([for a C compiler for build tools]) +if test $cross_compiling = yes; then + AC_CHECK_PROGS(CC_FOR_BUILD, gcc cc) +else + CC_FOR_BUILD=$CC +fi +AC_MSG_RESULT([$CC_FOR_BUILD]) +AC_SUBST(CC_FOR_BUILD) + +AC_MSG_CHECKING([for suffix of executable build tools]) +if test $cross_compiling = yes; then + cat >conftest.c <<\_______EOF +int +main () +{ + exit (0); +} +_______EOF + for i in .exe ""; do + compile="$CC_FOR_BUILD conftest.c -o conftest$i" + if AC_TRY_EVAL(compile); then + if (./conftest) 2>&AC_FD_CC; then + EXEEXT_FOR_BUILD=$i + break + fi + fi + done + rm -f conftest* + if test "${EXEEXT_FOR_BUILD+set}" != set; then + AC_MSG_ERROR([Cannot determine suffix of executable build tools]) + fi +else + EXEEXT_FOR_BUILD=$EXEEXT +fi +AC_MSG_RESULT([$EXEEXT_FOR_BUILD]) +AC_SUBST(EXEEXT_FOR_BUILD) + +dnl ========================================================================== + +AC_ARG_WITH(arch, [ --with-arch=ARCH Force architecture to ARCH], arch="$withval", arch=auto) + +if test $cross_compiling = yes; then + case "$arch" in + auto) + AC_MSG_ERROR([Cannot autodetect architecture in cross compile environment] + [Use --with-arch=ARCH to specify architecture]) + ;; + esac +fi + +ARCHITECTURE=$arch +AC_SUBST(ARCHITECTURE) + +dnl ========================================================================== + +# Checks for header files. +AC_HEADER_DIRENT +AC_HEADER_STDC +AC_CHECK_HEADERS([fcntl.h stdlib.h string.h unistd.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_C_CONST +AC_C_INLINE +AC_TYPE_PID_T + +# Checks for library functions. +AC_FUNC_VPRINTF +AC_FUNC_MMAP +AC_CHECK_FUNCS([geteuid getuid link memmove memset mkstemp strchr strrchr strtol getopt getopt_long sysconf ftruncate chsize rand random lrand48]) + +# +# Checks for iconv +# +AC_MSG_CHECKING([for a usable iconv]) +ICONV_LIBS="" +AC_TRY_LINK([#include <iconv.h>], + [iconv_open ("from", "to");], + [use_iconv=1], + [use_iconv=0]) +if test x$use_iconv = x1; then + AC_MSG_RESULT([libc]) +else + # try using libiconv + fontconfig_save_libs="$LIBS" + LIBS="$LIBS -liconv" + + AC_TRY_LINK([#include <iconv.h>], + [iconv_open ("from", "to");], + [use_iconv=1], + [use_iconv=0]) + + if test x$use_iconv = x1; then + ICONV_LIBS="-liconv" + AC_MSG_RESULT([libiconv]) + else + AC_MSG_RESULT([no]) + fi + + LIBS="$fontconfig_save_libs" +fi +AC_SUBST(ICONV_LIBS) +AC_DEFINE_UNQUOTED(USE_ICONV,$use_iconv,[Use iconv.]) + +# +# Checks for FreeType +# + +AC_ARG_WITH(freetype-config, [ --with-freetype-config=PROG Use FreeType configuration program PROG], freetype_config=$withval, freetype_config=yes) + +if test "$freetype_config" = "yes"; then + AC_PATH_PROG(ft_config,freetype-config,no) + if test "$ft_config" = "no"; then + AC_MSG_ERROR([You must have freetype installed; see http://www.freetype.org/]) + fi +else + ft_config="$freetype_config" +fi + +FREETYPE_CFLAGS="`$ft_config --cflags`" +FREETYPE_LIBS="`$ft_config --libs`" + +AC_SUBST(FREETYPE_LIBS) +AC_SUBST(FREETYPE_CFLAGS) + +fontconfig_save_libs="$LIBS" +fontconfig_save_cflags="$CFLAGS" +LIBS="$LIBS $FREETYPE_LIBS" +CFLAGS="$CFLAGS $FREETYPE_CFLAGS" +AC_CHECK_FUNCS(FT_Get_Next_Char FT_Get_BDF_Property FT_Get_PS_Font_Info FT_Has_PS_Glyph_Names FT_Get_X11_Font_Format FT_Select_Size) +AC_CHECK_MEMBER(FT_Bitmap_Size.y_ppem, + HAVE_FT_BITMAP_SIZE_Y_PPEM=1, + HAVE_FT_BITMAP_SIZE_Y_PPEM=0, +[#include <ft2build.h> +#include FT_FREETYPE_H]) +AC_DEFINE_UNQUOTED(HAVE_FT_BITMAP_SIZE_Y_PPEM,$HAVE_FT_BITMAP_SIZE_Y_PPEM, + [FT_Bitmap_Size structure includes y_ppem field]) +CFLAGS="$fontconfig_save_cflags" +LIBS="$fontconfig_save_libs" + +# +# Check expat configuration +# + +AC_ARG_WITH(expat, [ --with-expat=DIR Use Expat in DIR], expat=$withval, expat=yes) +AC_ARG_WITH(expat-includes, [ --with-expat-includes=DIR Use Expat includes in DIR], expat_includes=$withval, expat_includes=yes) +AC_ARG_WITH(expat-lib, [ --with-expat-lib=DIR Use Expat library in DIR], expat_lib=$withval, expat_lib=yes) + +if test "$enable_libxml2" != "yes"; then + case "$expat" in + no) + ;; + *) + case "$expat_includes" in + yes) + case "$expat" in + yes) + ;; + *) + EXPAT_CFLAGS="-I$expat/include" + ;; + esac + ;; + no) + EXPAT_CFLAGS="" + ;; + *) + EXPAT_CFLAGS="-I$expat_includes" + ;; + esac + case "$expat_lib" in + yes) + case "$expat" in + yes) + EXPAT_LIBS="-lexpat" + ;; + *) + EXPAT_LIBS="-L$expat/lib -lexpat" + ;; + esac + ;; + no) + ;; + *) + EXPAT_LIBS="-L$expat_lib -lexpat" + ;; + esac + + expatsaved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $EXPAT_CFLAGS" + expatsaved_LIBS="$LIBS" + LIBS="$LIBS $EXPAT_LIBS" + + AC_CHECK_HEADER(expat.h) + case "$ac_cv_header_expat_h" in + no) + AC_CHECK_HEADER(xmlparse.h) + case "$ac_cv_header_xmlparse_h" in + no) + have_expat_header=no; + ;; + yes) + HAVE_XMLPARSE_H=1 + AC_SUBST(HAVE_XMLPARSE_H) + AC_DEFINE_UNQUOTED(HAVE_XMLPARSE_H,$HAVE_XMLPARSE_H, + [Use xmlparse.h instead of expat.h]) + have_expat_header=yes + ;; + esac + ;; + yes) + have_expat_header=yes + ;; + esac + case "$have_expat_header" in + no) + expat=no + ;; + yes) + AC_CHECK_FUNCS(XML_SetDoctypeDeclHandler) + case "$ac_cv_func_XML_SetDoctypeDeclHandler" in + yes) + HAVE_EXPAT=1 + AC_SUBST(HAVE_EXPAT) + AC_DEFINE_UNQUOTED(HAVE_EXPAT,$HAVE_EXPAT, + [Found a useable expat library]) + ;; + *) + expat=no + ;; + esac + ;; + esac + CPPFLAGS="$expatsaved_CPPFLAGS" + LIBS="$expatsaved_LIBS" + ;; + esac + + AC_SUBST(EXPAT_CFLAGS) + AC_SUBST(EXPAT_LIBS) + + case "$expat" in + no) + EXPAT_CFLAGS="" + EXPAT_LIBS="" + + AC_MSG_WARN([Cannot find usable expat library. Trying to use libxml2 as fallback.]) + ;; + esac +fi + +# +# Check libxml2 configuration +# + +AC_ARG_ENABLE(libxml2, [ --enable-libxml2 Use libxml2 instead of Expat]) + +PKG_PROG_PKG_CONFIG + +if test "$enable_libxml2" = "yes" -o "$expat" = "no"; then + PKG_CHECK_MODULES([LIBXML2], [libxml-2.0 >= 2.6]) + AC_DEFINE_UNQUOTED(ENABLE_LIBXML2,1,[Use libxml2 instead of Expat]) + + AC_SUBST(LIBXML2_CFLAGS) + AC_SUBST(LIBXML2_LIBS) +fi + +# +# Set default font directory +# + +AC_ARG_WITH(default-fonts, [ --with-default-fonts=DIR Use fonts from DIR when config is busted], default_fonts="$withval", default_fonts=yes) + +case "$default_fonts" in +yes) + if test "$os_win32" = "yes"; then + FC_DEFAULT_FONTS="WINDOWSFONTDIR" + AC_DEFINE_UNQUOTED(FC_DEFAULT_FONTS, "WINDOWSFONTDIR", + [Windows font directory]) + else + FC_DEFAULT_FONTS="/usr/share/fonts" + AC_DEFINE_UNQUOTED(FC_DEFAULT_FONTS, "/usr/share/fonts", + [System font directory]) + fi + ;; +*) + FC_DEFAULT_FONTS="$default_fonts" + AC_DEFINE_UNQUOTED(FC_DEFAULT_FONTS, "$default_fonts", + [System font directory]) + ;; +esac + +AC_SUBST(FC_DEFAULT_FONTS) + +# +# Add more fonts if available. By default, add only the directories +# with outline fonts; those with bitmaps can be added as desired in +# local.conf or ~/.fonts.conf +# +AC_ARG_WITH(add-fonts, [ --with-add-fonts=DIR1,DIR2,...Find additional fonts in DIR1,DIR2,... ], add_fonts="$withval", add_fonts=yes) + +case "$add_fonts" in +yes) + FC_ADD_FONTS="" + for dir in /usr/X11R6/lib/X11 /usr/X11/lib/X11 /usr/lib/X11; do + case x"$FC_ADD_FONTS" in + x) + sub="$dir/fonts" + if test -d "$sub"; then + case x$FC_ADD_FONTS in + x) + FC_ADD_FONTS="$sub" + ;; + *) + FC_ADD_FONTS="$FC_ADD_FONTS,$sub" + ;; + esac + fi + ;; + esac + done + AC_DEFINE_UNQUOTED(FC_ADD_FONTS,"$add_fonts",[Additional font directories]) + ;; +no) + FC_ADD_FONTS="" + ;; +*) + FC_ADD_FONTS="$add_fonts" + AC_DEFINE_UNQUOTED(FC_ADD_FONTS,"$add_fonts",[Additional font directories]) + ;; +esac + +AC_SUBST(FC_ADD_FONTS) + +FC_FONTPATH="" + +case "$FC_ADD_FONTS" in +"") + ;; +*) + FC_FONTPATH=`echo $FC_ADD_FONTS | + sed -e 's/^/<dir>/' -e 's/$/<\/dir>/' -e 's/,/<\/dir> <dir>/g'` + ;; +esac + +AC_SUBST(FC_FONTPATH) + +# +# Set default cache directory path +# +AC_ARG_WITH(cache-dir, [ --with-cache-dir=DIR Use DIR to store cache files (default LOCALSTATEDIR/cache/fontconfig)], fc_cachedir="$withval", fc_cachedir=yes) + +case $fc_cachedir in +no|yes) + if test "$os_win32" = "yes"; then + fc_cachedir="WINDOWSTEMPDIR_FONTCONFIG_CACHE" + else + fc_cachedir='${localstatedir}/cache/${PACKAGE}' + fi + ;; +*) + ;; +esac +AC_SUBST(fc_cachedir) +FC_CACHEDIR=${fc_cachedir} +AC_SUBST(FC_CACHEDIR) + +FC_FONTDATE=`LC_ALL=C date` + +AC_SUBST(FC_FONTDATE) + +AC_ARG_WITH(confdir, [ --with-confdir=DIR Use DIR to store configuration files (default SYSCONFDIR/fonts)], confdir="$withval", confdir=yes) + +# +# Set CONFDIR and FONTCONFIG_PATH +# + +case "$confdir" in +no|yes) + confdir='${sysconfdir}'/fonts + ;; +*) + ;; +esac +AC_SUBST(confdir) +CONFDIR=${confdir} +AC_DEFINE_UNQUOTED(CONFDIR, "$CONFDIR",[Font configuration directory]) +AC_SUBST(CONFDIR) + +# +# Let people not build/install docs if they don't have docbook +# + +AC_CHECK_PROG(HASDOCBOOK, docbook2html, yes, no) + +AM_CONDITIONAL(USEDOCBOOK, test "x$HASDOCBOOK" = xyes) + +default_docs="yes" +# +# Check if docs exist or can be created +# +if test x$HASDOCBOOK = xno; then + if test -f $srcdir/doc/fonts-conf.5; then + : + else + default_docs="no" + fi +fi + +AC_ARG_ENABLE(docs, [ --disable-docs Don't build and install documentation],,enable_docs=$default_docs) + +AM_CONDITIONAL(ENABLE_DOCS, test "x$enable_docs" = xyes) + +if test "x$enable_docs" = xyes; then + DOCSRC="doc" + tmp=funcs.$$ + cat $srcdir/doc/*.fncs | awk ' + /^@TITLE@/ { if (!done) { printf ("%s\n", $2); done = 1; } } + /^@FUNC@/ { if (!done) { printf ("%s\n", $2); done = 1; } } + /^@@/ { done = 0; }' > $tmp + DOCMAN3=`cat $tmp | awk '{ printf ("%s.3 ", $1); }'` + echo DOCMAN3 $DOCMAN3 + rm -f $tmp +else + DOCSRC="" + DOCMAN3="" +fi + +AC_SUBST(DOCSRC) +AC_SUBST(DOCMAN3) + +AC_OUTPUT([ +Makefile +fontconfig/Makefile +fc-lang/Makefile +fc-glyphname/Makefile +fc-case/Makefile +fc-arch/Makefile +src/Makefile +conf.d/Makefile +fc-cache/Makefile +fc-cat/Makefile +fc-list/Makefile +fc-match/Makefile +fc-query/Makefile +fc-scan/Makefile +doc/Makefile +doc/version.sgml +test/Makefile +fontconfig.spec +fontconfig.pc +fontconfig-zip +]) diff --git a/fontconfig/doc/Makefile.am b/fontconfig/doc/Makefile.am new file mode 100644 index 000000000..49e00e155 --- /dev/null +++ b/fontconfig/doc/Makefile.am @@ -0,0 +1,200 @@ +# +# fontconfig/doc/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +CC = @CC_FOR_BUILD@ +EXEEXT = @EXEEXT_FOR_BUILD@ +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +DOC_SRC = $(srcdir) +DOC_MODULE = fontconfig +DOC2HTML = docbook2html +DOC2TXT = docbook2txt +DOC2MAN = docbook2man +DOC2PDF = docbook2pdf + +TXT = fontconfig-user.txt fontconfig-devel.txt +PDF = fontconfig-user.pdf fontconfig-devel.pdf +HTML_FILES = fontconfig-user.html +HTML_DIR = fontconfig-devel +SGML = fontconfig-user.sgml fontconfig-devel.sgml +FNCS_TMPL = ${DOC_SRC}/func.sgml + +DOC_FUNCS_FNCS=\ + fcatomic.fncs \ + fcblanks.fncs \ + fccache.fncs \ + fccharset.fncs \ + fcconfig.fncs \ + fcconstant.fncs \ + fcdircache.fncs \ + fcfile.fncs \ + fcfontset.fncs \ + fcformat.fncs \ + fcfreetype.fncs \ + fcinit.fncs \ + fclangset.fncs \ + fcmatrix.fncs \ + fcobjectset.fncs \ + fcobjecttype.fncs \ + fcpattern.fncs \ + fcstring.fncs \ + fcstrset.fncs \ + fcvalue.fncs + +DOC_FUNCS_SGML=\ + fcatomic.sgml \ + fcblanks.sgml \ + fccache.sgml \ + fccharset.sgml \ + fcconfig.sgml \ + fcconstant.sgml \ + fcdircache.sgml \ + fcfile.sgml \ + fcfontset.sgml \ + fcformat.sgml \ + fcfreetype.sgml \ + fcinit.sgml \ + fclangset.sgml \ + fcmatrix.sgml \ + fcobjectset.sgml \ + fcobjecttype.sgml \ + fcpattern.sgml \ + fcstring.sgml \ + fcstrset.sgml \ + fcvalue.sgml + +man5_MANS=fonts-conf.5 +man3_MANS=$(DOCMAN3) + +noinst_PROGRAMS=edit-sgml +edit_sgml_SOURCES=edit-sgml.c + +DOC_FILES=$(TXT) $(PDF) $(HTML_FILES) +LOCAL_DOCS=$(man3_MANS) $(man5_MANS) $(DOC_FILES) $(HTML_DIR)/* + +check_SCRIPTS=check-missing-doc +TESTS_ENVIRONMENT=top_srcdir=${top_srcdir} sh +TESTS=check-missing-doc + +EXTRA_DIST=$(LOCAL_DOCS) $(SGML) $(DOC_FUNCS_FNCS) $(check_SCRIPTS) func.sgml confdir.sgml.in + +SUFFIXES=.fncs .sgml .txt .html + +if USEDOCBOOK + +.fncs.sgml: + $(RM) $@ + ./edit-sgml$(EXEEXT) $(FNCS_TMPL) < '$<' > $*.sgml + +.sgml.txt: + $(RM) $@ + $(DOC2TXT) $< + +.sgml.pdf: + $(RM) $@ + $(DOC2PDF) $< + +$(man3_MANS): func.refs + +func.refs: local-fontconfig-devel.sgml $(DOC_FUNCS_SGML) version.sgml confdir.sgml + $(RM) func.refs + $(DOC2MAN) -o devel-man local-fontconfig-devel.sgml && \ + mv devel-man/manpage.refs func.refs && \ + mv devel-man/*.3 . && \ + $(RM) devel-man/manpage.* && \ + rmdir devel-man + +local-fontconfig-devel.sgml: fontconfig-devel.sgml + $(LN_S) $< $@ + +$(DOC_FUNCS_SGML): edit-sgml$(EXEEXT) $(FNCS_TMPL) + +fonts-conf.5: local-fontconfig-user.sgml version.sgml confdir.sgml + $(RM) $@ + $(DOC2MAN) local-fontconfig-user.sgml && \ + $(RM) manpage.* + +local-fontconfig-user.sgml: fontconfig-user.sgml + $(LN_S) $< $@ + +all-local: $(LOCAL_DOCS) + +clean-local: + $(RM) $(man3_MANS) $(man5_MANS) $(DOC_FILES) $(DOC_FUNCS_SGML) func.refs + $(RM) -r $(HTML_DIR) + +$(HTML_DIR): local-fontconfig-devel.sgml $(DOC_FUNCS_SGML) version.sgml confdir.sgml + $(RM) -r $(HTML_DIR) + $(DOC2HTML) -V '%use-id-as-filename%' -o $(HTML_DIR) local-fontconfig-devel.sgml + +fontconfig-devel.txt: local-fontconfig-devel.sgml $(DOC_FUNCS_SGML) version.sgml confdir.sgml + $(RM) $@ + $(DOC2TXT) local-fontconfig-devel.sgml + mv local-fontconfig-devel.txt $@ + +fontconfig-devel.pdf: local-fontconfig-devel.sgml $(DOC_FUNCS_SGML) version.sgml confdir.sgml + $(RM) $@ + $(top_srcdir)/missing --run $(DOC2PDF) $< && mv local-$@ $@ \ + || echo Failed to generate $@ >&2; \ + (test -f $@ || echo $(DOC2PDF) is required to generate this file >> $@) + +fontconfig-user.html: local-fontconfig-user.sgml version.sgml confdir.sgml + $(RM) $@ local-$@ $@.tmp + $(DOC2HTML) -u local-fontconfig-user.sgml > $@.tmp + -test -f local-$@ && mv local-$@ $@ + -test -f $@ || mv $@.tmp $@ + -test -f $@.tmp && $(RM) $@.tmp + +fontconfig-user.txt: local-fontconfig-user.sgml version.sgml confdir.sgml + $(RM) $@ + $(DOC2TXT) local-fontconfig-user.sgml + mv local-fontconfig-user.txt $@ + +fontconfig-user.pdf: local-fontconfig-user.sgml version.sgml confdir.sgml + $(RM) $@ + $(top_srcdir)/missing --run $(DOC2PDF) $< && mv local-$@ $@ \ + || echo Failed to generate $@ >&2; \ + (test -f $@ || echo $(DOC2PDF) is required to generate this file >> $@) + +STRIPNL=awk '{ if (NR > 1) printf ("\n"); printf ("%s", $$0); }' +confdir.sgml: ${DOC_SRC}/confdir.sgml.in + sed "s,@CONFDIR\@,${CONFDIR}," < ${DOC_SRC}/confdir.sgml.in | $(STRIPNL) > confdir.sgml + +CLEANFILES=confdir.sgml local-fontconfig-user.sgml local-fontconfig-devel.sgml + +htmldoc_DATA = $(HTML_DIR)/* + +$(HTML_DIR)/*: $(HTML_DIR) + +else + +htmldoc_DATA = $(srcdir)/$(HTML_DIR)/* + +all-local: +clean-local: +endif + +htmldocdir=$(docdir)/$(HTML_DIR) + +doc_DATA = $(DOC_FILES) + diff --git a/fontconfig/doc/check-missing-doc b/fontconfig/doc/check-missing-doc new file mode 100644 index 000000000..195ec003b --- /dev/null +++ b/fontconfig/doc/check-missing-doc @@ -0,0 +1,24 @@ +#!/bin/sh +header=fontconfig-header +doc=fontconfig-doc +trap "rm $header $doc" 0 1 15 +top_srcdir=${top_srcdir-".."} +( +cat $top_srcdir/fontconfig/*.h | grep '^Fc' | + grep -v FcPublic | sed 's/[^a-zA-Z0-9].*//'; + cat $top_srcdir/fontconfig/*.h | + sed -n 's/#define \(Fc[a-zA-Z]*\)(.*$/\1/p') | + sort -u > $header + +grep '@FUNC[+]*@' $top_srcdir/doc/*.fncs | +awk '{print $2}' | +sort -u > $doc + +if cmp $doc $header > /dev/null; then + exit 0 +fi + +echo \ +'Library Export Documentation' +diff -y $header $doc | grep '[<>]' +exit 1 diff --git a/fontconfig/doc/confdir.sgml.in b/fontconfig/doc/confdir.sgml.in new file mode 100644 index 000000000..291b26bb3 --- /dev/null +++ b/fontconfig/doc/confdir.sgml.in @@ -0,0 +1,26 @@ +<!-- + fontconfig/doc/confdir.sgml.in + + Copyright © 2003 Keith Packard + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Keith Packard not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Keith Packard makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. +--> +<!-- this is filled in at make time --> +<!--@CONFDIR@--> +/etc/fonts diff --git a/fontconfig/doc/edit-sgml.c b/fontconfig/doc/edit-sgml.c new file mode 100644 index 000000000..b69c93ed7 --- /dev/null +++ b/fontconfig/doc/edit-sgml.c @@ -0,0 +1,546 @@ +/* + * fontconfig/doc/edit-sgml.c + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +static void * +New (int size); + +static void * +Reallocate (void *p, int size); + +static void +Dispose (void *p); + +typedef enum { False, True } Bool; + +typedef struct { + char *buf; + int size; + int len; +} String; + +static String * +StringNew (void); + +static void +StringAdd (String *s, char c); + +static void +StringAddString (String *s, char *buf); + +static String * +StringMake (char *buf); + +static void +StringDel (String *s); + +static void +StringPut (FILE *f, String *s); + +static void +StringDispose (String *s); + +typedef struct { + String *tag; + String *text; +} Replace; + +static Replace * +ReplaceNew (void); + +static void +ReplaceDispose (Replace *r); + +static void +Bail (const char *format, int line, const char *arg); + +static Replace * +ReplaceRead (FILE *f, int *linep); + +typedef struct _replaceList { + struct _replaceList *next; + Replace *r; +} ReplaceList; + +static ReplaceList * +ReplaceListNew (Replace *r, ReplaceList *next); + +static void +ReplaceListDispose (ReplaceList *l); + +typedef struct { + ReplaceList *head; +} ReplaceSet; + +static ReplaceSet * +ReplaceSetNew (void); + +static void +ReplaceSetDispose (ReplaceSet *s); + +static void +ReplaceSetAdd (ReplaceSet *s, Replace *r); + +static Replace * +ReplaceSetFind (ReplaceSet *s, char *tag); + +static ReplaceSet * +ReplaceSetRead (FILE *f, int *linep); + +typedef struct _skipStack { + struct _skipStack *prev; + int skipping; +} SkipStack; + +static SkipStack * +SkipStackPush (SkipStack *prev, int skipping); + +static SkipStack * +SkipStackPop (SkipStack *prev); + +typedef struct _loopStack { + struct _loopStack *prev; + String *tag; + String *extra; + long pos; +} LoopStack; + +static LoopStack * +LoopStackPush (LoopStack *prev, FILE *f, char *tag); + +static LoopStack * +LoopStackLoop (ReplaceSet *rs, LoopStack *ls, FILE *f); + +static void +LineSkip (FILE *f, int *linep); + +static void +DoReplace (FILE *f, int *linep, ReplaceSet *s); + +#define STRING_INIT 128 + +static void * +New (int size) +{ + void *m = malloc (size); + if (!m) + abort (); + return m; +} + +static void * +Reallocate (void *p, int size) +{ + void *r = realloc (p, size); + + if (!r) + abort (); + return r; +} + +static void +Dispose (void *p) +{ + free (p); +} + +static String * +StringNew (void) +{ + String *s; + + s = New (sizeof (String)); + s->buf = New (STRING_INIT); + s->size = STRING_INIT - 1; + s->buf[0] = '\0'; + s->len = 0; + return s; +} + +static void +StringAdd (String *s, char c) +{ + if (s->len == s->size) + s->buf = Reallocate (s->buf, (s->size *= 2) + 1); + s->buf[s->len++] = c; + s->buf[s->len] = '\0'; +} + +static void +StringAddString (String *s, char *buf) +{ + while (*buf) + StringAdd (s, *buf++); +} + +static String * +StringMake (char *buf) +{ + String *s = StringNew (); + StringAddString (s, buf); + return s; +} + +static void +StringDel (String *s) +{ + if (s->len) + s->buf[--s->len] = '\0'; +} + +static void +StringPut (FILE *f, String *s) +{ + char *b = s->buf; + + while (*b) + putc (*b++, f); +} + +#define StringLast(s) ((s)->len ? (s)->buf[(s)->len - 1] : '\0') + +static void +StringDispose (String *s) +{ + Dispose (s->buf); + Dispose (s); +} + +static Replace * +ReplaceNew (void) +{ + Replace *r = New (sizeof (Replace)); + r->tag = StringNew (); + r->text = StringNew (); + return r; +} + +static void +ReplaceDispose (Replace *r) +{ + StringDispose (r->tag); + StringDispose (r->text); + Dispose (r); +} + +static void +Bail (const char *format, int line, const char *arg) +{ + fprintf (stderr, "fatal: "); + fprintf (stderr, format, line, arg); + fprintf (stderr, "\n"); + exit (1); +} + +static int +Getc (FILE *f, int *linep) +{ + int c = getc (f); + if (c == '\n') + ++(*linep); + return c; +} + +static void +Ungetc (int c, FILE *f, int *linep) +{ + if (c == '\n') + --(*linep); + ungetc (c, f); +} + +static Replace * +ReplaceRead (FILE *f, int *linep) +{ + int c; + Replace *r; + + while ((c = Getc (f, linep)) != '@') + { + if (c == EOF) + return 0; + } + r = ReplaceNew(); + while ((c = Getc (f, linep)) != '@') + { + if (c == EOF) + { + ReplaceDispose (r); + return 0; + } + if (isspace (c)) + Bail ("%d: invalid character after tag %s", *linep, r->tag->buf); + StringAdd (r->tag, c); + } + if (r->tag->buf[0] == '\0') + { + ReplaceDispose (r); + return 0; + } + while (isspace ((c = Getc (f, linep)))) + ; + Ungetc (c, f, linep); + while ((c = Getc (f, linep)) != '@' && c != EOF) + StringAdd (r->text, c); + if (c == '@') + Ungetc (c, f, linep); + while (isspace (StringLast (r->text))) + StringDel (r->text); + if (StringLast(r->text) == '%') + { + StringDel (r->text); + StringAdd (r->text, ' '); + } + return r; +} + +static ReplaceList * +ReplaceListNew (Replace *r, ReplaceList *next) +{ + ReplaceList *l = New (sizeof (ReplaceList)); + l->r = r; + l->next = next; + return l; +} + +static void +ReplaceListDispose (ReplaceList *l) +{ + if (l) + { + ReplaceListDispose (l->next); + ReplaceDispose (l->r); + Dispose (l); + } +} + +static ReplaceSet * +ReplaceSetNew (void) +{ + ReplaceSet *s = New (sizeof (ReplaceSet)); + s->head = 0; + return s; +} + +static void +ReplaceSetDispose (ReplaceSet *s) +{ + ReplaceListDispose (s->head); + Dispose (s); +} + +static void +ReplaceSetAdd (ReplaceSet *s, Replace *r) +{ + s->head = ReplaceListNew (r, s->head); +} + +static Replace * +ReplaceSetFind (ReplaceSet *s, char *tag) +{ + ReplaceList *l; + + for (l = s->head; l; l = l->next) + if (!strcmp (tag, l->r->tag->buf)) + return l->r; + return 0; +} + +static ReplaceSet * +ReplaceSetRead (FILE *f, int *linep) +{ + ReplaceSet *s = ReplaceSetNew (); + Replace *r; + + while ((r = ReplaceRead (f, linep))) + { + while (ReplaceSetFind (s, r->tag->buf)) + StringAdd (r->tag, '+'); + ReplaceSetAdd (s, r); + } + if (!s->head) + { + ReplaceSetDispose (s); + s = 0; + } + return s; +} + +static SkipStack * +SkipStackPush (SkipStack *prev, int skipping) +{ + SkipStack *ss = New (sizeof (SkipStack)); + ss->prev = prev; + ss->skipping = skipping; + return ss; +} + +static SkipStack * +SkipStackPop (SkipStack *prev) +{ + SkipStack *ss = prev->prev; + Dispose (prev); + return ss; +} + +static LoopStack * +LoopStackPush (LoopStack *prev, FILE *f, char *tag) +{ + LoopStack *ls = New (sizeof (LoopStack)); + ls->prev = prev; + ls->tag = StringMake (tag); + ls->extra = StringNew (); + ls->pos = ftell (f); + return ls; +} + +static LoopStack * +LoopStackLoop (ReplaceSet *rs, LoopStack *ls, FILE *f) +{ + String *s = StringMake (ls->tag->buf); + LoopStack *ret = ls; + Bool loop; + + StringAdd (ls->extra, '+'); + StringAddString (s, ls->extra->buf); + loop = ReplaceSetFind (rs, s->buf) != 0; + StringDispose (s); + if (loop) + fseek (f, ls->pos, SEEK_SET); + else + { + ret = ls->prev; + StringDispose (ls->tag); + StringDispose (ls->extra); + Dispose (ls); + } + return ret; +} + +static void +LineSkip (FILE *f, int *linep) +{ + int c; + + while ((c = Getc (f, linep)) == '\n') + ; + Ungetc (c, f, linep); +} + +static void +DoReplace (FILE *f, int *linep, ReplaceSet *s) +{ + int c; + String *tag; + Replace *r; + SkipStack *ss = 0; + LoopStack *ls = 0; + int skipping = 0; + + while ((c = Getc (f, linep)) != EOF) + { + if (c == '@') + { + tag = StringNew (); + while ((c = Getc (f, linep)) != '@') + { + if (c == EOF) + abort (); + StringAdd (tag, c); + } + if (ls) + StringAddString (tag, ls->extra->buf); + switch (tag->buf[0]) { + case '?': + ss = SkipStackPush (ss, skipping); + if (!ReplaceSetFind (s, tag->buf + 1)) + skipping++; + LineSkip (f, linep); + break; + case ':': + if (!ss) + abort (); + if (ss->skipping == skipping) + ++skipping; + else + --skipping; + LineSkip (f, linep); + break; + case ';': + skipping = ss->skipping; + ss = SkipStackPop (ss); + LineSkip (f, linep); + break; + case '{': + ls = LoopStackPush (ls, f, tag->buf + 1); + LineSkip (f, linep); + break; + case '}': + ls = LoopStackLoop (s, ls, f); + LineSkip (f, linep); + break; + default: + r = ReplaceSetFind (s, tag->buf); + if (r && !skipping) + StringPut (stdout, r->text); + break; + } + StringDispose (tag); + } + else if (!skipping) + putchar (c); + } +} + +int +main (int argc, char **argv) +{ + FILE *f; + ReplaceSet *s; + int iline, oline; + + if (!argv[1]) + Bail ("usage: %*s <template.sgml>", 0, argv[0]); + f = fopen (argv[1], "r"); + if (!f) + { + Bail ("can't open file %s", 0, argv[1]); + exit (1); + } + iline = 1; + while ((s = ReplaceSetRead (stdin, &iline))) + { + oline = 1; + DoReplace (f, &oline, s); + ReplaceSetDispose (s); + rewind (f); + } + if (ferror (stdout)) + Bail ("%s", 0, "error writing output"); + exit (0); +} diff --git a/fontconfig/doc/fcatomic.fncs b/fontconfig/doc/fcatomic.fncs new file mode 100644 index 000000000..c6b924d84 --- /dev/null +++ b/fontconfig/doc/fcatomic.fncs @@ -0,0 +1,95 @@ +/* + * fontconfig/doc/fcatomic.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@RET@ FcAtomic * +@FUNC@ FcAtomicCreate +@TYPE1@ const FcChar8 * @ARG1@ file +@PURPOSE@ create an FcAtomic object +@DESC@ +Creates a data structure containing data needed to control access to <parameter>file</parameter>. +Writing is done to a separate file. Once that file is complete, the original +configuration file is atomically replaced so that reading process always see +a consistent and complete file without the need to lock for reading. +@@ + +@RET@ FcBool +@FUNC@ FcAtomicLock +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ lock a file +@DESC@ +Attempts to lock the file referenced by <parameter>atomic</parameter>. +Returns FcFalse if the file is already locked, else returns FcTrue and +leaves the file locked. +@@ + +@RET@ FcChar8 * +@FUNC@ FcAtomicNewFile +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ return new temporary file name +@DESC@ +Returns the filename for writing a new version of the file referenced +by <parameter>atomic</parameter>. +@@ + +@RET@ FcChar8 * +@FUNC@ FcAtomicOrigFile +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ return original file name +@DESC@ +Returns the file refernced by <parameter>atomic</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcAtomicReplaceOrig +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ replace original with new +@DESC@ +Replaces the original file referenced by <parameter>atomic</parameter> with +the new file. Returns FcFalse if the file cannot be replaced due to +permission issues in the filesystem. Otherwise returns FcTrue. +@@ + +@RET@ void +@FUNC@ FcAtomicDeleteNew +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ delete new file +@DESC@ +Deletes the new file. Used in error recovery to back out changes. +@@ + +@RET@ void +@FUNC@ FcAtomicUnlock +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ unlock a file +@DESC@ +Unlocks the file. +@@ + +@RET@ void +@FUNC@ FcAtomicDestroy +@TYPE1@ FcAtomic * @ARG1@ atomic +@PURPOSE@ destroy an FcAtomic object +@DESC@ +Destroys <parameter>atomic</parameter>. +@@ diff --git a/fontconfig/doc/fcblanks.fncs b/fontconfig/doc/fcblanks.fncs new file mode 100644 index 000000000..b8ce47d24 --- /dev/null +++ b/fontconfig/doc/fcblanks.fncs @@ -0,0 +1,58 @@ +/* + * fontconfig/doc/fcblanks.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcBlanks * +@FUNC@ FcBlanksCreate +@TYPE1@ void +@PURPOSE@ Create an FcBlanks +@DESC@ +Creates an empty FcBlanks object. +@@ + +@RET@ void +@FUNC@ FcBlanksDestroy +@TYPE1@ FcBlanks * @ARG1@ b +@PURPOSE@ Destroy and FcBlanks +@DESC@ +Destroys an FcBlanks object, freeing any associated memory. +@@ + +@RET@ FcBool +@FUNC@ FcBlanksAdd +@TYPE1@ FcBlanks * @ARG1@ b +@TYPE2@ FcChar32% @ARG2@ ucs4 +@PURPOSE@ Add a character to an FcBlanks +@DESC@ +Adds a single character to an FcBlanks object, returning FcFalse +if this process ran out of memory. +@@ + +@RET@ FcBool +@FUNC@ FcBlanksIsMember +@TYPE1@ FcBlanks * @ARG1@ b +@TYPE2@ FcChar32% @ARG2@ ucs4 +@PURPOSE@ Query membership in an FcBlanks +@DESC@ +Returns whether the specified FcBlanks object contains the indicated Unicode +value. +@@ diff --git a/fontconfig/doc/fccache.fncs b/fontconfig/doc/fccache.fncs new file mode 100644 index 000000000..f0c984d79 --- /dev/null +++ b/fontconfig/doc/fccache.fncs @@ -0,0 +1,68 @@ +/* + * Copyright © 2007 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@RET@ const FcChar8 * +@FUNC@ FcCacheDir +@TYPE1@ const FcCache * @ARG1@ cache +@PURPOSE@ Return directory of <parameter>cache</parameter> +@DESC@ +This function returns the directory from which the cache was constructed. +@@ + +@RET@ FcFontSet * +@FUNC@ FcCacheCopySet +@TYPE1@ const FcCache * @ARG1@ cache +@PURPOSE@ Returns a copy of the fontset from <parameter>cache</parameter> +@DESC@ +The returned fontset contains each of the font patterns from +<parameter>cache</parameter>. This fontset may be modified, but the patterns +from the cache are read-only. +@@ + +@RET@ const FcChar8 * +@FUNC@ FcCacheSubdir +@TYPE1@ const FcCache * @ARG1@ cache +@TYPE2@ int @ARG2@ i +@PURPOSE@ Return the <parameter>i</parameter>'th subdirectory. +@DESC@ +The set of subdirectories stored in a cache file are indexed by this +function, <parameter>i</parameter> should range from 0 to +<parameter>n</parameter>-1, where <parameter>n</parameter> is the return +value from FcCacheNumSubdir. +@@ + +@RET@ int +@FUNC@ FcCacheNumSubdir +@TYPE1@ const FcCache * @ARG1@ cache +@PURPOSE@ Return the number of subdirectories in <parameter>cache</parameter>. +@DESC@ +This returns the total number of subdirectories in the cache. +@@ + +@RET@ int +@FUNC@ FcCacheNumFont +@TYPE1@ const FcCache * @ARG1@ cache +@PURPOSE@ Returns the number of fonts in <parameter>cache</parameter>. +@DESC@ +This returns the number of fonts which would be included in the return from +FcCacheCopySet. +@@ diff --git a/fontconfig/doc/fccharset.fncs b/fontconfig/doc/fccharset.fncs new file mode 100644 index 000000000..b12064a55 --- /dev/null +++ b/fontconfig/doc/fccharset.fncs @@ -0,0 +1,206 @@ +/* + * fontconfig/doc/fccharset.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcCharSet * +@FUNC@ FcCharSetCreate +@TYPE1@ void +@PURPOSE@ Create an empty character set +@DESC@ +<function>FcCharSetCreate</function> allocates and initializes a new empty +character set object. +@@ + +@RET@ void +@FUNC@ FcCharSetDestroy +@TYPE1@ FcCharSet * @ARG1@ fcs +@PURPOSE@ Destroy a character set +@DESC@ +<function>FcCharSetDestroy</function> decrements the reference count +<parameter>fcs</parameter>. If the reference count becomes zero, all +memory referenced is freed. +@@ + +@RET@ FcBool +@FUNC@ FcCharSetAddChar +@TYPE1@ FcCharSet * @ARG1@ fcs +@TYPE2@ FcChar32% @ARG2@ ucs4 +@PURPOSE@ Add a character to a charset +@DESC@ +<function>FcCharSetAddChar</function> adds a single unicode char to the set, +returning FcFalse on failure, either as a result of a constant set or from +running out of memory. +@@ + +@RET@ FcCharSet * +@FUNC@ FcCharSetCopy +@TYPE1@ FcCharSet * @ARG1@ src +@PURPOSE@ Copy a charset +@DESC@ +Makes a copy of <parameter>src</parameter>; note that this may not actually do anything more +than increment the reference count on <parameter>src</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcCharSetEqual +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Compare two charsets +@DESC@ +Returns whether <parameter>a</parameter> and <parameter>b</parameter> +contain the same set of unicode chars. +@@ + +@RET@ FcCharSet * +@FUNC@ FcCharSetIntersect +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Intersect charsets +@DESC@ +Returns a set including only those chars found in both +<parameter>a</parameter> and <parameter>b</parameter>. +@@ + +@RET@ FcCharSet * +@FUNC@ FcCharSetUnion +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Add charsets +@DESC@ +Returns a set including only those chars found in either <parameter>a</parameter> or <parameter>b</parameter>. +@@ + +@RET@ FcCharSet * +@FUNC@ FcCharSetSubtract +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Subtract charsets +@DESC@ +Returns a set including only those chars found in <parameter>a</parameter> but not <parameter>b</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcCharSetMerge +@TYPE1@ FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@TYPE3@ FcBool * @ARG3@ changed +@PURPOSE@ Merge charsets +@DESC@ +Adds all chars in <parameter>b</parameter> to <parameter>a</parameter>. +In other words, this is an in-place version of FcCharSetUnion. +If <parameter>changed</parameter> is not NULL, then it returns whether any new +chars from <parameter>b</parameter> were added to <parameter>a</parameter>. +Returns FcFalse on failure, either when <parameter>a</parameter> is a constant +set or from running out of memory. +@@ + +@RET@ FcBool +@FUNC@ FcCharSetHasChar +@TYPE1@ const FcCharSet * @ARG1@ fcs +@TYPE2@ FcChar32% @ARG2@ ucs4 +@PURPOSE@ Check a charset for a char +@DESC@ +Returns whether <parameter>fcs</parameter> contains the char <parameter>ucs4</parameter>. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetCount +@TYPE1@ const FcCharSet * @ARG1@ a +@PURPOSE@ Count entries in a charset +@DESC@ +Returns the total number of unicode chars in <parameter>a</parameter>. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetIntersectCount +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Intersect and count charsets +@DESC@ +Returns the number of chars that are in both <parameter>a</parameter> and <parameter>b</parameter>. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetSubtractCount +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Subtract and count charsets +@DESC@ +Returns the number of chars that are in <parameter>a</parameter> but not in <parameter>b</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcCharSetIsSubset +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ const FcCharSet * @ARG2@ b +@PURPOSE@ Test for charset inclusion +@DESC@ +Returns whether <parameter>a</parameter> is a subset of <parameter>b</parameter>. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetFirstPage +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ FcChar32[FC_CHARSET_MAP_SIZE]% @ARG2@ map +@TYPE3@ FcChar32 * @ARG3@ next +@PURPOSE@ Start enumerating charset contents +@DESC@ +Builds an array of bits marking the first page of Unicode coverage of +<parameter>a</parameter>. Returns the base of the array. <parameter>next</parameter> contains the next page in the +font. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetNextPage +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ FcChar32[FC_CHARSET_MAP_SIZE]% @ARG2@ map +@TYPE3@ FcChar32 * @ARG3@ next +@PURPOSE@ Continue enumerating charset contents +@DESC@ +Builds an array of bits marking the Unicode coverage of <parameter>a</parameter> for page +<parameter>*next</parameter>. Returns the base of the array. <parameter>next</parameter> contains the next page in +the font. +@@ + +@RET@ FcChar32 +@FUNC@ FcCharSetCoverage +@TYPE1@ const FcCharSet * @ARG1@ a +@TYPE2@ FcChar32 @ARG2@ page +@TYPE3@ FcChar32[8] @ARG3@ result +@PURPOSE@ DEPRECATED return coverage for a Unicode page +@DESC@ +DEPRECATED +This function returns a bitmask in <parameter>result</parameter> which +indicates which code points in +<parameter>page</parameter> are included in <parameter>a</parameter>. +<function>FcCharSetCoverage</function> returns the next page in the charset which has any +coverage. +@@ + +@RET@ FcCharSet * +@FUNC@ FcCharSetNew +@TYPE1@ void +@PURPOSE@ DEPRECATED alias for FcCharSetCreate +@DESC@ +<function>FcCharSetNew</function> is a DEPRECATED alias for FcCharSetCreate. +@@ + diff --git a/fontconfig/doc/fcconfig.fncs b/fontconfig/doc/fcconfig.fncs new file mode 100644 index 000000000..8bb953b34 --- /dev/null +++ b/fontconfig/doc/fcconfig.fncs @@ -0,0 +1,373 @@ +/* + * fontconfig/doc/fcconfig.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcConfig * +@FUNC@ FcConfigCreate +@TYPE1@ void +@PURPOSE@ Create a configuration +@DESC@ +Creates an empty configuration. +@@ + +@RET@ FcConfig * +@FUNC@ FcConfigReference +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Increment config reference count +@DESC@ +Add another reference to <parameter>config</parameter>. Configs are freed only +when the reference count reaches zero. +If <parameter>config</parameter> is NULL, the current configuration is used. +In that case this function will be similar to FcConfigGetCurrent() except that +it increments the reference count before returning and the user is responsible +for destroying the configuration when not needed anymore. +@@ + +@RET@ void +@FUNC@ FcConfigDestroy +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Destroy a configuration +@DESC@ +Decrements the config reference count. If all references are gone, destroys +the configuration and any data associated with it. +Note that calling this function with the return from FcConfigGetCurrent will +cause a new configuration to be created for use as current configuration. +@@ + +@RET@ FcBool +@FUNC@ FcConfigSetCurrent +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Set configuration as default +@DESC@ +Sets the current default configuration to <parameter>config</parameter>. Implicitly calls +FcConfigBuildFonts if necessary, returning FcFalse if that call fails. +@@ + +@RET@ FcConfig * +@FUNC@ FcConfigGetCurrent +@TYPE1@ void +@PURPOSE@ Return current configuration +@DESC@ +Returns the current default configuration. +@@ + +@RET@ FcBool +@FUNC@ FcConfigUptoDate +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Check timestamps on config files +@DESC@ +Checks all of the files related to <parameter>config</parameter> and returns +whether any of them has been modified since the configuration was created. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcChar8 * +@FUNC@ FcConfigHome +@TYPE1@ void +@PURPOSE@ return the current home directory. +@DESC@ +Return the current user's home directory, if it is available, and if using it +is enabled, and NULL otherwise. +See also <function>FcConfigEnableHome</function>). +@@ + +@RET@ FcBol +@FUNC@ FcConfigEnableHome +@TYPE1@ FcBool% @ARG1@ enable +@PURPOSE@ controls use of the home directory. +@DESC@ +If <parameter>enable</parameter> is FcTrue, then Fontconfig will use various +files which are specified relative to the user's home directory (using the ~ +notation in the configuration). When <parameter>enable</parameter> is +FcFalse, then all use of the home directory in these contexts will be +disabled. The previous setting of the value is returned. +@@ + +@RET@ FcBool +@FUNC@ FcConfigBuildFonts +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Build font database +@DESC@ +Builds the set of available fonts for the given configuration. Note that +any changes to the configuration after this call have indeterminate effects. +Returns FcFalse if this operation runs out of memory. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcStrList * +@FUNC@ FcConfigGetConfigDirs +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Get config directories +@DESC@ +Returns the list of font directories specified in the configuration files +for <parameter>config</parameter>. Does not include any subdirectories. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcStrList * +@FUNC@ FcConfigGetFontDirs +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Get font directories +@DESC@ +Returns the list of font directories in <parameter>config</parameter>. This includes the +configured font directories along with any directories below those in the +filesystem. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcStrList * +@FUNC@ FcConfigGetConfigFiles +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Get config files +@DESC@ +Returns the list of known configuration files used to generate <parameter>config</parameter>. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcChar8 * +@FUNC@ FcConfigGetCache +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ DEPRECATED used to return per-user cache filename +@DESC@ +With fontconfig no longer using per-user cache files, this function now +simply returns NULL to indicate that no per-user file exists. +@@ + +@RET@ FcStrList * +@FUNC@ FcConfigGetCacheDirs +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ return the list of directories searched for cache files +@DESC@ +<function>FcConfigGetCacheDirs</function> returns a string list containing +all of the directories that fontconfig will search when attempting to load a +cache file for a font directory. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcFontSet * +@FUNC@ FcConfigGetFonts +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcSetName% @ARG2@ set +@PURPOSE@ Get config font set +@DESC@ +Returns one of the two sets of fonts from the configuration as specified +by <parameter>set</parameter>. This font set is owned by the library and must +not be modified or freed. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBlanks * +@FUNC@ FcConfigGetBlanks +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Get config blanks +@DESC@ +Returns the FcBlanks object associated with the given configuration, if no +blanks were present in the configuration, this function will return 0. +The returned FcBlanks object if not NULL, is valid as long as the owning +FcConfig is alive. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ int +@FUNC@ FcConfigGetRescanInterval +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Get config rescan interval +@DESC@ +Returns the interval between automatic checks of the configuration (in +seconds) specified in <parameter>config</parameter>. The configuration is checked during +a call to FcFontList when this interval has passed since the last check. +An interval setting of zero disables automatic checks. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBool +@FUNC@ FcConfigSetRescanInterval +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ int% @ARG2@ rescanInterval +@PURPOSE@ Set config rescan interval +@DESC@ +Sets the rescan interval. Returns FcFalse if the interval cannot be set (due +to allocation failure). Otherwise returns FcTrue. +An interval setting of zero disables automatic checks. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBool +@FUNC@ FcConfigAppFontAddFile +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ const FcChar8 * @ARG2@ file +@PURPOSE@ Add font file to font database +@DESC@ +Adds an application-specific font to the configuration. Returns FcFalse +if the fonts cannot be added (due to allocation failure). Otherwise returns FcTrue. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBool +@FUNC@ FcConfigAppFontAddDir +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ const FcChar8 * @ARG2@ dir +@PURPOSE@ Add fonts from directory to font database +@DESC@ +Scans the specified directory for fonts, adding each one found to the +application-specific set of fonts. Returns FcFalse +if the fonts cannot be added (due to allocation failure). Otherwise returns FcTrue. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ void +@FUNC@ FcConfigAppFontClear +@TYPE1@ FcConfig * @ARG1@ config +@PURPOSE@ Remove all app fonts from font database +@DESC@ +Clears the set of application-specific fonts. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBool +@FUNC@ FcConfigSubstituteWithPat +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ p +@TYPE3@ FcPattern * @ARG3@ p_pat +@TYPE4@ FcMatchKind% @ARG4@ kind +@PURPOSE@ Execute substitutions +@DESC@ +Performs the sequence of pattern modification operations, if <parameter>kind</parameter> is +FcMatchPattern, then those tagged as pattern operations are applied, else +if <parameter>kind</parameter> is FcMatchFont, those tagged as font operations are applied and +p_pat is used for <test> elements with target=pattern. Returns FcFalse +if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcBool +@FUNC@ FcConfigSubstitute +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ p +@TYPE3@ FcMatchKind% @ARG3@ kind +@PURPOSE@ Execute substitutions +@DESC@ +Calls FcConfigSubstituteWithPat setting p_pat to NULL. Returns FcFalse +if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcPattern * +@FUNC@ FcFontMatch +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ p +@TYPE3@ FcResult * @ARG3@ result +@PURPOSE@ Return best font +@DESC@ +Finds the font in <parameter>sets</parameter> most closely matching +<parameter>pattern</parameter> and returns the result of +<function>FcFontRenderPrepare</function> for that font and the provided +pattern. This function should be called only after +<function>FcConfigSubstitute</function> and +<function>FcDefaultSubstitute</function> have been called for +<parameter>p</parameter>; otherwise the results will not be correct. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcFontSet * +@FUNC@ FcFontSort +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ p +@TYPE3@ FcBool% @ARG3@ trim +@TYPE4@ FcCharSet ** @ARG4@ csp +@TYPE5@ FcResult * @ARG5@ result +@PURPOSE@ Return list of matching fonts +@DESC@ +Returns the list of fonts sorted by closeness to <parameter>p</parameter>. If <parameter>trim</parameter> is FcTrue, +elements in the list which don't include Unicode coverage not provided by +earlier elements in the list are elided. The union of Unicode coverage of +all of the fonts is returned in <parameter>csp</parameter>, if <parameter>csp</parameter> is not NULL. This function +should be called only after FcConfigSubstitute and FcDefaultSubstitute have +been called for <parameter>p</parameter>; otherwise the results will not be correct. + </para><para> +The returned FcFontSet references FcPattern structures which may be shared +by the return value from multiple FcFontSort calls, applications must not +modify these patterns. Instead, they should be passed, along with <parameter>p</parameter> to +<function>FcFontRenderPrepare</function> which combines them into a complete pattern. + </para><para> +The FcFontSet returned by FcFontSort is destroyed by caling FcFontSetDestroy. +If <parameter>config</parameter> is NULL, the current configuration is used. +@@ + +@RET@ FcPattern * +@FUNC@ FcFontRenderPrepare +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ pat +@TYPE3@ FcPattern * @ARG3@ font +@PURPOSE@ Prepare pattern for loading font file +@DESC@ +Creates a new pattern consisting of elements of <parameter>font</parameter> not appearing +in <parameter>pat</parameter>, elements of <parameter>pat</parameter> not appearing in <parameter>font</parameter> and the best matching +value from <parameter>pat</parameter> for elements appearing in both. The result is passed to +FcConfigSubstituteWithPat with <parameter>kind</parameter> FcMatchFont and then returned. +@@ + +@RET@ FcFontSet * +@FUNC@ FcFontList +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcPattern * @ARG2@ p +@TYPE3@ FcObjectSet * @ARG3@ os +@PURPOSE@ List fonts +@DESC@ +Selects fonts matching <parameter>p</parameter>, creates patterns from those fonts containing +only the objects in <parameter>os</parameter> and returns the set of unique such patterns. +If <parameter>config</parameter> is NULL, the default configuration is checked +to be up to date, and used. +@@ + +@RET@ FcChar8 * +@FUNC@ FcConfigFilename +@TYPE1@ const FcChar8 * @ARG1@ name +@PURPOSE@ Find a config file +@DESC@ +Given the specified external entity name, return the associated filename. +This provides applications a way to convert various configuration file +references into filename form. + </para><para> +A null or empty <parameter>name</parameter> indicates that the default configuration file should +be used; which file this references can be overridden with the +FC_CONFIG_FILE environment variable. Next, if the name starts with <parameter>~</parameter>, it +refers to a file in the current users home directory. Otherwise if the name +doesn't start with '/', it refers to a file in the default configuration +directory; the built-in default directory can be overridden with the +FC_CONFIG_DIR environment variable. +@@ + +@RET@ FcBool +@FUNC@ FcConfigParseAndLoad +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ const FcChar8 * @ARG2@ file +@TYPE3@ FcBool% @ARG3@ complain +@PURPOSE@ load a configuration file +@DESC@ +Walks the configuration in 'file' and constructs the internal representation +in 'config'. Any include files referenced from within 'file' will be loaded +and parsed. If 'complain' is FcFalse, no warning will be displayed if +'file' does not exist. Error and warning messages will be output to stderr. +Returns FcFalse if some error occurred while loading the file, either a +parse error, semantic error or allocation failure. Otherwise returns FcTrue. +@@ diff --git a/fontconfig/doc/fcconstant.fncs b/fontconfig/doc/fcconstant.fncs new file mode 100644 index 000000000..86150f203 --- /dev/null +++ b/fontconfig/doc/fcconstant.fncs @@ -0,0 +1,62 @@ +/* + * fontconfig/doc/fcconstant.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcBool +@FUNC@ FcNameRegisterConstants +@TYPE1@ const FcConstant * @ARG1@ consts +@TYPE2@ int% @ARG2@ nconsts +@PURPOSE@ Register symbolic constants +@DESC@ +Register <parameter>nconsts</parameter> new symbolic constants. Returns +FcFalse if the constants cannot be registered (due to allocation failure). +Otherwise returns FcTrue. +@@ + +@RET@ FcBool +@FUNC@ FcNameUnregisterConstants +@TYPE1@ const FcConstant * @ARG1@ consts +@TYPE2@ int% @ARG2@ nconsts +@PURPOSE@ Unregister symbolic constants +@DESC@ +Unregister <parameter>nconsts</parameter> symbolic constants. Returns +FcFalse if the specified constants were not registered. Otherwise returns +FcTrue. +@@ + +@RET@ const FcConstant * +@FUNC@ FcNameGetConstant +@TYPE1@ FcChar8 * @ARG1@ string +@PURPOSE@ Lookup symbolic constant +@DESC@ +Return the FcConstant structure related to symbolic constant <parameter>string</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcNameConstant +@TYPE1@ FcChar8 * @ARG1@ string +@TYPE2@ int * @ARG2@ result +@PURPOSE@ Get the value for a symbolic constant +@DESC@ +Returns whether a symbolic constant with name <parameter>string</parameter> is registered, +placing the value of the constant in <parameter>result</parameter> if present. +@@ diff --git a/fontconfig/doc/fcdircache.fncs b/fontconfig/doc/fcdircache.fncs new file mode 100644 index 000000000..24dea8bc5 --- /dev/null +++ b/fontconfig/doc/fcdircache.fncs @@ -0,0 +1,88 @@ +/* + * Copyright © 2007 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +@RET@ FcBool +@FUNC@ FcDirCacheUnlink +@TYPE1@ const FcChar8 * @ARG1@ dir +@TYPE2@ FcConfig * @ARG2@ config +@PURPOSE@ Remove all caches related to <parameter>dir</parameter> +@DESC@ +Scans the cache directories in <parameter>config</parameter>, removing any +instances of the cache file for <parameter>dir</parameter>. Returns FcFalse +when some internal error occurs (out of memory, etc). Errors actually +unlinking any files are ignored. +@@ + +@RET@ FcBool +@FUNC@ FcDirCacheValid +@TYPE1@ const FcChar8 * @ARG1@ dir +@PURPOSE@ check directory cache +@DESC@ +Returns FcTrue if <parameter>dir</parameter> has an associated valid cache +file, else returns FcFalse +@@ + +@RET@ FcCache * +@FUNC@ FcDirCacheLoad +@TYPE1@ const FcChar8 * @ARG1@ dir +@TYPE2@ FcConfig * @ARG2@ config +@TYPE3@ FcChar8 ** @ARG3@ cache_file +@PURPOSE@ load a directory cache +@DESC@ +Loads the cache related to <parameter>dir</parameter>. If no cache file +exists, returns NULL. The name of the cache file is returned in +<parameter>cache_file</parameter>, unless that is NULL. See also +FcDirCacheRead. +@@ + +@RET@ FcCache * +@FUNC@ FcDirCacheRead +@TYPE1@ const FcChar8 * @ARG1@ dir +@TYPE2@ FcBool% @ARG2@ force +@TYPE3@ FcConfig * @ARG3@ config +@PURPOSE@ read or construct a directory cache +@DESC@ +This returns a cache for <parameter>dir</parameter>. If +<parameter>force</parameter> is FcFalse, then an existing, valid cache file +will be used. Otherwise, a new cache will be created by scanning the +directory and that returned. +@@ + +@RET@ FcCache * +@FUNC@ FcDirCacheLoadFile +@TYPE1@ const FcChar8 * @ARG1@ cache_file +@TYPE2@ struct stat * @ARG2@ file_stat +@PURPOSE@ load a cache file +@DESC@ +This function loads a directory cache from +<parameter>cache_file</parameter>. If <parameter>file_stat</parameter> is +non-NULL, it will be filled with the results of stat(2) on the cache file. +@@ + +@RET@ void +@FUNC@ FcDirCacheUnload +@TYPE1@ FcCache * @ARG1@ cache +@PURPOSE@ unload a cache file +@DESC@ +This function dereferences <parameter>cache</parameter>. When no other +references to it remain, all memory associated with the cache will be freed. +@@ diff --git a/fontconfig/doc/fcfile.fncs b/fontconfig/doc/fcfile.fncs new file mode 100644 index 000000000..d15ab27a3 --- /dev/null +++ b/fontconfig/doc/fcfile.fncs @@ -0,0 +1,88 @@ +/* + * fontconfig/doc/fcfile.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@RET@ FcBool +@FUNC@ FcFileScan +@TYPE1@ FcFontSet * @ARG1@ set +@TYPE2@ FcStrSet * @ARG2@ dirs +@TYPE3@ FcFileCache * @ARG3@ cache +@TYPE4@ FcBlanks * @ARG4@ blanks +@TYPE5@ const FcChar8 * @ARG5@ file +@TYPE6@ FcBool% @ARG6@ force +@PURPOSE@ scan a font file +@DESC@ +Scans a single file and adds all fonts found to <parameter>set</parameter>. +If <parameter>force</parameter> is FcTrue, then the file is scanned even if +associated information is found in <parameter>cache</parameter>. If +<parameter>file</parameter> is a directory, it is added to +<parameter>dirs</parameter>. Whether fonts are found depends on fontconfig +policy as well as the current configuration. Internally, fontconfig will +ignore BDF and PCF fonts which are not in Unicode (or the effectively +equivalent ISO Latin-1) encoding as those are not usable by Unicode-based +applications. The configuration can ignore fonts based on filename or +contents of the font file itself. Returns FcFalse if any of the fonts cannot be +added (due to allocation failure). Otherwise returns FcTrue. +@@ + +@RET@ FcBool +@FUNC@ FcFileIsDir +@TYPE1@ const FcChar8 * @ARG1@ file +@PURPOSE@ check whether a file is a directory +@DESC@ +Returns FcTrue if <parameter>file</parameter> is a directory, otherwise +returns FcFalse. +@@ + +@RET@ FcBool +@FUNC@ FcDirScan +@TYPE1@ FcFontSet * @ARG1@ set +@TYPE2@ FcStrSet * @ARG2@ dirs +@TYPE3@ FcFileCache * @ARG3@ cache +@TYPE4@ FcBlanks * @ARG4@ blanks +@TYPE5@ const FcChar8 * @ARG5@ dir +@TYPE6@ FcBool% @ARG6@ force +@PURPOSE@ scan a font directory without caching it +@DESC@ +If <parameter>cache</parameter> is not zero or if <parameter>force</parameter> +is FcFalse, this function currently returns FcFalse. Otherwise, it scans an +entire directory and adds all fonts found to <parameter>set</parameter>. +Any subdirectories found are added to <parameter>dirs</parameter>. Calling +this function does not create any cache files. Use FcDirCacheRead() if +caching is desired. +@@ + +@RET@ FcBool +@FUNC@ FcDirSave +@TYPE1@ FcFontSet * @ARG1@ set +@TYPE2@ FcStrSet * @ARG2@ dirs +@TYPE3@ const FcChar8 * @ARG3@ dir +@PURPOSE@ DEPRECATED: formerly used to save a directory cache +@DESC@ +This function now does nothing aside from returning FcFalse. It used to creates the +per-directory cache file for <parameter>dir</parameter> and populates it +with the fonts in <parameter>set</parameter> and subdirectories in +<parameter>dirs</parameter>. All of this functionality is now automatically +managed by FcDirCacheLoad and FcDirCacheRead. +@@ + diff --git a/fontconfig/doc/fcfontset.fncs b/fontconfig/doc/fcfontset.fncs new file mode 100644 index 000000000..57005fdd0 --- /dev/null +++ b/fontconfig/doc/fcfontset.fncs @@ -0,0 +1,140 @@ +/* + * fontconfig/doc/fcfontset.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcFontSet * +@FUNC@ FcFontSetCreate +@TYPE1@ void +@PURPOSE@ Create a font set +@DESC@ +Creates an empty font set. +@@ + +@RET@ void +@FUNC@ FcFontSetDestroy +@TYPE1@ FcFontSet * @ARG1@ s +@PURPOSE@ Destroy a font set +@DESC@ +Destroys a font set. Note that this destroys any referenced patterns as +well. +@@ + +@RET@ FcBool +@FUNC@ FcFontSetAdd +@TYPE1@ FcFontSet * @ARG1@ s +@TYPE2@ FcPattern * @ARG2@ font +@PURPOSE@ Add to a font set +@DESC@ +Adds a pattern to a font set. Note that the pattern is not copied before +being inserted into the set. Returns FcFalse if the pattern cannot be +inserted into the set (due to allocation failure). Otherwise returns FcTrue. +@@ + +@RET@ FcFontSet * +@FUNC@ FcFontSetList +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcFontSet ** @ARG2@ sets +@TYPE3@ int @ARG3@ nsets +@TYPE4@ FcPattern * @ARG4@ pattern +@TYPE5@ FcObjectSet * @ARG5@ object_set +@PURPOSE@ List fonts from a set of font sets +@DESC@ +Selects fonts matching <parameter>pattern</parameter> from +<parameter>sets</parameter>, creates patterns from those +fonts containing only the objects in <parameter>object_set</parameter> and returns +the set of unique such patterns. +If <parameter>config</parameter> is NULL, the default configuration is checked +to be up to date, and used. +@@ + +@RET@ FcPattern * +@FUNC@ FcFontSetMatch +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcFontSet ** @ARG2@ sets +@TYPE3@ int @ARG3@ nsets +@TYPE4@ FcPattern * @ARG4@ pattern +@TYPE5@ FcResult * @ARG5@ result +@PURPOSE@ Return the best font from a set of font sets +@DESC@ +Finds the font in <parameter>sets</parameter> most closely matching +<parameter>pattern</parameter> and returns the result of +<function>FcFontRenderPrepare</function> for that font and the provided +pattern. This function should be called only after +<function>FcConfigSubstitute</function> and +<function>FcDefaultSubstitute</function> have been called for +<parameter>pattern</parameter>; otherwise the results will not be correct. +If <parameter>config</parameter> is NULL, the current configuration is used. +Returns NULL if an error occurs during this process. +@@ + +@RET@ void +@FUNC@ FcFontSetPrint +@TYPE1@ FcFontSet * @ARG1@ set +@PURPOSE@ Print a set of patterns to stdout +@DESC@ +This function is useful for diagnosing font related issues, printing the +complete contents of every pattern in <parameter>set</parameter>. The format +of the output is designed to be of help to users and developers, and may +change at any time. +@@ + +@RET@ +@FUNC@ FcFontSetSort +@TYPE1@ FcConfig * @ARG1@ config +@TYPE2@ FcFontSet ** @ARG2@ sets +@TYPE3@ int @ARG3@ nsets +@TYPE4@ FcPattern * @ARG4@ pattern +@TYPE5@ FcBool% @ARG5@ trim +@TYPE6@ FcCharSet ** @ARG6@ csp +@TYPE7@ FcResult * @ARG7@ result +@PURPOSE@ Add to a font set +@DESC@ +Returns the list of fonts from <parameter>sets</parameter> +sorted by closeness to <parameter>pattern</parameter>. +If <parameter>trim</parameter> is FcTrue, +elements in the list which don't include Unicode coverage not provided by +earlier elements in the list are elided. The union of Unicode coverage of +all of the fonts is returned in <parameter>csp</parameter>, +if <parameter>csp</parameter> is not NULL. This function +should be called only after FcConfigSubstitute and FcDefaultSubstitute have +been called for <parameter>p</parameter>; +otherwise the results will not be correct. + </para><para> +The returned FcFontSet references FcPattern structures which may be shared +by the return value from multiple FcFontSort calls, applications cannot +modify these patterns. Instead, they should be passed, along with +<parameter>pattern</parameter> to +<function>FcFontRenderPrepare</function> which combines them into a complete pattern. + </para><para> +The FcFontSet returned by FcFontSetSort is destroyed by caling FcFontSetDestroy. +@@ + +@RET@ +@FUNC@ FcFontSetSortDestroy +@TYPE1@ FcFontSet * @ARG1@ set +@PURPOSE@ DEPRECATED destroy a font set +@DESC@ +This function is DEPRECATED. <function>FcFontSetSortDestroy</function> +destroys <parameter>set</parameter> by calling +<function>FcFontSetDestroy</function>. Applications should use +<function>FcFontSetDestroy</function> directly instead. +@@ diff --git a/fontconfig/doc/fcformat.fncs b/fontconfig/doc/fcformat.fncs new file mode 100644 index 000000000..b092449cf --- /dev/null +++ b/fontconfig/doc/fcformat.fncs @@ -0,0 +1,301 @@ +/* + * fontconfig/doc/fcformat.fncs + * + * Copyright © 2008 Behdad Esfahbod + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@RET@ FcChar8 * +@FUNC@ FcPatternFormat +@TYPE1@ FcPattern * @ARG1@ pat +@TYPE2@ const FcChar8 * @ARG2@ format +@PURPOSE@ Format a pattern into a string according to a format specifier +@DESC@ + +Converts given pattern <parameter>pat</parameter> into text described by +the format specifier <parameter>format</parameter>. +The return value refers to newly allocated memory which should be freed by the +caller using free(), or NULL if <parameter>format</parameter> is invalid. + +</para><para> + +The format is loosely modelled after printf-style format string. +The format string is composed of zero or more directives: ordinary +characters (not "%"), which are copied unchanged to the output stream; +and tags which are interpreted to construct text from the pattern in a +variety of ways (explained below). +Special characters can be escaped +using backslash. C-string style special characters like \n and \r are +also supported (this is useful when the format string is not a C string +literal). +It is advisable to always escape curly braces that +are meant to be copied to the output as ordinary characters. + +</para><para> + +Each tags is introduced by the character "%", +followed by an optional minimum field width, +followed by tag contents in curly braces ({}). +If the minimum field width value is provided the tag +will be expanded and the result padded to achieve the minimum width. +If the minimum field width is positive, the padding will right-align +the text. Negative field width will left-align. +The rest of this section describes various supported tag contents +and their expansion. + +</para><para> + +A <firstterm>simple</firstterm> tag +is one where the content is an identifier. When simple +tags are expanded, the named identifier will be looked up in +<parameter>pattern</parameter> and the resulting list of values returned, +joined together using comma. For example, to print the family name and style the +pattern, use the format "%{family} %{style}\n". To extend the family column +to forty characters use "%-40{family}%{style}\n". + +</para><para> + +Simple tags expand to list of all values for an element. To only choose +one of the values, one can index using the syntax "%{elt[idx]}". For example, +to get the first family name only, use "%{family[0]}". + +</para><para> + +If a simple tag ends with "=" and the element is found in the pattern, the +name of the element followed by "=" will be output before the list of values. +For example, "%{weight=}" may expand to the string "weight=80". Or to the empty +string if <parameter>pattern</parameter> does not have weight set. + +</para><para> + +If a simple tag starts with ":" and the element is found in the pattern, ":" +will be printed first. For example, combining this with the =, the format +"%{:weight=}" may expand to ":weight=80" or to the empty string +if <parameter>pattern</parameter> does not have weight set. + +</para><para> + +If a simple tag contains the string ":-", the rest of the the tag contents +will be used as a default string. The default string is output if the element +is not found in the pattern. For example, the format +"%{:weight=:-123}" may expand to ":weight=80" or to the string +":weight=123" if <parameter>pattern</parameter> does not have weight set. + +</para><para> + +A <firstterm>count</firstterm> tag +is one that starts with the character "#" followed by an element +name, and expands to the number of values for the element in the pattern. +For example, "%{#family}" expands to the number of family names +<parameter>pattern</parameter> has set, which may be zero. + +</para><para> + +A <firstterm>sub-expression</firstterm> tag +is one that expands a sub-expression. The tag contents +are the sub-expression to expand placed inside another set of curly braces. +Sub-expression tags are useful for aligning an entire sub-expression, or to +apply converters (explained later) on an entire sub-expression. +For example, the format "%40{{%{family} %{style}}}" expands the sub-expression +to construct the family name followed by the style, then takes the entire +string and pads it on the left to be at least forty characters. + +</para><para> + +A <firstterm>filter-out</firstterm> tag +is one starting with the character "-" followed by a +comma-separated list of element names, followed by a sub-expression enclosed +in curly braces. The sub-expression will be expanded but with a pattern that +has the listed elements removed from it. +For example, the format "%{-size,pixelsize{sub-expr}}" will expand "sub-expr" +with <parameter>pattern</parameter> sans the size and pixelsize elements. + +</para><para> + +A <firstterm>filter-in</firstterm> tag +is one starting with the character "+" followed by a +comma-separated list of element names, followed by a sub-expression enclosed +in curly braces. The sub-expression will be expanded but with a pattern that +only has the listed elements from the surrounding pattern. +For example, the format "%{+family,familylang{sub-expr}}" will expand "sub-expr" +with a sub-pattern consisting only the family and family lang elements of +<parameter>pattern</parameter>. + +</para><para> + +A <firstterm>conditional</firstterm> tag +is one starting with the character "?" followed by a +comma-separated list of element conditions, followed by two sub-expression +enclosed in curly braces. An element condition can be an element name, +in which case it tests whether the element is defined in pattern, or +the character "!" followed by an element name, in which case the test +is negated. The conditional passes if all the element conditions pass. +The tag expands the first sub-expression if the conditional passes, and +expands the second sub-expression otherwise. +For example, the format "%{?size,dpi,!pixelsize{pass}{fail}}" will expand +to "pass" if <parameter>pattern</parameter> has size and dpi elements but +no pixelsize element, and to "fail" otherwise. + +</para><para> + +An <firstterm>enumerate</firstterm> tag +is one starting with the string "[]" followed by a +comma-separated list of element names, followed by a sub-expression enclosed +in curly braces. The list of values for the named elements are walked in +parallel and the sub-expression expanded each time with a pattern just having +a single value for those elements, starting from the first value and +continuing as long as any of those elements has a value. +For example, the format "%{[]family,familylang{%{family} (%{familylang})\n}}" +will expand the pattern "%{family} (%{familylang})\n" with a pattern +having only the first value of the family and familylang elemtns, then expands +it with the second values, then the third, etc. + +</para><para> + +As a special case, if an enumerate tag has only one element, and that element +has only one value in the pattern, and that value is of type FcLangSet, the +individual languages in the language set are enumerated. + +</para><para> + +A <firstterm>builtin</firstterm> tag +is one starting with the character "=" followed by a builtin +name. The following builtins are defined: + +<variablelist> + +<varlistentry><term> +unparse +</term><listitem><para> +Expands to the result of calling FcNameUnparse() on the pattern. +</para></listitem></varlistentry> + +<varlistentry><term> +fcmatch +</term><listitem><para> +Expands to the output of the default output format of the fc-match +command on the pattern, without the final newline. +</para></listitem></varlistentry> + +<varlistentry><term> +fclist +</term><listitem><para> +Expands to the output of the default output format of the fc-list +command on the pattern, without the final newline. +</para></listitem></varlistentry> + +<varlistentry><term> +pkgkit +</term><listitem><para> +Expands to the list of PackageKit font() tags for the pattern. +Currently this includes tags for each family name, and each language +from the pattern, enumerated and sanitized into a set of tags terminated +by newline. Package management systems can use these tags to tag their +packages accordingly. +</para></listitem></varlistentry> + +</variablelist> + +For example, the format "%{+family,style{%{=unparse}}}\n" will expand +to an unparsed name containing only the family and style element values +from <parameter>pattern</parameter>. + +</para><para> + +The contents of any tag can be followed by a set of zero or more +<firstterm>converter</firstterm>s. A converter is specified by the +character "|" followed by the converter name and arguments. The +following converters are defined: + +<variablelist> + +<varlistentry><term> +basename +</term><listitem><para> +Replaces text with the results of calling FcStrBasename() on it. +</para></listitem></varlistentry> + +<varlistentry><term> +dirname +</term><listitem><para> +Replaces text with the results of calling FcStrDirname() on it. +</para></listitem></varlistentry> + +<varlistentry><term> +downcase +</term><listitem><para> +Replaces text with the results of calling FcStrDowncase() on it. +</para></listitem></varlistentry> + +<varlistentry><term> +shescape +</term><listitem><para> +Escapes text for one level of shell expansion. +(Escapes single-quotes, also encloses text in single-quotes.) +</para></listitem></varlistentry> + +<varlistentry><term> +cescape +</term><listitem><para> +Escapes text such that it can be used as part of a C string literal. +(Escapes backslash and double-quotes.) +</para></listitem></varlistentry> + +<varlistentry><term> +xmlescape +</term><listitem><para> +Escapes text such that it can be used in XML and HTML. +(Escapes less-than, greater-than, and ampersand.) +</para></listitem></varlistentry> + +<varlistentry><term> +delete(<parameter>chars</parameter>) +</term><listitem><para> +Deletes all occurrences of each of the characters in <parameter>chars</parameter> +from the text. +FIXME: This converter is not UTF-8 aware yet. +</para></listitem></varlistentry> + +<varlistentry><term> +escape(<parameter>chars</parameter>) +</term><listitem><para> +Escapes all occurrences of each of the characters in <parameter>chars</parameter> +by prepending it by the first character in <parameter>chars</parameter>. +FIXME: This converter is not UTF-8 aware yet. +</para></listitem></varlistentry> + +<varlistentry><term> +translate(<parameter>from</parameter>,<parameter>to</parameter>) +</term><listitem><para> +Translates all occurrences of each of the characters in <parameter>from</parameter> +by replacing them with their corresponding character in <parameter>to</parameter>. +If <parameter>to</parameter> has fewer characters than +<parameter>from</parameter>, it will be extended by repeating its last +character. +FIXME: This converter is not UTF-8 aware yet. +</para></listitem></varlistentry> + +</variablelist> + +For example, the format "%{family|downcase|delete( )}\n" will expand +to the values of the family element in <parameter>pattern</parameter>, +lower-cased and with spaces removed. + +@@ diff --git a/fontconfig/doc/fcfreetype.fncs b/fontconfig/doc/fcfreetype.fncs new file mode 100644 index 000000000..366cfaef8 --- /dev/null +++ b/fontconfig/doc/fcfreetype.fncs @@ -0,0 +1,106 @@ +/* + * fontconfig/doc/fcfreetype.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@SYNOPSIS@ +#include <fontconfig.h> +#include <fcfreetype.h> +@RET@ FT_UInt +@FUNC@ FcFreeTypeCharIndex +@TYPE1@ FT_Face% @ARG1@ face +@TYPE2@ FcChar32% @ARG2@ ucs4 +@PURPOSE@ map Unicode to glyph id +@DESC@ +Maps a Unicode char to a glyph index. This function uses information from +several possible underlying encoding tables to work around broken fonts. +As a result, this function isn't designed to be used in performance +sensitive areas; results from this function are intended to be cached by +higher level functions. +@@ + +@SYNOPSIS@ +#include <fontconfig.h> +#include <fcfreetype.h> +@RET@ FcCharSet * +@FUNC@ FcFreeTypeCharSet +@TYPE1@ FT_Face% @ARG1@ face +@TYPE2@ FcBlanks * @ARG2@ blanks +@PURPOSE@ compute unicode coverage +@DESC@ +Scans a FreeType face and returns the set of encoded Unicode chars. This scans +several encoding tables to build as complete a list as possible. +If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs +not in 'blanks' are not placed in the returned FcCharSet. +@@ + +@SYNOPSIS@ +#include <fontconfig.h> +#include <fcfreetype.h> +@RET@ FcCharSet * +@FUNC@ FcFreeTypeCharSetAndSpacing +@TYPE1@ FT_Face% @ARG1@ face +@TYPE2@ FcBlanks * @ARG2@ blanks +@TYPE3@ int * @ARG3@ spacing +@PURPOSE@ compute unicode coverage and spacing type +@DESC@ +Scans a FreeType face and returns the set of encoded Unicode chars. +This scans +several encoding tables to build as complete a list as possible. +If 'blanks' is not 0, the glyphs in the font are examined and any blank glyphs +not in 'blanks' are not placed in the returned FcCharSet. +<parameter>spacing</parameter> receives the computed spacing type of the +font, one of FC_MONO for a font where all glyphs have the same width, +FC_DUAL, where the font has glyphs in precisely two widths, one twice as +wide as the other, or FC_PROPORTIONAL where the font has glyphs of many +widths. +@@ + +@SYNOPSIS@ +#include <fontconfig.h> +#include <fcfreetype.h> +@RET@ FcPattern * +@FUNC@ FcFreeTypeQuery +@TYPE1@ const FcChar8 * @ARG1@ file +@TYPE2@ int% @ARG2@ id +@TYPE3@ FcBlanks * @ARG3@ blanks +@TYPE4@ int * @ARG4@ count +@PURPOSE@ compute pattern from font file (and index) +@DESC@ +Constructs a pattern representing the 'id'th font in 'file'. The number +of fonts in 'file' is returned in 'count'. +@@ + +@SYNOPSIS@ +#include <fontconfig.h> +#include <fcfreetype.h> +@RET@ FcPattern * +@FUNC@ FcFreeTypeQueryFace +@TYPE1@ const FT_Face% @ARG1@ face +@TYPE2@ const FcChar8 * @ARG2@ file +@TYPE3@ int% @ARG3@ id +@TYPE4@ FcBlanks * @ARG4@ blanks +@PURPOSE@ compute pattern from FT_Face +@DESC@ +Constructs a pattern representing 'face'. 'file' and 'id' are used solely as +data for pattern elements (FC_FILE, FC_INDEX and sometimes FC_FAMILY). +@@ diff --git a/fontconfig/doc/fcinit.fncs b/fontconfig/doc/fcinit.fncs new file mode 100644 index 000000000..e9b7947b8 --- /dev/null +++ b/fontconfig/doc/fcinit.fncs @@ -0,0 +1,92 @@ +/* + * fontconfig/doc/fcinit.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcConfig * +@FUNC@ FcInitLoadConfig +@TYPE1@ void +@PURPOSE@ load configuration +@DESC@ +Loads the default configuration file and returns the resulting configuration. +Does not load any font information. +@@ + +@RET@ FcConfig * +@FUNC@ FcInitLoadConfigAndFonts +@TYPE1@ void +@PURPOSE@ load configuration and font data +@DESC@ +Loads the default configuration file and builds information about the +available fonts. Returns the resulting configuration. +@@ + +@RET@ FcBool +@FUNC@ FcInit +@TYPE1@ void +@PURPOSE@ initialize fontconfig library +@DESC@ +Loads the default configuration file and the fonts referenced therein and +sets the default configuration to that result. Returns whether this +process succeeded or not. If the default configuration has already +been loaded, this routine does nothing and returns FcTrue. +@@ + +@RET@ void +@FUNC@ FcFini +@TYPE1@ void +@PURPOSE@ finalize fonconfig library +@DESC@ +Frees all data structures allocated by previous calls to fontconfig +functions. Fontconfig returns to an uninitialized state, requiring a +new call to one of the FcInit functions before any other fontconfig +function may be called. +@@ + +@RET@ int +@FUNC@ FcGetVersion +@TYPE1@ void +@PURPOSE@ library version number +@DESC@ +Returns the version number of the library. +@@ + +@RET@ FcBool +@FUNC@ FcInitReinitialize +@TYPE1@ void +@PURPOSE@ re-initialize library +@DESC@ +Forces the default configuration file to be reloaded and resets the default +configuration. Returns FcFalse if the configuration cannot be reloaded (due +to config file errors, allocation failures or other issues) and leaves the +existing configuration unchanged. Otherwise returns FcTrue. +@@ + +@RET@ FcBool +@FUNC@ FcInitBringUptoDate +@TYPE1@ void +@PURPOSE@ reload configuration files if needed +@DESC@ +Checks the rescan interval in the default configuration, checking the +configuration if the interval has passed and reloading the configuration if +when any changes are detected. Returns FcFalse if the configuration cannot +be reloaded (see FcInitReinitialize). Otherwise returns FcTrue. +@@ diff --git a/fontconfig/doc/fclangset.fncs b/fontconfig/doc/fclangset.fncs new file mode 100644 index 000000000..f9d578e65 --- /dev/null +++ b/fontconfig/doc/fclangset.fncs @@ -0,0 +1,148 @@ +/* + * Copyright © 2007 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +@RET@ FcLangSet * +@FUNC@ FcLangSetCreate +@TYPE1@ void +@PURPOSE@ create a langset object +@DESC@ +<function>FcLangSetCreate</function> creates a new FcLangSet object. +@@ + +@RET@ void +@FUNC@ FcLangSetDestroy +@TYPE1@ FcLangSet * @ARG1@ ls +@PURPOSE@ destroy a langset object +@DESC@ +<function>FcLangSetDestroy</function> destroys a FcLangSet object, freeing +all memory associated with it. +@@ + +@RET@ FcLangSet * +@FUNC@ FcLangSetCopy +@TYPE1@ const FcLangSet * @ARG1@ ls +@PURPOSE@ copy a langset object +@DESC@ +<function>FcLangSetCopy</function> creates a new FcLangSet object and +populates it with the contents of <parameter>ls</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcLangSetAdd +@TYPE1@ FcLangSet * @ARG1@ ls +@TYPE2@ const FcChar8 * @ARG2@ lang +@PURPOSE@ add a language to a langset +@DESC@ +<parameter>lang</parameter> is added to <parameter>ls</parameter>. +<parameter>lang</parameter> should be of the form Ll-Tt where Ll is a +two or three letter language from ISO 639 and Tt is a territory from ISO +3166. +@@ + +@RET@ FcLangResult +@FUNC@ FcLangSetCompare +@TYPE1@ const FcLangSet * @ARG1@ ls_a +@TYPE2@ const FcLangSet * @ARG2@ ls_b +@PURPOSE@ compare language sets +@DESC@ +<function>FcLangSetCompare</function> compares language coverage for +<parameter>ls_a</parameter> and <parameter>ls_b</parameter>. If they share +any language and territory pair, this function returns FcLangEqual. If they +share a language but differ in which territory that language is for, this +function returns FcLangDiffentTerritory. If they share no languages in +common, this function returns FcLangDifferentLang. +@@ + +@RET@ FcBool +@FUNC@ FcLangSetContains +@TYPE1@ const FcLangSet * @ARG1@ ls_a +@TYPE2@ const FcLangSet * @ARG2@ ls_b +@PURPOSE@ check langset subset relation +@DESC@ +<function>FcLangSetContains</function> returns FcTrue if +<parameter>ls_a</parameter> contains every language in +<parameter>ls_b</parameter>. <parameter>ls_a</parameter> will 'contain' a +language from <parameter>ls_b</parameter> if <parameter>ls_a</parameter> +has exactly the language, or either the language or +<parameter>ls_a</parameter> has no territory. +@@ + +@RET@ FcBool +@FUNC@ FcLangSetEqual +@TYPE1@ const FcLangSet * @ARG1@ ls_a +@TYPE2@ const FcLangSet * @ARG2@ ls_b +@PURPOSE@ test for matching langsets +@DESC@ +Returns FcTrue if and only if <parameter>ls_a</parameter> supports precisely +the same language and territory combinations as <parameter>ls_b</parameter>. +@@ + +@RET@ FcChar32 +@FUNC@ FcLangSetHash +@TYPE1@ const FcLangSet * @ARG1@ ls +@PURPOSE@ return a hash value for a langset +@DESC@ +This function returns a value which depends solely on the languages +supported by <parameter>ls</parameter>. Any language which equals +<parameter>ls</parameter> will have the same result from +<function>FcLangSetHash</function>. However, two langsets with the same hash +value may not be equal. +@@ + +@RET@ FcLangResult +@FUNC@ FcLangSetHasLang +@TYPE1@ const FcLangSet * @ARG1@ ls +@TYPE2@ const FcChar8 * @ARG2@ lang +@PURPOSE@ test langset for language support +@DESC@ +<function>FcLangSetHasLang</function> checks whether +<parameter>ls</parameter> supports <parameter>lang</parameter>. If +<parameter>ls</parameter> has a matching language and territory pair, +this function returns FcLangEqual. If <parameter>ls</parameter> has +a matching language but differs in which territory that language is for, this +function returns FcLangDiffentTerritory. If <parameter>ls</parameter> +has no matching language, this function returns FcLangDifferentLang. +@@ + +@RET@ FcStrSet * +@FUNC@ FcLangSetGetLangs +@TYPE1@ const FcLangSet * @ARG1@ ls +@PURPOSE@ get the list of languages in the langset +@DESC@ +Returns a string set of all languages in <parameter>langset</parameter>. +@@ + +@RET@ FcStrSet * +@FUNC@ FcGetLangs +@TYPE1@ void +@PURPOSE@ Get list of languages +@DESC@ +Returns a string set of all known languages. +@@ + +@RET@ const FcCharSet * +@FUNC@ FcLangGetCharSet +@TYPE1@ const FcChar8 * @ARG1@ lang +@PURPOSE@ Get character map for a language +@DESC@ +Returns the FcCharMap for a language. +@@ diff --git a/fontconfig/doc/fcmatrix.fncs b/fontconfig/doc/fcmatrix.fncs new file mode 100644 index 000000000..fd680e458 --- /dev/null +++ b/fontconfig/doc/fcmatrix.fncs @@ -0,0 +1,125 @@ +/* + * fontconfig/doc/fcmatrix.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@RET@ void +@FUNC@ FcMatrixInit +@PURPOSE@ initialize an FcMatrix structure +@TYPE1@ FcMatrix * +@ARG1@ matrix +@DESC@ +<function>FcMatrixInit</function> initializes <parameter>matrix</parameter> +to the identity matrix. +@@ + +@FUNC@ FcMatrixCopy +@PURPOSE@ Copy a matrix +@TYPE1@ const FcMatrix * +@ARG1@ matrix +@DESC@ +<function>FcMatrixCopy</function> allocates a new FcMatrix +and copies <parameter>mat</parameter> into it. +@@ + +@FUNC@ FcMatrixEqual +@PURPOSE@ Compare two matrices +@TYPE1@ const FcMatrix * +@ARG1@ matrix1 +@TYPE2@ const FcMatrix * +@ARG2@ matrix2 +@DESC@ +<function>FcMatrixEqual</function> compares <parameter>matrix1</parameter> +and <parameter>matrix2</parameter> returning FcTrue when they are equal and +FcFalse when they are not. +@@ + +@FUNC@ FcMatrixMultiply +@PURPOSE@ Multiply matrices +@TYPE1@ FcMatrix * +@ARG1@ result +@TYPE2@ const FcMatrix * +@ARG2@ matrix1 +@TYPE3@ const FcMatrix * +@ARG3@ matrix2 +@DESC@ +<function>FcMatrixMultiply</function> multiplies +<parameter>matrix1</parameter> and <parameter>matrix2</parameter> storing +the result in <parameter>result</parameter>. +@@ + +@FUNC@ FcMatrixRotate +@PURPOSE@ Rotate a matrix +@TYPE1@ FcMatrix * +@ARG1@ matrix +@TYPE2@ double% +@ARG2@ cos +@TYPE3@ double% +@ARG3@ sin +@DESC@ +<function>FcMatrixRotate</function> rotates <parameter>matrix</parameter> +by the angle who's sine is <parameter>sin</parameter> and cosine is +<parameter>cos</parameter>. This is done by multiplying by the +matrix: +<programlisting> + cos -sin + sin cos +</programlisting> +@@ + +@FUNC@ FcMatrixScale +@PURPOSE@ Scale a matrix +@TYPE1@ FcMatrix * +@ARG1@ matrix +@TYPE2@ double% +@ARG2@ sx +@TYPE3@ double% +@ARG3@ dy +@DESC@ +<function>FcMatrixScale</function> multiplies <parameter>matrix</parameter> +x values by <parameter>sx</parameter> and y values by +<parameter>sy</parameter>. This is done by multiplying by +the matrix: +<programlisting> + sx 0 + 0 sy +</programlisting> +@@ + +@FUNC@ FcMatrixShear +@PURPOSE@ Shear a matrix +@TYPE1@ FcMatrix * +@ARG1@ matrix +@TYPE2@ double% +@ARG2@ sh +@TYPE3@ double% +@ARG3@ sv +@DESC@ +<function>FcMatrixShare</function> shears <parameter>matrix</parameter> +horizontally by <parameter>sh</parameter> and vertically by +<parameter>sv</parameter>. This is done by multiplying by +the matrix: +<programlisting> + 1 sh + sv 1 +</programlisting> +@@ diff --git a/fontconfig/doc/fcobjectset.fncs b/fontconfig/doc/fcobjectset.fncs new file mode 100644 index 000000000..468a7bfc1 --- /dev/null +++ b/fontconfig/doc/fcobjectset.fncs @@ -0,0 +1,73 @@ +/* + * fontconfig/doc/fcobjectset.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcObjectSet * +@FUNC@ FcObjectSetCreate +@TYPE1@ void +@PURPOSE@ Create an object set +@DESC@ +Creates an empty set. +@@ + +@RET@ FcBool +@FUNC@ FcObjectSetAdd +@TYPE1@ FcObjectSet * @ARG1@ os +@TYPE2@ const char * @ARG2@ object +@PURPOSE@ Add to an object set +@DESC@ +Adds a proprety name to the set. Returns FcFalse if the property name cannot be +inserted into the set (due to allocation failure). Otherwise returns FcTrue. +@@ + +@RET@ void +@FUNC@ FcObjectSetDestroy +@TYPE1@ FcObjectSet * @ARG1@ os +@PURPOSE@ Destroy an object set +@DESC@ +Destroys an object set. +@@ + +@RET@ FcObjectSet * +@FUNC@ FcObjectSetBuild +@TYPE1@ const char * @ARG1@ first +@TYPE2@ ... + +@PROTOTYPE+@ +@RET+@ FcObjectSet * +@FUNC+@ FcObjectSetVaBuild +@TYPE1+@ const char * @ARG1+@ first +@TYPE2+@ va_list% @ARG2+@ va + +@PROTOTYPE++@ +@RET++@ void +@FUNC++@ FcObjectSetVapBuild +@TYPE1++@ FcObjectSet * @ARG1++@ result +@TYPE2++@ const char * @ARG2++@ first +@TYPE3++@ va_list% @ARG3++@ va + +@PURPOSE@ Build object set from args +@DESC@ +These build an object set from a null-terminated list of property names. +FcObjectSetVapBuild is a macro version of FcObjectSetVaBuild which returns +the result in the <parameter>result</parameter> variable directly. +@@ diff --git a/fontconfig/doc/fcobjecttype.fncs b/fontconfig/doc/fcobjecttype.fncs new file mode 100644 index 000000000..bc254f3b9 --- /dev/null +++ b/fontconfig/doc/fcobjecttype.fncs @@ -0,0 +1,50 @@ +/* + * fontconfig/doc/fcobjecttype.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcBool +@FUNC@ FcNameRegisterObjectTypes +@TYPE1@ const FcObjectType * @ARG1@ types +@TYPE2@ int% @ARG2@ ntype +@PURPOSE@ Register object types +@DESC@ +Register <parameter>ntype</parameter> new object types. Returns FcFalse if +some of the names cannot be +registered (due to allocation failure). Otherwise returns FcTrue. +@@ + +@RET@ FcBool +@FUNC@ FcNameUnregisterObjectTypes +@TYPE1@ const FcObjectType * @ARG1@ types +@TYPE2@ int% @ARG2@ ntype +@PURPOSE@ Unregister object types +@DESC@ +Unregister <parameter>ntype</parameter> object types. Returns FcTrue. +@@ + +@RET@ const FcObjectType * +@FUNC@ FcNameGetObjectType +@TYPE1@ const char * @ARG1@ object +@PURPOSE@ Lookup an object type +@DESC@ +Return the object type for the pattern element named <parameter>object</parameter>. +@@ diff --git a/fontconfig/doc/fcpattern.fncs b/fontconfig/doc/fcpattern.fncs new file mode 100644 index 000000000..e2c2953df --- /dev/null +++ b/fontconfig/doc/fcpattern.fncs @@ -0,0 +1,397 @@ +/* + * fontconfig/doc/fcpattern.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ FcPattern * +@FUNC@ FcPatternCreate +@TYPE1@ void +@PURPOSE@ Create a pattern +@DESC@ +Creates a pattern with no properties; used to build patterns from scratch. +@@ + +@RET@ FcPattern * +@FUNC@ FcPatternDuplicate +@TYPE1@ const FcPattern * @ARG1@ p +@PURPOSE@ Copy a pattern +@DESC@ +Copy a pattern, returning a new pattern that matches +<parameter>p</parameter>. Each pattern may be modified without affecting the +other. +@@ + +@RET@ void +@FUNC@ FcPatternReference +@TYPE1@ FcPattern * @ARG1@ p +@PURPOSE@ Increment pattern reference count +@DESC@ +Add another reference to <parameter>p</parameter>. Patterns are freed only +when the reference count reaches zero. +@@ + +@RET@ void +@FUNC@ FcPatternDestroy +@TYPE1@ FcPattern * @ARG1@ p +@PURPOSE@ Destroy a pattern +@DESC@ +Decrement the pattern reference count. If all references are gone, destroys +the pattern, in the process destroying all related values. +@@ + +@RET@ FcBool +@FUNC@ FcPatternEqual +@TYPE1@ const FcPattern * @ARG1@ pa +@TYPE2@ const FcPattern * @ARG2@ pb +@PURPOSE@ Compare patterns +@DESC@ +Returns whether <parameter>pa</parameter> and <parameter>pb</parameter> are exactly alike. +@@ + +@RET@ FcBool +@FUNC@ FcPatternEqualSubset +@TYPE1@ const FcPattern * @ARG1@ pa +@TYPE2@ const FcPattern * @ARG2@ pb +@TYPE3@ const FcObjectSet * @ARG3@ os +@PURPOSE@ Compare portions of patterns +@DESC@ +Returns whether <parameter>pa</parameter> and <parameter>pb</parameter> have exactly the same values for all of the +objects in <parameter>os</parameter>. +@@ + +@RET@ FcPattern * +@FUNC@ FcPatternFilter +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const FcObjectSet * @ARG1@ os +@PURPOSE@ Filter the objects of pattern +@DESC@ +Returns a new pattern that only has those objects from +<parameter>p</parameter> that are in <parameter>os</parameter>. +If <parameter>os</parameter> is NULL, a duplicate of +<parameter>p</parameter> is returned. +@@ + +@RET@ FcChar32 +@FUNC@ FcPatternHash +@TYPE1@ const FcPattern * @ARG1@ p +@PURPOSE@ Compute a pattern hash value +@DESC@ +Returns a 32-bit number which is the same for any two patterns which are +equal. +@@ + +@RET@ FcBool +@FUNC@ FcPatternAdd +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ FcValue% @ARG3@ value +@TYPE4@ FcBool% @ARG4@ append +@PURPOSE@ Add a value to a pattern +@DESC@ +Adds a single value to the list of values associated with the property named +`object<parameter>. If `append</parameter> is FcTrue, the value is added at the end of any +existing list, otherwise it is inserted at the begining. `value' is saved +(with FcValueSave) when inserted into the pattern so that the library +retains no reference to any application-supplied data structure. +@@ + +@RET@ FcBool +@FUNC@ FcPatternAddWeak +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ FcValue% @ARG3@ value +@TYPE4@ FcBool% @ARG4@ append +@PURPOSE@ Add a value to a pattern with weak binding +@DESC@ +FcPatternAddWeak is essentially the same as FcPatternAdd except that any +values added to the list have binding <parameter>weak</parameter> instead of <parameter>strong</parameter>. +@@ + +@TITLE@ FcPatternAdd-Type +@RET@ FcBool +@FUNC@ FcPatternAddInteger +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ int% @ARG3@ i + +@PROTOTYPE+@ +@RET+@ FcBool +@FUNC+@ FcPatternAddDouble +@TYPE1+@ FcPattern * @ARG1+@ p +@TYPE2+@ const char * @ARG2+@ object +@TYPE3+@ double% @ARG3+@ d + +@PROTOTYPE++@ +@RET++@ FcBool +@FUNC++@ FcPatternAddString +@TYPE1++@ FcPattern * @ARG1++@ p +@TYPE2++@ const char * @ARG2++@ object +@TYPE3++@ const FcChar8 * @ARG3++@ s + +@PROTOTYPE+++@ +@RET+++@ FcBool +@FUNC+++@ FcPatternAddMatrix +@TYPE1+++@ FcPattern * @ARG1+++@ p +@TYPE2+++@ const char * @ARG2+++@ object +@TYPE3+++@ const FcMatrix * @ARG3+++@ m + +@PROTOTYPE++++@ +@RET++++@ FcBool +@FUNC++++@ FcPatternAddCharSet +@TYPE1++++@ FcPattern * @ARG1++++@ p +@TYPE2++++@ const char * @ARG2++++@ object +@TYPE3++++@ const FcCharSet * @ARG3++++@ c + +@PROTOTYPE+++++@ +@RET+++++@ FcBool +@FUNC+++++@ FcPatternAddBool +@TYPE1+++++@ FcPattern * @ARG1+++++@ p +@TYPE2+++++@ const char * @ARG2+++++@ object +@TYPE3+++++@ FcBool% @ARG3+++++@ b + +@PROTOTYPE++++++@ +@RET++++++@ FcBool +@FUNC++++++@ FcPatternAddFTFace +@TYPE1++++++@ FcPattern * @ARG1++++++@ p +@TYPE2++++++@ const char * @ARG2++++++@ object +@TYPE3++++++@ const FT_Face @ARG3++++++@ f + +@PROTOTYPE+++++++@ +@RET+++++++@ FcBool +@FUNC+++++++@ FcPatternAddLangSet +@TYPE1+++++++@ FcPattern * @ARG1+++++++@ p +@TYPE2+++++++@ const char * @ARG2+++++++@ object +@TYPE3+++++++@ const FcLangSet * @ARG3+++++++@ l + +@PURPOSE@ Add a typed value to a pattern +@DESC@ +These are all convenience functions that insert objects of the specified +type into the pattern. Use these in preference to FcPatternAdd as they +will provide compile-time typechecking. These all append values to +any existing list of values. +@@ + +@RET@ FcResult +@FUNC@ FcPatternGet +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ int% @ARG3@ id +@TYPE4@ FcValue * @ARG4@ v +@PURPOSE@ Return a value from a pattern +@DESC@ +Returns in <parameter>v</parameter> the <parameter>id</parameter>'th value +associated with the property <parameter>object</parameter>. +The value returned is not a copy, but rather refers to the data stored +within the pattern directly. Applications must not free this value. +@@ + +@TITLE@ FcPatternGet-Type +@PROTOTYPE@ +@RET@ FcResult +@FUNC@ FcPatternGetInteger +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ int% @ARG3@ n +@TYPE4@ int * @ARG4@ i + +@PROTOTYPE+@ +@RET+@ FcResult +@FUNC+@ FcPatternGetDouble +@TYPE1+@ FcPattern * @ARG1+@ p +@TYPE2+@ const char * @ARG2+@ object +@TYPE3+@ int% @ARG3+@ n +@TYPE4+@ double * @ARG4+@ d + +@PROTOTYPE++@ +@RET++@ FcResult +@FUNC++@ FcPatternGetString +@TYPE1++@ FcPattern * @ARG1++@ p +@TYPE2++@ const char * @ARG2++@ object +@TYPE3++@ int% @ARG3++@ n +@TYPE4++@ FcChar8 ** @ARG4++@ s + +@PROTOTYPE+++@ +@RET+++@ FcResult +@FUNC+++@ FcPatternGetMatrix +@TYPE1+++@ FcPattern * @ARG1+++@ p +@TYPE2+++@ const char * @ARG2+++@ object +@TYPE3+++@ int% @ARG3+++@ n +@TYPE4+++@ FcMatrix ** @ARG4+++@ s + +@PROTOTYPE++++@ +@RET++++@ FcResult +@FUNC++++@ FcPatternGetCharSet +@TYPE1++++@ FcPattern * @ARG1++++@ p +@TYPE2++++@ const char * @ARG2++++@ object +@TYPE3++++@ int% @ARG3++++@ n +@TYPE4++++@ FcCharSet ** @ARG4++++@ c + +@PROTOTYPE+++++@ +@RET+++++@ FcResult +@FUNC+++++@ FcPatternGetBool +@TYPE1+++++@ FcPattern * @ARG1+++++@ p +@TYPE2+++++@ const char * @ARG2+++++@ object +@TYPE3+++++@ int% @ARG3+++++@ n +@TYPE4+++++@ FcBool * @ARG4+++++@ b + +@PROTOTYPE++++++@ +@RET++++++@ FcResult +@FUNC++++++@ FcPatternGetFTFace +@TYPE1++++++@ FcPattern * @ARG1++++++@ p +@TYPE2++++++@ const char * @ARG2++++++@ object +@TYPE3+++++@ int% @ARG3+++++@ n +@TYPE3++++++@ FT_Face * @ARG3++++++@ f + +@PROTOTYPE+++++++@ +@RET+++++++@ FcResult +@FUNC+++++++@ FcPatternGetLangSet +@TYPE1+++++++@ FcPattern * @ARG1+++++++@ p +@TYPE2+++++++@ const char * @ARG2+++++++@ object +@TYPE3+++++@ int% @ARG3+++++@ n +@TYPE3+++++++@ FcLangSet ** @ARG3+++++++@ l + +@PURPOSE@ Return a typed value from a pattern +@DESC@ +These are convenience functions that call FcPatternGet and verify that the +returned data is of the expected type. They return FcResultTypeMismatch if +this is not the case. Note that these (like FcPatternGet) do not make a +copy of any data structure referenced by the return value. Use these +in preference to FcPatternGet to provide compile-time typechecking. +@@ + +@RET@ FcPattern * +@FUNC@ FcPatternBuild +@TYPE1@ FcPattern * @ARG1@ pattern +@TYPE2@ ... + +@PROTOTYPE+@ +@RET+@ FcPattern * +@FUNC+@ FcPatternVaBuild +@TYPE1+@ FcPattern * @ARG1+@ pattern +@TYPE2+@ va_list% @ARG2+@ va + +@PROTOTYPE++@ +@RET++@ void +@FUNC++@ FcPatternVapBuild +@TYPE1++@ FcPattern * @ARG1++@ result +@TYPE2++@ FcPattern * @ARG2++@ pattern +@TYPE3++@ va_list% @ARG3++@ va + +@PURPOSE@ Create patterns from arguments +@DESC@ +Builds a pattern using a list of objects, types and values. Each +value to be entered in the pattern is specified with three arguments: +</para> +<orderedlist> +<listitem><para> +Object name, a string describing the property to be added. +</para></listitem><listitem><para> +Object type, one of the FcType enumerated values +</para></listitem><listitem><para> +Value, not an FcValue, but the raw type as passed to any of the +FcPatternAdd<type> functions. Must match the type of the second +argument. +</para></listitem> +</orderedlist> +<para> +The argument list is terminated by a null object name, no object type nor +value need be passed for this. The values are added to `pattern', if +`pattern' is null, a new pattern is created. In either case, the pattern is +returned. Example +</para> +<programlisting> +pattern = FcPatternBuild (0, FC_FAMILY, FcTypeString, "Times", (char *) 0); +</programlisting> +<para> +FcPatternVaBuild is used when the arguments are already in the form of a +varargs value. FcPatternVapBuild is a macro version of FcPatternVaBuild +which returns its result directly in the <parameter>result</parameter> +variable. +@@ + +@RET@ FcBool +@FUNC@ FcPatternDel +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@PURPOSE@ Delete a property from a pattern +@DESC@ +Deletes all values associated with the property `object', returning +whether the property existed or not. +@@ + +@RET@ FcBool +@FUNC@ FcPatternRemove +@TYPE1@ FcPattern * @ARG1@ p +@TYPE2@ const char * @ARG2@ object +@TYPE3@ int% @ARG3@ id +@PURPOSE@ Remove one object of the specified type from the pattern +@DESC@ +Removes the value associated with the property `object' at position `id', returning +whether the property existed and had a value at that position or not. +@@ + +@RET@ void +@FUNC@ FcPatternPrint +@TYPE1@ const FcPattern * @ARG1@ p +@PURPOSE@ Print a pattern for debugging +@DESC@ +Prints an easily readable version of the pattern to stdout. There is +no provision for reparsing data in this format, it's just for diagnostics +and debugging. +@@ + +@RET@ void +@FUNC@ FcDefaultSubstitute +@TYPE1@ FcPattern * @ARG1@ pattern +@PURPOSE@ Perform default substitutions in a pattern +@DESC@ +Supplies default values for underspecified font patterns: +<itemizedlist> +<listitem><para> +Patterns without a specified style or weight are set to Medium +</para></listitem> +<listitem><para> +Patterns without a specified style or slant are set to Roman +</para></listitem> +<listitem><para> +Patterns without a specified pixel size are given one computed from any +specified point size (default 12), dpi (default 75) and scale (default 1). +</para></listitem> +</itemizedlist> +@@ + +@RET@ FcPattern * +@FUNC@ FcNameParse +@TYPE1@ const FcChar8 * @ARG1@ name +@PURPOSE@ Parse a pattern string +@DESC@ +Converts <parameter>name</parameter> from the standard text format described above into a pattern. +@@ + +@RET@ FcChar8 * +@FUNC@ FcNameUnparse +@TYPE1@ FcPattern * @ARG1@ pat +@PURPOSE@ Convert a pattern back into a string that can be parsed +@DESC@ +Converts the given pattern into the standard text format described above. +The return value is not static, but instead refers to newly allocated memory +which should be freed by the caller using free(). +@@ diff --git a/fontconfig/doc/fcstring.fncs b/fontconfig/doc/fcstring.fncs new file mode 100644 index 000000000..5f1f93ac1 --- /dev/null +++ b/fontconfig/doc/fcstring.fncs @@ -0,0 +1,244 @@ +/* + * fontconfig/doc/fcstring.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + <variablelist> + +@RET@ int +@FUNC@ FcUtf8ToUcs4 +@TYPE1@ FcChar8 * @ARG1@ src +@TYPE2@ FcChar32 * @ARG2@ dst +@TYPE3@ int% @ARG3@ len +@PURPOSE@ convert UTF-8 to UCS4 +@DESC@ +Converts the next Unicode char from <parameter>src</parameter> into +<parameter>dst</parameter> and returns the number of bytes containing the +char. <parameter>src</parameter> must be at least +<parameter>len</parameter> bytes long. +@@ + +@RET@ int +@FUNC@ FcUcs4ToUtf8 +@TYPE1@ FcChar32% @ARG1@ src +@TYPE2@ FcChar8% @ARG2@ dst[FC_UTF8_MAX_LEN] +@PURPOSE@ convert UCS4 to UTF-8 +@DESC@ +Converts the Unicode char from <parameter>src</parameter> into +<parameter>dst</parameter> and returns the number of bytes needed to encode +the char. +@@ + +@RET@ FcBool +@FUNC@ FcUtf8Len +@TYPE1@ FcChar8 * @ARG1@ src +@TYPE2@ int% @ARG2@ len +@TYPE3@ int * @ARG3@ nchar +@TYPE4@ int * @ARG4@ wchar +@PURPOSE@ count UTF-8 encoded chars +@DESC@ +Counts the number of Unicode chars in <parameter>len</parameter> bytes of +<parameter>src</parameter>. Places that count in +<parameter>nchar</parameter>. <parameter>wchar</parameter> contains 1, 2 or +4 depending on the number of bytes needed to hold the largest unicode char +counted. The return value indicates whether <parameter>src</parameter> is a +well-formed UTF8 string. +@@ + +@RET@ int +@FUNC@ FcUtf16ToUcs4 +@TYPE1@ FcChar8 * @ARG1@ src +@TYPE2@ FcEndian% @ARG2@ endian +@TYPE3@ FcChar32 * @ARG3@ dst +@TYPE4@ int% @ARG4@ len +@PURPOSE@ convert UTF-16 to UCS4 +@DESC@ +Converts the next Unicode char from <parameter>src</parameter> into +<parameter>dst</parameter> and returns the number of bytes containing the +char. <parameter>src</parameter> must be at least <parameter>len</parameter> +bytes long. Bytes of <parameter>src</parameter> are combined into 16-bit +units according to <parameter>endian</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcUtf16Len +@TYPE1@ FcChar8 * @ARG1@ src +@TYPE2@ FcEndian% @ARG2@ endian +@TYPE3@ int% @ARG3@ len +@TYPE4@ int * @ARG4@ nchar +@TYPE5@ int * @ARG5@ wchar +@PURPOSE@ count UTF-16 encoded chars +@DESC@ +Counts the number of Unicode chars in <parameter>len</parameter> bytes of +<parameter>src</parameter>. Bytes of <parameter>src</parameter> are +combined into 16-bit units according to <parameter>endian</parameter>. +Places that count in <parameter>nchar</parameter>. +<parameter>wchar</parameter> contains 1, 2 or 4 depending on the number of +bytes needed to hold the largest unicode char counted. The return value +indicates whether <parameter>string</parameter> is a well-formed UTF16 +string. +@@ + +@RET@ FcBool +@FUNC@ FcIsLower +@TYPE1@ FcChar8 @ARG1@ c +@PURPOSE@ check for lower case ASCII character +@DESC@ +This macro checks whether <parameter>c</parameter> is an lower case ASCII +letter. +@@ + +@RET@ FcBool +@FUNC@ FcIsUpper +@TYPE1@ FcChar8 @ARG1@ c +@PURPOSE@ check for upper case ASCII character +@DESC@ +This macro checks whether <parameter>c</parameter> is a upper case ASCII +letter. +@@ + +@RET@ FcChar8 +@FUNC@ FcToLower +@TYPE1@ FcChar8 @ARG1@ c +@PURPOSE@ convert upper case ASCII to lower case +@DESC@ +This macro converts upper case ASCII <parameter>c</parameter> to the +equivalent lower case letter. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrCopy +@TYPE1@ const FcChar8 * @ARG1@ s +@PURPOSE@ duplicate a string +@DESC@ +Allocates memory, copies <parameter>s</parameter> and returns the resulting +buffer. Yes, this is <function>strdup</function>, but that function isn't +available on every platform. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrDowncase +@TYPE1@ const FcChar8 * @ARG1@ s +@PURPOSE@ create a lower case translation of a string +@DESC@ +Allocates memory, copies <parameter>s</parameter>, converting upper case +letters to lower case and returns the allocated buffer. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrCopyFilename +@TYPE1@ const FcChar8 * @ARG1@ s +@PURPOSE@ create a complete path from a filename +@DESC@ +<function>FcStrCopyFilename</function> constructs an absolute pathname from +<parameter>s</parameter>. It converts any leading '~' characters in +to the value of the HOME environment variable, and any relative paths are +converted to absolute paths using the current working directory. Sequences +of '/' characters are converted to a single '/', and names containing the +current directory '.' or parent directory '..' are correctly reconstructed. +Returns NULL if '~' is the leading character and HOME is unset or disabled +(see <function>FcConfigEnableHome</function>). +@@ + +@RET@ int +@FUNC@ FcStrCmp +@TYPE1@ const FcChar8 * @ARG1@ s1 +@TYPE2@ const FcChar8 * @ARG2@ s2 +@PURPOSE@ compare UTF-8 strings +@DESC@ +Returns the usual <0, 0, >0 result of comparing +<parameter>s1</parameter> and <parameter>s2</parameter>. +@@ + +@RET@ int +@FUNC@ FcStrCmpIgnoreCase +@TYPE1@ const FcChar8 * @ARG1@ s1 +@TYPE2@ const FcChar8 * @ARG2@ s2 +@PURPOSE@ compare UTF-8 strings ignoring case +@DESC@ +Returns the usual <0, 0, >0 result of comparing +<parameter>s1</parameter> and <parameter>s2</parameter>. This test is +case-insensitive for all proper UTF-8 encoded strings. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrStr +@TYPE1@ const FcChar8 * @ARG1@ s1 +@TYPE2@ const FcChar8 * @ARG2@ s2 +@PURPOSE@ locate UTF-8 substring +@DESC@ +Returns the location of <parameter>s2</parameter> in +<parameter>s1</parameter>. Returns NULL if <parameter>s2</parameter> +is not present in <parameter>s1</parameter>. This test will operate properly +with UTF8 encoded strings. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrStrIgnoreCase +@TYPE1@ const FcChar8 * @ARG1@ s1 +@TYPE2@ const FcChar8 * @ARG2@ s2 +@PURPOSE@ locate UTF-8 substring ignoring ASCII case +@DESC@ +Returns the location of <parameter>s2</parameter> in +<parameter>s1</parameter>, ignoring case. Returns NULL if +<parameter>s2</parameter> is not present in <parameter>s1</parameter>. +This test is case-insensitive for all proper UTF-8 encoded strings. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrPlus +@TYPE1@ const FcChar8 * @ARG1@ s1 +@TYPE2@ const FcChar8 * @ARG2@ s2 +@PURPOSE@ concatenate two strings +@DESC@ +This function allocates new storage and places the concatenation of +<parameter>s1</parameter> and <parameter>s2</parameter> there, returning the +new string. +@@ + +@RET@ void +@FUNC@ FcStrFree +@TYPE1@ FcChar8 * @ARG1@ s +@PURPOSE@ free a string +@DESC@ +This is just a wrapper around free(3) which helps track memory usage of +strings within the fontconfig library. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrDirname +@TYPE1@ const FcChar8 * @ARG1@ file +@PURPOSE@ directory part of filename +@DESC@ +Returns the directory containing <parameter>file</parameter>. This +is returned in newly allocated storage which should be freed when no longer +needed. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrBasename +@TYPE1@ const FcChar8 * @ARG1@ file +@PURPOSE@ last component of filename +@DESC@ +Returns the filename of <parameter>file</parameter> stripped of any leading +directory names. This is returned in newly allocated storage which should +be freed when no longer needed. +@@ diff --git a/fontconfig/doc/fcstrset.fncs b/fontconfig/doc/fcstrset.fncs new file mode 100644 index 000000000..61af37b63 --- /dev/null +++ b/fontconfig/doc/fcstrset.fncs @@ -0,0 +1,115 @@ +/* + * fontconfig/doc/fcstrset.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + <variablelist> + +@RET@ FcStrSet * +@FUNC@ FcStrSetCreate +@TYPE1@ void +@PURPOSE@ create a string set +@DESC@ +Create an empty set. +@@ + +@RET@ FcBool +@FUNC@ FcStrSetMember +@TYPE1@ FcStrSet * @ARG1@ set +@TYPE2@ const FcChar8 * @ARG2@ s +@PURPOSE@ check set for membership +@DESC@ +Returns whether <parameter>s</parameter> is a member of +<parameter>set</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcStrSetEqual +@TYPE1@ FcStrSet * @ARG1@ set_a +@TYPE2@ FcStrSet * @ARG2@ set_b +@PURPOSE@ check sets for equality +@DESC@ +Returns whether <parameter>set_a</parameter> contains precisely the same +strings as <parameter>set_b</parameter>. Ordering of strings within the two +sets is not considered. +@@ + +@RET@ FcBool +@FUNC@ FcStrSetAdd +@TYPE1@ FcStrSet * @ARG1@ set +@TYPE2@ const FcChar8 * @ARG2@ s +@PURPOSE@ add to a string set +@DESC@ +Adds a copy of <parameter>s</parameter> to <parameter>set</parameter>. +@@ + +@RET@ FcBool +@FUNC@ FcStrSetAddFilename +@TYPE1@ FcStrSet * @ARG1@ set +@TYPE2@ const FcChar8 * @ARG2@ s +@PURPOSE@ add a filename to a string set +@DESC@ +Adds a copy <parameter>s</parameter> to <parameter>set</parameter>, The copy +is created with FcStrCopyFilename so that leading '~' values are replaced +with the value of the HOME environment variable. +@@ + +@RET@ FcBool +@FUNC@ FcStrSetDel +@TYPE1@ FcStrSet * @ARG1@ set +@TYPE2@ const FcChar8 * @ARG2@ s +@PURPOSE@ delete from a string set +@DESC@ +Removes <parameter>s</parameter> from <parameter>set</parameter>, returning +FcTrue if <parameter>s</parameter> was a member else FcFalse. +@@ + +@RET@ void +@FUNC@ FcStrSetDestroy +@TYPE1@ FcStrSet * @ARG1@ set +@PURPOSE@ destroy a string set +@DESC@ +Destroys <parameter>set</parameter>. +@@ + +@RET@ FcStrList * +@FUNC@ FcStrListCreate +@TYPE1@ FcStrSet * @ARG1@ set +@PURPOSE@ create a string iterator +@DESC@ +Creates an iterator to list the strings in <parameter>set</parameter>. +@@ + +@RET@ FcChar8 * +@FUNC@ FcStrListNext +@TYPE1@ FcStrList * @ARG1@ list +@PURPOSE@ get next string in iteration +@DESC@ +Returns the next string in <parameter>set</parameter>. +@@ + +@RET@ void +@FUNC@ FcStrListDone +@TYPE1@ FcStrList * @ARG1@ list +@PURPOSE@ destroy a string iterator +@DESC@ +Destroys the enumerator <parameter>list</parameter>. +@@ diff --git a/fontconfig/doc/fcvalue.fncs b/fontconfig/doc/fcvalue.fncs new file mode 100644 index 000000000..d0c669b1f --- /dev/null +++ b/fontconfig/doc/fcvalue.fncs @@ -0,0 +1,61 @@ +/* + * fontconfig/doc/fcvalue.fncs + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ +@RET@ void +@FUNC@ FcValueDestroy +@TYPE1@ FcValue% @ARG1@ v +@PURPOSE@ Free a value +@DESC@ +Frees any memory referenced by <parameter>v</parameter>. Values of type FcTypeString, +FcTypeMatrix and FcTypeCharSet reference memory, the other types do not. +@@ + +@RET@ FcValue +@FUNC@ FcValueSave +@TYPE1@ FcValue% @ARG1@ v +@PURPOSE@ Copy a value +@DESC@ +Returns a copy of <parameter>v</parameter> duplicating any object referenced by it so that <parameter>v</parameter> +may be safely destroyed without harming the new value. +@@ + +@RET@ void +@FUNC@ FcValuePrint +@TYPE1@ FcValue% @ARG1@ v +@PURPOSE@ Print a value to stdout +@DESC@ +Prints a human-readable representation of <parameter>v</parameter> to +stdout. The format should not be considered part of the library +specification as it may change in the future. +@@ + +@RET@ FcBool +@FUNC@ FcValueEqual +@TYPE1@ FcValue% @ARG1@ v_a +@TYPE2@ FcValue% @ARG2@ v_b +@PURPOSE@ Test two values for equality +@DESC@ +Compares two values. Integers and Doubles are compared as numbers; otherwise +the two values have to be the same type to be considered equal. Strings are +compared ignoring case. +@@ diff --git a/fontconfig/doc/fontconfig-devel.sgml b/fontconfig/doc/fontconfig-devel.sgml new file mode 100644 index 000000000..891251f30 --- /dev/null +++ b/fontconfig/doc/fontconfig-devel.sgml @@ -0,0 +1,573 @@ +<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ +<!ENTITY fcatomic SYSTEM "fcatomic.sgml"> +<!ENTITY fcblanks SYSTEM "fcblanks.sgml"> +<!ENTITY fccache SYSTEM "fccache.sgml"> +<!ENTITY fccharset SYSTEM "fccharset.sgml"> +<!ENTITY fcconfig SYSTEM "fcconfig.sgml"> +<!ENTITY fcconstant SYSTEM "fcconstant.sgml"> +<!ENTITY fcdircache SYSTEM "fcdircache.sgml"> +<!ENTITY fcfile SYSTEM "fcfile.sgml"> +<!ENTITY fcfontset SYSTEM "fcfontset.sgml"> +<!ENTITY fcformat SYSTEM "fcformat.sgml"> +<!ENTITY fcfreetype SYSTEM "fcfreetype.sgml"> +<!ENTITY fcinit SYSTEM "fcinit.sgml"> +<!ENTITY fclangset SYSTEM "fclangset.sgml"> +<!ENTITY fcmatrix SYSTEM "fcmatrix.sgml"> +<!ENTITY fcobjectset SYSTEM "fcobjectset.sgml"> +<!ENTITY fcobjecttype SYSTEM "fcobjecttype.sgml"> +<!ENTITY fcpattern SYSTEM "fcpattern.sgml"> +<!ENTITY fcstring SYSTEM "fcstring.sgml"> +<!ENTITY fcstrset SYSTEM "fcstrset.sgml"> +<!ENTITY fcvalue SYSTEM "fcvalue.sgml"> +<!ENTITY version SYSTEM "version.sgml"> +]> +<!-- + fontconfig/doc/local-fontconfig-devel.sgml + + Copyright © 2003 Keith Packard + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Keith Packard not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Keith Packard makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. +--> +<article> + <title>Fontconfig Developers Reference, Version &version; </title> + <artheader> + <author> + <firstname>Keith</firstname> + <surname>Packard</surname> + <affiliation><orgname> + HP Cambridge Research Lab + </orgname></affiliation> + </author> + <authorinitials>KRP</authorinitials> + <productname>Fontconfig</productname> + <productnumber>&version;</productnumber> + <LegalNotice> + <simpara> +Copyright © 2002 Keith Packard + </simpara><simpara> +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + </simpara><simpara> +THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + </simpara> + </LegalNotice> + </artheader> +<sect1><title>DESCRIPTION</title> + <para> +Fontconfig is a library designed to provide system-wide font configuration, +customization and application access. + </para> +</sect1> +<sect1><title>FUNCTIONAL OVERVIEW</title> + <para> +Fontconfig contains two essential modules, the configuration module which +builds an internal configuration from XML files and the matching module +which accepts font patterns and returns the nearest matching font. + </para> + <sect2><title>FONT CONFIGURATION</title> + <para> +The configuration module consists of the FcConfig datatype, libexpat and +FcConfigParse which walks over an XML tree and ammends a configuration with +data found within. From an external perspective, configuration of the +library consists of generating a valid XML tree and feeding that to +FcConfigParse. The only other mechanism provided to applications for +changing the running configuration is to add fonts and directories to the +list of application-provided font files. + </para><para> +The intent is to make font configurations relatively static, and shared by +as many applications as possible. It is hoped that this will lead to more +stable font selection when passing names from one application to another. +XML was chosen as a configuration file format because it provides a format +which is easy for external agents to edit while retaining the correct +structure and syntax. + </para><para> +Font configuration is separate from font matching; applications needing to +do their own matching can access the available fonts from the library and +perform private matching. The intent is to permit applications to pick and +choose appropriate functionality from the library instead of forcing them to +choose between this library and a private configuration mechanism. The hope +is that this will ensure that configuration of fonts for all applications +can be centralized in one place. Centralizing font configuration will +simplify and regularize font installation and customization. + </para> + </sect2> + <sect2> + <title>FONT PROPERTIES</title> + <para> +While font patterns may contain essentially any properties, there are some +well known properties with associated types. Fontconfig uses some of these +properties for font matching and font completion. Others are provided as a +convenience for the applications rendering mechanism. + </para> + <programlisting> + Property Definitions + + Property CPP Symbol Type Description + ---------------------------------------------------- + family FC_FAMILY String Font family names + familylang FC_FAMILYLANG String Language cooresponding to + each family name + style FC_STYLE String Font style. Overrides weight + and slant + stylelang FC_STYLELANG String Language cooresponding to + each style name + fullname FC_FULLNAME String Font face full name where + different from family and + family + style + fullnamelang FC_FULLNAMELANG String Language cooresponding to + each fullname + slant FC_SLANT Int Italic, oblique or roman + weight FC_WEIGHT Int Light, medium, demibold, + bold or black + size FC_SIZE Double Point size + width FC_WIDTH Int Condensed, normal or expanded + aspect FC_ASPECT Double Stretches glyphs horizontally + before hinting + pixelsize FC_PIXEL_SIZE Double Pixel size + spacing FC_SPACING Int Proportional, dual-width, + monospace or charcell + foundry FC_FOUNDRY String Font foundry name + antialias FC_ANTIALIAS Bool Whether glyphs can be + antialiased + hinting FC_HINTING Bool Whether the rasterizer should + use hinting + hintstyle FC_HINT_STYLE Int Automatic hinting style + verticallayout FC_VERTICAL_LAYOUT Bool Use vertical layout + autohint FC_AUTOHINT Bool Use autohinter instead of + normal hinter + globaladvance FC_GLOBAL_ADVANCE Bool Use font global advance data + file FC_FILE String The filename holding the font + index FC_INDEX Int The index of the font within + the file + ftface FC_FT_FACE FT_Face Use the specified FreeType + face object + rasterizer FC_RASTERIZER String Which rasterizer is in use + outline FC_OUTLINE Bool Whether the glyphs are outlines + scalable FC_SCALABLE Bool Whether glyphs can be scaled + scale FC_SCALE Double Scale factor for point->pixel + conversions + dpi FC_DPI Double Target dots per inch + rgba FC_RGBA Int unknown, rgb, bgr, vrgb, + vbgr, none - subpixel geometry + lcdfilter FC_LCD_FILTER Int Type of LCD filter + minspace FC_MINSPACE Bool Eliminate leading from line + spacing + charset FC_CHARSET CharSet Unicode chars encoded by + the font + lang FC_LANG LangSet Set of RFC-3066-style + languages this font supports + fontversion FC_FONTVERSION Int Version number of the font + capability FC_CAPABILITY String List of layout capabilities in + the font + embolden FC_EMBOLDEN Bool Rasterizer should + synthetically embolden the font + </programlisting> + </sect2> +</sect1> +<sect1><title>Datatypes</title> + <para> +Fontconfig uses abstract datatypes to hide internal implementation details +for most data structures. A few structures are exposed where appropriate. + </para> + <sect2><title>FcChar8, FcChar16, FcChar32, FcBool</title> + <para> +These are primitive datatypes; the FcChar* types hold precisely the number +of bits stated (if supported by the C implementation). FcBool holds +one of two CPP symbols: FcFalse or FcTrue. + </para> + </sect2> + <sect2><title>FcMatrix</title> + <para> +An FcMatrix holds an affine transformation, usually used to reshape glyphs. +A small set of matrix operations are provided to manipulate these. + <programlisting> + typedef struct _FcMatrix { + double xx, xy, yx, yy; + } FcMatrix; + </programlisting> + </para> + </sect2> + <sect2><title>FcCharSet</title> + <para> +An FcCharSet is an abstract type that holds the set of encoded unicode chars +in a font. Operations to build and compare these sets are provided. + </para> + </sect2> + <sect2><title>FcLangSet</title> + <para> +An FcLangSet is an abstract type that holds the set of languages supported +by a font. Operations to build and compare these sets are provided. These +are computed for a font based on orthographic information built into the +fontconfig library. Fontconfig has orthographies for all of the ISO 639-1 +languages except for MS, NA, PA, PS, QU, RN, RW, SD, SG, SN, SU and ZA. If +you have orthographic information for any of these languages, please submit +them. + </para> + </sect2> + <sect2><title>FcLangResult</title> + <para> +An FcLangResult is an enumeration used to return the results of comparing +two language strings or FcLangSet objects. FcLangEqual means the +objects match language and territory. FcLangDifferentTerritory means +the objects match in language but differ in territory. +FcLangDifferentLang means the objects differ in language. + </para> + </sect2> + <sect2><title>FcType</title> + <para> +Tags the kind of data stored in an FcValue. + </para> + </sect2> + <sect2><title>FcValue</title> + <para> +An FcValue object holds a single value with one of a number of different +types. The 'type' tag indicates which member is valid. + <programlisting> + typedef struct _FcValue { + FcType type; + union { + const FcChar8 *s; + int i; + FcBool b; + double d; + const FcMatrix *m; + const FcCharSet *c; + void *f; + const FcLangSet *l; + } u; + } FcValue; + </programlisting> + <programlisting> + FcValue Members + + Type Union member Datatype + -------------------------------- + FcTypeVoid (none) (none) + FcTypeInteger i int + FcTypeDouble d double + FcTypeString s FcChar8 * + FcTypeBool b b + FcTypeMatrix m FcMatrix * + FcTypeCharSet c FcCharSet * + FcTypeFTFace f void * (FT_Face) + FcTypeLangSet l FcLangSet * + </programlisting> + </para> + </sect2> + <sect2><title>FcPattern</title> + <para> +holds a set of names with associated value lists; each name refers to a +property of a font. FcPatterns are used as inputs to the matching code as +well as holding information about specific fonts. Each property can hold +one or more values; conventionally all of the same type, although the +interface doesn't demand that. + </para> + </sect2> + <sect2><title>FcFontSet</title> + <para> + <programlisting> + typedef struct _FcFontSet { + int nfont; + int sfont; + FcPattern **fonts; + } FcFontSet; + </programlisting> +An FcFontSet contains a list of FcPatterns. Internally fontconfig uses this +data structure to hold sets of fonts. Externally, fontconfig returns the +results of listing fonts in this format. 'nfont' holds the number of +patterns in the 'fonts' array; 'sfont' is used to indicate the size of that +array. + </para> + </sect2> + <sect2><title>FcStrSet, FcStrList</title> + <para> +FcStrSet holds a list of strings that can be appended to and enumerated. +Its unique characteristic is that the enumeration works even while strings +are appended during enumeration. FcStrList is used during enumeration to +safely and correctly walk the list of strings even while that list is edited +in the middle of enumeration. + </para> + </sect2> + <sect2><title>FcObjectSet</title> + <para> + <programlisting> + typedef struct _FcObjectSet { + int nobject; + int sobject; + const char **objects; + } FcObjectSet; + </programlisting> +holds a set of names and is used to specify which fields from fonts are +placed in the the list of returned patterns when listing fonts. + </para> + </sect2> + <sect2><title>FcObjectType</title> + <para> + <programlisting> + typedef struct _FcObjectType { + const char *object; + FcType type; + } FcObjectType; + </programlisting> +marks the type of a pattern element generated when parsing font names. +Applications can add new object types so that font names may contain the new +elements. + </para> + </sect2> + <sect2><title>FcConstant</title> + <para> + <programlisting> + typedef struct _FcConstant { + const FcChar8 *name; + const char *object; + int value; + } FcConstant; + </programlisting> +Provides for symbolic constants for new pattern elements. When 'name' is +seen in a font name, an 'object' element is created with value 'value'. + </para> + </sect2> + <sect2><title>FcBlanks</title> + <para> +holds a list of Unicode chars which are expected to be blank; unexpectedly +blank chars are assumed to be invalid and are elided from the charset +associated with the font. + </para> + </sect2> + <sect2><title>FcFileCache</title> + <para> +holds the per-user cache information for use while loading the font +database. This is built automatically for the current configuration when +that is loaded. Applications must always pass '0' when one is requested. + </para> + </sect2> + <sect2><title>FcConfig</title> + <para> +holds a complete configuration of the library; there is one default +configuration, other can be constructed from XML data structures. All +public entry points that need global data can take an optional FcConfig* +argument; passing 0 uses the default configuration. FcConfig objects hold two +sets of fonts, the first contains those specified by the configuration, the +second set holds those added by the application at run-time. Interfaces +that need to reference a particulat set use one of the FcSetName enumerated +values. + </para> + </sect2> + <sect2><title>FcSetName</title> + <para> +Specifies one of the two sets of fonts available in a configuration; +FcSetSystem for those fonts specified in the configuration and +FcSetApplication which holds fonts provided by the application. + </para> + </sect2> + <sect2><title>FcResult</title> + <para> +Used as a return type for functions manipulating FcPattern objects. + <programlisting> + FcResult Values + Result Code Meaning + ----------------------------------------------------------- + FcResultMatch Object exists with the specified ID + FcResultNoMatch Object doesn't exist at all + FcResultTypeMismatch Object exists, but the type doesn't match + FcResultNoId Object exists, but has fewer values + than specified + FcResultOutOfMemory Malloc failed + </programlisting> + </para> + </sect2> + <sect2><title>FcAtomic</title> + <para> +Used for locking access to config files. Provides a safe way to update +configuration files. + </para> + </sect2> + <sect2><title>FcCache</title> + <para> +Holds information about the fonts contained in a single directory. Normal +applications need not worry about this as caches for font access are +automatically managed by the library. Applications dealing with cache +management may want to use some of these objects in their work, however the +included 'fc-cache' program generally suffices for all of that. + </para> + </sect2> +</sect1> +<sect1><title>FUNCTIONS</title> + <para> +These are grouped by functionality, often using the main datatype being +manipulated. + </para> + <sect2><title>Initialization</title> + <para> +These functions provide some control over how the library is initialized. + </para> + &fcinit; + </sect2> + <sect2><title>FcPattern</title> + <para> +An FcPattern is an opaque type that holds both patterns to match against the +available fonts, as well as the information about each font. + </para> + &fcpattern; + &fcformat; + </sect2> + <sect2><title>FcFontSet</title> + <para> +An FcFontSet simply holds a list of patterns; these are used to return the +results of listing available fonts. + </para> + &fcfontset; + </sect2> + <sect2><title>FcObjectSet</title> + <para> +An FcObjectSet holds a list of pattern property names; it is used to +indiciate which properties are to be returned in the patterns from +FcFontList. + </para> + &fcobjectset; + </sect2> + <sect2><title>FreeType specific functions</title> + <para> +While the fontconfig library doesn't insist that FreeType be used as the +rasterization mechanism for fonts, it does provide some convenience +functions. + </para> + &fcfreetype; + </sect2> + <sect2><title>FcValue</title> + <para> +FcValue is a structure containing a type tag and a union of all possible +datatypes. The tag is an enum of type +<emphasis>FcType</emphasis> +and is intended to provide a measure of run-time +typechecking, although that depends on careful programming. + </para> + &fcvalue; + </sect2> + <sect2><title>FcCharSet</title> + <para> +An FcCharSet is a boolean array indicating a set of unicode chars. Those +associated with a font are marked constant and cannot be edited. +FcCharSets may be reference counted internally to reduce memory consumption; +this may be visible to applications as the result of FcCharSetCopy may +return it's argument, and that CharSet may remain unmodifiable. + </para> + &fccharset; + </sect2> + <sect2><title>FcLangSet</title> + <para> +An FcLangSet is a set of language names (each of which include language and +an optional territory). They are used when selecting fonts to indicate which +languages the fonts need to support. Each font is marked, using language +orthography information built into fontconfig, with the set of supported +languages. + </para> + &fclangset; + </sect2> + <sect2><title>FcMatrix</title> + <para> +FcMatrix structures hold an affine transformation in matrix form. + </para> + &fcmatrix; + </sect2> + <sect2><title>FcConfig</title> + <para> +An FcConfig object holds the internal representation of a configuration. +There is a default configuration which applications may use by passing 0 to +any function using the data within an FcConfig. + </para> + &fcconfig; + </sect2> + <sect2><title>FcObjectType</title> + <para> +Provides for applcation-specified font name object types so that new +pattern elements can be generated from font names. + </para> + &fcobjecttype; + </sect2> + <sect2><title>FcConstant</title> + <para> +Provides for application-specified symbolic constants for font names. + </para> + &fcconstant; + </sect2> + <sect2><title>FcBlanks</title> + <para> +An FcBlanks object holds a list of Unicode chars which are expected to +be blank when drawn. When scanning new fonts, any glyphs which are +empty and not in this list will be assumed to be broken and not placed in +the FcCharSet associated with the font. This provides a significantly more +accurate CharSet for applications. + </para> + &fcblanks; + </sect2> + <sect2><title>FcAtomic</title> + <para> +These functions provide a safe way to update config files, allowing ongoing +reading of the old config file while locked for writing and ensuring that a +consistent and complete version of the config file is always available. + </para> + &fcatomic; + </sect2> + <sect2><title>File and Directory routines</title> + <para> +These routines work with font files and directories, including font +directory cache files. + </para> + &fcfile; + &fcdircache; + </sect2> + <sect2><title>FcCache routines</title> + <para> +These routines work with font directory caches, accessing their contents in +limited ways. It is not expected that normal applications will need to use +these functions. + </para> + &fccache; + </sect2> + <sect2><title>FcStrSet and FcStrList</title> + <para> +A data structure for enumerating strings, used to list directories while +scanning the configuration as directories are added while scanning. + </para> + &fcstrset; + </sect2> + <sect2><title>String utilities</title> + <para> +Fontconfig manipulates many UTF-8 strings represented with the FcChar8 type. +These functions are exposed to help applications deal with these UTF-8 +strings in a locale-insensitive manner. + </para> + &fcstring; + </sect2> +</sect1> +</article> diff --git a/fontconfig/doc/fontconfig-user.sgml b/fontconfig/doc/fontconfig-user.sgml new file mode 100644 index 000000000..298f8d5f5 --- /dev/null +++ b/fontconfig/doc/fontconfig-user.sgml @@ -0,0 +1,692 @@ +<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook V3.1//EN" [ +<!ENTITY version SYSTEM "version.sgml"> +<!ENTITY confdir SYSTEM "confdir.sgml"> +]> +<!-- + Copyright © 2003 Keith Packard + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Keith Packard not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Keith Packard makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. +--> +<refentry> +<refmeta> + <refentrytitle>fonts-conf</refentrytitle> + <manvolnum>5</manvolnum> +</refmeta> +<refnamediv> + <refname>fonts.conf</refname> + <refpurpose>Font configuration files</refpurpose> +</refnamediv> +<refsynopsisdiv> +<synopsis> + &confdir;/fonts.conf + &confdir;/fonts.dtd + &confdir;/conf.d + ~/.fonts.conf.d + ~/.fonts.conf +</synopsis> +</refsynopsisdiv> +<refsect1><title>Description</title> + <para> +Fontconfig is a library designed to provide system-wide font configuration, +customization and application access. + </para> +</refsect1> +<refsect1><title>Functional Overview</title> + <para> +Fontconfig contains two essential modules, the configuration module which +builds an internal configuration from XML files and the matching module +which accepts font patterns and returns the nearest matching font. + </para> + <refsect2><title>Font Configuration</title> + <para> +The configuration module consists of the FcConfig datatype, libexpat and +FcConfigParse which walks over an XML tree and amends a configuration with +data found within. From an external perspective, configuration of the +library consists of generating a valid XML tree and feeding that to +FcConfigParse. The only other mechanism provided to applications for +changing the running configuration is to add fonts and directories to the +list of application-provided font files. + </para><para> +The intent is to make font configurations relatively static, and shared by +as many applications as possible. It is hoped that this will lead to more +stable font selection when passing names from one application to another. +XML was chosen as a configuration file format because it provides a format +which is easy for external agents to edit while retaining the correct +structure and syntax. + </para><para> +Font configuration is separate from font matching; applications needing to +do their own matching can access the available fonts from the library and +perform private matching. The intent is to permit applications to pick and +choose appropriate functionality from the library instead of forcing them to +choose between this library and a private configuration mechanism. The hope +is that this will ensure that configuration of fonts for all applications +can be centralized in one place. Centralizing font configuration will +simplify and regularize font installation and customization. + </para> + </refsect2> + <refsect2> + <title>Font Properties</title> + <para> +While font patterns may contain essentially any properties, there are some +well known properties with associated types. Fontconfig uses some of these +properties for font matching and font completion. Others are provided as a +convenience for the applications' rendering mechanism. + </para> + <programlisting> + Property Type Description + -------------------------------------------------------------- + family String Font family names + familylang String Languages corresponding to each family + style String Font style. Overrides weight and slant + stylelang String Languages corresponding to each style + fullname String Font full names (often includes style) + fullnamelang String Languages corresponding to each fullname + slant Int Italic, oblique or roman + weight Int Light, medium, demibold, bold or black + size Double Point size + width Int Condensed, normal or expanded + aspect Double Stretches glyphs horizontally before hinting + pixelsize Double Pixel size + spacing Int Proportional, dual-width, monospace or charcell + foundry String Font foundry name + antialias Bool Whether glyphs can be antialiased + hinting Bool Whether the rasterizer should use hinting + hintstyle Int Automatic hinting style + verticallayout Bool Use vertical layout + autohint Bool Use autohinter instead of normal hinter + globaladvance Bool Use font global advance data + file String The filename holding the font + index Int The index of the font within the file + ftface FT_Face Use the specified FreeType face object + rasterizer String Which rasterizer is in use + outline Bool Whether the glyphs are outlines + scalable Bool Whether glyphs can be scaled + scale Double Scale factor for point->pixel conversions + dpi Double Target dots per inch + rgba Int unknown, rgb, bgr, vrgb, vbgr, + none - subpixel geometry + lcdfilter Int Type of LCD filter + minspace Bool Eliminate leading from line spacing + charset CharSet Unicode chars encoded by the font + lang String List of RFC-3066-style languages this + font supports + fontversion Int Version number of the font + capability String List of layout capabilities in the font + embolden Bool Rasterizer should synthetically embolden the font + </programlisting> + </refsect2> + <refsect2> + <title>Font Matching</title> + <para> +Fontconfig performs matching by measuring the distance from a provided +pattern to all of the available fonts in the system. The closest matching +font is selected. This ensures that a font will always be returned, but +doesn't ensure that it is anything like the requested pattern. + </para><para> +Font matching starts with an application constructed pattern. The desired +attributes of the resulting font are collected together in a pattern. Each +property of the pattern can contain one or more values; these are listed in +priority order; matches earlier in the list are considered "closer" than +matches later in the list. + </para><para> +The initial pattern is modified by applying the list of editing instructions +specific to patterns found in the configuration; each consists of a match +predicate and a set of editing operations. They are executed in the order +they appeared in the configuration. Each match causes the associated +sequence of editing operations to be applied. + </para><para> +After the pattern has been edited, a sequence of default substitutions are +performed to canonicalize the set of available properties; this avoids the +need for the lower layers to constantly provide default values for various +font properties during rendering. + </para><para> +The canonical font pattern is finally matched against all available fonts. +The distance from the pattern to the font is measured for each of several +properties: foundry, charset, family, lang, spacing, pixelsize, style, +slant, weight, antialias, rasterizer and outline. This list is in priority +order -- results of comparing earlier elements of this list weigh more +heavily than later elements. + </para><para> +There is one special case to this rule; family names are split into two +bindings; strong and weak. Strong family names are given greater precedence +in the match than lang elements while weak family names are given lower +precedence than lang elements. This permits the document language to drive +font selection when any document specified font is unavailable. + </para><para> +The pattern representing that font is augmented to include any properties +found in the pattern but not found in the font itself; this permits the +application to pass rendering instructions or any other data through the +matching system. Finally, the list of editing instructions specific to +fonts found in the configuration are applied to the pattern. This modified +pattern is returned to the application. + </para><para> +The return value contains sufficient information to locate and rasterize the +font, including the file name, pixel size and other rendering data. As +none of the information involved pertains to the FreeType library, +applications are free to use any rasterization engine or even to take +the identified font file and access it directly. + </para><para> +The match/edit sequences in the configuration are performed in two passes +because there are essentially two different operations necessary -- the +first is to modify how fonts are selected; aliasing families and adding +suitable defaults. The second is to modify how the selected fonts are +rasterized. Those must apply to the selected font, not the original pattern +as false matches will often occur. + </para> + </refsect2> + <refsect2><title>Font Names</title> + <para> +Fontconfig provides a textual representation for patterns that the library +can both accept and generate. The representation is in three parts, first a +list of family names, second a list of point sizes and finally a list of +additional properties: + </para> + <programlisting> + <families>-<point sizes>:<name1>=<values1>:<name2>=<values2>... + </programlisting> + <para> +Values in a list are separated with commas. The name needn't include either +families or point sizes; they can be elided. In addition, there are +symbolic constants that simultaneously indicate both a name and a value. +Here are some examples: + </para> + <programlisting> + Name Meaning + ---------------------------------------------------------- + Times-12 12 point Times Roman + Times-12:bold 12 point Times Bold + Courier:italic Courier Italic in the default size + Monospace:matrix=1 .1 0 1 The users preferred monospace font + with artificial obliquing + </programlisting> + <para> +The '\', '-', ':' and ',' characters in family names must be preceeded by a +'\' character to avoid having them misinterpreted. Similarly, values +containing '\', '=', '_', ':' and ',' must also have them preceeded by a +'\' character. The '\' characters are stripped out of the family name and +values as the font name is read. + </para> + </refsect2> +</refsect1> +<refsect1><title>Debugging Applications</title> + <para> +To help diagnose font and applications problems, fontconfig is built with a +large amount of internal debugging left enabled. It is controlled by means +of the FC_DEBUG environment variable. The value of this variable is +interpreted as a number, and each bit within that value controls different +debugging messages. + </para> + <programlisting> + Name Value Meaning + --------------------------------------------------------- + MATCH 1 Brief information about font matching + MATCHV 2 Extensive font matching information + EDIT 4 Monitor match/test/edit execution + FONTSET 8 Track loading of font information at startup + CACHE 16 Watch cache files being written + CACHEV 32 Extensive cache file writing information + PARSE 64 (no longer in use) + SCAN 128 Watch font files being scanned to build caches + SCANV 256 Verbose font file scanning information + MEMORY 512 Monitor fontconfig memory usage + CONFIG 1024 Monitor which config files are loaded + LANGSET 2048 Dump char sets used to construct lang values + OBJTYPES 4096 Display message when value typechecks fail + </programlisting> + <para> +Add the value of the desired debug levels together and assign that (in +base 10) to the FC_DEBUG environment variable before running the +application. Output from these statements is sent to stdout. + </para> +</refsect1> +<refsect1><title>Lang Tags</title> + <para> +Each font in the database contains a list of languages it supports. This is +computed by comparing the Unicode coverage of the font with the orthography +of each language. Languages are tagged using an RFC-3066 compatible naming +and occur in two parts -- the ISO 639 language tag followed a hyphen and then +by the ISO 3166 country code. The hyphen and country code may be elided. + </para><para> +Fontconfig has orthographies for several languages built into the library. +No provision has been made for adding new ones aside from rebuilding the +library. It currently supports 122 of the 139 languages named in ISO 639-1, +141 of the languages with two-letter codes from ISO 639-2 and another 30 +languages with only three-letter codes. Languages with both two and three +letter codes are provided with only the two letter code. + </para><para> +For languages used in multiple territories with radically different +character sets, fontconfig includes per-territory orthographies. This +includes Azerbaijani, Kurdish, Pashto, Tigrinya and Chinese. + </para> +</refsect1> +<refsect1><title>Configuration File Format</title> + <para> +Configuration files for fontconfig are stored in XML format; this +format makes external configuration tools easier to write and ensures that +they will generate syntactically correct configuration files. As XML +files are plain text, they can also be manipulated by the expert user using +a text editor. + </para><para> +The fontconfig document type definition resides in the external entity +"fonts.dtd"; this is normally stored in the default font configuration +directory (&confdir;). Each configuration file should contain the +following structure: + <programlisting> + <?xml version="1.0"?> + <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> + <fontconfig> + ... + </fontconfig> + </programlisting> + </para> +<refsect2><title><literal><fontconfig></literal></title><para> +This is the top level element for a font configuration and can contain +<literal><dir></literal>, <literal><cache></literal>, <literal><include></literal>, <literal><match></literal> and <literal><alias></literal> elements in any order. + </para></refsect2> + <refsect2><title><literal><dir></literal></title><para> +This element contains a directory name which will be scanned for font files +to include in the set of available fonts. + </para></refsect2> + <refsect2><title><literal><cache></literal></title><para> +This element contains a file name for the per-user cache of font +information. If it starts with '~', it refers to a file in the users +home directory. This file is used to hold information about fonts that +isn't present in the per-directory cache files. It is automatically +maintained by the fontconfig library. The default for this file +is ``~/.fonts.cache-<literal><version></literal>'', where <literal><version></literal> is the font configuration +file version number (currently 2). + </para></refsect2> + <refsect2><title><literal><include ignore_missing="no"></literal></title><para> +This element contains the name of an additional configuration file or +directory. If a directory, every file within that directory starting with an +ASCII digit (U+0030 - U+0039) and ending with the string ``.conf'' will be processed in sorted order. When +the XML datatype is traversed by FcConfigParse, the contents of the file(s) +will also be incorporated into the configuration by passing the filename(s) to +FcConfigLoadAndParse. If 'ignore_missing' is set to "yes" instead of the +default "no", a missing file or directory will elicit no warning message from +the library. + </para></refsect2> + <refsect2><title><literal><config></literal></title><para> +This element provides a place to consolidate additional configuration +information. <literal><config></literal> can contain <literal><blank></literal> and <literal><rescan></literal> elements in any +order. + </para></refsect2> + <refsect2><title><literal><blank></literal></title><para> +Fonts often include "broken" glyphs which appear in the encoding but are +drawn as blanks on the screen. Within the <literal><blank></literal> element, place each +Unicode characters which is supposed to be blank in an <literal><int></literal> element. +Characters outside of this set which are drawn as blank will be elided from +the set of characters supported by the font. + </para></refsect2> + <refsect2><title><literal><rescan></literal></title><para> +The <literal><rescan></literal> element holds an <literal><int></literal> element which indicates the default +interval between automatic checks for font configuration changes. +Fontconfig will validate all of the configuration files and directories and +automatically rebuild the internal datastructures when this interval passes. + </para></refsect2> + <refsect2><title><literal><selectfont></literal></title><para> +This element is used to black/white list fonts from being listed or matched +against. It holds acceptfont and rejectfont elements. + </para></refsect2> + <refsect2><title><literal><acceptfont></literal></title><para> +Fonts matched by an acceptfont element are "whitelisted"; such fonts are +explicitly included in the set of fonts used to resolve list and match +requests; including them in this list protects them from being "blacklisted" +by a rejectfont element. Acceptfont elements include glob and pattern +elements which are used to match fonts. + </para></refsect2> + <refsect2><title><literal><rejectfont></literal></title><para> +Fonts matched by an rejectfont element are "blacklisted"; such fonts are +excluded from the set of fonts used to resolve list and match requests as if +they didn't exist in the system. Rejectfont elements include glob and +pattern elements which are used to match fonts. + </para></refsect2> + <refsect2><title><literal><glob></literal></title><para> +Glob elements hold shell-style filename matching patterns (including ? and +*) which match fonts based on their complete pathnames. This can be used to +exclude a set of directories (/usr/share/fonts/uglyfont*), or particular +font file types (*.pcf.gz), but the latter mechanism relies rather heavily +on filenaming conventions which can't be relied upon. Note that globs +only apply to directories, not to individual fonts. + </para></refsect2> + <refsect2><title><literal><pattern></literal></title><para> +Pattern elements perform list-style matching on incoming fonts; that is, +they hold a list of elements and associated values. If all of those +elements have a matching value, then the pattern matches the font. This can +be used to select fonts based on attributes of the font (scalable, bold, +etc), which is a more reliable mechanism than using file extensions. +Pattern elements include patelt elements. + </para></refsect2> + <refsect2><title><literal><patelt name="property"></literal></title><para> +Patelt elements hold a single pattern element and list of values. They must +have a 'name' attribute which indicates the pattern element name. Patelt +elements include int, double, string, matrix, bool, charset and const +elements. + </para></refsect2> + <refsect2><title><literal><match target="pattern"></literal></title><para> +This element holds first a (possibly empty) list of <literal><test></literal> elements and then +a (possibly empty) list of <literal><edit></literal> elements. Patterns which match all of the +tests are subjected to all the edits. If 'target' is set to "font" instead +of the default "pattern", then this element applies to the font name +resulting from a match rather than a font pattern to be matched. If 'target' +is set to "scan", then this element applies when the font is scanned to +build the fontconfig database. + </para></refsect2> + <refsect2><title><literal><test qual="any" name="property" target="default" compare="eq"></literal></title><para> +This element contains a single value which is compared with the target +('pattern', 'font', 'scan' or 'default') property "property" (substitute any of the property names seen +above). 'compare' can be one of "eq", "not_eq", "less", "less_eq", "more", or +"more_eq". 'qual' may either be the default, "any", in which case the match +succeeds if any value associated with the property matches the test value, or +"all", in which case all of the values associated with the property must +match the test value. When used in a <match target="font"> element, +the target= attribute in the <test> element selects between matching +the original pattern or the font. "default" selects whichever target the +outer <match> element has selected. + </para></refsect2> + <refsect2><title><literal><edit name="property" mode="assign" binding="weak"></literal></title><para> +This element contains a list of expression elements (any of the value or +operator elements). The expression elements are evaluated at run-time and +modify the property "property". The modification depends on whether +"property" was matched by one of the associated <literal><test></literal> elements, if so, the +modification may affect the first matched value. Any values inserted into +the property are given the indicated binding ("strong", "weak" or "same") +with "same" binding using the value from the matched pattern element. +'mode' is one of: + <programlisting> + Mode With Match Without Match + --------------------------------------------------------------------- + "assign" Replace matching value Replace all values + "assign_replace" Replace all values Replace all values + "prepend" Insert before matching Insert at head of list + "prepend_first" Insert at head of list Insert at head of list + "append" Append after matching Append at end of list + "append_last" Append at end of list Append at end of list + </programlisting> + </para></refsect2> + <refsect2><title><literal><int></literal>, <literal><double></literal>, <literal><string></literal>, <literal><bool></literal></title><para> +These elements hold a single value of the indicated type. <literal><bool></literal> +elements hold either true or false. An important limitation exists in +the parsing of floating point numbers -- fontconfig requires that +the mantissa start with a digit, not a decimal point, so insert a leading +zero for purely fractional values (e.g. use 0.5 instead of .5 and -0.5 +instead of -.5). + </para></refsect2> + <refsect2><title><literal><matrix></literal></title><para> +This element holds the four <literal><double></literal> elements of an affine +transformation. + </para></refsect2> + <refsect2><title><literal><name></literal></title><para> +Holds a property name. Evaluates to the first value from the property of +the font, not the pattern. + </para></refsect2> + <refsect2><title><literal><const></literal></title><para> +Holds the name of a constant; these are always integers and serve as +symbolic names for common font values: + <programlisting> + Constant Property Value + ------------------------------------- + thin weight 0 + extralight weight 40 + ultralight weight 40 + light weight 50 + book weight 75 + regular weight 80 + normal weight 80 + medium weight 100 + demibold weight 180 + semibold weight 180 + bold weight 200 + extrabold weight 205 + black weight 210 + heavy weight 210 + roman slant 0 + italic slant 100 + oblique slant 110 + ultracondensed width 50 + extracondensed width 63 + condensed width 75 + semicondensed width 87 + normal width 100 + semiexpanded width 113 + expanded width 125 + extraexpanded width 150 + ultraexpanded width 200 + proportional spacing 0 + dual spacing 90 + mono spacing 100 + charcell spacing 110 + unknown rgba 0 + rgb rgba 1 + bgr rgba 2 + vrgb rgba 3 + vbgr rgba 4 + none rgba 5 + lcdnone lcdfilter 0 + lcddefault lcdfilter 1 + lcdlight lcdfilter 2 + lcdlegacy lcdfilter 3 + hintnone hintstyle 0 + hintslight hintstyle 1 + hintmedium hintstyle 2 + hintfull hintstyle 3 + </programlisting> + </para> + </refsect2> + <refsect2> + <title><literal><or></literal>, <literal><and></literal>, <literal><plus></literal>, <literal><minus></literal>, <literal><times></literal>, <literal><divide></literal></title> + <para> +These elements perform the specified operation on a list of expression +elements. <literal><or></literal> and <literal><and></literal> are boolean, not bitwise. + </para> + </refsect2> + <refsect2> + <title><literal><eq></literal>, <literal><not_eq></literal>, <literal><less></literal>, <literal><less_eq></literal>, <literal><more></literal>, <literal><more_eq></literal></title> + <para> +These elements compare two values, producing a boolean result. + </para></refsect2> + <refsect2><title><literal><not></literal></title><para> +Inverts the boolean sense of its one expression element + </para></refsect2> + <refsect2><title><literal><if></literal></title><para> +This element takes three expression elements; if the value of the first is +true, it produces the value of the second, otherwise it produces the value +of the third. + </para></refsect2> + <refsect2><title><literal><alias></literal></title><para> +Alias elements provide a shorthand notation for the set of common match +operations needed to substitute one font family for another. They contain a +<literal><family></literal> element followed by optional <literal><prefer></literal>, <literal><accept></literal> and <literal><default></literal> +elements. Fonts matching the <literal><family></literal> element are edited to prepend the +list of <literal><prefer></literal>ed families before the matching <literal><family></literal>, append the +<literal><accept></literal>able families after the matching <literal><family></literal> and append the <literal><default></literal> +families to the end of the family list. + </para></refsect2> + <refsect2><title><literal><family></literal></title><para> +Holds a single font family name + </para></refsect2> + <refsect2><title><literal><prefer></literal>, <literal><accept></literal>, <literal><default></literal></title><para> +These hold a list of <literal><family></literal> elements to be used by the <literal><alias></literal> element. + </para></refsect2> +</refsect1> +<refsect1><title>EXAMPLE CONFIGURATION FILE</title> + <refsect2><title>System configuration file</title> + <para> +This is an example of a system-wide configuration file + </para> + <programlisting> +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<!-- &confdir;/fonts.conf file to configure system font access --> +<fontconfig> +<!-- + Find fonts in these directories +--> +<dir>/usr/share/fonts</dir> +<dir>/usr/X11R6/lib/X11/fonts</dir> + +<!-- + Accept deprecated 'mono' alias, replacing it with 'monospace' +--> +<match target="pattern"> + <test qual="any" name="family"><string>mono</string></test> + <edit name="family" mode="assign"><string>monospace</string></edit> +</match> + +<!-- + Names not including any well known alias are given 'sans' +--> +<match target="pattern"> + <test qual="all" name="family" mode="not_eq">sans</test> + <test qual="all" name="family" mode="not_eq">serif</test> + <test qual="all" name="family" mode="not_eq">monospace</test> + <edit name="family" mode="append_last"><string>sans</string></edit> +</match> + +<!-- + Load per-user customization file, but don't complain + if it doesn't exist +--> +<include ignore_missing="yes">~/.fonts.conf</include> + +<!-- + Load local customization files, but don't complain + if there aren't any +--> +<include ignore_missing="yes">conf.d</include> +<include ignore_missing="yes">local.conf</include> + +<!-- + Alias well known font names to available TrueType fonts. + These substitute TrueType faces for similar Type1 + faces to improve screen appearance. +--> +<alias> + <family>Times</family> + <prefer><family>Times New Roman</family></prefer> + <default><family>serif</family></default> +</alias> +<alias> + <family>Helvetica</family> + <prefer><family>Arial</family></prefer> + <default><family>sans</family></default> +</alias> +<alias> + <family>Courier</family> + <prefer><family>Courier New</family></prefer> + <default><family>monospace</family></default> +</alias> + +<!-- + Provide required aliases for standard names + Do these after the users configuration file so that + any aliases there are used preferentially +--> +<alias> + <family>serif</family> + <prefer><family>Times New Roman</family></prefer> +</alias> +<alias> + <family>sans</family> + <prefer><family>Arial</family></prefer> +</alias> +<alias> + <family>monospace</family> + <prefer><family>Andale Mono</family></prefer> +</alias> +</fontconfig> + </programlisting> + </refsect2> + <refsect2><title>User configuration file</title> + <para> +This is an example of a per-user configuration file that lives in +~/.fonts.conf + </para> + <programlisting> +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<!-- ~/.fonts.conf for per-user font configuration --> +<fontconfig> + +<!-- + Private font directory +--> +<dir>~/.fonts</dir> + +<!-- + use rgb sub-pixel ordering to improve glyph appearance on + LCD screens. Changes affecting rendering, but not matching + should always use target="font". +--> +<match target="font"> + <edit name="rgba" mode="assign"><const>rgb</const></edit> +</match> +</fontconfig> + </programlisting> + </refsect2> +</refsect1> +<refsect1><title>Files</title> + <para> +<emphasis>fonts.conf</emphasis> +contains configuration information for the fontconfig library +consisting of directories to look at for font information as well as +instructions on editing program specified font patterns before attempting to +match the available fonts. It is in xml format. + </para> + <para> +<emphasis>conf.d</emphasis> +is the conventional name for a directory of additional configuration files +managed by external applications or the local administrator. The +filenames starting with decimal digits are sorted in lexicographic order +and used as additional configuration files. All of these files are in xml +format. The master fonts.conf file references this directory in an +<include> directive. + </para> + <para> +<emphasis>fonts.dtd</emphasis> +is a DTD that describes the format of the configuration files. + </para> + <para> +<emphasis>~/.fonts.conf.d</emphasis> +is the conventional name for a per-user directory of (typically +auto-generated) configuration files, although the +actual location is specified in the global fonts.conf file. + </para> + <para> +<emphasis>~/.fonts.conf</emphasis> +is the conventional location for per-user font configuration, although the +actual location is specified in the global fonts.conf file. + </para> + <para> +<emphasis> ~/.fonts.cache-*</emphasis> +is the conventional repository of font information that isn't found in the +per-directory caches. This file is automatically maintained by fontconfig. + </para> +</refsect1> +<refsect1><title>See Also</title> + <para> +fc-cat(1), fc-cache(1), fc-list(1), fc-match(1), fc-query(1) + </para> +</refsect1> +<refsect1><title>Version</title> + <para> +Fontconfig version &version; + </para> +</refsect1> +</refentry> diff --git a/fontconfig/doc/func.sgml b/fontconfig/doc/func.sgml new file mode 100644 index 000000000..0da5ae4a6 --- /dev/null +++ b/fontconfig/doc/func.sgml @@ -0,0 +1,90 @@ +<!-- + fontconfig/doc/func.sgml + + Copyright © 2003 Keith Packard + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Keith Packard not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Keith Packard makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + --> +@?TITLE@ + <refentry id="@TITLE@"> +@:@ + <refentry id="@FUNC@"> +@;@ + <refmeta> +@?TITLE@ + <refentrytitle>@TITLE@</refentrytitle> +@:@ + <refentrytitle>@FUNC@</refentrytitle> +@;@ + <manvolnum>3</manvolnum> + </refmeta> + <refnamediv> +@{PROTOTYPE@ + <refname>@FUNC@</refname> +@}PROTOTYPE@ + <refpurpose>@PURPOSE@</refpurpose> + </refnamediv> + <refsynopsisdiv> + <funcsynopsis> + <funcsynopsisinfo> +@?SYNOPSIS@ +@SYNOPSIS@ +@:@ +#include <fontconfig.h> +@;@ + </funcsynopsisinfo> +@{PROTOTYPE@ + <funcprototype> + <funcdef>@?RET@@RET@@:@void@;@ <function>@FUNC@</function></funcdef> +@?TYPE1@ + <paramdef>@TYPE1@<parameter>@ARG1@</parameter></paramdef> +@;@ +@?TYPE2@ + <paramdef>@TYPE2@<parameter>@ARG2@</parameter></paramdef> +@;@ +@?TYPE3@ + <paramdef>@TYPE3@<parameter>@ARG3@</parameter></paramdef> +@;@ +@?TYPE4@ + <paramdef>@TYPE4@<parameter>@ARG4@</parameter></paramdef> +@;@ +@?TYPE5@ + <paramdef>@TYPE5@<parameter>@ARG5@</parameter></paramdef> +@;@ +@?TYPE6@ + <paramdef>@TYPE6@<parameter>@ARG6@</parameter></paramdef> +@;@ +@?TYPE7@ + <paramdef>@TYPE7@<parameter>@ARG7@</parameter></paramdef> +@;@ + </funcprototype> +@}PROTOTYPE@ + </funcsynopsis> + </refsynopsisdiv> + <refsect1><title>Description</title> + <para> +@DESC@ + </para> + </refsect1> + <refsect1><title>Version</title> + <para> +Fontconfig version &version; + </para> + </refsect1> + </refentry> diff --git a/fontconfig/doc/version.sgml.in b/fontconfig/doc/version.sgml.in new file mode 100644 index 000000000..9981b1c74 --- /dev/null +++ b/fontconfig/doc/version.sgml.in @@ -0,0 +1,24 @@ +<!-- + fontconfig/doc/version.sgml.in + + Copyright © 2003 Keith Packard + + Permission to use, copy, modify, distribute, and sell this software and its + documentation for any purpose is hereby granted without fee, provided that + the above copyright notice appear in all copies and that both that + copyright notice and this permission notice appear in supporting + documentation, and that the name of Keith Packard not be used in + advertising or publicity pertaining to distribution of the software without + specific, written prior permission. Keith Packard makes no + representations about the suitability of this software for any purpose. It + is provided "as is" without express or implied warranty. + + THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. +--> +@VERSION@ diff --git a/fontconfig/fc-arch/Makefile.am b/fontconfig/fc-arch/Makefile.am new file mode 100644 index 000000000..806c730b4 --- /dev/null +++ b/fontconfig/fc-arch/Makefile.am @@ -0,0 +1,54 @@ +# +# $Id $ +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +CC = @CC_FOR_BUILD@ +EXEEXT = @EXEEXT_FOR_BUILD@ +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS) + +TMPL=fcarch.tmpl.h +STMPL=${top_srcdir}/fc-arch/fcarch.tmpl.h +TARG=fcarch.h + +ARCHITECTURE=@ARCHITECTURE@ +.PRECIOUS: $(TARG) + +noinst_PROGRAMS=fc-arch + +EXTRA_DIST=$(TMPL) + +$(TARG):fc-arch${EXEEXT} $(STMPL) ${top_srcdir}/src/fcint.h ../config.h + $(AM_V_GEN) $(RM) $(TARG); \ + ./fc-arch${EXEEXT} $(ARCHITECTURE) < $(STMPL) > $(TARG).tmp && \ + mv $(TARG).tmp $(TARG) + +ALIAS_FILES = fcalias.h fcaliastail.h + +BUILT_SOURCES = $(ALIAS_FILES) $(TARG) + +$(ALIAS_FILES): + touch $(ALIAS_FILES) + +CLEANFILES=$(TARG) $(ALIAS_FILES) diff --git a/fontconfig/fc-arch/fc-arch.c b/fontconfig/fc-arch/fc-arch.c new file mode 100644 index 000000000..1ef0cf18a --- /dev/null +++ b/fontconfig/fc-arch/fc-arch.c @@ -0,0 +1,138 @@ +/* + * Copyright © 2006 Keith Packard + * Copyright © 2005 Patrick Lam + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <ctype.h> + +#define ENDIAN_TEST 0x01020304 +#define MACHINE_SIGNATURE_SIZE 1024 + +static char * +FcCacheMachineSignature (void) +{ + static char buf[MACHINE_SIGNATURE_SIZE]; + int32_t magic = ENDIAN_TEST; + char * m = (char *)&magic; + + sprintf (buf, "%01x%01x%01x%01x_" + "%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_" + "%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x_%02x", + m[0], m[1], m[2], m[3], + (unsigned int)sizeof (FcAlign), + (unsigned int)sizeof (char), + (unsigned int)sizeof (char *), + (unsigned int)sizeof (int), + (unsigned int)sizeof (intptr_t), + (unsigned int)sizeof (FcPattern), + (unsigned int)sizeof (FcPatternEltPtr), + (unsigned int)sizeof (struct FcPatternElt *), + (unsigned int)sizeof (FcPatternElt), + (unsigned int)sizeof (FcObject), + (unsigned int)sizeof (FcValueListPtr), + (unsigned int)sizeof (FcValue), + (unsigned int)sizeof (FcValueBinding), + (unsigned int)sizeof (struct FcValueList *), + (unsigned int)sizeof (FcStrSet *), /* For FcLangSet */ + (unsigned int)sizeof (FcCharSet), + (unsigned int)sizeof (FcCharLeaf **), + (unsigned int)sizeof (FcChar16 *), + (unsigned int)sizeof (FcChar16), + (unsigned int)sizeof (FcCharLeaf), + (unsigned int)sizeof (FcChar32), + (unsigned int)sizeof (FcCache)); + + return buf; +} + +int +main (int argc, char **argv) +{ + static char line[1024]; + char *signature; + int signature_length; + char *space; + char *arch = NULL; + int lineno = 0; + + if (argc != 2) + fprintf (stderr, "Usage: %s <architecture>|auto < fcarch.tmpl.h > fcarch.h\n", + argv[0]); + arch = argv[1]; + /* + * Scan the input until the marker is found + */ + + while (fgets (line, sizeof (line), stdin)) + { + lineno++; + if (!strncmp (line, "@@@", 3)) + break; + fputs (line, stdout); + } + signature = FcCacheMachineSignature(); + signature_length = strlen (signature); + + if (strcmp (arch, "auto") == 0) + { + arch = NULL; + /* + * Search for signature + */ + while (fgets (line, sizeof (line), stdin)) + { + lineno++; + /* + * skip comments + */ + if (!strncmp (line, "@@@", 3)) + continue; + space = line; + while (*space && !isspace (*space)) + space++; + if (!space) + { + fprintf (stderr, "%s: malformed input on line %d\n", + argv[0], lineno); + exit (1); + } + *space++ = '\0'; + while (isspace (*space)) + space++; + if (!strncmp (space, signature, signature_length)) + { + arch = line; + break; + } + } + } + if (!arch) + { + fprintf (stderr, "%s: unknown signature \"%s\"\n", argv[0], signature); + fprintf (stderr, "\tPlease update fcarch.tmpl.h and rebuild\n"); + exit (1); + } + printf ("#define FC_ARCHITECTURE \"%s\"\n", arch); + fflush (stdout); + exit (ferror (stdout)); +} + diff --git a/fontconfig/fc-arch/fcarch.tmpl.h b/fontconfig/fc-arch/fcarch.tmpl.h new file mode 100644 index 000000000..363e11aa1 --- /dev/null +++ b/fontconfig/fc-arch/fcarch.tmpl.h @@ -0,0 +1,65 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@@@ +@@@ Each unique machine architecture needs an entry in this file +@@@ If fc-arch runs and doesn't find a matching entry, it will print +@@@ out the archtecture signature in the error message. Take that +@@@ signature and place it in this file along with a suitable architecture +@@@ name. Architecture names are used to construct file names, so +@@@ use something reasonable and don't include any spaces +@@@ +@@@ So far the differences boil down to: endianness, 32 vs 64 bit pointers, +@@@ and on @@@ 32bit ones, whether double is aligned to one word or two words. +@@@ Those result in the 6 formats listed below. +@@@ +@@@ ,name (endianness,pointer-size,double-alignment) +@@@ | ,endian +@@@ | | ,FcAlign +@@@ | | | ,char +@@@ | | | | ,char* +@@@ | | | | | ,int +@@@ | | | | | | ,intptr_t +@@@ | | | | | | | ,Pattern +@@@ | | | | | | | | ,EltPtr +@@@ | | | | | | | | | ,Elt * +@@@ | | | | | | | | | | ,Elt +@@@ | | | | | | | | | | | ,ObjPtr +@@@ | | | | | | | | | | | | ,ValueListPtr +@@@ | | | | | | | | | | | | | ,Value +@@@ | | | | | | | | | | | | | | ,ValueBinding +@@@ | | | | | | | | | | | | | | | ,ValueList * +@@@ | | | | | | | | | | | | | | | | ,StrSet * +@@@ | | | | | | | | | | | | | | | | | ,CharSet +@@@ | | | | | | | | | | | | | | | | | | ,CharLeaf ** +@@@ | | | | | | | | | | | | | | | | | | | ,Char16 * +@@@ | | | | | | | | | | | | | | | | | | | | ,Char16 +@@@ | | | | | | | | | | | | | | | | | | | | | ,CharLeaf +@@@ | | | | | | | | | | | | | | | | | | | | | | ,Char32 +@@@ | | | | | | | | | | | | | | | | | | | | | | | ,Cache +@@@ | | | | | | | | | | | | | | | | | | | | | | | | +le32d4 4321_08_01_04_04_04_10_04_04_08_04_04_0c_04_04_04_10_04_04_02_20_04_20 +le32d8 4321_08_01_04_04_04_10_04_04_08_04_04_10_04_04_04_10_04_04_02_20_04_20 +le64 4321_08_01_08_04_08_18_08_08_10_04_08_10_04_08_08_18_08_08_02_20_04_38 +be32d4 1234_08_01_04_04_04_10_04_04_08_04_04_0c_04_04_04_10_04_04_02_20_04_20 +be32d8 1234_08_01_04_04_04_10_04_04_08_04_04_10_04_04_04_10_04_04_02_20_04_20 +be64 1234_08_01_08_04_08_18_08_08_10_04_08_10_04_08_08_18_08_08_02_20_04_38 diff --git a/fontconfig/fc-cache/Makefile.am b/fontconfig/fc-cache/Makefile.am new file mode 100644 index 000000000..5067c04c0 --- /dev/null +++ b/fontconfig/fc-cache/Makefile.am @@ -0,0 +1,68 @@ +# +# fontconfig/fc-cache/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOC2MAN = docbook2man + +FC_CACHE_SRC=${top_srcdir}/fc-cache + +SGML = ${FC_CACHE_SRC}/fc-cache.sgml + +if OS_WIN32 +else +install-data-local: + -$(mkinstalldirs) "$(DESTDIR)$(fc_cachedir)" + +uninstall-local: + -$(RM) -rf "$(DESTDIR)$(fc_cachedir)" +endif + +INCLUDES=-I${top_srcdir} -I${top_srcdir}/src $(WARN_CFLAGS) + +bin_PROGRAMS=fc-cache + +BUILT_MANS=fc-cache.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-cache.sgml $(BUILT_MANS) + +fc_cache_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-cache/fc-cache.c b/fontconfig/fc-cache/fc-cache.c new file mode 100644 index 000000000..19e9d0df6 --- /dev/null +++ b/fontconfig/fc-cache/fc-cache.c @@ -0,0 +1,468 @@ +/* + * fontconfig/fc-cache/fc-cache.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "../fc-arch/fcarch.h" + +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include <fontconfig/fontconfig.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> +#include <fcntl.h> +#include <dirent.h> +#include <string.h> + +#if defined (_WIN32) +#define STRICT +#include <windows.h> +#define sleep(x) Sleep((x) * 1000) +#undef STRICT +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +const struct option longopts[] = { + {"force", 0, 0, 'f'}, + {"really-force", 0, 0, 'r'}, + {"system-only", 0, 0, 's'}, + {"version", 0, 0, 'V'}, + {"verbose", 0, 0, 'v'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-frsvVh] [--force|--really-force] [--system-only] [--verbose] [--version] [--help] [dirs]\n", + program); +#else + fprintf (file, "usage: %s [-frsvVh] [dirs]\n", + program); +#endif + fprintf (file, "Build font information caches in [dirs]\n" + "(all directories in font configuration by default).\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -f, --force scan directories with apparently valid caches\n"); + fprintf (file, " -r, --really-force erase all existing caches, then rescan\n"); + fprintf (file, " -s, --system-only scan system-wide directories only\n"); + fprintf (file, " -v, --verbose display status information while busy\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -f (force) scan directories with apparently valid caches\n"); + fprintf (file, " -r, (really force) erase all existing caches, then rescan\n"); + fprintf (file, " -s (system) scan system-wide directories only\n"); + fprintf (file, " -v (verbose) display status information while busy\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +static FcStrSet *processed_dirs; + +static int +scanDirs (FcStrList *list, FcConfig *config, FcBool force, FcBool really_force, FcBool verbose) +{ + int ret = 0; + const FcChar8 *dir; + FcStrSet *subdirs; + FcStrList *sublist; + FcCache *cache; + struct stat statb; + FcBool was_valid; + int i; + + /* + * Now scan all of the directories into separate databases + * and write out the results + */ + while ((dir = FcStrListNext (list))) + { + if (verbose) + { + printf ("%s: ", dir); + fflush (stdout); + } + + if (!dir) + { + if (verbose) + printf ("skipping, no such directory\n"); + continue; + } + + if (FcStrSetMember (processed_dirs, dir)) + { + if (verbose) + printf ("skipping, looped directory detected\n"); + continue; + } + + if (stat ((char *) dir, &statb) == -1) + { + switch (errno) { + case ENOENT: + case ENOTDIR: + if (verbose) + printf ("skipping, no such directory\n"); + break; + default: + fprintf (stderr, "\"%s\": ", dir); + perror (""); + ret++; + break; + } + continue; + } + + if (!S_ISDIR (statb.st_mode)) + { + fprintf (stderr, "\"%s\": not a directory, skipping\n", dir); + continue; + } + + if (really_force) + FcDirCacheUnlink (dir, config); + + cache = NULL; + was_valid = FcFalse; + if (!force) { + cache = FcDirCacheLoad (dir, config, NULL); + if (cache) + was_valid = FcTrue; + } + + if (!cache) + { + cache = FcDirCacheRead (dir, FcTrue, config); + if (!cache) + { + fprintf (stderr, "%s: error scanning\n", dir); + ret++; + continue; + } + } + + if (was_valid) + { + if (verbose) + printf ("skipping, existing cache is valid: %d fonts, %d dirs\n", + FcCacheNumFont (cache), FcCacheNumSubdir (cache)); + } + else + { + if (verbose) + printf ("caching, new cache contents: %d fonts, %d dirs\n", + FcCacheNumFont (cache), FcCacheNumSubdir (cache)); + + if (!FcDirCacheValid (dir)) + { + fprintf (stderr, "%s: failed to write cache\n", dir); + (void) FcDirCacheUnlink (dir, config); + ret++; + } + } + + subdirs = FcStrSetCreate (); + if (!subdirs) + { + fprintf (stderr, "%s: Can't create subdir set\n", dir); + ret++; + FcDirCacheUnload (cache); + continue; + } + for (i = 0; i < FcCacheNumSubdir (cache); i++) + FcStrSetAdd (subdirs, FcCacheSubdir (cache, i)); + + FcDirCacheUnload (cache); + + sublist = FcStrListCreate (subdirs); + FcStrSetDestroy (subdirs); + if (!sublist) + { + fprintf (stderr, "%s: Can't create subdir list\n", dir); + ret++; + continue; + } + FcStrSetAdd (processed_dirs, dir); + ret += scanDirs (sublist, config, force, really_force, verbose); + } + FcStrListDone (list); + return ret; +} + +static FcBool +cleanCacheDirectory (FcConfig *config, FcChar8 *dir, FcBool verbose) +{ + DIR *d; + struct dirent *ent; + FcChar8 *dir_base; + FcBool ret = FcTrue; + FcBool remove; + FcCache *cache; + struct stat target_stat; + + dir_base = FcStrPlus (dir, (FcChar8 *) "/"); + if (!dir_base) + { + fprintf (stderr, "%s: out of memory\n", dir); + return FcFalse; + } + if (access ((char *) dir, W_OK) != 0) + { + if (verbose) + printf ("%s: not cleaning %s cache directory\n", dir, + access ((char *) dir, F_OK) == 0 ? "unwritable" : "non-existent"); + FcStrFree (dir_base); + return FcTrue; + } + if (verbose) + printf ("%s: cleaning cache directory\n", dir); + d = opendir ((char *) dir); + if (!d) + { + perror ((char *) dir); + FcStrFree (dir_base); + return FcFalse; + } + while ((ent = readdir (d))) + { + FcChar8 *file_name; + const FcChar8 *target_dir; + + if (ent->d_name[0] == '.') + continue; + /* skip cache files for different architectures and */ + /* files which are not cache files at all */ + if (strlen(ent->d_name) != 32 + strlen ("-" FC_ARCHITECTURE FC_CACHE_SUFFIX) || + strcmp(ent->d_name + 32, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX)) + continue; + + file_name = FcStrPlus (dir_base, (FcChar8 *) ent->d_name); + if (!file_name) + { + fprintf (stderr, "%s: allocation failure\n", dir); + ret = FcFalse; + break; + } + remove = FcFalse; + cache = FcDirCacheLoadFile (file_name, NULL); + if (!cache) + { + if (verbose) + printf ("%s: invalid cache file: %s\n", dir, ent->d_name); + remove = FcTrue; + } + else + { + target_dir = FcCacheDir (cache); + if (stat ((char *) target_dir, &target_stat) < 0) + { + if (verbose) + printf ("%s: %s: missing directory: %s \n", + dir, ent->d_name, target_dir); + remove = FcTrue; + } + } + if (remove) + { + if (unlink ((char *) file_name) < 0) + { + perror ((char *) file_name); + ret = FcFalse; + } + } + FcDirCacheUnload (cache); + FcStrFree (file_name); + } + + closedir (d); + FcStrFree (dir_base); + return ret; +} + +static FcBool +cleanCacheDirectories (FcConfig *config, FcBool verbose) +{ + FcStrList *cache_dirs = FcConfigGetCacheDirs (config); + FcChar8 *cache_dir; + FcBool ret = FcTrue; + + if (!cache_dirs) + return FcFalse; + while ((cache_dir = FcStrListNext (cache_dirs))) + { + if (!cleanCacheDirectory (config, cache_dir, verbose)) + { + ret = FcFalse; + break; + } + } + FcStrListDone (cache_dirs); + return ret; +} + +int +main (int argc, char **argv) +{ + FcStrSet *dirs; + FcStrList *list; + FcBool verbose = FcFalse; + FcBool force = FcFalse; + FcBool really_force = FcFalse; + FcBool systemOnly = FcFalse; + FcConfig *config; + int i; + int ret; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "frsVvh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "frsVvh")) != -1) +#endif + { + switch (c) { + case 'r': + really_force = FcTrue; + /* fall through */ + case 'f': + force = FcTrue; + break; + case 's': + systemOnly = FcTrue; + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'v': + verbose = FcTrue; + break; + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (systemOnly) + FcConfigEnableHome (FcFalse); + config = FcInitLoadConfig (); + if (!config) + { + fprintf (stderr, "%s: Can't init font config library\n", argv[0]); + return 1; + } + FcConfigSetCurrent (config); + + if (argv[i]) + { + dirs = FcStrSetCreate (); + if (!dirs) + { + fprintf (stderr, "%s: Can't create list of directories\n", + argv[0]); + return 1; + } + while (argv[i]) + { + if (!FcStrSetAddFilename (dirs, (FcChar8 *) argv[i])) + { + fprintf (stderr, "%s: Can't add directory\n", argv[0]); + return 1; + } + i++; + } + list = FcStrListCreate (dirs); + FcStrSetDestroy (dirs); + } + else + list = FcConfigGetConfigDirs (config); + + if ((processed_dirs = FcStrSetCreate()) == NULL) { + fprintf(stderr, "Cannot malloc\n"); + return 1; + } + + ret = scanDirs (list, config, force, really_force, verbose); + + FcStrSetDestroy (processed_dirs); + + cleanCacheDirectories (config, verbose); + + /* + * Now we need to sleep a second (or two, to be extra sure), to make + * sure that timestamps for changes after this run of fc-cache are later + * then any timestamps we wrote. We don't use gettimeofday() because + * sleep(3) can't be interrupted by a signal here -- this isn't in the + * library, and there aren't any signals flying around here. + */ + FcConfigDestroy (config); + FcFini (); + sleep (2); + if (verbose) + printf ("%s: %s\n", argv[0], ret ? "failed" : "succeeded"); + return ret; +} diff --git a/fontconfig/fc-cache/fc-cache.sgml b/fontconfig/fc-cache/fc-cache.sgml new file mode 100644 index 000000000..0b602a39d --- /dev/null +++ b/fontconfig/fc-cache/fc-cache.sgml @@ -0,0 +1,210 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Josselin</firstname>"> + <!ENTITY dhsurname "<surname>Mouette</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Aug 13, 2008</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>joss@debian.org</email>"> + <!ENTITY dhusername "Josselin Mouette"> + <!ENTITY dhucpackage "<refentrytitle>fc-cache</refentrytitle>"> + <!ENTITY dhpackage "fc-cache"> + + <!ENTITY debian "<productname>Debian</productname>"> + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2003</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>build font information cache files</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-fsvVh</option></arg> + <arg><option>--force</option></arg> + <arg><option>--system-only</option></arg> + <arg><option>--verbose</option></arg> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <arg rep="repeat"><option><replaceable>dir</replaceable></option></arg> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> scans the font directories on + the system and builds font information cache files for + applications using fontconfig for their font handling.</para> + + <para>If directory arguments are not given, + <command>&dhpackage;</command> uses each directory in the + current font configuration. Each directory is scanned for + font files readable by FreeType. A cache is created which + contains properties of each font and the associated filename. + This cache is used to speed up application startup when using + the fontconfig library.</para> + + <para>Note that <command>&dhpackage;</command> must be executed + once per architecture to generate font information customized + for that architecture.</para> + + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-f</option> + <option>--force</option> + </term> + <listitem> + <para>Force re-generation of apparently up-to-date cache files, + overriding the timestamp checking.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-s</option> + <option>--system-only</option> + </term> + <listitem> + <para>Only scan system-wide directories, omitting the places + located in the user's home directory.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-v</option> + <option>--verbose</option> + </term> + <listitem> + <para>Display status information while busy.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>dir</replaceable></option> + </term> + <listitem> + <para>Directory to scan for fonts.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>FILES</title> + <variablelist> + <varlistentry> + <term><filename><replaceable>%cachdir%</replaceable>/*-<replaceable>%arch%</replaceable>.cache-2</filename></term> + <listitem> + <para>These files are generated by <command>&dhpackage;</command> + and contain maps from file names to font properties. They are + read by the fontconfig library at application startup to locate + appropriate fonts.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-cat</command>(1) + <command>fc-list</command>(1) + <command>fc-match</command>(1) + <command>fc-query</command>(1) + <command>fc-scan</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was written by Keith Packard + <email>keithp@keithp.com</email> and &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fc-case/CaseFolding.txt b/fontconfig/fc-case/CaseFolding.txt new file mode 100644 index 000000000..bd0e86d03 --- /dev/null +++ b/fontconfig/fc-case/CaseFolding.txt @@ -0,0 +1,1202 @@ +# CaseFolding-5.2.0.txt +# Date: 2009-05-28, 23:02:34 GMT [MD] +# +# Unicode Character Database +# Copyright (c) 1991-2009 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Case Folding Properties +# +# This file is a supplement to the UnicodeData file. +# It provides a case folding mapping generated from the Unicode Character Database. +# If all characters are mapped according to the full mapping below, then +# case differences (according to UnicodeData.txt and SpecialCasing.txt) +# are eliminated. +# +# The data supports both implementations that require simple case foldings +# (where string lengths don't change), and implementations that allow full case folding +# (where string lengths may grow). Note that where they can be supported, the +# full case foldings are superior: for example, they allow "MASSE" and "Maße" to match. +# +# All code points not listed in this file map to themselves. +# +# NOTE: case folding does not preserve normalization formats! +# +# For information on case folding, including how to have case folding +# preserve normalization formats, see Section 3.13 Default Case Algorithms in +# The Unicode Standard, Version 5.0. +# +# ================================================================================ +# Format +# ================================================================================ +# The entries in this file are in the following machine-readable format: +# +# <code>; <status>; <mapping>; # <name> +# +# The status field is: +# C: common case folding, common mappings shared by both simple and full mappings. +# F: full case folding, mappings that cause strings to grow in length. Multiple characters are separated by spaces. +# S: simple case folding, mappings to single characters where different from F. +# T: special case for uppercase I and dotted uppercase I +# - For non-Turkic languages, this mapping is normally not used. +# - For Turkic languages (tr, az), this mapping can be used instead of the normal mapping for these characters. +# Note that the Turkic mappings do not maintain canonical equivalence without additional processing. +# See the discussions of case mapping in the Unicode Standard for more information. +# +# Usage: +# A. To do a simple case folding, use the mappings with status C + S. +# B. To do a full case folding, use the mappings with status C + F. +# +# The mappings with status T can be used or omitted depending on the desired case-folding +# behavior. (The default option is to exclude them.) +# +# ================================================================= +# @missing 0000..10FFFF; <codepoint> +0041; C; 0061; # LATIN CAPITAL LETTER A +0042; C; 0062; # LATIN CAPITAL LETTER B +0043; C; 0063; # LATIN CAPITAL LETTER C +0044; C; 0064; # LATIN CAPITAL LETTER D +0045; C; 0065; # LATIN CAPITAL LETTER E +0046; C; 0066; # LATIN CAPITAL LETTER F +0047; C; 0067; # LATIN CAPITAL LETTER G +0048; C; 0068; # LATIN CAPITAL LETTER H +0049; C; 0069; # LATIN CAPITAL LETTER I +0049; T; 0131; # LATIN CAPITAL LETTER I +004A; C; 006A; # LATIN CAPITAL LETTER J +004B; C; 006B; # LATIN CAPITAL LETTER K +004C; C; 006C; # LATIN CAPITAL LETTER L +004D; C; 006D; # LATIN CAPITAL LETTER M +004E; C; 006E; # LATIN CAPITAL LETTER N +004F; C; 006F; # LATIN CAPITAL LETTER O +0050; C; 0070; # LATIN CAPITAL LETTER P +0051; C; 0071; # LATIN CAPITAL LETTER Q +0052; C; 0072; # LATIN CAPITAL LETTER R +0053; C; 0073; # LATIN CAPITAL LETTER S +0054; C; 0074; # LATIN CAPITAL LETTER T +0055; C; 0075; # LATIN CAPITAL LETTER U +0056; C; 0076; # LATIN CAPITAL LETTER V +0057; C; 0077; # LATIN CAPITAL LETTER W +0058; C; 0078; # LATIN CAPITAL LETTER X +0059; C; 0079; # LATIN CAPITAL LETTER Y +005A; C; 007A; # LATIN CAPITAL LETTER Z +00B5; C; 03BC; # MICRO SIGN +00C0; C; 00E0; # LATIN CAPITAL LETTER A WITH GRAVE +00C1; C; 00E1; # LATIN CAPITAL LETTER A WITH ACUTE +00C2; C; 00E2; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C3; C; 00E3; # LATIN CAPITAL LETTER A WITH TILDE +00C4; C; 00E4; # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5; C; 00E5; # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6; C; 00E6; # LATIN CAPITAL LETTER AE +00C7; C; 00E7; # LATIN CAPITAL LETTER C WITH CEDILLA +00C8; C; 00E8; # LATIN CAPITAL LETTER E WITH GRAVE +00C9; C; 00E9; # LATIN CAPITAL LETTER E WITH ACUTE +00CA; C; 00EA; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CB; C; 00EB; # LATIN CAPITAL LETTER E WITH DIAERESIS +00CC; C; 00EC; # LATIN CAPITAL LETTER I WITH GRAVE +00CD; C; 00ED; # LATIN CAPITAL LETTER I WITH ACUTE +00CE; C; 00EE; # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF; C; 00EF; # LATIN CAPITAL LETTER I WITH DIAERESIS +00D0; C; 00F0; # LATIN CAPITAL LETTER ETH +00D1; C; 00F1; # LATIN CAPITAL LETTER N WITH TILDE +00D2; C; 00F2; # LATIN CAPITAL LETTER O WITH GRAVE +00D3; C; 00F3; # LATIN CAPITAL LETTER O WITH ACUTE +00D4; C; 00F4; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00D5; C; 00F5; # LATIN CAPITAL LETTER O WITH TILDE +00D6; C; 00F6; # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8; C; 00F8; # LATIN CAPITAL LETTER O WITH STROKE +00D9; C; 00F9; # LATIN CAPITAL LETTER U WITH GRAVE +00DA; C; 00FA; # LATIN CAPITAL LETTER U WITH ACUTE +00DB; C; 00FB; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC; C; 00FC; # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD; C; 00FD; # LATIN CAPITAL LETTER Y WITH ACUTE +00DE; C; 00FE; # LATIN CAPITAL LETTER THORN +00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S +0100; C; 0101; # LATIN CAPITAL LETTER A WITH MACRON +0102; C; 0103; # LATIN CAPITAL LETTER A WITH BREVE +0104; C; 0105; # LATIN CAPITAL LETTER A WITH OGONEK +0106; C; 0107; # LATIN CAPITAL LETTER C WITH ACUTE +0108; C; 0109; # LATIN CAPITAL LETTER C WITH CIRCUMFLEX +010A; C; 010B; # LATIN CAPITAL LETTER C WITH DOT ABOVE +010C; C; 010D; # LATIN CAPITAL LETTER C WITH CARON +010E; C; 010F; # LATIN CAPITAL LETTER D WITH CARON +0110; C; 0111; # LATIN CAPITAL LETTER D WITH STROKE +0112; C; 0113; # LATIN CAPITAL LETTER E WITH MACRON +0114; C; 0115; # LATIN CAPITAL LETTER E WITH BREVE +0116; C; 0117; # LATIN CAPITAL LETTER E WITH DOT ABOVE +0118; C; 0119; # LATIN CAPITAL LETTER E WITH OGONEK +011A; C; 011B; # LATIN CAPITAL LETTER E WITH CARON +011C; C; 011D; # LATIN CAPITAL LETTER G WITH CIRCUMFLEX +011E; C; 011F; # LATIN CAPITAL LETTER G WITH BREVE +0120; C; 0121; # LATIN CAPITAL LETTER G WITH DOT ABOVE +0122; C; 0123; # LATIN CAPITAL LETTER G WITH CEDILLA +0124; C; 0125; # LATIN CAPITAL LETTER H WITH CIRCUMFLEX +0126; C; 0127; # LATIN CAPITAL LETTER H WITH STROKE +0128; C; 0129; # LATIN CAPITAL LETTER I WITH TILDE +012A; C; 012B; # LATIN CAPITAL LETTER I WITH MACRON +012C; C; 012D; # LATIN CAPITAL LETTER I WITH BREVE +012E; C; 012F; # LATIN CAPITAL LETTER I WITH OGONEK +0130; F; 0069 0307; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0130; T; 0069; # LATIN CAPITAL LETTER I WITH DOT ABOVE +0132; C; 0133; # LATIN CAPITAL LIGATURE IJ +0134; C; 0135; # LATIN CAPITAL LETTER J WITH CIRCUMFLEX +0136; C; 0137; # LATIN CAPITAL LETTER K WITH CEDILLA +0139; C; 013A; # LATIN CAPITAL LETTER L WITH ACUTE +013B; C; 013C; # LATIN CAPITAL LETTER L WITH CEDILLA +013D; C; 013E; # LATIN CAPITAL LETTER L WITH CARON +013F; C; 0140; # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0141; C; 0142; # LATIN CAPITAL LETTER L WITH STROKE +0143; C; 0144; # LATIN CAPITAL LETTER N WITH ACUTE +0145; C; 0146; # LATIN CAPITAL LETTER N WITH CEDILLA +0147; C; 0148; # LATIN CAPITAL LETTER N WITH CARON +0149; F; 02BC 006E; # LATIN SMALL LETTER N PRECEDED BY APOSTROPHE +014A; C; 014B; # LATIN CAPITAL LETTER ENG +014C; C; 014D; # LATIN CAPITAL LETTER O WITH MACRON +014E; C; 014F; # LATIN CAPITAL LETTER O WITH BREVE +0150; C; 0151; # LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +0152; C; 0153; # LATIN CAPITAL LIGATURE OE +0154; C; 0155; # LATIN CAPITAL LETTER R WITH ACUTE +0156; C; 0157; # LATIN CAPITAL LETTER R WITH CEDILLA +0158; C; 0159; # LATIN CAPITAL LETTER R WITH CARON +015A; C; 015B; # LATIN CAPITAL LETTER S WITH ACUTE +015C; C; 015D; # LATIN CAPITAL LETTER S WITH CIRCUMFLEX +015E; C; 015F; # LATIN CAPITAL LETTER S WITH CEDILLA +0160; C; 0161; # LATIN CAPITAL LETTER S WITH CARON +0162; C; 0163; # LATIN CAPITAL LETTER T WITH CEDILLA +0164; C; 0165; # LATIN CAPITAL LETTER T WITH CARON +0166; C; 0167; # LATIN CAPITAL LETTER T WITH STROKE +0168; C; 0169; # LATIN CAPITAL LETTER U WITH TILDE +016A; C; 016B; # LATIN CAPITAL LETTER U WITH MACRON +016C; C; 016D; # LATIN CAPITAL LETTER U WITH BREVE +016E; C; 016F; # LATIN CAPITAL LETTER U WITH RING ABOVE +0170; C; 0171; # LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +0172; C; 0173; # LATIN CAPITAL LETTER U WITH OGONEK +0174; C; 0175; # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0176; C; 0177; # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0178; C; 00FF; # LATIN CAPITAL LETTER Y WITH DIAERESIS +0179; C; 017A; # LATIN CAPITAL LETTER Z WITH ACUTE +017B; C; 017C; # LATIN CAPITAL LETTER Z WITH DOT ABOVE +017D; C; 017E; # LATIN CAPITAL LETTER Z WITH CARON +017F; C; 0073; # LATIN SMALL LETTER LONG S +0181; C; 0253; # LATIN CAPITAL LETTER B WITH HOOK +0182; C; 0183; # LATIN CAPITAL LETTER B WITH TOPBAR +0184; C; 0185; # LATIN CAPITAL LETTER TONE SIX +0186; C; 0254; # LATIN CAPITAL LETTER OPEN O +0187; C; 0188; # LATIN CAPITAL LETTER C WITH HOOK +0189; C; 0256; # LATIN CAPITAL LETTER AFRICAN D +018A; C; 0257; # LATIN CAPITAL LETTER D WITH HOOK +018B; C; 018C; # LATIN CAPITAL LETTER D WITH TOPBAR +018E; C; 01DD; # LATIN CAPITAL LETTER REVERSED E +018F; C; 0259; # LATIN CAPITAL LETTER SCHWA +0190; C; 025B; # LATIN CAPITAL LETTER OPEN E +0191; C; 0192; # LATIN CAPITAL LETTER F WITH HOOK +0193; C; 0260; # LATIN CAPITAL LETTER G WITH HOOK +0194; C; 0263; # LATIN CAPITAL LETTER GAMMA +0196; C; 0269; # LATIN CAPITAL LETTER IOTA +0197; C; 0268; # LATIN CAPITAL LETTER I WITH STROKE +0198; C; 0199; # LATIN CAPITAL LETTER K WITH HOOK +019C; C; 026F; # LATIN CAPITAL LETTER TURNED M +019D; C; 0272; # LATIN CAPITAL LETTER N WITH LEFT HOOK +019F; C; 0275; # LATIN CAPITAL LETTER O WITH MIDDLE TILDE +01A0; C; 01A1; # LATIN CAPITAL LETTER O WITH HORN +01A2; C; 01A3; # LATIN CAPITAL LETTER OI +01A4; C; 01A5; # LATIN CAPITAL LETTER P WITH HOOK +01A6; C; 0280; # LATIN LETTER YR +01A7; C; 01A8; # LATIN CAPITAL LETTER TONE TWO +01A9; C; 0283; # LATIN CAPITAL LETTER ESH +01AC; C; 01AD; # LATIN CAPITAL LETTER T WITH HOOK +01AE; C; 0288; # LATIN CAPITAL LETTER T WITH RETROFLEX HOOK +01AF; C; 01B0; # LATIN CAPITAL LETTER U WITH HORN +01B1; C; 028A; # LATIN CAPITAL LETTER UPSILON +01B2; C; 028B; # LATIN CAPITAL LETTER V WITH HOOK +01B3; C; 01B4; # LATIN CAPITAL LETTER Y WITH HOOK +01B5; C; 01B6; # LATIN CAPITAL LETTER Z WITH STROKE +01B7; C; 0292; # LATIN CAPITAL LETTER EZH +01B8; C; 01B9; # LATIN CAPITAL LETTER EZH REVERSED +01BC; C; 01BD; # LATIN CAPITAL LETTER TONE FIVE +01C4; C; 01C6; # LATIN CAPITAL LETTER DZ WITH CARON +01C5; C; 01C6; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +01C7; C; 01C9; # LATIN CAPITAL LETTER LJ +01C8; C; 01C9; # LATIN CAPITAL LETTER L WITH SMALL LETTER J +01CA; C; 01CC; # LATIN CAPITAL LETTER NJ +01CB; C; 01CC; # LATIN CAPITAL LETTER N WITH SMALL LETTER J +01CD; C; 01CE; # LATIN CAPITAL LETTER A WITH CARON +01CF; C; 01D0; # LATIN CAPITAL LETTER I WITH CARON +01D1; C; 01D2; # LATIN CAPITAL LETTER O WITH CARON +01D3; C; 01D4; # LATIN CAPITAL LETTER U WITH CARON +01D5; C; 01D6; # LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON +01D7; C; 01D8; # LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE +01D9; C; 01DA; # LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON +01DB; C; 01DC; # LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE +01DE; C; 01DF; # LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +01E0; C; 01E1; # LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +01E2; C; 01E3; # LATIN CAPITAL LETTER AE WITH MACRON +01E4; C; 01E5; # LATIN CAPITAL LETTER G WITH STROKE +01E6; C; 01E7; # LATIN CAPITAL LETTER G WITH CARON +01E8; C; 01E9; # LATIN CAPITAL LETTER K WITH CARON +01EA; C; 01EB; # LATIN CAPITAL LETTER O WITH OGONEK +01EC; C; 01ED; # LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +01EE; C; 01EF; # LATIN CAPITAL LETTER EZH WITH CARON +01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON +01F1; C; 01F3; # LATIN CAPITAL LETTER DZ +01F2; C; 01F3; # LATIN CAPITAL LETTER D WITH SMALL LETTER Z +01F4; C; 01F5; # LATIN CAPITAL LETTER G WITH ACUTE +01F6; C; 0195; # LATIN CAPITAL LETTER HWAIR +01F7; C; 01BF; # LATIN CAPITAL LETTER WYNN +01F8; C; 01F9; # LATIN CAPITAL LETTER N WITH GRAVE +01FA; C; 01FB; # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +01FC; C; 01FD; # LATIN CAPITAL LETTER AE WITH ACUTE +01FE; C; 01FF; # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +0200; C; 0201; # LATIN CAPITAL LETTER A WITH DOUBLE GRAVE +0202; C; 0203; # LATIN CAPITAL LETTER A WITH INVERTED BREVE +0204; C; 0205; # LATIN CAPITAL LETTER E WITH DOUBLE GRAVE +0206; C; 0207; # LATIN CAPITAL LETTER E WITH INVERTED BREVE +0208; C; 0209; # LATIN CAPITAL LETTER I WITH DOUBLE GRAVE +020A; C; 020B; # LATIN CAPITAL LETTER I WITH INVERTED BREVE +020C; C; 020D; # LATIN CAPITAL LETTER O WITH DOUBLE GRAVE +020E; C; 020F; # LATIN CAPITAL LETTER O WITH INVERTED BREVE +0210; C; 0211; # LATIN CAPITAL LETTER R WITH DOUBLE GRAVE +0212; C; 0213; # LATIN CAPITAL LETTER R WITH INVERTED BREVE +0214; C; 0215; # LATIN CAPITAL LETTER U WITH DOUBLE GRAVE +0216; C; 0217; # LATIN CAPITAL LETTER U WITH INVERTED BREVE +0218; C; 0219; # LATIN CAPITAL LETTER S WITH COMMA BELOW +021A; C; 021B; # LATIN CAPITAL LETTER T WITH COMMA BELOW +021C; C; 021D; # LATIN CAPITAL LETTER YOGH +021E; C; 021F; # LATIN CAPITAL LETTER H WITH CARON +0220; C; 019E; # LATIN CAPITAL LETTER N WITH LONG RIGHT LEG +0222; C; 0223; # LATIN CAPITAL LETTER OU +0224; C; 0225; # LATIN CAPITAL LETTER Z WITH HOOK +0226; C; 0227; # LATIN CAPITAL LETTER A WITH DOT ABOVE +0228; C; 0229; # LATIN CAPITAL LETTER E WITH CEDILLA +022A; C; 022B; # LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON +022C; C; 022D; # LATIN CAPITAL LETTER O WITH TILDE AND MACRON +022E; C; 022F; # LATIN CAPITAL LETTER O WITH DOT ABOVE +0230; C; 0231; # LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON +0232; C; 0233; # LATIN CAPITAL LETTER Y WITH MACRON +023A; C; 2C65; # LATIN CAPITAL LETTER A WITH STROKE +023B; C; 023C; # LATIN CAPITAL LETTER C WITH STROKE +023D; C; 019A; # LATIN CAPITAL LETTER L WITH BAR +023E; C; 2C66; # LATIN CAPITAL LETTER T WITH DIAGONAL STROKE +0241; C; 0242; # LATIN CAPITAL LETTER GLOTTAL STOP +0243; C; 0180; # LATIN CAPITAL LETTER B WITH STROKE +0244; C; 0289; # LATIN CAPITAL LETTER U BAR +0245; C; 028C; # LATIN CAPITAL LETTER TURNED V +0246; C; 0247; # LATIN CAPITAL LETTER E WITH STROKE +0248; C; 0249; # LATIN CAPITAL LETTER J WITH STROKE +024A; C; 024B; # LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL +024C; C; 024D; # LATIN CAPITAL LETTER R WITH STROKE +024E; C; 024F; # LATIN CAPITAL LETTER Y WITH STROKE +0345; C; 03B9; # COMBINING GREEK YPOGEGRAMMENI +0370; C; 0371; # GREEK CAPITAL LETTER HETA +0372; C; 0373; # GREEK CAPITAL LETTER ARCHAIC SAMPI +0376; C; 0377; # GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA +0386; C; 03AC; # GREEK CAPITAL LETTER ALPHA WITH TONOS +0388; C; 03AD; # GREEK CAPITAL LETTER EPSILON WITH TONOS +0389; C; 03AE; # GREEK CAPITAL LETTER ETA WITH TONOS +038A; C; 03AF; # GREEK CAPITAL LETTER IOTA WITH TONOS +038C; C; 03CC; # GREEK CAPITAL LETTER OMICRON WITH TONOS +038E; C; 03CD; # GREEK CAPITAL LETTER UPSILON WITH TONOS +038F; C; 03CE; # GREEK CAPITAL LETTER OMEGA WITH TONOS +0390; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +0391; C; 03B1; # GREEK CAPITAL LETTER ALPHA +0392; C; 03B2; # GREEK CAPITAL LETTER BETA +0393; C; 03B3; # GREEK CAPITAL LETTER GAMMA +0394; C; 03B4; # GREEK CAPITAL LETTER DELTA +0395; C; 03B5; # GREEK CAPITAL LETTER EPSILON +0396; C; 03B6; # GREEK CAPITAL LETTER ZETA +0397; C; 03B7; # GREEK CAPITAL LETTER ETA +0398; C; 03B8; # GREEK CAPITAL LETTER THETA +0399; C; 03B9; # GREEK CAPITAL LETTER IOTA +039A; C; 03BA; # GREEK CAPITAL LETTER KAPPA +039B; C; 03BB; # GREEK CAPITAL LETTER LAMDA +039C; C; 03BC; # GREEK CAPITAL LETTER MU +039D; C; 03BD; # GREEK CAPITAL LETTER NU +039E; C; 03BE; # GREEK CAPITAL LETTER XI +039F; C; 03BF; # GREEK CAPITAL LETTER OMICRON +03A0; C; 03C0; # GREEK CAPITAL LETTER PI +03A1; C; 03C1; # GREEK CAPITAL LETTER RHO +03A3; C; 03C3; # GREEK CAPITAL LETTER SIGMA +03A4; C; 03C4; # GREEK CAPITAL LETTER TAU +03A5; C; 03C5; # GREEK CAPITAL LETTER UPSILON +03A6; C; 03C6; # GREEK CAPITAL LETTER PHI +03A7; C; 03C7; # GREEK CAPITAL LETTER CHI +03A8; C; 03C8; # GREEK CAPITAL LETTER PSI +03A9; C; 03C9; # GREEK CAPITAL LETTER OMEGA +03AA; C; 03CA; # GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +03AB; C; 03CB; # GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +03B0; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +03C2; C; 03C3; # GREEK SMALL LETTER FINAL SIGMA +03CF; C; 03D7; # GREEK CAPITAL KAI SYMBOL +03D0; C; 03B2; # GREEK BETA SYMBOL +03D1; C; 03B8; # GREEK THETA SYMBOL +03D5; C; 03C6; # GREEK PHI SYMBOL +03D6; C; 03C0; # GREEK PI SYMBOL +03D8; C; 03D9; # GREEK LETTER ARCHAIC KOPPA +03DA; C; 03DB; # GREEK LETTER STIGMA +03DC; C; 03DD; # GREEK LETTER DIGAMMA +03DE; C; 03DF; # GREEK LETTER KOPPA +03E0; C; 03E1; # GREEK LETTER SAMPI +03E2; C; 03E3; # COPTIC CAPITAL LETTER SHEI +03E4; C; 03E5; # COPTIC CAPITAL LETTER FEI +03E6; C; 03E7; # COPTIC CAPITAL LETTER KHEI +03E8; C; 03E9; # COPTIC CAPITAL LETTER HORI +03EA; C; 03EB; # COPTIC CAPITAL LETTER GANGIA +03EC; C; 03ED; # COPTIC CAPITAL LETTER SHIMA +03EE; C; 03EF; # COPTIC CAPITAL LETTER DEI +03F0; C; 03BA; # GREEK KAPPA SYMBOL +03F1; C; 03C1; # GREEK RHO SYMBOL +03F4; C; 03B8; # GREEK CAPITAL THETA SYMBOL +03F5; C; 03B5; # GREEK LUNATE EPSILON SYMBOL +03F7; C; 03F8; # GREEK CAPITAL LETTER SHO +03F9; C; 03F2; # GREEK CAPITAL LUNATE SIGMA SYMBOL +03FA; C; 03FB; # GREEK CAPITAL LETTER SAN +03FD; C; 037B; # GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL +03FE; C; 037C; # GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL +03FF; C; 037D; # GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL +0400; C; 0450; # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0401; C; 0451; # CYRILLIC CAPITAL LETTER IO +0402; C; 0452; # CYRILLIC CAPITAL LETTER DJE +0403; C; 0453; # CYRILLIC CAPITAL LETTER GJE +0404; C; 0454; # CYRILLIC CAPITAL LETTER UKRAINIAN IE +0405; C; 0455; # CYRILLIC CAPITAL LETTER DZE +0406; C; 0456; # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +0407; C; 0457; # CYRILLIC CAPITAL LETTER YI +0408; C; 0458; # CYRILLIC CAPITAL LETTER JE +0409; C; 0459; # CYRILLIC CAPITAL LETTER LJE +040A; C; 045A; # CYRILLIC CAPITAL LETTER NJE +040B; C; 045B; # CYRILLIC CAPITAL LETTER TSHE +040C; C; 045C; # CYRILLIC CAPITAL LETTER KJE +040D; C; 045D; # CYRILLIC CAPITAL LETTER I WITH GRAVE +040E; C; 045E; # CYRILLIC CAPITAL LETTER SHORT U +040F; C; 045F; # CYRILLIC CAPITAL LETTER DZHE +0410; C; 0430; # CYRILLIC CAPITAL LETTER A +0411; C; 0431; # CYRILLIC CAPITAL LETTER BE +0412; C; 0432; # CYRILLIC CAPITAL LETTER VE +0413; C; 0433; # CYRILLIC CAPITAL LETTER GHE +0414; C; 0434; # CYRILLIC CAPITAL LETTER DE +0415; C; 0435; # CYRILLIC CAPITAL LETTER IE +0416; C; 0436; # CYRILLIC CAPITAL LETTER ZHE +0417; C; 0437; # CYRILLIC CAPITAL LETTER ZE +0418; C; 0438; # CYRILLIC CAPITAL LETTER I +0419; C; 0439; # CYRILLIC CAPITAL LETTER SHORT I +041A; C; 043A; # CYRILLIC CAPITAL LETTER KA +041B; C; 043B; # CYRILLIC CAPITAL LETTER EL +041C; C; 043C; # CYRILLIC CAPITAL LETTER EM +041D; C; 043D; # CYRILLIC CAPITAL LETTER EN +041E; C; 043E; # CYRILLIC CAPITAL LETTER O +041F; C; 043F; # CYRILLIC CAPITAL LETTER PE +0420; C; 0440; # CYRILLIC CAPITAL LETTER ER +0421; C; 0441; # CYRILLIC CAPITAL LETTER ES +0422; C; 0442; # CYRILLIC CAPITAL LETTER TE +0423; C; 0443; # CYRILLIC CAPITAL LETTER U +0424; C; 0444; # CYRILLIC CAPITAL LETTER EF +0425; C; 0445; # CYRILLIC CAPITAL LETTER HA +0426; C; 0446; # CYRILLIC CAPITAL LETTER TSE +0427; C; 0447; # CYRILLIC CAPITAL LETTER CHE +0428; C; 0448; # CYRILLIC CAPITAL LETTER SHA +0429; C; 0449; # CYRILLIC CAPITAL LETTER SHCHA +042A; C; 044A; # CYRILLIC CAPITAL LETTER HARD SIGN +042B; C; 044B; # CYRILLIC CAPITAL LETTER YERU +042C; C; 044C; # CYRILLIC CAPITAL LETTER SOFT SIGN +042D; C; 044D; # CYRILLIC CAPITAL LETTER E +042E; C; 044E; # CYRILLIC CAPITAL LETTER YU +042F; C; 044F; # CYRILLIC CAPITAL LETTER YA +0460; C; 0461; # CYRILLIC CAPITAL LETTER OMEGA +0462; C; 0463; # CYRILLIC CAPITAL LETTER YAT +0464; C; 0465; # CYRILLIC CAPITAL LETTER IOTIFIED E +0466; C; 0467; # CYRILLIC CAPITAL LETTER LITTLE YUS +0468; C; 0469; # CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS +046A; C; 046B; # CYRILLIC CAPITAL LETTER BIG YUS +046C; C; 046D; # CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS +046E; C; 046F; # CYRILLIC CAPITAL LETTER KSI +0470; C; 0471; # CYRILLIC CAPITAL LETTER PSI +0472; C; 0473; # CYRILLIC CAPITAL LETTER FITA +0474; C; 0475; # CYRILLIC CAPITAL LETTER IZHITSA +0476; C; 0477; # CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT +0478; C; 0479; # CYRILLIC CAPITAL LETTER UK +047A; C; 047B; # CYRILLIC CAPITAL LETTER ROUND OMEGA +047C; C; 047D; # CYRILLIC CAPITAL LETTER OMEGA WITH TITLO +047E; C; 047F; # CYRILLIC CAPITAL LETTER OT +0480; C; 0481; # CYRILLIC CAPITAL LETTER KOPPA +048A; C; 048B; # CYRILLIC CAPITAL LETTER SHORT I WITH TAIL +048C; C; 048D; # CYRILLIC CAPITAL LETTER SEMISOFT SIGN +048E; C; 048F; # CYRILLIC CAPITAL LETTER ER WITH TICK +0490; C; 0491; # CYRILLIC CAPITAL LETTER GHE WITH UPTURN +0492; C; 0493; # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0494; C; 0495; # CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK +0496; C; 0497; # CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER +0498; C; 0499; # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +049A; C; 049B; # CYRILLIC CAPITAL LETTER KA WITH DESCENDER +049C; C; 049D; # CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE +049E; C; 049F; # CYRILLIC CAPITAL LETTER KA WITH STROKE +04A0; C; 04A1; # CYRILLIC CAPITAL LETTER BASHKIR KA +04A2; C; 04A3; # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A4; C; 04A5; # CYRILLIC CAPITAL LIGATURE EN GHE +04A6; C; 04A7; # CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK +04A8; C; 04A9; # CYRILLIC CAPITAL LETTER ABKHASIAN HA +04AA; C; 04AB; # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AC; C; 04AD; # CYRILLIC CAPITAL LETTER TE WITH DESCENDER +04AE; C; 04AF; # CYRILLIC CAPITAL LETTER STRAIGHT U +04B0; C; 04B1; # CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE +04B2; C; 04B3; # CYRILLIC CAPITAL LETTER HA WITH DESCENDER +04B4; C; 04B5; # CYRILLIC CAPITAL LIGATURE TE TSE +04B6; C; 04B7; # CYRILLIC CAPITAL LETTER CHE WITH DESCENDER +04B8; C; 04B9; # CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE +04BA; C; 04BB; # CYRILLIC CAPITAL LETTER SHHA +04BC; C; 04BD; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE +04BE; C; 04BF; # CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER +04C0; C; 04CF; # CYRILLIC LETTER PALOCHKA +04C1; C; 04C2; # CYRILLIC CAPITAL LETTER ZHE WITH BREVE +04C3; C; 04C4; # CYRILLIC CAPITAL LETTER KA WITH HOOK +04C5; C; 04C6; # CYRILLIC CAPITAL LETTER EL WITH TAIL +04C7; C; 04C8; # CYRILLIC CAPITAL LETTER EN WITH HOOK +04C9; C; 04CA; # CYRILLIC CAPITAL LETTER EN WITH TAIL +04CB; C; 04CC; # CYRILLIC CAPITAL LETTER KHAKASSIAN CHE +04CD; C; 04CE; # CYRILLIC CAPITAL LETTER EM WITH TAIL +04D0; C; 04D1; # CYRILLIC CAPITAL LETTER A WITH BREVE +04D2; C; 04D3; # CYRILLIC CAPITAL LETTER A WITH DIAERESIS +04D4; C; 04D5; # CYRILLIC CAPITAL LIGATURE A IE +04D6; C; 04D7; # CYRILLIC CAPITAL LETTER IE WITH BREVE +04D8; C; 04D9; # CYRILLIC CAPITAL LETTER SCHWA +04DA; C; 04DB; # CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS +04DC; C; 04DD; # CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS +04DE; C; 04DF; # CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS +04E0; C; 04E1; # CYRILLIC CAPITAL LETTER ABKHASIAN DZE +04E2; C; 04E3; # CYRILLIC CAPITAL LETTER I WITH MACRON +04E4; C; 04E5; # CYRILLIC CAPITAL LETTER I WITH DIAERESIS +04E6; C; 04E7; # CYRILLIC CAPITAL LETTER O WITH DIAERESIS +04E8; C; 04E9; # CYRILLIC CAPITAL LETTER BARRED O +04EA; C; 04EB; # CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS +04EC; C; 04ED; # CYRILLIC CAPITAL LETTER E WITH DIAERESIS +04EE; C; 04EF; # CYRILLIC CAPITAL LETTER U WITH MACRON +04F0; C; 04F1; # CYRILLIC CAPITAL LETTER U WITH DIAERESIS +04F2; C; 04F3; # CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE +04F4; C; 04F5; # CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS +04F6; C; 04F7; # CYRILLIC CAPITAL LETTER GHE WITH DESCENDER +04F8; C; 04F9; # CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS +04FA; C; 04FB; # CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK +04FC; C; 04FD; # CYRILLIC CAPITAL LETTER HA WITH HOOK +04FE; C; 04FF; # CYRILLIC CAPITAL LETTER HA WITH STROKE +0500; C; 0501; # CYRILLIC CAPITAL LETTER KOMI DE +0502; C; 0503; # CYRILLIC CAPITAL LETTER KOMI DJE +0504; C; 0505; # CYRILLIC CAPITAL LETTER KOMI ZJE +0506; C; 0507; # CYRILLIC CAPITAL LETTER KOMI DZJE +0508; C; 0509; # CYRILLIC CAPITAL LETTER KOMI LJE +050A; C; 050B; # CYRILLIC CAPITAL LETTER KOMI NJE +050C; C; 050D; # CYRILLIC CAPITAL LETTER KOMI SJE +050E; C; 050F; # CYRILLIC CAPITAL LETTER KOMI TJE +0510; C; 0511; # CYRILLIC CAPITAL LETTER REVERSED ZE +0512; C; 0513; # CYRILLIC CAPITAL LETTER EL WITH HOOK +0514; C; 0515; # CYRILLIC CAPITAL LETTER LHA +0516; C; 0517; # CYRILLIC CAPITAL LETTER RHA +0518; C; 0519; # CYRILLIC CAPITAL LETTER YAE +051A; C; 051B; # CYRILLIC CAPITAL LETTER QA +051C; C; 051D; # CYRILLIC CAPITAL LETTER WE +051E; C; 051F; # CYRILLIC CAPITAL LETTER ALEUT KA +0520; C; 0521; # CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK +0522; C; 0523; # CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK +0524; C; 0525; # CYRILLIC CAPITAL LETTER PE WITH DESCENDER +0531; C; 0561; # ARMENIAN CAPITAL LETTER AYB +0532; C; 0562; # ARMENIAN CAPITAL LETTER BEN +0533; C; 0563; # ARMENIAN CAPITAL LETTER GIM +0534; C; 0564; # ARMENIAN CAPITAL LETTER DA +0535; C; 0565; # ARMENIAN CAPITAL LETTER ECH +0536; C; 0566; # ARMENIAN CAPITAL LETTER ZA +0537; C; 0567; # ARMENIAN CAPITAL LETTER EH +0538; C; 0568; # ARMENIAN CAPITAL LETTER ET +0539; C; 0569; # ARMENIAN CAPITAL LETTER TO +053A; C; 056A; # ARMENIAN CAPITAL LETTER ZHE +053B; C; 056B; # ARMENIAN CAPITAL LETTER INI +053C; C; 056C; # ARMENIAN CAPITAL LETTER LIWN +053D; C; 056D; # ARMENIAN CAPITAL LETTER XEH +053E; C; 056E; # ARMENIAN CAPITAL LETTER CA +053F; C; 056F; # ARMENIAN CAPITAL LETTER KEN +0540; C; 0570; # ARMENIAN CAPITAL LETTER HO +0541; C; 0571; # ARMENIAN CAPITAL LETTER JA +0542; C; 0572; # ARMENIAN CAPITAL LETTER GHAD +0543; C; 0573; # ARMENIAN CAPITAL LETTER CHEH +0544; C; 0574; # ARMENIAN CAPITAL LETTER MEN +0545; C; 0575; # ARMENIAN CAPITAL LETTER YI +0546; C; 0576; # ARMENIAN CAPITAL LETTER NOW +0547; C; 0577; # ARMENIAN CAPITAL LETTER SHA +0548; C; 0578; # ARMENIAN CAPITAL LETTER VO +0549; C; 0579; # ARMENIAN CAPITAL LETTER CHA +054A; C; 057A; # ARMENIAN CAPITAL LETTER PEH +054B; C; 057B; # ARMENIAN CAPITAL LETTER JHEH +054C; C; 057C; # ARMENIAN CAPITAL LETTER RA +054D; C; 057D; # ARMENIAN CAPITAL LETTER SEH +054E; C; 057E; # ARMENIAN CAPITAL LETTER VEW +054F; C; 057F; # ARMENIAN CAPITAL LETTER TIWN +0550; C; 0580; # ARMENIAN CAPITAL LETTER REH +0551; C; 0581; # ARMENIAN CAPITAL LETTER CO +0552; C; 0582; # ARMENIAN CAPITAL LETTER YIWN +0553; C; 0583; # ARMENIAN CAPITAL LETTER PIWR +0554; C; 0584; # ARMENIAN CAPITAL LETTER KEH +0555; C; 0585; # ARMENIAN CAPITAL LETTER OH +0556; C; 0586; # ARMENIAN CAPITAL LETTER FEH +0587; F; 0565 0582; # ARMENIAN SMALL LIGATURE ECH YIWN +10A0; C; 2D00; # GEORGIAN CAPITAL LETTER AN +10A1; C; 2D01; # GEORGIAN CAPITAL LETTER BAN +10A2; C; 2D02; # GEORGIAN CAPITAL LETTER GAN +10A3; C; 2D03; # GEORGIAN CAPITAL LETTER DON +10A4; C; 2D04; # GEORGIAN CAPITAL LETTER EN +10A5; C; 2D05; # GEORGIAN CAPITAL LETTER VIN +10A6; C; 2D06; # GEORGIAN CAPITAL LETTER ZEN +10A7; C; 2D07; # GEORGIAN CAPITAL LETTER TAN +10A8; C; 2D08; # GEORGIAN CAPITAL LETTER IN +10A9; C; 2D09; # GEORGIAN CAPITAL LETTER KAN +10AA; C; 2D0A; # GEORGIAN CAPITAL LETTER LAS +10AB; C; 2D0B; # GEORGIAN CAPITAL LETTER MAN +10AC; C; 2D0C; # GEORGIAN CAPITAL LETTER NAR +10AD; C; 2D0D; # GEORGIAN CAPITAL LETTER ON +10AE; C; 2D0E; # GEORGIAN CAPITAL LETTER PAR +10AF; C; 2D0F; # GEORGIAN CAPITAL LETTER ZHAR +10B0; C; 2D10; # GEORGIAN CAPITAL LETTER RAE +10B1; C; 2D11; # GEORGIAN CAPITAL LETTER SAN +10B2; C; 2D12; # GEORGIAN CAPITAL LETTER TAR +10B3; C; 2D13; # GEORGIAN CAPITAL LETTER UN +10B4; C; 2D14; # GEORGIAN CAPITAL LETTER PHAR +10B5; C; 2D15; # GEORGIAN CAPITAL LETTER KHAR +10B6; C; 2D16; # GEORGIAN CAPITAL LETTER GHAN +10B7; C; 2D17; # GEORGIAN CAPITAL LETTER QAR +10B8; C; 2D18; # GEORGIAN CAPITAL LETTER SHIN +10B9; C; 2D19; # GEORGIAN CAPITAL LETTER CHIN +10BA; C; 2D1A; # GEORGIAN CAPITAL LETTER CAN +10BB; C; 2D1B; # GEORGIAN CAPITAL LETTER JIL +10BC; C; 2D1C; # GEORGIAN CAPITAL LETTER CIL +10BD; C; 2D1D; # GEORGIAN CAPITAL LETTER CHAR +10BE; C; 2D1E; # GEORGIAN CAPITAL LETTER XAN +10BF; C; 2D1F; # GEORGIAN CAPITAL LETTER JHAN +10C0; C; 2D20; # GEORGIAN CAPITAL LETTER HAE +10C1; C; 2D21; # GEORGIAN CAPITAL LETTER HE +10C2; C; 2D22; # GEORGIAN CAPITAL LETTER HIE +10C3; C; 2D23; # GEORGIAN CAPITAL LETTER WE +10C4; C; 2D24; # GEORGIAN CAPITAL LETTER HAR +10C5; C; 2D25; # GEORGIAN CAPITAL LETTER HOE +1E00; C; 1E01; # LATIN CAPITAL LETTER A WITH RING BELOW +1E02; C; 1E03; # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E04; C; 1E05; # LATIN CAPITAL LETTER B WITH DOT BELOW +1E06; C; 1E07; # LATIN CAPITAL LETTER B WITH LINE BELOW +1E08; C; 1E09; # LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE +1E0A; C; 1E0B; # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0C; C; 1E0D; # LATIN CAPITAL LETTER D WITH DOT BELOW +1E0E; C; 1E0F; # LATIN CAPITAL LETTER D WITH LINE BELOW +1E10; C; 1E11; # LATIN CAPITAL LETTER D WITH CEDILLA +1E12; C; 1E13; # LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW +1E14; C; 1E15; # LATIN CAPITAL LETTER E WITH MACRON AND GRAVE +1E16; C; 1E17; # LATIN CAPITAL LETTER E WITH MACRON AND ACUTE +1E18; C; 1E19; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW +1E1A; C; 1E1B; # LATIN CAPITAL LETTER E WITH TILDE BELOW +1E1C; C; 1E1D; # LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE +1E1E; C; 1E1F; # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E20; C; 1E21; # LATIN CAPITAL LETTER G WITH MACRON +1E22; C; 1E23; # LATIN CAPITAL LETTER H WITH DOT ABOVE +1E24; C; 1E25; # LATIN CAPITAL LETTER H WITH DOT BELOW +1E26; C; 1E27; # LATIN CAPITAL LETTER H WITH DIAERESIS +1E28; C; 1E29; # LATIN CAPITAL LETTER H WITH CEDILLA +1E2A; C; 1E2B; # LATIN CAPITAL LETTER H WITH BREVE BELOW +1E2C; C; 1E2D; # LATIN CAPITAL LETTER I WITH TILDE BELOW +1E2E; C; 1E2F; # LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE +1E30; C; 1E31; # LATIN CAPITAL LETTER K WITH ACUTE +1E32; C; 1E33; # LATIN CAPITAL LETTER K WITH DOT BELOW +1E34; C; 1E35; # LATIN CAPITAL LETTER K WITH LINE BELOW +1E36; C; 1E37; # LATIN CAPITAL LETTER L WITH DOT BELOW +1E38; C; 1E39; # LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON +1E3A; C; 1E3B; # LATIN CAPITAL LETTER L WITH LINE BELOW +1E3C; C; 1E3D; # LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW +1E3E; C; 1E3F; # LATIN CAPITAL LETTER M WITH ACUTE +1E40; C; 1E41; # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E42; C; 1E43; # LATIN CAPITAL LETTER M WITH DOT BELOW +1E44; C; 1E45; # LATIN CAPITAL LETTER N WITH DOT ABOVE +1E46; C; 1E47; # LATIN CAPITAL LETTER N WITH DOT BELOW +1E48; C; 1E49; # LATIN CAPITAL LETTER N WITH LINE BELOW +1E4A; C; 1E4B; # LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW +1E4C; C; 1E4D; # LATIN CAPITAL LETTER O WITH TILDE AND ACUTE +1E4E; C; 1E4F; # LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS +1E50; C; 1E51; # LATIN CAPITAL LETTER O WITH MACRON AND GRAVE +1E52; C; 1E53; # LATIN CAPITAL LETTER O WITH MACRON AND ACUTE +1E54; C; 1E55; # LATIN CAPITAL LETTER P WITH ACUTE +1E56; C; 1E57; # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E58; C; 1E59; # LATIN CAPITAL LETTER R WITH DOT ABOVE +1E5A; C; 1E5B; # LATIN CAPITAL LETTER R WITH DOT BELOW +1E5C; C; 1E5D; # LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON +1E5E; C; 1E5F; # LATIN CAPITAL LETTER R WITH LINE BELOW +1E60; C; 1E61; # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E62; C; 1E63; # LATIN CAPITAL LETTER S WITH DOT BELOW +1E64; C; 1E65; # LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE +1E66; C; 1E67; # LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE +1E68; C; 1E69; # LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE +1E6A; C; 1E6B; # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6C; C; 1E6D; # LATIN CAPITAL LETTER T WITH DOT BELOW +1E6E; C; 1E6F; # LATIN CAPITAL LETTER T WITH LINE BELOW +1E70; C; 1E71; # LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW +1E72; C; 1E73; # LATIN CAPITAL LETTER U WITH DIAERESIS BELOW +1E74; C; 1E75; # LATIN CAPITAL LETTER U WITH TILDE BELOW +1E76; C; 1E77; # LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW +1E78; C; 1E79; # LATIN CAPITAL LETTER U WITH TILDE AND ACUTE +1E7A; C; 1E7B; # LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS +1E7C; C; 1E7D; # LATIN CAPITAL LETTER V WITH TILDE +1E7E; C; 1E7F; # LATIN CAPITAL LETTER V WITH DOT BELOW +1E80; C; 1E81; # LATIN CAPITAL LETTER W WITH GRAVE +1E82; C; 1E83; # LATIN CAPITAL LETTER W WITH ACUTE +1E84; C; 1E85; # LATIN CAPITAL LETTER W WITH DIAERESIS +1E86; C; 1E87; # LATIN CAPITAL LETTER W WITH DOT ABOVE +1E88; C; 1E89; # LATIN CAPITAL LETTER W WITH DOT BELOW +1E8A; C; 1E8B; # LATIN CAPITAL LETTER X WITH DOT ABOVE +1E8C; C; 1E8D; # LATIN CAPITAL LETTER X WITH DIAERESIS +1E8E; C; 1E8F; # LATIN CAPITAL LETTER Y WITH DOT ABOVE +1E90; C; 1E91; # LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +1E92; C; 1E93; # LATIN CAPITAL LETTER Z WITH DOT BELOW +1E94; C; 1E95; # LATIN CAPITAL LETTER Z WITH LINE BELOW +1E96; F; 0068 0331; # LATIN SMALL LETTER H WITH LINE BELOW +1E97; F; 0074 0308; # LATIN SMALL LETTER T WITH DIAERESIS +1E98; F; 0077 030A; # LATIN SMALL LETTER W WITH RING ABOVE +1E99; F; 0079 030A; # LATIN SMALL LETTER Y WITH RING ABOVE +1E9A; F; 0061 02BE; # LATIN SMALL LETTER A WITH RIGHT HALF RING +1E9B; C; 1E61; # LATIN SMALL LETTER LONG S WITH DOT ABOVE +1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S +1E9E; S; 00DF; # LATIN CAPITAL LETTER SHARP S +1EA0; C; 1EA1; # LATIN CAPITAL LETTER A WITH DOT BELOW +1EA2; C; 1EA3; # LATIN CAPITAL LETTER A WITH HOOK ABOVE +1EA4; C; 1EA5; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE +1EA6; C; 1EA7; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE +1EA8; C; 1EA9; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE +1EAA; C; 1EAB; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE +1EAC; C; 1EAD; # LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW +1EAE; C; 1EAF; # LATIN CAPITAL LETTER A WITH BREVE AND ACUTE +1EB0; C; 1EB1; # LATIN CAPITAL LETTER A WITH BREVE AND GRAVE +1EB2; C; 1EB3; # LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE +1EB4; C; 1EB5; # LATIN CAPITAL LETTER A WITH BREVE AND TILDE +1EB6; C; 1EB7; # LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW +1EB8; C; 1EB9; # LATIN CAPITAL LETTER E WITH DOT BELOW +1EBA; C; 1EBB; # LATIN CAPITAL LETTER E WITH HOOK ABOVE +1EBC; C; 1EBD; # LATIN CAPITAL LETTER E WITH TILDE +1EBE; C; 1EBF; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE +1EC0; C; 1EC1; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE +1EC2; C; 1EC3; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE +1EC4; C; 1EC5; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE +1EC6; C; 1EC7; # LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW +1EC8; C; 1EC9; # LATIN CAPITAL LETTER I WITH HOOK ABOVE +1ECA; C; 1ECB; # LATIN CAPITAL LETTER I WITH DOT BELOW +1ECC; C; 1ECD; # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECE; C; 1ECF; # LATIN CAPITAL LETTER O WITH HOOK ABOVE +1ED0; C; 1ED1; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE +1ED2; C; 1ED3; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE +1ED4; C; 1ED5; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE +1ED6; C; 1ED7; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE +1ED8; C; 1ED9; # LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW +1EDA; C; 1EDB; # LATIN CAPITAL LETTER O WITH HORN AND ACUTE +1EDC; C; 1EDD; # LATIN CAPITAL LETTER O WITH HORN AND GRAVE +1EDE; C; 1EDF; # LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE +1EE0; C; 1EE1; # LATIN CAPITAL LETTER O WITH HORN AND TILDE +1EE2; C; 1EE3; # LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW +1EE4; C; 1EE5; # LATIN CAPITAL LETTER U WITH DOT BELOW +1EE6; C; 1EE7; # LATIN CAPITAL LETTER U WITH HOOK ABOVE +1EE8; C; 1EE9; # LATIN CAPITAL LETTER U WITH HORN AND ACUTE +1EEA; C; 1EEB; # LATIN CAPITAL LETTER U WITH HORN AND GRAVE +1EEC; C; 1EED; # LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE +1EEE; C; 1EEF; # LATIN CAPITAL LETTER U WITH HORN AND TILDE +1EF0; C; 1EF1; # LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW +1EF2; C; 1EF3; # LATIN CAPITAL LETTER Y WITH GRAVE +1EF4; C; 1EF5; # LATIN CAPITAL LETTER Y WITH DOT BELOW +1EF6; C; 1EF7; # LATIN CAPITAL LETTER Y WITH HOOK ABOVE +1EF8; C; 1EF9; # LATIN CAPITAL LETTER Y WITH TILDE +1EFA; C; 1EFB; # LATIN CAPITAL LETTER MIDDLE-WELSH LL +1EFC; C; 1EFD; # LATIN CAPITAL LETTER MIDDLE-WELSH V +1EFE; C; 1EFF; # LATIN CAPITAL LETTER Y WITH LOOP +1F08; C; 1F00; # GREEK CAPITAL LETTER ALPHA WITH PSILI +1F09; C; 1F01; # GREEK CAPITAL LETTER ALPHA WITH DASIA +1F0A; C; 1F02; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA +1F0B; C; 1F03; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA +1F0C; C; 1F04; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA +1F0D; C; 1F05; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA +1F0E; C; 1F06; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI +1F0F; C; 1F07; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI +1F18; C; 1F10; # GREEK CAPITAL LETTER EPSILON WITH PSILI +1F19; C; 1F11; # GREEK CAPITAL LETTER EPSILON WITH DASIA +1F1A; C; 1F12; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA +1F1B; C; 1F13; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA +1F1C; C; 1F14; # GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA +1F1D; C; 1F15; # GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA +1F28; C; 1F20; # GREEK CAPITAL LETTER ETA WITH PSILI +1F29; C; 1F21; # GREEK CAPITAL LETTER ETA WITH DASIA +1F2A; C; 1F22; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA +1F2B; C; 1F23; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA +1F2C; C; 1F24; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA +1F2D; C; 1F25; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA +1F2E; C; 1F26; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI +1F2F; C; 1F27; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI +1F38; C; 1F30; # GREEK CAPITAL LETTER IOTA WITH PSILI +1F39; C; 1F31; # GREEK CAPITAL LETTER IOTA WITH DASIA +1F3A; C; 1F32; # GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA +1F3B; C; 1F33; # GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA +1F3C; C; 1F34; # GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA +1F3D; C; 1F35; # GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA +1F3E; C; 1F36; # GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI +1F3F; C; 1F37; # GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI +1F48; C; 1F40; # GREEK CAPITAL LETTER OMICRON WITH PSILI +1F49; C; 1F41; # GREEK CAPITAL LETTER OMICRON WITH DASIA +1F4A; C; 1F42; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA +1F4B; C; 1F43; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA +1F4C; C; 1F44; # GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA +1F4D; C; 1F45; # GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA +1F50; F; 03C5 0313; # GREEK SMALL LETTER UPSILON WITH PSILI +1F52; F; 03C5 0313 0300; # GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA +1F54; F; 03C5 0313 0301; # GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA +1F56; F; 03C5 0313 0342; # GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI +1F59; C; 1F51; # GREEK CAPITAL LETTER UPSILON WITH DASIA +1F5B; C; 1F53; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA +1F5D; C; 1F55; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA +1F5F; C; 1F57; # GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI +1F68; C; 1F60; # GREEK CAPITAL LETTER OMEGA WITH PSILI +1F69; C; 1F61; # GREEK CAPITAL LETTER OMEGA WITH DASIA +1F6A; C; 1F62; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA +1F6B; C; 1F63; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA +1F6C; C; 1F64; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA +1F6D; C; 1F65; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA +1F6E; C; 1F66; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI +1F6F; C; 1F67; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI +1F80; F; 1F00 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI +1F81; F; 1F01 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI +1F82; F; 1F02 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F83; F; 1F03 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F84; F; 1F04 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F85; F; 1F05 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F86; F; 1F06 03B9; # GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F87; F; 1F07 03B9; # GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F88; F; 1F00 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F88; S; 1F80; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI +1F89; F; 1F01 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F89; S; 1F81; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI +1F8A; F; 1F02 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8A; S; 1F82; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F8B; F; 1F03 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8B; S; 1F83; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F8C; F; 1F04 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8C; S; 1F84; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F8D; F; 1F05 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8D; S; 1F85; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F8E; F; 1F06 03B9; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8E; S; 1F86; # GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; F; 1F07 03B9; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F8F; S; 1F87; # GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F90; F; 1F20 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI +1F91; F; 1F21 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI +1F92; F; 1F22 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1F93; F; 1F23 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1F94; F; 1F24 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1F95; F; 1F25 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1F96; F; 1F26 03B9; # GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1F97; F; 1F27 03B9; # GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1F98; F; 1F20 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F98; S; 1F90; # GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI +1F99; F; 1F21 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F99; S; 1F91; # GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI +1F9A; F; 1F22 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9A; S; 1F92; # GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1F9B; F; 1F23 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9B; S; 1F93; # GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1F9C; F; 1F24 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9C; S; 1F94; # GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1F9D; F; 1F25 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9D; S; 1F95; # GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1F9E; F; 1F26 03B9; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9E; S; 1F96; # GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; F; 1F27 03B9; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1F9F; S; 1F97; # GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FA0; F; 1F60 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI +1FA1; F; 1F61 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI +1FA2; F; 1F62 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI +1FA3; F; 1F63 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI +1FA4; F; 1F64 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI +1FA5; F; 1F65 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI +1FA6; F; 1F66 03B9; # GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI +1FA7; F; 1F67 03B9; # GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI +1FA8; F; 1F60 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA8; S; 1FA0; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI +1FA9; F; 1F61 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FA9; S; 1FA1; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI +1FAA; F; 1F62 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAA; S; 1FA2; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI +1FAB; F; 1F63 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAB; S; 1FA3; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI +1FAC; F; 1F64 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAC; S; 1FA4; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI +1FAD; F; 1F65 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAD; S; 1FA5; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI +1FAE; F; 1F66 03B9; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAE; S; 1FA6; # GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; F; 1F67 03B9; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FAF; S; 1FA7; # GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI +1FB2; F; 1F70 03B9; # GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI +1FB3; F; 03B1 03B9; # GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI +1FB4; F; 03AC 03B9; # GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI +1FB6; F; 03B1 0342; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI +1FB7; F; 03B1 0342 03B9; # GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI +1FB8; C; 1FB0; # GREEK CAPITAL LETTER ALPHA WITH VRACHY +1FB9; C; 1FB1; # GREEK CAPITAL LETTER ALPHA WITH MACRON +1FBA; C; 1F70; # GREEK CAPITAL LETTER ALPHA WITH VARIA +1FBB; C; 1F71; # GREEK CAPITAL LETTER ALPHA WITH OXIA +1FBC; F; 03B1 03B9; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBC; S; 1FB3; # GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI +1FBE; C; 03B9; # GREEK PROSGEGRAMMENI +1FC2; F; 1F74 03B9; # GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI +1FC3; F; 03B7 03B9; # GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI +1FC4; F; 03AE 03B9; # GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI +1FC6; F; 03B7 0342; # GREEK SMALL LETTER ETA WITH PERISPOMENI +1FC7; F; 03B7 0342 03B9; # GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI +1FC8; C; 1F72; # GREEK CAPITAL LETTER EPSILON WITH VARIA +1FC9; C; 1F73; # GREEK CAPITAL LETTER EPSILON WITH OXIA +1FCA; C; 1F74; # GREEK CAPITAL LETTER ETA WITH VARIA +1FCB; C; 1F75; # GREEK CAPITAL LETTER ETA WITH OXIA +1FCC; F; 03B7 03B9; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FCC; S; 1FC3; # GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI +1FD2; F; 03B9 0308 0300; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA +1FD3; F; 03B9 0308 0301; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA +1FD6; F; 03B9 0342; # GREEK SMALL LETTER IOTA WITH PERISPOMENI +1FD7; F; 03B9 0308 0342; # GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI +1FD8; C; 1FD0; # GREEK CAPITAL LETTER IOTA WITH VRACHY +1FD9; C; 1FD1; # GREEK CAPITAL LETTER IOTA WITH MACRON +1FDA; C; 1F76; # GREEK CAPITAL LETTER IOTA WITH VARIA +1FDB; C; 1F77; # GREEK CAPITAL LETTER IOTA WITH OXIA +1FE2; F; 03C5 0308 0300; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA +1FE3; F; 03C5 0308 0301; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA +1FE4; F; 03C1 0313; # GREEK SMALL LETTER RHO WITH PSILI +1FE6; F; 03C5 0342; # GREEK SMALL LETTER UPSILON WITH PERISPOMENI +1FE7; F; 03C5 0308 0342; # GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI +1FE8; C; 1FE0; # GREEK CAPITAL LETTER UPSILON WITH VRACHY +1FE9; C; 1FE1; # GREEK CAPITAL LETTER UPSILON WITH MACRON +1FEA; C; 1F7A; # GREEK CAPITAL LETTER UPSILON WITH VARIA +1FEB; C; 1F7B; # GREEK CAPITAL LETTER UPSILON WITH OXIA +1FEC; C; 1FE5; # GREEK CAPITAL LETTER RHO WITH DASIA +1FF2; F; 1F7C 03B9; # GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI +1FF3; F; 03C9 03B9; # GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI +1FF4; F; 03CE 03B9; # GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI +1FF6; F; 03C9 0342; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI +1FF7; F; 03C9 0342 03B9; # GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI +1FF8; C; 1F78; # GREEK CAPITAL LETTER OMICRON WITH VARIA +1FF9; C; 1F79; # GREEK CAPITAL LETTER OMICRON WITH OXIA +1FFA; C; 1F7C; # GREEK CAPITAL LETTER OMEGA WITH VARIA +1FFB; C; 1F7D; # GREEK CAPITAL LETTER OMEGA WITH OXIA +1FFC; F; 03C9 03B9; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +1FFC; S; 1FF3; # GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI +2126; C; 03C9; # OHM SIGN +212A; C; 006B; # KELVIN SIGN +212B; C; 00E5; # ANGSTROM SIGN +2132; C; 214E; # TURNED CAPITAL F +2160; C; 2170; # ROMAN NUMERAL ONE +2161; C; 2171; # ROMAN NUMERAL TWO +2162; C; 2172; # ROMAN NUMERAL THREE +2163; C; 2173; # ROMAN NUMERAL FOUR +2164; C; 2174; # ROMAN NUMERAL FIVE +2165; C; 2175; # ROMAN NUMERAL SIX +2166; C; 2176; # ROMAN NUMERAL SEVEN +2167; C; 2177; # ROMAN NUMERAL EIGHT +2168; C; 2178; # ROMAN NUMERAL NINE +2169; C; 2179; # ROMAN NUMERAL TEN +216A; C; 217A; # ROMAN NUMERAL ELEVEN +216B; C; 217B; # ROMAN NUMERAL TWELVE +216C; C; 217C; # ROMAN NUMERAL FIFTY +216D; C; 217D; # ROMAN NUMERAL ONE HUNDRED +216E; C; 217E; # ROMAN NUMERAL FIVE HUNDRED +216F; C; 217F; # ROMAN NUMERAL ONE THOUSAND +2183; C; 2184; # ROMAN NUMERAL REVERSED ONE HUNDRED +24B6; C; 24D0; # CIRCLED LATIN CAPITAL LETTER A +24B7; C; 24D1; # CIRCLED LATIN CAPITAL LETTER B +24B8; C; 24D2; # CIRCLED LATIN CAPITAL LETTER C +24B9; C; 24D3; # CIRCLED LATIN CAPITAL LETTER D +24BA; C; 24D4; # CIRCLED LATIN CAPITAL LETTER E +24BB; C; 24D5; # CIRCLED LATIN CAPITAL LETTER F +24BC; C; 24D6; # CIRCLED LATIN CAPITAL LETTER G +24BD; C; 24D7; # CIRCLED LATIN CAPITAL LETTER H +24BE; C; 24D8; # CIRCLED LATIN CAPITAL LETTER I +24BF; C; 24D9; # CIRCLED LATIN CAPITAL LETTER J +24C0; C; 24DA; # CIRCLED LATIN CAPITAL LETTER K +24C1; C; 24DB; # CIRCLED LATIN CAPITAL LETTER L +24C2; C; 24DC; # CIRCLED LATIN CAPITAL LETTER M +24C3; C; 24DD; # CIRCLED LATIN CAPITAL LETTER N +24C4; C; 24DE; # CIRCLED LATIN CAPITAL LETTER O +24C5; C; 24DF; # CIRCLED LATIN CAPITAL LETTER P +24C6; C; 24E0; # CIRCLED LATIN CAPITAL LETTER Q +24C7; C; 24E1; # CIRCLED LATIN CAPITAL LETTER R +24C8; C; 24E2; # CIRCLED LATIN CAPITAL LETTER S +24C9; C; 24E3; # CIRCLED LATIN CAPITAL LETTER T +24CA; C; 24E4; # CIRCLED LATIN CAPITAL LETTER U +24CB; C; 24E5; # CIRCLED LATIN CAPITAL LETTER V +24CC; C; 24E6; # CIRCLED LATIN CAPITAL LETTER W +24CD; C; 24E7; # CIRCLED LATIN CAPITAL LETTER X +24CE; C; 24E8; # CIRCLED LATIN CAPITAL LETTER Y +24CF; C; 24E9; # CIRCLED LATIN CAPITAL LETTER Z +2C00; C; 2C30; # GLAGOLITIC CAPITAL LETTER AZU +2C01; C; 2C31; # GLAGOLITIC CAPITAL LETTER BUKY +2C02; C; 2C32; # GLAGOLITIC CAPITAL LETTER VEDE +2C03; C; 2C33; # GLAGOLITIC CAPITAL LETTER GLAGOLI +2C04; C; 2C34; # GLAGOLITIC CAPITAL LETTER DOBRO +2C05; C; 2C35; # GLAGOLITIC CAPITAL LETTER YESTU +2C06; C; 2C36; # GLAGOLITIC CAPITAL LETTER ZHIVETE +2C07; C; 2C37; # GLAGOLITIC CAPITAL LETTER DZELO +2C08; C; 2C38; # GLAGOLITIC CAPITAL LETTER ZEMLJA +2C09; C; 2C39; # GLAGOLITIC CAPITAL LETTER IZHE +2C0A; C; 2C3A; # GLAGOLITIC CAPITAL LETTER INITIAL IZHE +2C0B; C; 2C3B; # GLAGOLITIC CAPITAL LETTER I +2C0C; C; 2C3C; # GLAGOLITIC CAPITAL LETTER DJERVI +2C0D; C; 2C3D; # GLAGOLITIC CAPITAL LETTER KAKO +2C0E; C; 2C3E; # GLAGOLITIC CAPITAL LETTER LJUDIJE +2C0F; C; 2C3F; # GLAGOLITIC CAPITAL LETTER MYSLITE +2C10; C; 2C40; # GLAGOLITIC CAPITAL LETTER NASHI +2C11; C; 2C41; # GLAGOLITIC CAPITAL LETTER ONU +2C12; C; 2C42; # GLAGOLITIC CAPITAL LETTER POKOJI +2C13; C; 2C43; # GLAGOLITIC CAPITAL LETTER RITSI +2C14; C; 2C44; # GLAGOLITIC CAPITAL LETTER SLOVO +2C15; C; 2C45; # GLAGOLITIC CAPITAL LETTER TVRIDO +2C16; C; 2C46; # GLAGOLITIC CAPITAL LETTER UKU +2C17; C; 2C47; # GLAGOLITIC CAPITAL LETTER FRITU +2C18; C; 2C48; # GLAGOLITIC CAPITAL LETTER HERU +2C19; C; 2C49; # GLAGOLITIC CAPITAL LETTER OTU +2C1A; C; 2C4A; # GLAGOLITIC CAPITAL LETTER PE +2C1B; C; 2C4B; # GLAGOLITIC CAPITAL LETTER SHTA +2C1C; C; 2C4C; # GLAGOLITIC CAPITAL LETTER TSI +2C1D; C; 2C4D; # GLAGOLITIC CAPITAL LETTER CHRIVI +2C1E; C; 2C4E; # GLAGOLITIC CAPITAL LETTER SHA +2C1F; C; 2C4F; # GLAGOLITIC CAPITAL LETTER YERU +2C20; C; 2C50; # GLAGOLITIC CAPITAL LETTER YERI +2C21; C; 2C51; # GLAGOLITIC CAPITAL LETTER YATI +2C22; C; 2C52; # GLAGOLITIC CAPITAL LETTER SPIDERY HA +2C23; C; 2C53; # GLAGOLITIC CAPITAL LETTER YU +2C24; C; 2C54; # GLAGOLITIC CAPITAL LETTER SMALL YUS +2C25; C; 2C55; # GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL +2C26; C; 2C56; # GLAGOLITIC CAPITAL LETTER YO +2C27; C; 2C57; # GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS +2C28; C; 2C58; # GLAGOLITIC CAPITAL LETTER BIG YUS +2C29; C; 2C59; # GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS +2C2A; C; 2C5A; # GLAGOLITIC CAPITAL LETTER FITA +2C2B; C; 2C5B; # GLAGOLITIC CAPITAL LETTER IZHITSA +2C2C; C; 2C5C; # GLAGOLITIC CAPITAL LETTER SHTAPIC +2C2D; C; 2C5D; # GLAGOLITIC CAPITAL LETTER TROKUTASTI A +2C2E; C; 2C5E; # GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE +2C60; C; 2C61; # LATIN CAPITAL LETTER L WITH DOUBLE BAR +2C62; C; 026B; # LATIN CAPITAL LETTER L WITH MIDDLE TILDE +2C63; C; 1D7D; # LATIN CAPITAL LETTER P WITH STROKE +2C64; C; 027D; # LATIN CAPITAL LETTER R WITH TAIL +2C67; C; 2C68; # LATIN CAPITAL LETTER H WITH DESCENDER +2C69; C; 2C6A; # LATIN CAPITAL LETTER K WITH DESCENDER +2C6B; C; 2C6C; # LATIN CAPITAL LETTER Z WITH DESCENDER +2C6D; C; 0251; # LATIN CAPITAL LETTER ALPHA +2C6E; C; 0271; # LATIN CAPITAL LETTER M WITH HOOK +2C6F; C; 0250; # LATIN CAPITAL LETTER TURNED A +2C70; C; 0252; # LATIN CAPITAL LETTER TURNED ALPHA +2C72; C; 2C73; # LATIN CAPITAL LETTER W WITH HOOK +2C75; C; 2C76; # LATIN CAPITAL LETTER HALF H +2C7E; C; 023F; # LATIN CAPITAL LETTER S WITH SWASH TAIL +2C7F; C; 0240; # LATIN CAPITAL LETTER Z WITH SWASH TAIL +2C80; C; 2C81; # COPTIC CAPITAL LETTER ALFA +2C82; C; 2C83; # COPTIC CAPITAL LETTER VIDA +2C84; C; 2C85; # COPTIC CAPITAL LETTER GAMMA +2C86; C; 2C87; # COPTIC CAPITAL LETTER DALDA +2C88; C; 2C89; # COPTIC CAPITAL LETTER EIE +2C8A; C; 2C8B; # COPTIC CAPITAL LETTER SOU +2C8C; C; 2C8D; # COPTIC CAPITAL LETTER ZATA +2C8E; C; 2C8F; # COPTIC CAPITAL LETTER HATE +2C90; C; 2C91; # COPTIC CAPITAL LETTER THETHE +2C92; C; 2C93; # COPTIC CAPITAL LETTER IAUDA +2C94; C; 2C95; # COPTIC CAPITAL LETTER KAPA +2C96; C; 2C97; # COPTIC CAPITAL LETTER LAULA +2C98; C; 2C99; # COPTIC CAPITAL LETTER MI +2C9A; C; 2C9B; # COPTIC CAPITAL LETTER NI +2C9C; C; 2C9D; # COPTIC CAPITAL LETTER KSI +2C9E; C; 2C9F; # COPTIC CAPITAL LETTER O +2CA0; C; 2CA1; # COPTIC CAPITAL LETTER PI +2CA2; C; 2CA3; # COPTIC CAPITAL LETTER RO +2CA4; C; 2CA5; # COPTIC CAPITAL LETTER SIMA +2CA6; C; 2CA7; # COPTIC CAPITAL LETTER TAU +2CA8; C; 2CA9; # COPTIC CAPITAL LETTER UA +2CAA; C; 2CAB; # COPTIC CAPITAL LETTER FI +2CAC; C; 2CAD; # COPTIC CAPITAL LETTER KHI +2CAE; C; 2CAF; # COPTIC CAPITAL LETTER PSI +2CB0; C; 2CB1; # COPTIC CAPITAL LETTER OOU +2CB2; C; 2CB3; # COPTIC CAPITAL LETTER DIALECT-P ALEF +2CB4; C; 2CB5; # COPTIC CAPITAL LETTER OLD COPTIC AIN +2CB6; C; 2CB7; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE +2CB8; C; 2CB9; # COPTIC CAPITAL LETTER DIALECT-P KAPA +2CBA; C; 2CBB; # COPTIC CAPITAL LETTER DIALECT-P NI +2CBC; C; 2CBD; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI +2CBE; C; 2CBF; # COPTIC CAPITAL LETTER OLD COPTIC OOU +2CC0; C; 2CC1; # COPTIC CAPITAL LETTER SAMPI +2CC2; C; 2CC3; # COPTIC CAPITAL LETTER CROSSED SHEI +2CC4; C; 2CC5; # COPTIC CAPITAL LETTER OLD COPTIC SHEI +2CC6; C; 2CC7; # COPTIC CAPITAL LETTER OLD COPTIC ESH +2CC8; C; 2CC9; # COPTIC CAPITAL LETTER AKHMIMIC KHEI +2CCA; C; 2CCB; # COPTIC CAPITAL LETTER DIALECT-P HORI +2CCC; C; 2CCD; # COPTIC CAPITAL LETTER OLD COPTIC HORI +2CCE; C; 2CCF; # COPTIC CAPITAL LETTER OLD COPTIC HA +2CD0; C; 2CD1; # COPTIC CAPITAL LETTER L-SHAPED HA +2CD2; C; 2CD3; # COPTIC CAPITAL LETTER OLD COPTIC HEI +2CD4; C; 2CD5; # COPTIC CAPITAL LETTER OLD COPTIC HAT +2CD6; C; 2CD7; # COPTIC CAPITAL LETTER OLD COPTIC GANGIA +2CD8; C; 2CD9; # COPTIC CAPITAL LETTER OLD COPTIC DJA +2CDA; C; 2CDB; # COPTIC CAPITAL LETTER OLD COPTIC SHIMA +2CDC; C; 2CDD; # COPTIC CAPITAL LETTER OLD NUBIAN SHIMA +2CDE; C; 2CDF; # COPTIC CAPITAL LETTER OLD NUBIAN NGI +2CE0; C; 2CE1; # COPTIC CAPITAL LETTER OLD NUBIAN NYI +2CE2; C; 2CE3; # COPTIC CAPITAL LETTER OLD NUBIAN WAU +2CEB; C; 2CEC; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI +2CED; C; 2CEE; # COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA +A640; C; A641; # CYRILLIC CAPITAL LETTER ZEMLYA +A642; C; A643; # CYRILLIC CAPITAL LETTER DZELO +A644; C; A645; # CYRILLIC CAPITAL LETTER REVERSED DZE +A646; C; A647; # CYRILLIC CAPITAL LETTER IOTA +A648; C; A649; # CYRILLIC CAPITAL LETTER DJERV +A64A; C; A64B; # CYRILLIC CAPITAL LETTER MONOGRAPH UK +A64C; C; A64D; # CYRILLIC CAPITAL LETTER BROAD OMEGA +A64E; C; A64F; # CYRILLIC CAPITAL LETTER NEUTRAL YER +A650; C; A651; # CYRILLIC CAPITAL LETTER YERU WITH BACK YER +A652; C; A653; # CYRILLIC CAPITAL LETTER IOTIFIED YAT +A654; C; A655; # CYRILLIC CAPITAL LETTER REVERSED YU +A656; C; A657; # CYRILLIC CAPITAL LETTER IOTIFIED A +A658; C; A659; # CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS +A65A; C; A65B; # CYRILLIC CAPITAL LETTER BLENDED YUS +A65C; C; A65D; # CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS +A65E; C; A65F; # CYRILLIC CAPITAL LETTER YN +A662; C; A663; # CYRILLIC CAPITAL LETTER SOFT DE +A664; C; A665; # CYRILLIC CAPITAL LETTER SOFT EL +A666; C; A667; # CYRILLIC CAPITAL LETTER SOFT EM +A668; C; A669; # CYRILLIC CAPITAL LETTER MONOCULAR O +A66A; C; A66B; # CYRILLIC CAPITAL LETTER BINOCULAR O +A66C; C; A66D; # CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O +A680; C; A681; # CYRILLIC CAPITAL LETTER DWE +A682; C; A683; # CYRILLIC CAPITAL LETTER DZWE +A684; C; A685; # CYRILLIC CAPITAL LETTER ZHWE +A686; C; A687; # CYRILLIC CAPITAL LETTER CCHE +A688; C; A689; # CYRILLIC CAPITAL LETTER DZZE +A68A; C; A68B; # CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK +A68C; C; A68D; # CYRILLIC CAPITAL LETTER TWE +A68E; C; A68F; # CYRILLIC CAPITAL LETTER TSWE +A690; C; A691; # CYRILLIC CAPITAL LETTER TSSE +A692; C; A693; # CYRILLIC CAPITAL LETTER TCHE +A694; C; A695; # CYRILLIC CAPITAL LETTER HWE +A696; C; A697; # CYRILLIC CAPITAL LETTER SHWE +A722; C; A723; # LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF +A724; C; A725; # LATIN CAPITAL LETTER EGYPTOLOGICAL AIN +A726; C; A727; # LATIN CAPITAL LETTER HENG +A728; C; A729; # LATIN CAPITAL LETTER TZ +A72A; C; A72B; # LATIN CAPITAL LETTER TRESILLO +A72C; C; A72D; # LATIN CAPITAL LETTER CUATRILLO +A72E; C; A72F; # LATIN CAPITAL LETTER CUATRILLO WITH COMMA +A732; C; A733; # LATIN CAPITAL LETTER AA +A734; C; A735; # LATIN CAPITAL LETTER AO +A736; C; A737; # LATIN CAPITAL LETTER AU +A738; C; A739; # LATIN CAPITAL LETTER AV +A73A; C; A73B; # LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR +A73C; C; A73D; # LATIN CAPITAL LETTER AY +A73E; C; A73F; # LATIN CAPITAL LETTER REVERSED C WITH DOT +A740; C; A741; # LATIN CAPITAL LETTER K WITH STROKE +A742; C; A743; # LATIN CAPITAL LETTER K WITH DIAGONAL STROKE +A744; C; A745; # LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE +A746; C; A747; # LATIN CAPITAL LETTER BROKEN L +A748; C; A749; # LATIN CAPITAL LETTER L WITH HIGH STROKE +A74A; C; A74B; # LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY +A74C; C; A74D; # LATIN CAPITAL LETTER O WITH LOOP +A74E; C; A74F; # LATIN CAPITAL LETTER OO +A750; C; A751; # LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER +A752; C; A753; # LATIN CAPITAL LETTER P WITH FLOURISH +A754; C; A755; # LATIN CAPITAL LETTER P WITH SQUIRREL TAIL +A756; C; A757; # LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER +A758; C; A759; # LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE +A75A; C; A75B; # LATIN CAPITAL LETTER R ROTUNDA +A75C; C; A75D; # LATIN CAPITAL LETTER RUM ROTUNDA +A75E; C; A75F; # LATIN CAPITAL LETTER V WITH DIAGONAL STROKE +A760; C; A761; # LATIN CAPITAL LETTER VY +A762; C; A763; # LATIN CAPITAL LETTER VISIGOTHIC Z +A764; C; A765; # LATIN CAPITAL LETTER THORN WITH STROKE +A766; C; A767; # LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER +A768; C; A769; # LATIN CAPITAL LETTER VEND +A76A; C; A76B; # LATIN CAPITAL LETTER ET +A76C; C; A76D; # LATIN CAPITAL LETTER IS +A76E; C; A76F; # LATIN CAPITAL LETTER CON +A779; C; A77A; # LATIN CAPITAL LETTER INSULAR D +A77B; C; A77C; # LATIN CAPITAL LETTER INSULAR F +A77D; C; 1D79; # LATIN CAPITAL LETTER INSULAR G +A77E; C; A77F; # LATIN CAPITAL LETTER TURNED INSULAR G +A780; C; A781; # LATIN CAPITAL LETTER TURNED L +A782; C; A783; # LATIN CAPITAL LETTER INSULAR R +A784; C; A785; # LATIN CAPITAL LETTER INSULAR S +A786; C; A787; # LATIN CAPITAL LETTER INSULAR T +A78B; C; A78C; # LATIN CAPITAL LETTER SALTILLO +FB00; F; 0066 0066; # LATIN SMALL LIGATURE FF +FB01; F; 0066 0069; # LATIN SMALL LIGATURE FI +FB02; F; 0066 006C; # LATIN SMALL LIGATURE FL +FB03; F; 0066 0066 0069; # LATIN SMALL LIGATURE FFI +FB04; F; 0066 0066 006C; # LATIN SMALL LIGATURE FFL +FB05; F; 0073 0074; # LATIN SMALL LIGATURE LONG S T +FB06; F; 0073 0074; # LATIN SMALL LIGATURE ST +FB13; F; 0574 0576; # ARMENIAN SMALL LIGATURE MEN NOW +FB14; F; 0574 0565; # ARMENIAN SMALL LIGATURE MEN ECH +FB15; F; 0574 056B; # ARMENIAN SMALL LIGATURE MEN INI +FB16; F; 057E 0576; # ARMENIAN SMALL LIGATURE VEW NOW +FB17; F; 0574 056D; # ARMENIAN SMALL LIGATURE MEN XEH +FF21; C; FF41; # FULLWIDTH LATIN CAPITAL LETTER A +FF22; C; FF42; # FULLWIDTH LATIN CAPITAL LETTER B +FF23; C; FF43; # FULLWIDTH LATIN CAPITAL LETTER C +FF24; C; FF44; # FULLWIDTH LATIN CAPITAL LETTER D +FF25; C; FF45; # FULLWIDTH LATIN CAPITAL LETTER E +FF26; C; FF46; # FULLWIDTH LATIN CAPITAL LETTER F +FF27; C; FF47; # FULLWIDTH LATIN CAPITAL LETTER G +FF28; C; FF48; # FULLWIDTH LATIN CAPITAL LETTER H +FF29; C; FF49; # FULLWIDTH LATIN CAPITAL LETTER I +FF2A; C; FF4A; # FULLWIDTH LATIN CAPITAL LETTER J +FF2B; C; FF4B; # FULLWIDTH LATIN CAPITAL LETTER K +FF2C; C; FF4C; # FULLWIDTH LATIN CAPITAL LETTER L +FF2D; C; FF4D; # FULLWIDTH LATIN CAPITAL LETTER M +FF2E; C; FF4E; # FULLWIDTH LATIN CAPITAL LETTER N +FF2F; C; FF4F; # FULLWIDTH LATIN CAPITAL LETTER O +FF30; C; FF50; # FULLWIDTH LATIN CAPITAL LETTER P +FF31; C; FF51; # FULLWIDTH LATIN CAPITAL LETTER Q +FF32; C; FF52; # FULLWIDTH LATIN CAPITAL LETTER R +FF33; C; FF53; # FULLWIDTH LATIN CAPITAL LETTER S +FF34; C; FF54; # FULLWIDTH LATIN CAPITAL LETTER T +FF35; C; FF55; # FULLWIDTH LATIN CAPITAL LETTER U +FF36; C; FF56; # FULLWIDTH LATIN CAPITAL LETTER V +FF37; C; FF57; # FULLWIDTH LATIN CAPITAL LETTER W +FF38; C; FF58; # FULLWIDTH LATIN CAPITAL LETTER X +FF39; C; FF59; # FULLWIDTH LATIN CAPITAL LETTER Y +FF3A; C; FF5A; # FULLWIDTH LATIN CAPITAL LETTER Z +10400; C; 10428; # DESERET CAPITAL LETTER LONG I +10401; C; 10429; # DESERET CAPITAL LETTER LONG E +10402; C; 1042A; # DESERET CAPITAL LETTER LONG A +10403; C; 1042B; # DESERET CAPITAL LETTER LONG AH +10404; C; 1042C; # DESERET CAPITAL LETTER LONG O +10405; C; 1042D; # DESERET CAPITAL LETTER LONG OO +10406; C; 1042E; # DESERET CAPITAL LETTER SHORT I +10407; C; 1042F; # DESERET CAPITAL LETTER SHORT E +10408; C; 10430; # DESERET CAPITAL LETTER SHORT A +10409; C; 10431; # DESERET CAPITAL LETTER SHORT AH +1040A; C; 10432; # DESERET CAPITAL LETTER SHORT O +1040B; C; 10433; # DESERET CAPITAL LETTER SHORT OO +1040C; C; 10434; # DESERET CAPITAL LETTER AY +1040D; C; 10435; # DESERET CAPITAL LETTER OW +1040E; C; 10436; # DESERET CAPITAL LETTER WU +1040F; C; 10437; # DESERET CAPITAL LETTER YEE +10410; C; 10438; # DESERET CAPITAL LETTER H +10411; C; 10439; # DESERET CAPITAL LETTER PEE +10412; C; 1043A; # DESERET CAPITAL LETTER BEE +10413; C; 1043B; # DESERET CAPITAL LETTER TEE +10414; C; 1043C; # DESERET CAPITAL LETTER DEE +10415; C; 1043D; # DESERET CAPITAL LETTER CHEE +10416; C; 1043E; # DESERET CAPITAL LETTER JEE +10417; C; 1043F; # DESERET CAPITAL LETTER KAY +10418; C; 10440; # DESERET CAPITAL LETTER GAY +10419; C; 10441; # DESERET CAPITAL LETTER EF +1041A; C; 10442; # DESERET CAPITAL LETTER VEE +1041B; C; 10443; # DESERET CAPITAL LETTER ETH +1041C; C; 10444; # DESERET CAPITAL LETTER THEE +1041D; C; 10445; # DESERET CAPITAL LETTER ES +1041E; C; 10446; # DESERET CAPITAL LETTER ZEE +1041F; C; 10447; # DESERET CAPITAL LETTER ESH +10420; C; 10448; # DESERET CAPITAL LETTER ZHEE +10421; C; 10449; # DESERET CAPITAL LETTER ER +10422; C; 1044A; # DESERET CAPITAL LETTER EL +10423; C; 1044B; # DESERET CAPITAL LETTER EM +10424; C; 1044C; # DESERET CAPITAL LETTER EN +10425; C; 1044D; # DESERET CAPITAL LETTER ENG +10426; C; 1044E; # DESERET CAPITAL LETTER OI +10427; C; 1044F; # DESERET CAPITAL LETTER EW diff --git a/fontconfig/fc-case/Makefile.am b/fontconfig/fc-case/Makefile.am new file mode 100644 index 000000000..bf0198454 --- /dev/null +++ b/fontconfig/fc-case/Makefile.am @@ -0,0 +1,62 @@ +# +# $Id $ +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +CC = @CC_FOR_BUILD@ +EXEEXT = @EXEEXT_FOR_BUILD@ +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS) + +TMPL=fccase.tmpl.h +STMPL=${top_srcdir}/fc-case/${TMPL} +TARG=fccase.h + +noinst_PROGRAMS=fc-case + +noinst_HEADERS=$(TARG) + +fc_case_SRCS= \ + fc-case.c \ + fccaseint.h \ + fccaseread.c + +CASEFOLDING=CaseFolding.txt +SCASEFOLDING=${top_srcdir}/fc-case/CaseFolding.txt + +EXTRA_DIST=$(TMPL) $(CASEFOLDING) + +$(TARG): $(STMPL) fc-case$(EXEEXT) $(SCASEFOLDING) + $(AM_V_GEN) $(RM) $(TARG); \ + ./fc-case$(EXEEXT) $(SCASEFOLDING) < $(STMPL) > $(TARG).tmp && \ + mv $(TARG).tmp $(TARG) + +ALIAS_FILES = fcalias.h fcaliastail.h + +BUILT_SOURCES = $(ALIAS_FILES) + +$(ALIAS_FILES): + touch $(ALIAS_FILES) + +CLEANFILES=$(TARG) $(ALIAS_FILES) + diff --git a/fontconfig/fc-case/fc-case.c b/fontconfig/fc-case/fc-case.c new file mode 100644 index 000000000..e86b34783 --- /dev/null +++ b/fontconfig/fc-case/fc-case.c @@ -0,0 +1,363 @@ +/* + * fontconfig/fc-case/fc-case.c + * + * Copyright © 2004 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <ctype.h> + +#define MAX_OUT 32 +#define MAX_LINE 8192 + +typedef enum _caseFoldClass { CaseFoldCommon, CaseFoldFull, CaseFoldSimple, CaseFoldTurkic } CaseFoldClass; + +typedef struct _caseFoldClassMap { + const char *name; + CaseFoldClass class; +} CaseFoldClassMap; + +static const CaseFoldClassMap caseFoldClassMap[] = { + { "C", CaseFoldCommon }, + { "F", CaseFoldFull }, + { "S", CaseFoldSimple }, + { "T", CaseFoldTurkic }, + { 0, 0 } +}; + +typedef struct _caseFoldRaw { + FcChar32 upper; + CaseFoldClass class; + int nout; + FcChar32 lower[MAX_OUT]; +} CaseFoldRaw; + +static void +panic (const char *reason) +{ + fprintf (stderr, "fc-case: panic %s\n", reason); + exit (1); +} + +int maxExpand; +static FcCaseFold *folds; +int nfolds; + +static FcCaseFold * +addFold (void) +{ + if (folds) + folds = realloc (folds, (nfolds + 1) * sizeof (FcCaseFold)); + else + folds = malloc (sizeof (FcCaseFold)); + if (!folds) + panic ("out of memory"); + return &folds[nfolds++]; +} + +static int +ucs4_to_utf8 (FcChar32 ucs4, + FcChar8 dest[FC_UTF8_MAX_LEN]) +{ + int bits; + FcChar8 *d = dest; + + if (ucs4 < 0x80) { *d++= ucs4; bits= -6; } + else if (ucs4 < 0x800) { *d++= ((ucs4 >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (ucs4 < 0x10000) { *d++= ((ucs4 >> 12) & 0x0F) | 0xE0; bits= 6; } + else if (ucs4 < 0x200000) { *d++= ((ucs4 >> 18) & 0x07) | 0xF0; bits= 12; } + else if (ucs4 < 0x4000000) { *d++= ((ucs4 >> 24) & 0x03) | 0xF8; bits= 18; } + else if (ucs4 < 0x80000000) { *d++= ((ucs4 >> 30) & 0x01) | 0xFC; bits= 24; } + else return 0; + + for ( ; bits >= 0; bits-= 6) { + *d++= ((ucs4 >> bits) & 0x3F) | 0x80; + } + return d - dest; +} + +static int +utf8_size (FcChar32 ucs4) +{ + FcChar8 utf8[FC_UTF8_MAX_LEN]; + return ucs4_to_utf8 (ucs4, utf8 ); +} + +static FcChar8 *foldChars; +static int nfoldChars; +static int maxFoldChars; +static FcChar32 minFoldChar; +static FcChar32 maxFoldChar; + +static void +addChar (FcChar32 c) +{ + FcChar8 utf8[FC_UTF8_MAX_LEN]; + int len; + int i; + + len = ucs4_to_utf8 (c, utf8); + if (foldChars) + foldChars = realloc (foldChars, (nfoldChars + len) * sizeof (FcChar8)); + else + foldChars = malloc (sizeof (FcChar8) * len); + if (!foldChars) + panic ("out of memory"); + for (i = 0; i < len; i++) + foldChars[nfoldChars + i] = utf8[i]; + nfoldChars += len; +} + +static int +foldExtends (FcCaseFold *fold, CaseFoldRaw *raw) +{ + switch (fold->method) { + case FC_CASE_FOLD_RANGE: + if ((short) (raw->lower[0] - raw->upper) != fold->offset) + return 0; + if (raw->upper != fold->upper + fold->count) + return 0; + return 1; + case FC_CASE_FOLD_EVEN_ODD: + if ((short) (raw->lower[0] - raw->upper) != 1) + return 0; + if (raw->upper != fold->upper + fold->count + 1) + return 0; + return 1; + case FC_CASE_FOLD_FULL: + break; + } + return 0; +} + +static const char * +case_fold_method_name (FcChar16 method) +{ + switch (method) { + case FC_CASE_FOLD_RANGE: return "FC_CASE_FOLD_RANGE,"; + case FC_CASE_FOLD_EVEN_ODD: return "FC_CASE_FOLD_EVEN_ODD,"; + case FC_CASE_FOLD_FULL: return "FC_CASE_FOLD_FULL,"; + default: return "unknown"; + } +} + +static void +dump (void) +{ + int i; + + printf ( "#define FC_NUM_CASE_FOLD %d\n", nfolds); + printf ( "#define FC_NUM_CASE_FOLD_CHARS %d\n", nfoldChars); + printf ( "#define FC_MAX_CASE_FOLD_CHARS %d\n", maxFoldChars); + printf ( "#define FC_MAX_CASE_FOLD_EXPAND %d\n", maxExpand); + printf ( "#define FC_MIN_FOLD_CHAR 0x%08x\n", minFoldChar); + printf ( "#define FC_MAX_FOLD_CHAR 0x%08x\n", maxFoldChar); + printf ( "\n"); + + /* + * Dump out ranges + */ + printf ("static const FcCaseFold fcCaseFold[FC_NUM_CASE_FOLD] = {\n"); + for (i = 0; i < nfolds; i++) + { + printf (" { 0x%08x, %-22s 0x%04x, %6d },\n", + folds[i].upper, case_fold_method_name (folds[i].method), + folds[i].count, folds[i].offset); + } + printf ("};\n\n"); + + /* + * Dump out "other" values + */ + + printf ("static const FcChar8 fcCaseFoldChars[FC_NUM_CASE_FOLD_CHARS] = {\n"); + for (i = 0; i < nfoldChars; i++) + { + printf ("0x%02x", foldChars[i]); + if (i != nfoldChars - 1) + { + if ((i & 0xf) == 0xf) + printf (",\n"); + else + printf (","); + } + } + printf ("\n};\n"); +} + +/* + * Read the standard Unicode CaseFolding.txt file + */ +#define SEP "; \t\n" + +static int +parseRaw (char *line, CaseFoldRaw *raw) +{ + char *tok, *end; + int i; + + if (!isxdigit (line[0])) + return 0; + /* + * Get upper case value + */ + tok = strtok (line, SEP); + if (!tok || tok[0] == '#') + return 0; + raw->upper = strtol (tok, &end, 16); + if (end == tok) + return 0; + /* + * Get class + */ + tok = strtok (NULL, SEP); + if (!tok || tok[0] == '#') + return 0; + for (i = 0; caseFoldClassMap[i].name; i++) + if (!strcmp (tok, caseFoldClassMap[i].name)) + { + raw->class = caseFoldClassMap[i].class; + break; + } + if (!caseFoldClassMap[i].name) + return 0; + + /* + * Get list of result characters + */ + for (i = 0; i < MAX_OUT; i++) + { + tok = strtok (NULL, SEP); + if (!tok || tok[0] == '#') + break; + raw->lower[i] = strtol (tok, &end, 16); + if (end == tok) + break; + } + if (i == 0) + return 0; + raw->nout = i; + return 1; +} + +static int +caseFoldReadRaw (FILE *in, CaseFoldRaw *raw) +{ + char line[MAX_LINE]; + + for (;;) + { + if (!fgets (line, sizeof (line) - 1, in)) + return 0; + if (parseRaw (line, raw)) + return 1; + } +} + +int +main (int argc, char **argv) +{ + FcCaseFold *fold = 0; + CaseFoldRaw raw; + int i; + FILE *caseFile; + char line[MAX_LINE]; + int expand; + + if (argc != 2) + panic ("usage: fc-case CaseFolding.txt"); + caseFile = fopen (argv[1], "r"); + if (!caseFile) + panic ("can't open case folding file"); + + while (caseFoldReadRaw (caseFile, &raw)) + { + if (!minFoldChar) + minFoldChar = raw.upper; + maxFoldChar = raw.upper; + switch (raw.class) { + case CaseFoldCommon: + case CaseFoldFull: + if (raw.nout == 1) + { + if (fold && foldExtends (fold, &raw)) + fold->count = raw.upper - fold->upper + 1; + else + { + fold = addFold (); + fold->upper = raw.upper; + fold->offset = raw.lower[0] - raw.upper; + if (fold->offset == 1) + fold->method = FC_CASE_FOLD_EVEN_ODD; + else + fold->method = FC_CASE_FOLD_RANGE; + fold->count = 1; + } + expand = utf8_size (raw.lower[0]) - utf8_size(raw.upper); + } + else + { + fold = addFold (); + fold->upper = raw.upper; + fold->method = FC_CASE_FOLD_FULL; + fold->offset = nfoldChars; + for (i = 0; i < raw.nout; i++) + addChar (raw.lower[i]); + fold->count = nfoldChars - fold->offset; + if (fold->count > maxFoldChars) + maxFoldChars = fold->count; + expand = fold->count - utf8_size (raw.upper); + } + if (expand > maxExpand) + maxExpand = expand; + break; + case CaseFoldSimple: + break; + case CaseFoldTurkic: + break; + } + } + /* + * Scan the input until the marker is found + */ + + while (fgets (line, sizeof (line), stdin)) + { + if (!strncmp (line, "@@@", 3)) + break; + fputs (line, stdout); + } + + /* + * Dump these tables + */ + dump (); + + /* + * And flush out the rest of the input file + */ + + while (fgets (line, sizeof (line), stdin)) + fputs (line, stdout); + + fflush (stdout); + exit (ferror (stdout)); +} diff --git a/fontconfig/fc-case/fccase.tmpl.h b/fontconfig/fc-case/fccase.tmpl.h new file mode 100644 index 000000000..62633293a --- /dev/null +++ b/fontconfig/fc-case/fccase.tmpl.h @@ -0,0 +1,25 @@ +/* + * fontconfig/fc-case/fccase.tmpl.h + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@@@ diff --git a/fontconfig/fc-cat/Makefile.am b/fontconfig/fc-cat/Makefile.am new file mode 100644 index 000000000..27b637534 --- /dev/null +++ b/fontconfig/fc-cat/Makefile.am @@ -0,0 +1,59 @@ +# +# fontconfig/fc-cat/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOC2MAN = docbook2man + +FC_CAT_SRC=${top_srcdir}/fc-cat + +SGML = ${FC_CAT_SRC}/fc-cat.sgml + +INCLUDES=-I${top_srcdir} $(WARN_CFLAGS) + +bin_PROGRAMS=fc-cat + +BUILT_MANS=fc-cat.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-cat.sgml ${BUILT_MANS} + +fc_cat_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-cat/fc-cat.c b/fontconfig/fc-cat/fc-cat.c new file mode 100644 index 000000000..a9326c8eb --- /dev/null +++ b/fontconfig/fc-cat/fc-cat.c @@ -0,0 +1,408 @@ +/* + * fontconfig/fc-cat/fc-cat.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include <fontconfig/fontconfig.h> +#include "../fc-arch/fcarch.h" +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <errno.h> + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +const struct option longopts[] = { + {"version", 0, 0, 'V'}, + {"verbose", 0, 0, 'v'}, + {"recurse", 0, 0, 'r'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +/* + * POSIX has broken stdio so that getc must do thread-safe locking, + * this is a serious performance problem for applications doing large + * amounts of IO with getc (as is done here). If available, use + * the getc_unlocked varient instead. + */ + +#if defined(getc_unlocked) || defined(_IO_getc_unlocked) +#define GETC(f) getc_unlocked(f) +#define PUTC(c,f) putc_unlocked(c,f) +#else +#define GETC(f) getc(f) +#define PUTC(c,f) putc(c,f) +#endif + +static FcBool +write_chars (FILE *f, const FcChar8 *chars) +{ + FcChar8 c; + while ((c = *chars++)) + { + switch (c) { + case '"': + case '\\': + if (PUTC ('\\', f) == EOF) + return FcFalse; + /* fall through */ + default: + if (PUTC (c, f) == EOF) + return FcFalse; + } + } + return FcTrue; +} + +static FcBool +write_ulong (FILE *f, unsigned long t) +{ + int pow; + unsigned long temp, digit; + + temp = t; + pow = 1; + while (temp >= 10) + { + temp /= 10; + pow *= 10; + } + temp = t; + while (pow) + { + digit = temp / pow; + if (PUTC ((char) digit + '0', f) == EOF) + return FcFalse; + temp = temp - pow * digit; + pow = pow / 10; + } + return FcTrue; +} + +static FcBool +write_int (FILE *f, int i) +{ + return write_ulong (f, (unsigned long) i); +} + +static FcBool +write_string (FILE *f, const FcChar8 *string) +{ + + if (PUTC ('"', f) == EOF) + return FcFalse; + if (!write_chars (f, string)) + return FcFalse; + if (PUTC ('"', f) == EOF) + return FcFalse; + return FcTrue; +} + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-rv] [--recurse] [--verbose] [*-%s.cache-2|directory]...\n", + program, FC_ARCHITECTURE); + fprintf (file, " %s [-Vh] [--version] [--help]\n", program); +#else + fprintf (file, "usage: %s [-rvVh] [*-%s.cache-2|directory]...\n", + program, FC_ARCHITECTURE); +#endif + fprintf (file, "Reads font information cache from:\n"); + fprintf (file, " 1) specified fontconfig cache file\n"); + fprintf (file, " 2) related to a particular font directory\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -r, --recurse recurse into subdirectories\n"); + fprintf (file, " -v, --verbose be verbose\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -r (recurse) recurse into subdirectories\n"); + fprintf (file, " -v (verbose) be verbose\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +/* + * return the path from the directory containing 'cache' to 'file' + */ + +static const FcChar8 * +file_base_name (const FcChar8 *cache, const FcChar8 *file) +{ + int cache_len = strlen ((char *) cache); + + if (!strncmp ((char *) cache, (char *) file, cache_len) && file[cache_len] == '/') + return file + cache_len + 1; + return file; +} + +#define FC_FONT_FILE_DIR ((FcChar8 *) ".dir") + +static FcBool +cache_print_set (FcFontSet *set, FcStrSet *dirs, const FcChar8 *base_name, FcBool verbose) +{ + FcChar8 *name, *dir; + const FcChar8 *file, *base; + int ret; + int n; + int id; + int ndir = 0; + FcStrList *list; + + list = FcStrListCreate (dirs); + if (!list) + goto bail2; + + while ((dir = FcStrListNext (list))) + { + base = file_base_name (base_name, dir); + if (!write_string (stdout, base)) + goto bail3; + if (PUTC (' ', stdout) == EOF) + goto bail3; + if (!write_int (stdout, 0)) + goto bail3; + if (PUTC (' ', stdout) == EOF) + goto bail3; + if (!write_string (stdout, FC_FONT_FILE_DIR)) + goto bail3; + if (PUTC ('\n', stdout) == EOF) + goto bail3; + ndir++; + } + + for (n = 0; n < set->nfont; n++) + { + FcPattern *font = set->fonts[n]; + + if (FcPatternGetString (font, FC_FILE, 0, (FcChar8 **) &file) != FcResultMatch) + goto bail3; + base = file_base_name (base_name, file); + if (FcPatternGetInteger (font, FC_INDEX, 0, &id) != FcResultMatch) + goto bail3; + if (!write_string (stdout, base)) + goto bail3; + if (PUTC (' ', stdout) == EOF) + goto bail3; + if (!write_int (stdout, id)) + goto bail3; + if (PUTC (' ', stdout) == EOF) + goto bail3; + name = FcNameUnparse (font); + if (!name) + goto bail3; + ret = write_string (stdout, name); + FcStrFree (name); + if (!ret) + goto bail3; + if (PUTC ('\n', stdout) == EOF) + goto bail3; + } + if (verbose && !set->nfont && !ndir) + printf ("<empty>\n"); + + FcStrListDone (list); + + return FcTrue; + +bail3: + FcStrListDone (list); +bail2: + return FcFalse; +} + +int +main (int argc, char **argv) +{ + int i; + int ret = 0; + FcFontSet *fs; + FcStrSet *dirs; + FcStrSet *args = NULL; + FcStrList *arglist; + FcCache *cache; + FcConfig *config; + FcChar8 *arg; + int verbose = 0; + int recurse = 0; + FcBool first = FcTrue; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "Vvrh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "Vvrh")) != -1) +#endif + { + switch (c) { + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'v': + verbose++; + break; + case 'r': + recurse++; + break; + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + config = FcInitLoadConfig (); + if (!config) + { + fprintf (stderr, "%s: Can't init font config library\n", argv[0]); + return 1; + } + FcConfigSetCurrent (config); + + args = FcStrSetCreate (); + if (!args) + { + fprintf (stderr, "%s: malloc failure\n", argv[0]); + return 1; + } + if (i < argc) + { + for (; i < argc; i++) + { + if (!FcStrSetAddFilename (args, (const FcChar8 *) argv[i])) + { + fprintf (stderr, "%s: malloc failure\n", argv[0]); + return 1; + } + } + arglist = FcStrListCreate (args); + if (!arglist) + { + fprintf (stderr, "%s: malloc failure\n", argv[0]); + return 1; + } + } + else + { + recurse++; + arglist = FcConfigGetFontDirs (config); + while ((arg = FcStrListNext (arglist))) + if (!FcStrSetAdd (args, arg)) + { + fprintf (stderr, "%s: malloc failure\n", argv[0]); + return 1; + } + FcStrListDone (arglist); + } + arglist = FcStrListCreate (args); + if (!arglist) + { + fprintf (stderr, "%s: malloc failure\n", argv[0]); + return 1; + } + + while ((arg = FcStrListNext (arglist))) + { + int j; + FcChar8 *cache_file = NULL; + struct stat file_stat; + + if (FcFileIsDir (arg)) + cache = FcDirCacheLoad (arg, config, &cache_file); + else + cache = FcDirCacheLoadFile (arg, &file_stat); + if (!cache) + { + perror ((char *) arg); + ret++; + continue; + } + + dirs = FcStrSetCreate (); + fs = FcCacheCopySet (cache); + for (j = 0; j < FcCacheNumSubdir (cache); j++) + { + FcStrSetAdd (dirs, FcCacheSubdir (cache, j)); + if (recurse) + FcStrSetAdd (args, FcCacheSubdir (cache, j)); + } + + if (verbose) + { + if (!first) + printf ("\n"); + printf ("Directory: %s\nCache: %s\n--------\n", + FcCacheDir(cache), cache_file ? cache_file : arg); + first = FcFalse; + } + cache_print_set (fs, dirs, FcCacheDir (cache), verbose); + + FcStrSetDestroy (dirs); + + FcFontSetDestroy (fs); + FcDirCacheUnload (cache); + if (cache_file) + FcStrFree (cache_file); + } + + return 0; +} diff --git a/fontconfig/fc-cat/fc-cat.sgml b/fontconfig/fc-cat/fc-cat.sgml new file mode 100644 index 000000000..b042dc65f --- /dev/null +++ b/fontconfig/fc-cat/fc-cat.sgml @@ -0,0 +1,168 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Patrick</firstname>"> + <!ENTITY dhsurname "<surname>Lam</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Aug 13, 2008</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>plam@mit.edu</email>"> + <!ENTITY dhusername "Patrick Lam"> + <!ENTITY dhucpackage "<refentrytitle>fc-cat</refentrytitle>"> + <!ENTITY dhpackage "fc-cat"> + + <!ENTITY debian "<productname>Debian</productname>"> + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2005</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>read font information cache files</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-rvVh</option></arg> + <arg><option>--recurse</option></arg> + <arg><option>--verbose</option></arg> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <sbr> + <group rep="repeat"> + <arg><option><replaceable>fonts-cache-2-files</replaceable></option></arg> + <arg><option><replaceable>dirs</replaceable></option></arg> + </group> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> reads the font information from + cache files or related to font directories + and emits it in ASCII form.</para> + + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-r</option> + <option>--recurse</option> + </term> + <listitem> + <para>Recurse into subdirectories.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-v</option> + <option>--verbose</option> + </term> + <listitem> + <para>Be verbose.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-cache</command>(1) + <command>fc-list</command>(1) + <command>fc-match</command>(1) + <command>fc-query</command>(1) + <command>fc-scan</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was written by &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fc-glyphname/Makefile.am b/fontconfig/fc-glyphname/Makefile.am new file mode 100644 index 000000000..bcb4d0746 --- /dev/null +++ b/fontconfig/fc-glyphname/Makefile.am @@ -0,0 +1,55 @@ +# +# $Id $ +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +CC = @CC_FOR_BUILD@ +EXEEXT = @EXEEXT_FOR_BUILD@ +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS) + +TMPL=fcglyphname.tmpl.h +STMPL=${top_srcdir}/fc-glyphname/${TMPL} +TARG=fcglyphname.h + +noinst_PROGRAMS=fc-glyphname + +GLYPHNAME=zapfdingbats.txt +SGLYPHNAME=${top_srcdir}/fc-glyphname/zapfdingbats.txt + +EXTRA_DIST=$(TMPL) $(GLYPHNAME) + +$(TARG): $(STMPL) fc-glyphname$(EXEEXT) $(SGLYPHNAME) + $(AM_V_GEN) $(RM) $(TARG); \ + ./fc-glyphname$(EXEEXT) $(SGLYPHNAME) < $(STMPL) > $(TARG).tmp && \ + mv $(TARG).tmp $(TARG) + +ALIAS_FILES = fcalias.h fcaliastail.h + +BUILT_SOURCES = $(ALIAS_FILES) $(TARG) + +$(ALIAS_FILES): + touch $(ALIAS_FILES) + +CLEANFILES=$(TARG) $(ALIAS_FILES) + diff --git a/fontconfig/fc-glyphname/fc-glyphname.c b/fontconfig/fc-glyphname/fc-glyphname.c new file mode 100644 index 000000000..5e1e8816f --- /dev/null +++ b/fontconfig/fc-glyphname/fc-glyphname.c @@ -0,0 +1,325 @@ +/* + * fontconfig/fc-glyphname/fc-glyphname.c + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" + +static int +rawindex (const FcGlyphName *gn); + +static void +scan (FILE *f, char *filename); + +static int +isprime (int i); + +static void +find_hash (void); + +static FcChar32 +FcHashGlyphName (const FcChar8 *name); + +static void +insert (FcGlyphName *gn, FcGlyphName **table, FcChar32 h); + +static void +dump (FcGlyphName * const *table, const char *name); + +static FcGlyphName * +FcAllocGlyphName (FcChar32 ucs, FcChar8 *name) +{ + FcGlyphName *gn; + + gn = malloc (sizeof (FcGlyphName) + strlen ((char *) name)); + if (!gn) + return 0; + gn->ucs = ucs; + strcpy ((char *) gn->name, (char *) name); + return gn; +} + +static void +fatal (const char *file, int lineno, const char *msg) +{ + if (lineno) + fprintf (stderr, "%s:%d: %s\n", file, lineno, msg); + else + fprintf (stderr, "%s: %s\n", file, msg); + + exit (1); +} + +#define MAX_GLYPHFILE 256 +#define MAX_GLYPHNAME 10240 +#define MAX_NAMELEN 1024 + +static FcGlyphName *raw[MAX_GLYPHNAME]; +static int nraw; +static int max_name_len; +static FcGlyphName *name_to_ucs[MAX_GLYPHNAME*2]; +static FcGlyphName *ucs_to_name[MAX_GLYPHNAME*2]; +static unsigned int hash, rehash; + +static int +rawindex (const FcGlyphName *gn) +{ + int i; + + for (i = 0; i < nraw; i++) + if (raw[i] == gn) + return i; + return -1; +} + +static void +scan (FILE *f, char *filename) +{ + char buf[MAX_NAMELEN]; + char name[MAX_NAMELEN]; + unsigned long ucs; + FcGlyphName *gn; + int lineno = 0; + int len; + + while (fgets (buf, sizeof (buf), f)) + { + lineno++; + if (sscanf (buf, "%[^;];%lx\n", name, &ucs) != 2) + continue; + gn = FcAllocGlyphName ((FcChar32) ucs, (FcChar8 *) name); + if (!gn) + fatal (filename, lineno, "out of memory"); + len = strlen (name); + if (len > max_name_len) + max_name_len = len; + raw[nraw++] = gn; + } +} + +static int compare_string (const void *a, const void *b) +{ + const char *const *as = a, *const *bs = b; + return strcmp (*as, *bs); +} + +static int compare_glyphname (const void *a, const void *b) +{ + const FcGlyphName *const *ag = a, *const *bg = b; + + return strcmp ((char *) (*ag)->name, (char *) (*bg)->name); +} + +static int +isqrt (int a) +{ + int l, h, m; + + l = 2; + h = a/2; + while ((h-l) > 1) + { + m = (h+l) >> 1; + if (m * m < a) + l = m; + else + h = m; + } + return h; +} + +static int +isprime (int i) +{ + int l, t; + + if (i < 2) + return FcFalse; + if ((i & 1) == 0) + { + if (i == 2) + return FcTrue; + return FcFalse; + } + l = isqrt (i) + 1; + for (t = 3; t <= l; t += 2) + if (i % t == 0) + return 0; + return 1; +} + +/* + * Find a prime pair that leaves at least 25% of the hash table empty + */ + +static void +find_hash (void) +{ + int h; + + h = nraw + nraw / 4; + if ((h & 1) == 0) + h++; + while (!isprime(h-2) || !isprime(h)) + h += 2; + hash = h; + rehash = h-2; +} + +static FcChar32 +FcHashGlyphName (const FcChar8 *name) +{ + FcChar32 h = 0; + FcChar8 c; + + while ((c = *name++)) + { + h = ((h << 1) | (h >> 31)) ^ c; + } + return h; +} + +static void +insert (FcGlyphName *gn, FcGlyphName **table, FcChar32 h) +{ + int i, r = 0; + + i = (int) (h % hash); + while (table[i]) + { + if (!r) r = (int) (h % rehash + 1); + i += r; + if (i >= hash) + i -= hash; + } + table[i] = gn; +} + +static void +dump (FcGlyphName * const *table, const char *name) +{ + int i; + + printf ("static const FcGlyphId %s[%d] = {\n", name, hash); + + for (i = 0; i < hash; i++) + if (table[i]) + printf (" %d,\n", rawindex(table[i])); + else + printf (" -1,\n"); + + printf ("};\n"); +} + +int +main (int argc, char **argv) +{ + char *files[MAX_GLYPHFILE]; + char line[1024]; + FILE *f; + int i; + char *type; + + i = 0; + while (argv[i+1]) + { + if (i == MAX_GLYPHFILE) + fatal (*argv, 0, "Too many glyphname files"); + files[i] = argv[i+1]; + i++; + } + files[i] = 0; + qsort (files, i, sizeof (char *), compare_string); + for (i = 0; files[i]; i++) + { + f = fopen (files[i], "r"); + if (!f) + fatal (files[i], 0, strerror (errno)); + scan (f, files[i]); + fclose (f); + } + qsort (raw, nraw, sizeof (FcGlyphName *), compare_glyphname); + + find_hash (); + + for (i = 0; i < nraw; i++) + { + insert (raw[i], name_to_ucs, FcHashGlyphName (raw[i]->name)); + insert (raw[i], ucs_to_name, raw[i]->ucs); + } + + /* + * Scan the input until the marker is found + */ + + while (fgets (line, sizeof (line), stdin)) + { + if (!strncmp (line, "@@@", 3)) + break; + fputs (line, stdout); + } + + printf ("/* %d glyphnames in %d entries, %d%% occupancy */\n\n", + nraw, hash, nraw * 100 / hash); + + printf ("#define FC_GLYPHNAME_HASH %u\n", hash); + printf ("#define FC_GLYPHNAME_REHASH %u\n", rehash); + printf ("#define FC_GLYPHNAME_MAXLEN %d\n\n", max_name_len); + if (nraw < 128) + type = "int8_t"; + else if (nraw < 32768) + type = "int16_t"; + else + type = "int32_t"; + + printf ("typedef %s FcGlyphId;\n\n", type); + + /* + * Dump out entries + */ + + printf ("static const struct { const FcChar32 ucs; const FcChar8 name[%d]; } _fc_glyph_names[%d] = {\n", + max_name_len + 1, nraw); + + for (i = 0; i < nraw; i++) + printf (" { 0x%lx, \"%s\" },\n", + (unsigned long) raw[i]->ucs, raw[i]->name); + + printf ("};\n"); + + /* + * Dump out name_to_ucs table + */ + + dump (name_to_ucs, "_fc_name_to_ucs"); + + /* + * Dump out ucs_to_name table + */ + dump (ucs_to_name, "_fc_ucs_to_name"); + + while (fgets (line, sizeof (line), stdin)) + fputs (line, stdout); + + fflush (stdout); + exit (ferror (stdout)); +} diff --git a/fontconfig/fc-glyphname/fcglyphname.tmpl.h b/fontconfig/fc-glyphname/fcglyphname.tmpl.h new file mode 100644 index 000000000..e2f76a2a5 --- /dev/null +++ b/fontconfig/fc-glyphname/fcglyphname.tmpl.h @@ -0,0 +1,25 @@ +/* + * fontconfig/fc-glyphname/fcglyphname.tmpl.h + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@@@ diff --git a/fontconfig/fc-glyphname/zapfdingbats.txt b/fontconfig/fc-glyphname/zapfdingbats.txt new file mode 100644 index 000000000..bcad2e285 --- /dev/null +++ b/fontconfig/fc-glyphname/zapfdingbats.txt @@ -0,0 +1,212 @@ +# Name: ITC Zapf Dingbats Glyph List +# Table version: 2.0 +# Date: September 20, 2002 +# +# See http://partners.adobe.com/asn/developer/typeforum/unicodegn.html +# +# Format: Semicolon-delimited fields: +# (1) glyph name +# (2) Unicode scalar value +# +a100;275E +a101;2761 +a102;2762 +a103;2763 +a104;2764 +a105;2710 +a106;2765 +a107;2766 +a108;2767 +a109;2660 +a10;2721 +a110;2665 +a111;2666 +a112;2663 +a117;2709 +a118;2708 +a119;2707 +a11;261B +a120;2460 +a121;2461 +a122;2462 +a123;2463 +a124;2464 +a125;2465 +a126;2466 +a127;2467 +a128;2468 +a129;2469 +a12;261E +a130;2776 +a131;2777 +a132;2778 +a133;2779 +a134;277A +a135;277B +a136;277C +a137;277D +a138;277E +a139;277F +a13;270C +a140;2780 +a141;2781 +a142;2782 +a143;2783 +a144;2784 +a145;2785 +a146;2786 +a147;2787 +a148;2788 +a149;2789 +a14;270D +a150;278A +a151;278B +a152;278C +a153;278D +a154;278E +a155;278F +a156;2790 +a157;2791 +a158;2792 +a159;2793 +a15;270E +a160;2794 +a161;2192 +a162;27A3 +a163;2194 +a164;2195 +a165;2799 +a166;279B +a167;279C +a168;279D +a169;279E +a16;270F +a170;279F +a171;27A0 +a172;27A1 +a173;27A2 +a174;27A4 +a175;27A5 +a176;27A6 +a177;27A7 +a178;27A8 +a179;27A9 +a17;2711 +a180;27AB +a181;27AD +a182;27AF +a183;27B2 +a184;27B3 +a185;27B5 +a186;27B8 +a187;27BA +a188;27BB +a189;27BC +a18;2712 +a190;27BD +a191;27BE +a192;279A +a193;27AA +a194;27B6 +a195;27B9 +a196;2798 +a197;27B4 +a198;27B7 +a199;27AC +a19;2713 +a1;2701 +a200;27AE +a201;27B1 +a202;2703 +a203;2750 +a204;2752 +a205;276E +a206;2770 +a20;2714 +a21;2715 +a22;2716 +a23;2717 +a24;2718 +a25;2719 +a26;271A +a27;271B +a28;271C +a29;2722 +a2;2702 +a30;2723 +a31;2724 +a32;2725 +a33;2726 +a34;2727 +a35;2605 +a36;2729 +a37;272A +a38;272B +a39;272C +a3;2704 +a40;272D +a41;272E +a42;272F +a43;2730 +a44;2731 +a45;2732 +a46;2733 +a47;2734 +a48;2735 +a49;2736 +a4;260E +a50;2737 +a51;2738 +a52;2739 +a53;273A +a54;273B +a55;273C +a56;273D +a57;273E +a58;273F +a59;2740 +a5;2706 +a60;2741 +a61;2742 +a62;2743 +a63;2744 +a64;2745 +a65;2746 +a66;2747 +a67;2748 +a68;2749 +a69;274A +a6;271D +a70;274B +a71;25CF +a72;274D +a73;25A0 +a74;274F +a75;2751 +a76;25B2 +a77;25BC +a78;25C6 +a79;2756 +a7;271E +a81;25D7 +a82;2758 +a83;2759 +a84;275A +a85;276F +a86;2771 +a87;2772 +a88;2773 +a89;2768 +a8;271F +a90;2769 +a91;276C +a92;276D +a93;276A +a94;276B +a95;2774 +a96;2775 +a97;275B +a98;275C +a99;275D +a9;2720 +#-- end diff --git a/fontconfig/fc-lang/Makefile.am b/fontconfig/fc-lang/Makefile.am new file mode 100644 index 000000000..923a4fff6 --- /dev/null +++ b/fontconfig/fc-lang/Makefile.am @@ -0,0 +1,300 @@ +# +# $Id $ +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# + +CC = @CC_FOR_BUILD@ +EXEEXT = @EXEEXT_FOR_BUILD@ +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ + +INCLUDES=-I${top_srcdir}/src -I${top_srcdir} $(WARN_CFLAGS) + +TMPL=fclang.tmpl.h +STMPL=${top_srcdir}/fc-lang/fclang.tmpl.h +TARG=fclang.h + +noinst_PROGRAMS=fc-lang + +noinst_MANS=fc-lang.man + +EXTRA_DIST=$(TMPL) $(ORTH) + +$(TARG):$(ORTH) fc-lang${EXEEXT} $(STMPL) + $(AM_V_GEN) $(RM) $(TARG); \ + ./fc-lang${EXEEXT} -d ${srcdir} $(ORTH) < $(STMPL) > $(TARG).tmp && \ + mv $(TARG).tmp $(TARG) + +ALIAS_FILES = fcalias.h fcaliastail.h + +BUILT_SOURCES = $(ALIAS_FILES) $(TARG) + +$(ALIAS_FILES): + touch $(ALIAS_FILES) + +CLEANFILES = $(TARG) $(ALIAS_FILES) + +# NOTE: +# +# The order of the orth files here is extremely important (part of the cache +# format) and should not be modified. New orth files should be added at the +# end. No files should be removed either. +# +ORTH = \ + aa.orth \ + ab.orth \ + af.orth \ + am.orth \ + ar.orth \ + as.orth \ + ast.orth \ + av.orth \ + ay.orth \ + az_az.orth \ + az_ir.orth \ + ba.orth \ + bm.orth \ + be.orth \ + bg.orth \ + bh.orth \ + bho.orth \ + bi.orth \ + bin.orth \ + bn.orth \ + bo.orth \ + br.orth \ + bs.orth \ + bua.orth \ + ca.orth \ + ce.orth \ + ch.orth \ + chm.orth \ + chr.orth \ + co.orth \ + cs.orth \ + cu.orth \ + cv.orth \ + cy.orth \ + da.orth \ + de.orth \ + dz.orth \ + el.orth \ + en.orth \ + eo.orth \ + es.orth \ + et.orth \ + eu.orth \ + fa.orth \ + fi.orth \ + fj.orth \ + fo.orth \ + fr.orth \ + ff.orth \ + fur.orth \ + fy.orth \ + ga.orth \ + gd.orth \ + gez.orth \ + gl.orth \ + gn.orth \ + gu.orth \ + gv.orth \ + ha.orth \ + haw.orth \ + he.orth \ + hi.orth \ + ho.orth \ + hr.orth \ + hu.orth \ + hy.orth \ + ia.orth \ + ig.orth \ + id.orth \ + ie.orth \ + ik.orth \ + io.orth \ + is.orth \ + it.orth \ + iu.orth \ + ja.orth \ + ka.orth \ + kaa.orth \ + ki.orth \ + kk.orth \ + kl.orth \ + km.orth \ + kn.orth \ + ko.orth \ + kok.orth \ + ks.orth \ + ku_am.orth \ + ku_ir.orth \ + kum.orth \ + kv.orth \ + kw.orth \ + ky.orth \ + la.orth \ + lb.orth \ + lez.orth \ + ln.orth \ + lo.orth \ + lt.orth \ + lv.orth \ + mg.orth \ + mh.orth \ + mi.orth \ + mk.orth \ + ml.orth \ + mn_cn.orth \ + mo.orth \ + mr.orth \ + mt.orth \ + my.orth \ + nb.orth \ + nds.orth \ + ne.orth \ + nl.orth \ + nn.orth \ + no.orth \ + nr.orth \ + nso.orth \ + ny.orth \ + oc.orth \ + om.orth \ + or.orth \ + os.orth \ + pa.orth \ + pl.orth \ + ps_af.orth \ + ps_pk.orth \ + pt.orth \ + rm.orth \ + ro.orth \ + ru.orth \ + sa.orth \ + sah.orth \ + sco.orth \ + se.orth \ + sel.orth \ + sh.orth \ + shs.orth \ + si.orth \ + sk.orth \ + sl.orth \ + sm.orth \ + sma.orth \ + smj.orth \ + smn.orth \ + sms.orth \ + so.orth \ + sq.orth \ + sr.orth \ + ss.orth \ + st.orth \ + sv.orth \ + sw.orth \ + syr.orth \ + ta.orth \ + te.orth \ + tg.orth \ + th.orth \ + ti_er.orth \ + ti_et.orth \ + tig.orth \ + tk.orth \ + tl.orth \ + tn.orth \ + to.orth \ + tr.orth \ + ts.orth \ + tt.orth \ + tw.orth \ + tyv.orth \ + ug.orth \ + uk.orth \ + ur.orth \ + uz.orth \ + ve.orth \ + vi.orth \ + vo.orth \ + vot.orth \ + wa.orth \ + wen.orth \ + wo.orth \ + xh.orth \ + yap.orth \ + yi.orth \ + yo.orth \ + zh_cn.orth \ + zh_hk.orth \ + zh_mo.orth \ + zh_sg.orth \ + zh_tw.orth \ + zu.orth \ + ak.orth \ + an.orth \ + ber_dz.orth \ + ber_ma.orth \ + byn.orth \ + crh.orth \ + csb.orth \ + dv.orth \ + ee.orth \ + fat.orth \ + fil.orth \ + hne.orth \ + hsb.orth \ + ht.orth \ + hz.orth \ + ii.orth \ + jv.orth \ + kab.orth \ + kj.orth \ + kr.orth \ + ku_iq.orth \ + ku_tr.orth \ + kwm.orth \ + lg.orth \ + li.orth \ + mai.orth \ + mn_mn.orth \ + ms.orth \ + na.orth \ + ng.orth \ + nv.orth \ + ota.orth \ + pa_pk.orth \ + pap_an.orth \ + pap_aw.orth \ + qu.orth \ + rn.orth \ + rw.orth \ + sc.orth \ + sd.orth \ + sg.orth \ + sid.orth \ + sn.orth \ + su.orth \ + ty.orth \ + wal.orth \ + za.orth \ + lah.orth +# ^-------------- Add new orth files here diff --git a/fontconfig/fc-lang/aa.orth b/fontconfig/fc-lang/aa.orth new file mode 100644 index 000000000..58658ce84 --- /dev/null +++ b/fontconfig/fc-lang/aa.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/aa.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Afar (AA) +# +# Taken from http://www.arhotaba.com/waldegram.htm +# and http://www.arhotaba.com/alphabet.htm +# +0041-005a # afar doesn't use J, P, V or Z +0061-007a # afar doesn't use j, p, v or z +00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX diff --git a/fontconfig/fc-lang/ab.orth b/fontconfig/fc-lang/ab.orth new file mode 100644 index 000000000..7049ac1e8 --- /dev/null +++ b/fontconfig/fc-lang/ab.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/ab.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Abkhazia (AB) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00ab # double angle quotes +#00bb # double angle quotes +0401 +040f +0410-044f +0451 +045f +049e-049f +04a6-04a9 +04ac-04ad +04b2-04b7 +04bc-04bf +04d8 +04d9 +04e0-04e1 +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/af.orth b/fontconfig/fc-lang/af.orth new file mode 100644 index 000000000..4c34460e9 --- /dev/null +++ b/fontconfig/fc-lang/af.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/af.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Afrikaans (AF) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c8 +00e8 +00c9 +00e9 +00ca +00ea +00cb +00eb +00ce +00ee +00cf +00ef +00d4 +00f4 +00db +00fb +0149 diff --git a/fontconfig/fc-lang/ak.orth b/fontconfig/fc-lang/ak.orth new file mode 100644 index 000000000..de94f0771 --- /dev/null +++ b/fontconfig/fc-lang/ak.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/ak.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Akan (ak) +# +# According to ISO 639-3, Akan is a macro-language of Twi and Fanti. +# Information on the web indicates Twi and Fanti now have a unified +# orthography. We include Twi. +# +include tw.orth diff --git a/fontconfig/fc-lang/am.orth b/fontconfig/fc-lang/am.orth new file mode 100644 index 000000000..2f00a9616 --- /dev/null +++ b/fontconfig/fc-lang/am.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/am.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Amharic (AM) +# +# The same as Ethiopic +# +include gez.orth +1238-123f # xe-xWa +1268-126e # ve-vo +1278-127f # ce-cWa +1298-129f # Ne-NWa +12a8 # ea +12e0-12e8 # Ze-ZWa +1300-1307 # je-jWa +1328-132f # Ce-CWa diff --git a/fontconfig/fc-lang/an.orth b/fontconfig/fc-lang/an.orth new file mode 100644 index 000000000..7236886fc --- /dev/null +++ b/fontconfig/fc-lang/an.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/an.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Aragonese (an) +# +# Source: +# * Consello d’a Fabla Aragonesa, "Normas graficas de l’aragonés", at +# http://www.charrando.com/normasgraficas.pdf +# +0041-005A +0061-007A +00C1 +00C9 +00CD +00D1 +00D3 +00DA +00DC +00E1 +00E9 +00ED +00F1 +00F3 +00FA +00FC diff --git a/fontconfig/fc-lang/ar.orth b/fontconfig/fc-lang/ar.orth new file mode 100644 index 000000000..39fcfa05d --- /dev/null +++ b/fontconfig/fc-lang/ar.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/ar.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Arabic (ar) +# +# We are assuming that: +# * Most fonts that claim to support an Arabic letter actually do so; +# * Most modern text rendering software use OpenType tables, instead of +# directly using presentation forms. +# * Some good Arabic fonts do not support codepoints for Arabic presentation +# forms. +# Thus, we are switching to general forms of Arabic letters. +# +# General forms: +0621-063a +0641-064a +# Presentations forms: +# fe80-fefc diff --git a/fontconfig/fc-lang/as.orth b/fontconfig/fc-lang/as.orth new file mode 100644 index 000000000..7b7cef84a --- /dev/null +++ b/fontconfig/fc-lang/as.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/as.orth +# +# Copyright © 2006 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Assamese (as) +# +# Source: Unicode coverage and notes for Bengali script, Unicode internal +# documents, Wikipedia articles +0981-0983 +0985-098c +098f-0990 +0993-09a8 +09aa-09af +# 09b0 # Assamese uses U+09F0 instead +09b2 +09b6-09b9 +09bc +09be-09c4 +09c7-09c8 +09cb-09cd +# 09d7 # Only used as a part of U+09CC +09dc-09dd +09df +# 09e0-09e3 # These are for Sanskrit +09f0-09f1 diff --git a/fontconfig/fc-lang/ast.orth b/fontconfig/fc-lang/ast.orth new file mode 100644 index 000000000..20b81f418 --- /dev/null +++ b/fontconfig/fc-lang/ast.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/ast.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Orthography from http://www.evertype.com/alphabets/asturian.pdf +# +# Asturian/Bable/Leonese/Asturleonese (ast) +# +0041-005a +0061-007a +00c1 +00c9 +00cd +00d1 +00d3 +00da +00dc +00e1 +00e9 +00ed +00f1 +00f3 +00fa +00fc diff --git a/fontconfig/fc-lang/av.orth b/fontconfig/fc-lang/av.orth new file mode 100644 index 000000000..21e4c22de --- /dev/null +++ b/fontconfig/fc-lang/av.orth @@ -0,0 +1,97 @@ +# +# fontconfig/fc-lang/av.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Avaric (av) +# +0401 +0406 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/ay.orth b/fontconfig/fc-lang/ay.orth new file mode 100644 index 000000000..8055e9336 --- /dev/null +++ b/fontconfig/fc-lang/ay.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/ay.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Aymara (KW) +# +# Orthography from http://www.aymara.org/arusa/qillqa_eng.html +# +0041-005a +0061-007a +00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +00D1 # LATIN CAPITAL LETTER N WITH TILDE +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00EF # LATIN SMALL LETTER I WITH DIAERESIS +00F1 # LATIN SMALL LETTER N WITH TILDE +00FC # LATIN SMALL LETTER U WITH DIAERESIS diff --git a/fontconfig/fc-lang/az_az.orth b/fontconfig/fc-lang/az_az.orth new file mode 100644 index 000000000..3c9671572 --- /dev/null +++ b/fontconfig/fc-lang/az_az.orth @@ -0,0 +1,53 @@ +# +# fontconfig/fc-lang/az_az.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Azerbaijani in Azerbaijan (az-AZ) +# +# The complete orthography was from http://www.evertype.com +# +# This had been verified with the latin and cyrillic orthographies found at +# http://www.eki.ee/letter +# +# Cyrillic was removed because the switch to Latin is almost finished. +# The letter “ä” is also deprecated and replaced with “ə” since 1992. +# +0041-005a +0061-007a +#00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +#00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00E7 # LATIN SMALL LETTER C WITH CEDILLA +00F6 # LATIN SMALL LETTER O WITH DIAERESIS +00FC # LATIN SMALL LETTER U WITH DIAERESIS +011E # LATIN CAPITAL LETTER G WITH BREVE +011F # LATIN SMALL LETTER G WITH BREVE +0130 # LATIN CAPITAL LETTER I WITH DOT ABOVE +0131 # LATIN SMALL LETTER DOTLESS I +015E # LATIN CAPITAL LETTER S WITH CEDILLA +015F # LATIN SMALL LETTER S WITH CEDILLA +018F # LATIN CAPITAL LETTER SCHWA +0259 # LATIN SMALL LETTER SCHWA +#02BC # MODIFIER LETTER APOSTROPHE diff --git a/fontconfig/fc-lang/az_ir.orth b/fontconfig/fc-lang/az_ir.orth new file mode 100644 index 000000000..6899791b6 --- /dev/null +++ b/fontconfig/fc-lang/az_ir.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/az_ir.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Azerbaijani in Iran (AZ-IR) +# +# Data from Roozbeh Pournader <roozbeh@sharif.edu> +# +# Iran's Azerbaijani uses Persian letters plus an obligatory HAMZA ABOVE +# (only used over FARSI YEH). +# +include fa.orth +0654 # ARABIC HAMZA ABOVE diff --git a/fontconfig/fc-lang/ba.orth b/fontconfig/fc-lang/ba.orth new file mode 100644 index 000000000..169083564 --- /dev/null +++ b/fontconfig/fc-lang/ba.orth @@ -0,0 +1,56 @@ +# +# fontconfig/fc-lang/ba.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bashkir (BA) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00AA # FEMININE ORDINAL INDICATOR +#00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK * +#0401 # CYRILLIC CAPITAL LETTER IO in evertype.com +#0451 # CYRILLIC SMALL LETTER IO in evertype.com + +0410-044f # CYRILLIC +0492 # CYRILLIC CAPITAL LETTER GHE WITH STROKE +0493 # CYRILLIC SMALL LETTER GHE WITH STROKE +0498 # CYRILLIC CAPITAL LETTER ZE WITH DESCENDER +0499 # CYRILLIC SMALL LETTER ZE WITH DESCENDER +04A0 # CYRILLIC CAPITAL LETTER BASHKIR KA +04A1 # CYRILLIC SMALL LETTER BASHKIR KA +04A2 # CYRILLIC CAPITAL LETTER EN WITH DESCENDER +04A3 # CYRILLIC SMALL LETTER EN WITH DESCENDER +04AA # CYRILLIC CAPITAL LETTER ES WITH DESCENDER +04AB # CYRILLIC SMALL LETTER ES WITH DESCENDER +04AE # CYRILLIC CAPITAL LETTER STRAIGHT U +04AF # CYRILLIC SMALL LETTER STRAIGHT U +04BA # CYRILLIC CAPITAL LETTER SHHA +04BB # CYRILLIC SMALL LETTER SHHA +04D8 # CYRILLIC CAPITAL LETTER SCHWA +04D9 # CYRILLIC SMALL LETTER SCHWA +04E8 # CYRILLIC CAPITAL LETTER BARRED O +04E9 # CYRILLIC SMALL LETTER BARRED O +#2018-2019 # single quotes +#201c-201d # double quotes +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/be.orth b/fontconfig/fc-lang/be.orth new file mode 100644 index 000000000..ebcd19587 --- /dev/null +++ b/fontconfig/fc-lang/be.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/be.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Byelorussian (BE) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00ab +#00bb +#02BC # MODIFIER LETTER APOSTROPHE +#0401 # CYRILLIC CAPITAL LETTER IO evertype.com +0406 # CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +040E # CYRILLIC CAPITAL LETTER SHORT U (Byelorussian) +0410-044f +#0451 # CYRILLIC SMALL LETTER IO evertype.com +0456 # CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +045E # CYRILLIC SMALL LETTER SHORT U (Byelorussian) +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/ber_dz.orth b/fontconfig/fc-lang/ber_dz.orth new file mode 100644 index 000000000..bfd20f7de --- /dev/null +++ b/fontconfig/fc-lang/ber_dz.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/ber_dz.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Berber in Algeria (ber-DZ) +# +# Algerian Berber is usually Kabyle +include kab.orth diff --git a/fontconfig/fc-lang/ber_ma.orth b/fontconfig/fc-lang/ber_ma.orth new file mode 100644 index 000000000..3e63e91f6 --- /dev/null +++ b/fontconfig/fc-lang/ber_ma.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/ber_ma.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Berber in Morocco (ber-MA) +# +# Tifinagh is the official script for Berber language(s) in Morocco. +# The character list comes from Institut Royal de la Culture Amazighe (IRCAM). +# Sources: +# http://www.omniglot.com/writing/tifinagh.htm +# http://www.win.tue.nl/~aeb/natlang/berber/tifinagh/tifinagh.html +2D30-2D31 +2D33 +2D37 +2D39 +2D3B-2D3D +2D40 +2D43-2D45 +2D47 +2D49-2D4A +2D4D-2D4F +2D53-2D56 +2D59-2D5C +2D5F +2D61-2D63 +2D65 +2D6F diff --git a/fontconfig/fc-lang/bg.orth b/fontconfig/fc-lang/bg.orth new file mode 100644 index 000000000..7c84790c8 --- /dev/null +++ b/fontconfig/fc-lang/bg.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/bg.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bulgarian (BG) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#0400 # CYRILLIC CAPITAL IE WITH GRAVE evertype.com +#040d # CYRILLIC CAPITAL I WITH GRAVE evertype.com +0410-042a +042c +042e-042f +0430-044a +044c +044e-044f +#0450 # CYRILLIC SMALL IE WITH GRAVE evertype.com +#045d # CYRILLIC SMALL I WITH GRAVE evertype.com +#0462 # CYRILLIC CAPITAL LETTER YAT evertype.com +#0463 # CYRILLIC SMALL LETTER YAT evertype.com +#046A # CYRILLIC CAPITAL LETTER BIG YUS evertype.com +#046B # CYRILLIC SMALL LETTER BIG YUS evertype.com diff --git a/fontconfig/fc-lang/bh.orth b/fontconfig/fc-lang/bh.orth new file mode 100644 index 000000000..4dc39ef6c --- /dev/null +++ b/fontconfig/fc-lang/bh.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/bh.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bihari (Devanagari script) (BH) +include hi.orth diff --git a/fontconfig/fc-lang/bho.orth b/fontconfig/fc-lang/bho.orth new file mode 100644 index 000000000..d5998b4d9 --- /dev/null +++ b/fontconfig/fc-lang/bho.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/bho.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bhojpuri (Devanagari script) (BHO) +include hi.orth diff --git a/fontconfig/fc-lang/bi.orth b/fontconfig/fc-lang/bi.orth new file mode 100644 index 000000000..451783e7a --- /dev/null +++ b/fontconfig/fc-lang/bi.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/bi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bislama (BI) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c9 +00e9 +00cf +00ef +#e000 # LATIN CAPITAL LETTER M WITH MACRON (no UCS code) +#e001 # LATIN SMALL LETTER M WITH MACRON (no UCS code) +#e002 # LATIN CAPITAL LETTER P WITH MACRON (no UCS code) +#e003 # LATIN SMALL LETTER P WITH MACRON (no UCS code) +00dc +00fc diff --git a/fontconfig/fc-lang/bin.orth b/fontconfig/fc-lang/bin.orth new file mode 100644 index 000000000..1ff2c4b14 --- /dev/null +++ b/fontconfig/fc-lang/bin.orth @@ -0,0 +1,55 @@ +# +# fontconfig/fc-lang/bin.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Edo or Bini (BIN) +# +# Orthography from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a +0061-007a +00C0 # LATIN CAPITAL LETTER A WITH GRAVE +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +00C8 # LATIN CAPITAL LETTER E WITH GRAVE +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00CC # LATIN CAPITAL LETTER I WITH GRAVE +00CD # LATIN CAPITAL LETTER I WITH ACUTE +00D2 # LATIN CAPITAL LETTER O WITH GRAVE +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +00D9 # LATIN CAPITAL LETTER U WITH GRAVE +00DA # LATIN CAPITAL LETTER U WITH ACUTE +00E0 # LATIN SMALL LETTER A WITH GRAVE +00E1 # LATIN SMALL LETTER A WITH ACUTE +00E8 # LATIN SMALL LETTER E WITH GRAVE +00E9 # LATIN SMALL LETTER E WITH ACUTE +00EC # LATIN SMALL LETTER I WITH GRAVE +00ED # LATIN SMALL LETTER I WITH ACUTE +00F2 # LATIN SMALL LETTER O WITH GRAVE +00F3 # LATIN SMALL LETTER O WITH ACUTE +00F9 # LATIN SMALL LETTER U WITH GRAVE +00FA # LATIN SMALL LETTER U WITH ACUTE +1EB8 # LATIN CAPITAL LETTER E WITH DOT BELOW +1EB9 # LATIN SMALL LETTER E WITH DOT BELOW +1ECC # LATIN CAPITAL LETTER O WITH DOT BELOW +1ECD # LATIN SMALL LETTER O WITH DOT BELOW +0300 # COMBINING GRAVE ACCENT (Varia) +0301 # COMBINING ACUTE ACCENT (Oxia, Tonos) diff --git a/fontconfig/fc-lang/bm.orth b/fontconfig/fc-lang/bm.orth new file mode 100644 index 000000000..d87a5bf8f --- /dev/null +++ b/fontconfig/fc-lang/bm.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/bm.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bambara (bm) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0190 +025b +014a +014b +019d +0272 +0186 +0254 diff --git a/fontconfig/fc-lang/bn.orth b/fontconfig/fc-lang/bn.orth new file mode 100644 index 000000000..151ced25b --- /dev/null +++ b/fontconfig/fc-lang/bn.orth @@ -0,0 +1,44 @@ +# +# fontconfig/fc-lang/bn.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bengali (bn) +# +# Source: Unicode coverage and notes for Bengali script, Unicode internal +# documents +0981-0983 +0985-098c +098f-0990 +0993-09a8 +09aa-09b0 +09b2 +09b6-09b9 +09bc +09be-09c4 +09c7-09c8 +09cb-09cd +# 09d7 # Only used as a part of U+09CC +09dc-09dd +09df +# 09e0-09e3 # These are for Sanskrit +# 09f0-09f1 # These are for Assamese diff --git a/fontconfig/fc-lang/bo.orth b/fontconfig/fc-lang/bo.orth new file mode 100644 index 000000000..f09d18e74 --- /dev/null +++ b/fontconfig/fc-lang/bo.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/bo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tibetan (BO) +# +# Taken from the Unicode coverage of this language +# +0f40-0f47 +0f49-0f69 +0f71-0f76 +0f78 +0f7a-0f7d +0f80-0f81 +0f90-0f97 +0f99-0fb9 +# Fixed-form subjoined consonants +# These characters are used only for transliteration and transcription. +#0fba-0fbc + diff --git a/fontconfig/fc-lang/br.orth b/fontconfig/fc-lang/br.orth new file mode 100644 index 000000000..fb90f0ff7 --- /dev/null +++ b/fontconfig/fc-lang/br.orth @@ -0,0 +1,47 @@ +# +# fontconfig/fc-lang/br.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Breton (BR) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#0027 +0041-005a +0061-007a +#00AB # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK * +#00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK * +00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00D1 # LATIN CAPITAL LETTER N WITH TILDE +00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX eki.ee +00D9 # LATIN CAPITAL LETTER U WITH GRAVE +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +00F1 # LATIN SMALL LETTER N WITH TILDE +00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX eki.ee +00F9 # LATIN SMALL LETTER U WITH GRAVE +00FC # LATIN SMALL LETTER U WITH DIAERESIS +#2019-201a # single quote and comma diff --git a/fontconfig/fc-lang/bs.orth b/fontconfig/fc-lang/bs.orth new file mode 100644 index 000000000..5df47069a --- /dev/null +++ b/fontconfig/fc-lang/bs.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/bs.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Bosnian (BS) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0106 +0107 +010c +010d +0110 +0111 +0160 +0161 +017d +017e diff --git a/fontconfig/fc-lang/bua.orth b/fontconfig/fc-lang/bua.orth new file mode 100644 index 000000000..cb6729964 --- /dev/null +++ b/fontconfig/fc-lang/bua.orth @@ -0,0 +1,102 @@ +# +# fontconfig/fc-lang/bua.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Buriat (Buryat) (BUA) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA (Historic cyrillic letter) +#0473 # CYRILLIC SMALL LETTER FITA (Historic cyrillic letter) +04ae +04af +04ba +04bb diff --git a/fontconfig/fc-lang/byn.orth b/fontconfig/fc-lang/byn.orth new file mode 100644 index 000000000..539feebc1 --- /dev/null +++ b/fontconfig/fc-lang/byn.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/byn.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Blin/Bilin (byn) +# +# Copying Tigrinya of Eritrea, as does glibc +include ti_er.orth diff --git a/fontconfig/fc-lang/ca.orth b/fontconfig/fc-lang/ca.orth new file mode 100644 index 000000000..6ace8fa02 --- /dev/null +++ b/fontconfig/fc-lang/ca.orth @@ -0,0 +1,58 @@ +# +# fontconfig/fc-lang/ca.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Catalan (CA) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00B7 # MIDDLE DOT +00C0 # LATIN CAPITAL LETTER A WITH GRAVE +00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +00C8 # LATIN CAPITAL LETTER E WITH GRAVE +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00CD # LATIN CAPITAL LETTER I WITH ACUTE +00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +#00D1 # LATIN CAPITAL LETTER N WITH TILDE "important" @ eki.ee +00D2 # LATIN CAPITAL LETTER O WITH GRAVE +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +00DA # LATIN CAPITAL LETTER U WITH ACUTE +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00E0 # LATIN SMALL LETTER A WITH GRAVE +00E7 # LATIN SMALL LETTER C WITH CEDILLA +00E8 # LATIN SMALL LETTER E WITH GRAVE +00E9 # LATIN SMALL LETTER E WITH ACUTE +00ED # LATIN SMALL LETTER I WITH ACUTE +00EF # LATIN SMALL LETTER I WITH DIAERESIS +#00F1 # LATIN SMALL LETTER N WITH TILDE "important" @ eki.ee +00F2 # LATIN SMALL LETTER O WITH GRAVE +00F3 # LATIN SMALL LETTER O WITH ACUTE +00FA # LATIN SMALL LETTER U WITH ACUTE +00FC # LATIN SMALL LETTER U WITH DIAERESIS +013F # LATIN CAPITAL LETTER L WITH MIDDLE DOT +0140 # LATIN SMALL LETTER L WITH MIDDLE DOT +#2018-2019 # single quotes +#201c-201d # double quotes diff --git a/fontconfig/fc-lang/ce.orth b/fontconfig/fc-lang/ce.orth new file mode 100644 index 000000000..4db7fbdab --- /dev/null +++ b/fontconfig/fc-lang/ce.orth @@ -0,0 +1,97 @@ +# +# fontconfig/fc-lang/ce.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Chechen (CE) +# +0401 +0406 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/ch.orth b/fontconfig/fc-lang/ch.orth new file mode 100644 index 000000000..795c821a1 --- /dev/null +++ b/fontconfig/fc-lang/ch.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/ch.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chamorro (CH) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c2 +00e2 +00d1 +00f1 +00dc +00fc diff --git a/fontconfig/fc-lang/chm.orth b/fontconfig/fc-lang/chm.orth new file mode 100644 index 000000000..0f4b13cc6 --- /dev/null +++ b/fontconfig/fc-lang/chm.orth @@ -0,0 +1,109 @@ +# +# fontconfig/fc-lang/chm.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Mari (Lower Cheremis / Upper Cheremis) (CHM) +# +# I've merged both of these languages together so that a font +# for 'chm' will cover both orthographies +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +04a4 +04a5 +04d2 +04d3 +04e6 +04e7 +04f0 +04f1 +04f8 +04f9 diff --git a/fontconfig/fc-lang/chr.orth b/fontconfig/fc-lang/chr.orth new file mode 100644 index 000000000..f41951164 --- /dev/null +++ b/fontconfig/fc-lang/chr.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/chr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Cherokee (chr) +13a0-13f4 diff --git a/fontconfig/fc-lang/co.orth b/fontconfig/fc-lang/co.orth new file mode 100644 index 000000000..ccfc7d4c9 --- /dev/null +++ b/fontconfig/fc-lang/co.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/co.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Corsican (CO) +include fr.orth diff --git a/fontconfig/fc-lang/crh.orth b/fontconfig/fc-lang/crh.orth new file mode 100644 index 000000000..4e4a9860b --- /dev/null +++ b/fontconfig/fc-lang/crh.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/crh.orth +# +# Copyright © 2009 Roozbeh Pournader +# Copyright © 2009 Reşat SABIQ +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Crimean Tatar/Crimean Turkish (crh) +# +# Sources: +# * http://www.omniglot.com/writing/crimeantatar.php +# * http://en.wikipedia.org/wiki/Crimean_Tatar_language +# * http://www.vatankirim.net/yazi.asp?yaziNo=31 +# +0041-005A +0061-007A +00C2 +00C7 +00D1 +00D6 +00DC +00E2 +00E7 +00F1 +00F6 +00FC +011E-011F +0130-0131 +015E-015F diff --git a/fontconfig/fc-lang/cs.orth b/fontconfig/fc-lang/cs.orth new file mode 100644 index 000000000..aa7e7aa5d --- /dev/null +++ b/fontconfig/fc-lang/cs.orth @@ -0,0 +1,67 @@ +# +# fontconfig/fc-lang/cs.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Czech (CS) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +#00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS evertype.com +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00CD # LATIN CAPITAL LETTER I WITH ACUTE +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +#00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS evertype.com +00DA # LATIN CAPITAL LETTER U WITH ACUTE +#00DC # LATIN CAPITAL LETTER U WITH DIAERESIS evertype.com +00DD # LATIN CAPITAL LETTER Y WITH ACUTE +00E1 # LATIN SMALL LETTER A WITH ACUTE +#00E4 # LATIN SMALL LETTER A WITH DIAERESIS evertype.com +00E9 # LATIN SMALL LETTER E WITH ACUTE +00ED # LATIN SMALL LETTER I WITH ACUTE +00F3 # LATIN SMALL LETTER O WITH ACUTE +#00F6 # LATIN SMALL LETTER O WITH DIAERESIS evertype.com +00FA # LATIN SMALL LETTER U WITH ACUTE +#00FC # LATIN SMALL LETTER U WITH DIAERESIS evertype.com +00FD # LATIN SMALL LETTER Y WITH ACUTE +010C # LATIN CAPITAL LETTER C WITH CARON +010D # LATIN SMALL LETTER C WITH CARON +010E # LATIN CAPITAL LETTER D WITH CARON +010F # LATIN SMALL LETTER D WITH CARON +011A # LATIN CAPITAL LETTER E WITH CARON +011B # LATIN SMALL LETTER E WITH CARON +0147 # LATIN CAPITAL LETTER N WITH CARON +0148 # LATIN SMALL LETTER N WITH CARON +0158 # LATIN CAPITAL LETTER R WITH CARON +0159 # LATIN SMALL LETTER R WITH CARON +0160 # LATIN CAPITAL LETTER S WITH CARON +0161 # LATIN SMALL LETTER S WITH CARON +0164 # LATIN CAPITAL LETTER T WITH CARON +0165 # LATIN SMALL LETTER T WITH CARON +016E # LATIN CAPITAL LETTER U WITH RING ABOVE +016F # LATIN SMALL LETTER U WITH RING ABOVE +017D # LATIN CAPITAL LETTER Z WITH CARON +017E # LATIN SMALL LETTER Z WITH CARON diff --git a/fontconfig/fc-lang/csb.orth b/fontconfig/fc-lang/csb.orth new file mode 100644 index 000000000..4f69fff52 --- /dev/null +++ b/fontconfig/fc-lang/csb.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/csb.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kashubian (CSB) +# +# Sources: +# http://www.omniglot.com/writing/kashubian.htm +# http://www.evertype.com/alphabets/kashubian.pdf +# +0041-005A +0061-007A +00C3 +00C9 +00CB +00D2-00D4 +00D9 +00E3 +00E9 +00EB +00F2-00F4 +00F9 +0104-0105 +#0118-0119 # E with ogonek - only in evertype +0141-0144 +#015A-015B # S with acute - only in evertype +017B-017C diff --git a/fontconfig/fc-lang/cu.orth b/fontconfig/fc-lang/cu.orth new file mode 100644 index 000000000..043ad74fb --- /dev/null +++ b/fontconfig/fc-lang/cu.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/cu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Old Church Slavonic (CU) +# +# Orthography from http://www.evertype.com/alphabets/old-church-slavonic.pdf +# +0401-0402 +0405-0406 +0408 +040b +040d +040f-0418 +041a-042c +042e-044c +044e-0450 +0452 +0455-456 +0458 +045b +045d +045f-0479 diff --git a/fontconfig/fc-lang/cv.orth b/fontconfig/fc-lang/cv.orth new file mode 100644 index 000000000..3fe1b02f7 --- /dev/null +++ b/fontconfig/fc-lang/cv.orth @@ -0,0 +1,109 @@ +# +# fontconfig/fc-lang/cv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Chuvash (CV) +# +# +# I'm guessing the c cedilla is really es with descender +# +#00c7 # C cedilla +#00e7 # c cedilla +04aa # capital es with descender +04ab # small es with descender +0102 +0103 +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +04d6 +04d7 +04f2 +04f3 diff --git a/fontconfig/fc-lang/cy.orth b/fontconfig/fc-lang/cy.orth new file mode 100644 index 000000000..db790c9ad --- /dev/null +++ b/fontconfig/fc-lang/cy.orth @@ -0,0 +1,63 @@ +# +# fontconfig/fc-lang/cy.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Welsh (CY) +# +# Coverage given by Markus Kuhn <Markus.Kuhn@cl.cam.ac.uk> +# and separately by Jessica Perry Hekman <jphekman@arborius.net> +# with help from Mark Kille and Jerry Hunter. +# +0041-005a +0061-007a +00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +00E9 # LATIN SMALL LETTER E WITH ACUTE +00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +00EF # LATIN SMALL LETTER I WITH DIAERESIS +00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +00FF # LATIN SMALL LETTER Y WITH DIAERESIS +# +# Non-Latin-1 characters needed for Welsh: +# +0174 # LATIN CAPITAL LETTER W WITH CIRCUMFLEX +0175 # LATIN SMALL LETTER W WITH CIRCUMFLEX +0176 # LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +0177 # LATIN SMALL LETTER Y WITH CIRCUMFLEX +0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +# +# And stricktly speaking for dictionary authors also: +# +1E80 # LATIN CAPITAL LETTER W WITH GRAVE +1E81 # LATIN SMALL LETTER W WITH GRAVE +1E82 # LATIN CAPITAL LETTER W WITH ACUTE +1E83 # LATIN SMALL LETTER W WITH ACUTE +1E84 # LATIN CAPITAL LETTER W WITH DIAERESIS +1E85 # LATIN SMALL LETTER W WITH DIAERESIS +1EF2 # LATIN CAPITAL LETTER Y WITH GRAVE +1EF3 # LATIN SMALL LETTER Y WITH GRAVE diff --git a/fontconfig/fc-lang/da.orth b/fontconfig/fc-lang/da.orth new file mode 100644 index 000000000..b1f646714 --- /dev/null +++ b/fontconfig/fc-lang/da.orth @@ -0,0 +1,89 @@ +# +# fontconfig/fc-lang/da.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Danish (DA) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# Note: +# The sources cited at www.evertype.com appear to have unified +# all of the nordic languages making the orthography significantly +# larger than needed for Danish. The orthography used here is +# just that from eki.ee with the evertype.com additions commented out +# +0041-005a +0061-007a +#00ab +#00bb +#00C0 # LATIN CAPITAL LETTER A WITH GRAVE +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +#00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +#00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +00C6 # LATIN CAPITAL LETTER AE (ash) * +#00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +#00C8 # LATIN CAPITAL LETTER E WITH GRAVE +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +#00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +#00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +00CD # LATIN CAPITAL LETTER I WITH ACUTE +#00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +#00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +#00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +00D8 # LATIN CAPITAL LETTER O WITH STROKE +00DA # LATIN CAPITAL LETTER U WITH ACUTE +#00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00DD # LATIN CAPITAL LETTER Y WITH ACUTE +#00DE # LATIN CAPITAL LETTER THORN (Icelandic) +#00E0 # LATIN SMALL LETTER A WITH GRAVE +00E1 # LATIN SMALL LETTER A WITH ACUTE +#00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +#00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00E5 # LATIN SMALL LETTER A WITH RING ABOVE +00E6 # LATIN SMALL LETTER AE (ash) * +#00E7 # LATIN SMALL LETTER C WITH CEDILLA +#00E8 # LATIN SMALL LETTER E WITH GRAVE +00E9 # LATIN SMALL LETTER E WITH ACUTE +#00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +#00EB # LATIN SMALL LETTER E WITH DIAERESIS +00ED # LATIN SMALL LETTER I WITH ACUTE +#00F0 # LATIN SMALL LETTER ETH (Icelandic) +00F3 # LATIN SMALL LETTER O WITH ACUTE +#00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +#00F6 # LATIN SMALL LETTER O WITH DIAERESIS +00F8 # LATIN SMALL LETTER O WITH STROKE +00FA # LATIN SMALL LETTER U WITH ACUTE +#00FC # LATIN SMALL LETTER U WITH DIAERESIS +00FD # LATIN SMALL LETTER Y WITH ACUTE +#00FE # LATIN SMALL LETTER THORN (Icelandic) +#0152 # LATIN CAPITAL LIGATURE OE +#0153 # LATIN SMALL LIGATURE OE +#01FA # LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE +#01FB # LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE +#01FC # LATIN CAPITAL LETTER AE WITH ACUTE (ash) * +#01FD # LATIN SMALL LETTER AE WITH ACUTE (ash) * +#01FE # LATIN CAPITAL LETTER O WITH STROKE AND ACUTE +#01FF # LATIN SMALL LETTER O WITH STROKE AND ACUTE +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/de.orth b/fontconfig/fc-lang/de.orth new file mode 100644 index 000000000..15bf17855 --- /dev/null +++ b/fontconfig/fc-lang/de.orth @@ -0,0 +1,49 @@ +# +# fontconfig/fc-lang/de.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# German (DE) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00ab +#00bb +0041-005a +0061-007a +#00C0 # LATIN CAPITAL LETTER A WITH GRAVE eki.ee +00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +#00C9 # LATIN CAPITAL LETTER E WITH ACUTE eki.ee +00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00DF # LATIN SMALL LETTER SHARP S (German) +#00E0 # LATIN SMALL LETTER A WITH GRAVE eki.ee +00E4 # LATIN SMALL LETTER A WITH DIAERESIS +#00E9 # LATIN SMALL LETTER E WITH ACUTE eki.ee +00F6 # LATIN SMALL LETTER O WITH DIAERESIS +00FC # LATIN SMALL LETTER U WITH DIAERESIS +#2018 # single quotes +#201a # single quotes +#201c # double quotes +#201e # double quotes +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/dv.orth b/fontconfig/fc-lang/dv.orth new file mode 100644 index 000000000..289358480 --- /dev/null +++ b/fontconfig/fc-lang/dv.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/dv.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Divehi/Dhivehi/Maldivian (dv) +# +# Sources: +# * The Unicode standard +# * http://www.omniglot.com/writing/thaana.htm +# * http://en.wikipedia.org/wiki/T%C4%81na +# +0780-0797 # main consonants +0798-07A5 # consonants used for loanwords +07A6-07B0 # vowels +#07B1 # used only in dialectic or historic Divehi diff --git a/fontconfig/fc-lang/dz.orth b/fontconfig/fc-lang/dz.orth new file mode 100644 index 000000000..c7843af22 --- /dev/null +++ b/fontconfig/fc-lang/dz.orth @@ -0,0 +1,28 @@ +# +# fontconfig/fc-lang/dz.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Dzongkha (DZ) +# +# Uses Tibetan script +# +include bo.orth diff --git a/fontconfig/fc-lang/ee.orth b/fontconfig/fc-lang/ee.orth new file mode 100644 index 000000000..089c47e30 --- /dev/null +++ b/fontconfig/fc-lang/ee.orth @@ -0,0 +1,77 @@ +# +# fontconfig/fc-lang/ee.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ewe (ee) +# +# Sources: +# * http://www.uni-koeln.de/phil-fak/afrikanistik/down/publikationen/basic_ewe.pdf +# * http://en.wikipedia.org/wiki/Ewe_language +# * http://www.omniglot.com/writing/ewe.htm +# * http://www.panafril10n.org/wikidoc/pmwiki.php/PanAfrLoc/Gbe +# +# We amend the main alphabet with tone marks over each vowel, but some +# combinations lack precomposed forms in Unicode, so we also add indiviual +# combining marks. +# +# Sources also differ on the notation used for the fourth tone: circumflex +# vs combining line above (U+030D). At the moment, we are not including any +# of the two. +# +# There is also a nasalization mark for vowels (combining tilde), but there +# is a need for more research to find which vowels it's used with. The +# combination of nasalization and tones may also exist, resulting in double +# accents. +# +# C, J, and Q are not used. +# +0041-005A +0061-007A +00C0-00C1 +00C8-00C9 +00CC-00CD +00D2-00D3 +00D9-00DA +00E0-00E1 +00E8-00E9 +00EC-00ED +00F2-00F3 +00F9-00FA +011A-011B +014A-014B +0186 +0189 +# 018A # according to Unicode characters notes for U+0257 +0190-0192 +0194 +01B2 +01CD-01D4 +0254 +0256 +# 0257 # according to Unicode character notes +025B +0263 +028B +0300-0301 # to be used with open e and open o +# 0303 # combining tilde +030C # to be used with open e and open o +# 030D # combining vertical line above diff --git a/fontconfig/fc-lang/el.orth b/fontconfig/fc-lang/el.orth new file mode 100644 index 000000000..0b9782ea6 --- /dev/null +++ b/fontconfig/fc-lang/el.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/el.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Greek (EL) +# +# From vvas@hal.csd.auth.gr (Vasilis Vasaitis) +# +0386 +0388-038a +038c +038e-03a1 +03a3-03ce diff --git a/fontconfig/fc-lang/en.orth b/fontconfig/fc-lang/en.orth new file mode 100644 index 000000000..c521e2183 --- /dev/null +++ b/fontconfig/fc-lang/en.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/en.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# English (EN) +0041-005a +0061-007a +00c0 +00c7-00cb +00cf +00d1 +00d4 +00d6 +00e0 +00e7-00eb +00ef +00f1 +00f4 +00f6 +#2018-2019 # single quotes +#201c-201d # double quotes diff --git a/fontconfig/fc-lang/eo.orth b/fontconfig/fc-lang/eo.orth new file mode 100644 index 000000000..80501c7bf --- /dev/null +++ b/fontconfig/fc-lang/eo.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/eo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Esperanto (EO) +0041-005a +0061-007a +0108-0109 +011c-011d +0124-0125 +0134-0135 +015c-015d +016c-016d diff --git a/fontconfig/fc-lang/es.orth b/fontconfig/fc-lang/es.orth new file mode 100644 index 000000000..603ef6062 --- /dev/null +++ b/fontconfig/fc-lang/es.orth @@ -0,0 +1,50 @@ +# +# fontconfig/fc-lang/es.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Spanish (ES) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00A1 # INVERTED EXCLAMATION MARK +#00BF # INVERTED QUESTION MARK +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +#00C7 # LATIN CAPITAL LETTER C WITH CEDILLA important @eki.ee +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00CD # LATIN CAPITAL LETTER I WITH ACUTE +00D1 # LATIN CAPITAL LETTER N WITH TILDE +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +00DA # LATIN CAPITAL LETTER U WITH ACUTE +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00E1 # LATIN SMALL LETTER A WITH ACUTE +#00E7 # LATIN SMALL LETTER C WITH CEDILLA important @eki.ee +00E9 # LATIN SMALL LETTER E WITH ACUTE +00ED # LATIN SMALL LETTER I WITH ACUTE +00F1 # LATIN SMALL LETTER N WITH TILDE +00F3 # LATIN SMALL LETTER O WITH ACUTE +00FA # LATIN SMALL LETTER U WITH ACUTE +00FC # LATIN SMALL LETTER U WITH DIAERESIS +# diff --git a/fontconfig/fc-lang/et.orth b/fontconfig/fc-lang/et.orth new file mode 100644 index 000000000..db2d2c140 --- /dev/null +++ b/fontconfig/fc-lang/et.orth @@ -0,0 +1,47 @@ +# +# fontconfig/fc-lang/et.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Estonian (ET) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00D5 # LATIN CAPITAL LETTER O WITH TILDE +00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00F5 # LATIN SMALL LETTER O WITH TILDE +00F6 # LATIN SMALL LETTER O WITH DIAERESIS +00FC # LATIN SMALL LETTER U WITH DIAERESIS +0160 # LATIN CAPITAL LETTER S WITH CARON +0161 # LATIN SMALL LETTER S WITH CARON +017D # LATIN CAPITAL LETTER Z WITH CARON +017E # LATIN SMALL LETTER Z WITH CARON +#2018 # # single quote +#201a # # single quote +#201c # # double quote +#201e # # double quote diff --git a/fontconfig/fc-lang/eu.orth b/fontconfig/fc-lang/eu.orth new file mode 100644 index 000000000..6ff35779d --- /dev/null +++ b/fontconfig/fc-lang/eu.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/eu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Basque (EU) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +# The orthography from evertype.com comes from the Académie de la Langue +# Basque prior to 1926. eki.ee adds some additional letters, marked here +# and commented out. I've also commented out some older letters +# from the evertype.com orthography which are (apparently) no longer +# in use +# +0041-005a +0061-007a +#00C7 # LATIN CAPITAL LETTER C WITH CEDILLA eki.ee +00D1 LATIN CAPITAL LETTER N WITH TILDE +00DC LATIN CAPITAL LETTER U WITH DIAERESIS +#00E7 # LATIN SMALL LETTER C WITH CEDILLA eki.ee +00F1 LATIN SMALL LETTER N WITH TILDE +00FC LATIN SMALL LETTER U WITH DIAERESIS +#0154 LATIN CAPITAL LETTER R WITH ACUTE evertype.com +#0155 LATIN SMALL LETTER R WITH ACUTE evertype.com diff --git a/fontconfig/fc-lang/fa.orth b/fontconfig/fc-lang/fa.orth new file mode 100644 index 000000000..2d9d7fa59 --- /dev/null +++ b/fontconfig/fc-lang/fa.orth @@ -0,0 +1,73 @@ +# +# fontconfig/fc-lang/fa.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Persian (fa) +# +# Sources: +# * ISIRI 6219:2002, "Information Technology — Persian Information +# Interchange and Display Mechanism, using Unicode" +# * "Dastur-e Khat-te Fārsi", Iranian Academy of Persian Language and +# Literature, 4th printing, December 2005, ISBN 964-7531-13-3. Available +# at http://www.persianacademy.ir/fa/das.aspx +# +# We are assuming that: +# * Most fonts that claim to support an Arabic letter actually do so; +# * Most modern text rendering software use OpenType tables, instead of +# directly using presentation forms. +# * Some good Arabic fonts do not support codepoints for Arabic presentation +# forms. +# Thus, we are switching to general forms of Arabic letters. +# +# General forms: +0621-0624 +0626-0628 +0629 # TEH MARBUTA, implicitly considered mandatory in the official orthography +062a-063a +0641-0642 +0644-0648 +064b # FATHATAN, considered mandatory in the official orthography +# 064b-064d # DAMMATAN and KASRATAN, considered mandatory in the official orthography, but very rare +# 064e-0650 # FATHA, DAMMA, and KASRA, not mandataroy in the official orthography +# 0651 # SHADDA, considered mandatory only for legal texts +# 0652 # SUKUN, not mandatory in the official orthography +0654 # HAMZA ABOVE, considered mandatory in the official orthography +# 0656 # SUBSCRIPT ALEF, not mentioned in official orthography, but sometimes used +# 0670 # SUPERSCRIPT ALEF, not explicilty listed in the official orthography, although used in the document; not mandatory +067e +0686 +0698 +06a9 +06af +06cc +# Presentations forms: +#fb56-fb59 +#fb7a-fb7d +#fb8a-fb8b +#fb8e-fb95 +#fbfc-fbff +#fe80-fe86 +#fe89-fed8 +#fedd-feee +##fef5-fef8 # These four happen very rarely +#fefb-fefc diff --git a/fontconfig/fc-lang/fat.orth b/fontconfig/fc-lang/fat.orth new file mode 100644 index 000000000..f3cba1036 --- /dev/null +++ b/fontconfig/fc-lang/fat.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/fat.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Fanti (fat) +# +# According to ISO 639-3, Akan is a macro-language of Twi and Fanti. +# Information on the web indicates Twi and Fanti now have a unified +# orthography. We include Twi. +# +include tw.orth diff --git a/fontconfig/fc-lang/fc-lang.c b/fontconfig/fc-lang/fc-lang.c new file mode 100644 index 000000000..21d568d7e --- /dev/null +++ b/fontconfig/fc-lang/fc-lang.c @@ -0,0 +1,577 @@ +/* + * fontconfig/fc-lang/fc-lang.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fccharset.c" +#include "fcstr.c" +#include "fcserialize.c" + +/* + * fc-lang + * + * Read a set of language orthographies and build C declarations for + * charsets which can then be used to identify which languages are + * supported by a given font. Note that this uses some utilities + * from the fontconfig library, so the necessary file is simply + * included in this compilation. A couple of extra utility + * functions are also needed in slightly modified form + */ + +void +FcMemAlloc (int kind, int size) +{ +} + +void +FcMemFree (int kind, int size) +{ +} + +FcPrivate void +FcCacheObjectReference (void *object) +{ +} + +FcPrivate void +FcCacheObjectDereference (void *object) +{ +} + +int FcDebugVal; + +FcChar8 * +FcConfigHome (void) +{ + return (FcChar8 *) getenv ("HOME"); +} + +static void +fatal (const char *file, int lineno, const char *msg) +{ + if (lineno) + fprintf (stderr, "%s:%d: %s\n", file, lineno, msg); + else + fprintf (stderr, "%s: %s\n", file, msg); + exit (1); +} + +static char * +get_line (FILE *f, char *line, int *lineno) +{ + char *hash; + int end; + if (!fgets (line, 1024, f)) + return 0; + ++(*lineno); + hash = strchr (line, '#'); + if (hash) + *hash = '\0'; + + end = strlen (line); + while (end > 0 && isspace (line[end-1])) + line[--end] = '\0'; + + if (line[0] == '\0' || line[0] == '\n' || line[0] == '\032' || line[0] == '\r') + return get_line (f, line, lineno); + return line; +} + +static char *dir = 0; + +static FILE * +scanopen (char *file) +{ + FILE *f; + + f = fopen (file, "r"); + if (!f && dir) + { + char path[1024]; + + strcpy (path, dir); + strcat (path, "/"); + strcat (path, file); + f = fopen (path, "r"); + } + return f; +} + +/* + * build a single charset from a source file + * + * The file format is quite simple, either + * a single hex value or a pair separated with a dash + * + * Comments begin with '#' + */ + +static const FcCharSet * +scan (FILE *f, char *file, FcCharSetFreezer *freezer) +{ + FcCharSet *c = 0; + FcCharSet *n; + int start, end, ucs4; + char line[1024]; + int lineno = 0; + + while (get_line (f, line, &lineno)) + { + if (!strncmp (line, "include", 7)) + { + FILE *included_f; + char *included_file; + included_file = strchr (line, ' '); + if (!included_file) + fatal (file, lineno, + "invalid syntax, expected: include filename"); + while (isspace(*included_file)) + included_file++; + included_f = scanopen (included_file); + if (!included_f) + fatal (included_file, 0, "can't open"); + n = scan (included_f, included_file, freezer); + fclose (included_f); + if (!c) + c = FcCharSetCreate (); + if (!FcCharSetMerge (c, n, NULL)) + fatal (file, lineno, "out of memory"); + FcCharSetDestroy (n); + continue; + } + if (strchr (line, '-')) + { + if (sscanf (line, "%x-%x", &start, &end) != 2) + fatal (file, lineno, "parse error"); + } + else + { + if (sscanf (line, "%x", &start) != 1) + fatal (file, lineno, "parse error"); + end = start; + } + if (!c) + c = FcCharSetCreate (); + for (ucs4 = start; ucs4 <= end; ucs4++) + { + if (!FcCharSetAddChar (c, ucs4)) + fatal (file, lineno, "out of memory"); + } + } + n = FcCharSetFreeze (freezer, c); + FcCharSetDestroy (c); + return n; +} + +/* + * Convert a file name into a name suitable for C declarations + */ +static char * +get_name (char *file) +{ + char *name; + char *dot; + + dot = strchr (file, '.'); + if (!dot) + dot = file + strlen(file); + name = malloc (dot - file + 1); + strncpy (name, file, dot - file); + name[dot-file] = '\0'; + return name; +} + +/* + * Convert a C name into a language name + */ +static char * +get_lang (char *name) +{ + char *lang = malloc (strlen (name) + 1); + char *l = lang; + char c; + + while ((c = *name++)) + { + if (isupper ((int) (unsigned char) c)) + c = tolower ((int) (unsigned char) c); + if (c == '_') + c = '-'; + if (c == ' ') + continue; + *l++ = c; + } + *l++ = '\0'; + return lang; +} + +typedef struct _Entry { + int id; + char *file; +} Entry; + +static int compare (const void *a, const void *b) +{ + const Entry const *as = a, *bs = b; + return FcStrCmpIgnoreCase (as->file, bs->file); +} + +#define MAX_LANG 1024 +#define MAX_LANG_SET_MAP ((MAX_LANG + 31) / 32) + +#define BitSet(map, i) ((map)[(entries[i].id)>>5] |= ((FcChar32) 1 << ((entries[i].id) & 0x1f))) +#define BitGet(map, i) ((map)[(entries[i].id)>>5] >> ((entries[i].id) & 0x1f)) & 1) + +int +main (int argc, char **argv) +{ + static Entry entries[MAX_LANG]; + static const FcCharSet *sets[MAX_LANG]; + static int duplicate[MAX_LANG]; + static int country[MAX_LANG]; + static char *names[MAX_LANG]; + static char *langs[MAX_LANG]; + static int off[MAX_LANG]; + FILE *f; + int ncountry = 0; + int i = 0; + int nsets = 0; + int argi; + FcCharLeaf **leaves; + int total_leaves = 0; + int l, sl, tl, tn; + static char line[1024]; + static FcChar32 map[MAX_LANG_SET_MAP]; + int num_lang_set_map; + int setRangeStart[26]; + int setRangeEnd[26]; + FcChar8 setRangeChar; + FcCharSetFreezer *freezer; + + freezer = FcCharSetFreezerCreate (); + if (!freezer) + fatal (argv[0], 0, "out of memory"); + argi = 1; + while (argv[argi]) + { + if (!strcmp (argv[argi], "-d")) + { + argi++; + dir = argv[argi++]; + continue; + } + if (i == MAX_LANG) + fatal (argv[0], 0, "Too many languages"); + entries[i].id = i; + entries[i].file = argv[argi++]; + i++; + } + entries[i].file = 0; + qsort (entries, i, sizeof (Entry), compare); + i = 0; + while (entries[i].file) + { + f = scanopen (entries[i].file); + if (!f) + fatal (entries[i].file, 0, strerror (errno)); + sets[i] = scan (f, entries[i].file, freezer); + names[i] = get_name (entries[i].file); + langs[i] = get_lang(names[i]); + if (strchr (langs[i], '-')) + country[ncountry++] = i; + + total_leaves += sets[i]->num; + i++; + fclose (f); + } + nsets = i; + sets[i] = 0; + leaves = malloc (total_leaves * sizeof (FcCharLeaf *)); + tl = 0; + /* + * Find unique leaves + */ + for (i = 0; sets[i]; i++) + { + for (sl = 0; sl < sets[i]->num; sl++) + { + for (l = 0; l < tl; l++) + if (leaves[l] == FcCharSetLeaf(sets[i], sl)) + break; + if (l == tl) + leaves[tl++] = FcCharSetLeaf(sets[i], sl); + } + } + + /* + * Scan the input until the marker is found + */ + + while (fgets (line, sizeof (line), stdin)) + { + if (!strncmp (line, "@@@", 3)) + break; + fputs (line, stdout); + } + + printf ("/* total size: %d unique leaves: %d */\n\n", + total_leaves, tl); + + /* + * Find duplicate charsets + */ + duplicate[0] = -1; + for (i = 1; sets[i]; i++) + { + int j; + + duplicate[i] = -1; + for (j = 0; j < i; j++) + if (sets[j] == sets[i]) + { + duplicate[i] = j; + break; + } + } + + tn = 0; + for (i = 0; sets[i]; i++) { + if (duplicate[i] >= 0) + continue; + off[i] = tn; + tn += sets[i]->num; + } + + printf ("#define LEAF0 (%d * sizeof (FcLangCharSet))\n", nsets); + printf ("#define OFF0 (LEAF0 + %d * sizeof (FcCharLeaf))\n", tl); + printf ("#define NUM0 (OFF0 + %d * sizeof (intptr_t))\n", tn); + printf ("#define SET(n) (n * sizeof (FcLangCharSet) + offsetof (FcLangCharSet, charset))\n"); + printf ("#define OFF(s,o) (OFF0 + o * sizeof (intptr_t) - SET(s))\n"); + printf ("#define NUM(s,n) (NUM0 + n * sizeof (FcChar16) - SET(s))\n"); + printf ("#define LEAF(o,l) (LEAF0 + l * sizeof (FcCharLeaf) - (OFF0 + o * sizeof (intptr_t)))\n"); + printf ("#define fcLangCharSets (fcLangData.langCharSets)\n"); + printf ("#define fcLangCharSetIndices (fcLangData.langIndices)\n"); + printf ("#define fcLangCharSetIndicesInv (fcLangData.langIndicesInv)\n"); + printf ("\n"); + + printf ("static const struct {\n" + " FcLangCharSet langCharSets[%d];\n" + " FcCharLeaf leaves[%d];\n" + " intptr_t leaf_offsets[%d];\n" + " FcChar16 numbers[%d];\n" + " FcChar%s langIndices[%d];\n" + " FcChar%s langIndicesInv[%d];\n" + "} fcLangData = {\n", + nsets, tl, tn, tn, + nsets < 256 ? "8 " : "16", nsets, nsets < 256 ? "8 " : "16", nsets); + + /* + * Dump sets + */ + + printf ("{\n"); + for (i = 0; sets[i]; i++) + { + int j = duplicate[i]; + + if (j < 0) + j = i; + + printf (" { \"%s\", " + " { FC_REF_CONSTANT, %d, OFF(%d,%d), NUM(%d,%d) } }, /* %d */\n", + langs[i], + sets[j]->num, i, off[j], i, off[j], i); + } + printf ("},\n"); + + /* + * Dump leaves + */ + printf ("{\n"); + for (l = 0; l < tl; l++) + { + printf (" { { /* %d */", l); + for (i = 0; i < 256/32; i++) + { + if (i % 4 == 0) + printf ("\n "); + printf (" 0x%08x,", leaves[l]->map[i]); + } + printf ("\n } },\n"); + } + printf ("},\n"); + + /* + * Dump leaves + */ + printf ("{\n"); + for (i = 0; sets[i]; i++) + { + int n; + + if (duplicate[i] >= 0) + continue; + printf (" /* %s */\n", names[i]); + for (n = 0; n < sets[i]->num; n++) + { + if (n % 4 == 0) + printf (" "); + for (l = 0; l < tl; l++) + if (leaves[l] == FcCharSetLeaf(sets[i], n)) + break; + if (l == tl) + fatal (names[i], 0, "can't find leaf"); + printf (" LEAF(%3d,%3d),", off[i], l); + if (n % 4 == 3) + printf ("\n"); + } + if (n % 4 != 0) + printf ("\n"); + } + printf ("},\n"); + + + printf ("{\n"); + for (i = 0; sets[i]; i++) + { + int n; + + if (duplicate[i] >= 0) + continue; + printf (" /* %s */\n", names[i]); + for (n = 0; n < sets[i]->num; n++) + { + if (n % 8 == 0) + printf (" "); + printf (" 0x%04x,", FcCharSetNumbers (sets[i])[n]); + if (n % 8 == 7) + printf ("\n"); + } + if (n % 8 != 0) + printf ("\n"); + } + printf ("},\n"); + + /* langIndices */ + printf ("{\n"); + for (i = 0; sets[i]; i++) + { + printf (" %d, /* %s */\n", entries[i].id, names[i]); + } + printf ("},\n"); + + /* langIndicesInv */ + printf ("{\n"); + { + static int entries_inv[MAX_LANG]; + for (i = 0; sets[i]; i++) + entries_inv[entries[i].id] = i; + for (i = 0; sets[i]; i++) + printf (" %d, /* %s */\n", entries_inv[i], names[entries_inv[i]]); + } + printf ("}\n"); + + printf ("};\n\n"); + + printf ("#define NUM_LANG_CHAR_SET %d\n", i); + num_lang_set_map = (i + 31) / 32; + printf ("#define NUM_LANG_SET_MAP %d\n", num_lang_set_map); + /* + * Dump indices with country codes + */ + if (ncountry) + { + int c; + int ncountry_ent = 0; + printf ("\n"); + printf ("static const FcChar32 fcLangCountrySets[][NUM_LANG_SET_MAP] = {\n"); + for (c = 0; c < ncountry; c++) + { + i = country[c]; + if (i >= 0) + { + int lang = strchr (langs[i], '-') - langs[i]; + int d, k; + + for (k = 0; k < num_lang_set_map; k++) + map[k] = 0; + + BitSet (map, i); + for (d = c + 1; d < ncountry; d++) + { + int j = country[d]; + if (j >= 0 && !strncmp (langs[j], langs[i], lang + 1)) + { + BitSet(map, j); + country[d] = -1; + } + } + printf (" {"); + for (k = 0; k < num_lang_set_map; k++) + printf (" 0x%08x,", map[k]); + printf (" }, /* %*.*s */\n", + lang, lang, langs[i]); + ++ncountry_ent; + } + } + printf ("};\n\n"); + printf ("#define NUM_COUNTRY_SET %d\n", ncountry_ent); + } + + + /* + * Find ranges for each letter for faster searching + */ + setRangeChar = 'a'; + memset(setRangeStart, '\0', sizeof (setRangeStart)); + memset(setRangeEnd, '\0', sizeof (setRangeEnd)); + for (i = 0; sets[i]; i++) + { + char c = names[i][0]; + + while (setRangeChar <= c && c <= 'z') + setRangeStart[setRangeChar++ - 'a'] = i; + } + for (setRangeChar = 'a'; setRangeChar < 'z'; setRangeChar++) + setRangeEnd[setRangeChar - 'a'] = setRangeStart[setRangeChar+1-'a'] - 1; + setRangeEnd[setRangeChar - 'a'] = i - 1; + + /* + * Dump sets start/finish for the fastpath + */ + printf ("\n"); + printf ("static const FcLangCharSetRange fcLangCharSetRanges[] = {\n"); + printf ("\n"); + for (setRangeChar = 'a'; setRangeChar <= 'z' ; setRangeChar++) + { + printf (" { %d, %d }, /* %c */\n", + setRangeStart[setRangeChar - 'a'], + setRangeEnd[setRangeChar - 'a'], setRangeChar); + } + printf ("};\n\n"); + + while (fgets (line, sizeof (line), stdin)) + fputs (line, stdout); + + fflush (stdout); + exit (ferror (stdout)); +} diff --git a/fontconfig/fc-lang/fc-lang.man b/fontconfig/fc-lang/fc-lang.man new file mode 100644 index 000000000..8767be6fc --- /dev/null +++ b/fontconfig/fc-lang/fc-lang.man @@ -0,0 +1,39 @@ +.\" +.\" Copyright © 2002 Keith Packard +.\" +.\" Permission to use, copy, modify, distribute, and sell this software and its +.\" documentation for any purpose is hereby granted without fee, provided that +.\" the above copyright notice appear in all copies and that both that +.\" copyright notice and this permission notice appear in supporting +.\" documentation, and that the name of Keith Packard not be used in +.\" advertising or publicity pertaining to distribution of the software without +.\" specific, written prior permission. Keith Packard makes no +.\" representations about the suitability of this software for any purpose. It +.\" is provided "as is" without express or implied warranty. +.\" +.\" THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +.\" INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +.\" EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +.\" CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +.\" DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +.\" TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +.\" PERFORMANCE OF THIS SOFTWARE. +.\" +.\" +.\" fontconfig/fc-lang/fc-lang.man +.\" +.TH FC-LANG 1 __vendorversion__ +.SH NAME +fc-lang, fclang.h \- create an database of language orthographies +.SH SYNOPSIS +.B "fc-lang" +.RI [ language-coverage +\|.\|.\|. ] +.SH DESCRIPTION +.I Fc-lang +builds the fclang.h file used in the fontconfig library to automatically +determine language coverage for fonts which don't contain this information. +.SH FILES +.TP 15 +.B fclang.tmpl.h +The template file in which the tables are inserted diff --git a/fontconfig/fc-lang/fclang.tmpl.h b/fontconfig/fc-lang/fclang.tmpl.h new file mode 100644 index 000000000..c7d388918 --- /dev/null +++ b/fontconfig/fc-lang/fclang.tmpl.h @@ -0,0 +1,25 @@ +/* + * fontconfig/fc-lang/fclang.tmpl.h + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +@@@ diff --git a/fontconfig/fc-lang/ff.orth b/fontconfig/fc-lang/ff.orth new file mode 100644 index 000000000..25b4e359c --- /dev/null +++ b/fontconfig/fc-lang/ff.orth @@ -0,0 +1,38 @@ +# +# fontconfig/fc-lang/ff.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Fulah (Fula) (ff) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0181 +0253 +018a +0257 +014a +014b +019d +0272 +01b3-01b4 diff --git a/fontconfig/fc-lang/fi.orth b/fontconfig/fc-lang/fi.orth new file mode 100644 index 000000000..ccac86e21 --- /dev/null +++ b/fontconfig/fc-lang/fi.orth @@ -0,0 +1,51 @@ +# +# fontconfig/fc-lang/fi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Finnish (FI) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00BB # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK * +00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE +#00C6 # LATIN CAPITAL LETTER AE (ash) * evertype.com +#00D5 # LATIN CAPITAL LETTER O WITH TILDE evertype.com +00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +#00DC # LATIN CAPITAL LETTER U WITH DIAERESIS evertype.com +00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00E5 # LATIN SMALL LETTER A WITH RING ABOVE +#00E6 # LATIN SMALL LETTER AE (ash) * evertype.com +#00F5 # LATIN SMALL LETTER O WITH TILDE evertype.com +00F6 # LATIN SMALL LETTER O WITH DIAERESIS +#00FC # LATIN SMALL LETTER U WITH DIAERESIS evertype.com +0160 # LATIN CAPITAL LETTER S WITH CARON +0161 # LATIN SMALL LETTER S WITH CARON +017D # LATIN CAPITAL LETTER Z WITH CARON +017E # LATIN SMALL LETTER Z WITH CARON +#2019 # single quote +#201d # double quote +#203a # angle quote diff --git a/fontconfig/fc-lang/fil.orth b/fontconfig/fc-lang/fil.orth new file mode 100644 index 000000000..0f2719522 --- /dev/null +++ b/fontconfig/fc-lang/fil.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/fil.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Filipino (fil) +# +# Sources: +# * Paul Morrow, "A Brief Guide to Filipino Pronunciation", +# http://www.mts.net/~pmorrow/filpro.htm +# * Komisyon sa Wikang Filipino, "Ang Ortograpiya ng Wikang Pambansa", +# http://wika.pbwiki.com/f/ORTOPDF.pdf (in Filipino) +# * CLDR exemplar set for Filipino: +# http://unicode.org/cldr/data/common/main/fil.xml +# +0041-005A +0061-007A +00C0-00C2 +00C8-00CA +00CC-00CE +00D1-00D4 +00D9-00DB +00E0-00E2 +00E8-00EA +00EC-00EE +00F1-00F4 +00F9-00FB diff --git a/fontconfig/fc-lang/fj.orth b/fontconfig/fc-lang/fj.orth new file mode 100644 index 000000000..5b7b6fb3f --- /dev/null +++ b/fontconfig/fc-lang/fj.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/fj.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Fijian (KW) +# +# Orthography guessed from http://www.deeptrans.com/deeptrans/german.html +# +# There may be diacritical marks used, but I couldn't find any information +# about them, nor any Fijian text using them. +# +# Fijian doesn't use h, x, z and uses f, j and p in loan words +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/fo.orth b/fontconfig/fc-lang/fo.orth new file mode 100644 index 000000000..9d5d8c585 --- /dev/null +++ b/fontconfig/fc-lang/fo.orth @@ -0,0 +1,59 @@ +# +# fontconfig/fc-lang/fo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Faroese (FO) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +#00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS evertype.com +#00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE evertype.com +00C6 # LATIN CAPITAL LETTER AE (ash) * +00CD # LATIN CAPITAL LETTER I WITH ACUTE +00D0 # LATIN CAPITAL LETTER ETH (Icelandic) +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +#00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS evertype.com +00D8 # LATIN CAPITAL LETTER O WITH STROKE +00DA # LATIN CAPITAL LETTER U WITH ACUTE +#00DC # LATIN CAPITAL LETTER U WITH DIAERESIS evertype.com +00DD # LATIN CAPITAL LETTER Y WITH ACUTE +00E1 # LATIN SMALL LETTER A WITH ACUTE +#00E4 # LATIN SMALL LETTER A WITH DIAERESIS evertype.com +#00E5 # LATIN SMALL LETTER A WITH RING ABOVE evertype.com +00E6 # LATIN SMALL LETTER AE (ash) * +00ED # LATIN SMALL LETTER I WITH ACUTE +00F0 # LATIN SMALL LETTER ETH (Icelandic) +00F3 # LATIN SMALL LETTER O WITH ACUTE +#00F6 # LATIN SMALL LETTER O WITH DIAERESIS evertype.com +00F8 # LATIN SMALL LETTER O WITH STROKE +00FA # LATIN SMALL LETTER U WITH ACUTE +#00FC # LATIN SMALL LETTER U WITH DIAERESIS evertype.com +00FD # LATIN SMALL LETTER Y WITH ACUTE +#2018 # single quote +#201a # single quote +#201c # double quote +#201e # double quote diff --git a/fontconfig/fc-lang/fr.orth b/fontconfig/fc-lang/fr.orth new file mode 100644 index 000000000..3441b9ec4 --- /dev/null +++ b/fontconfig/fc-lang/fr.orth @@ -0,0 +1,58 @@ +# +# fontconfig/fc-lang/fr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# French (FR) +0041-005a +0061-007a +00C0 # LATIN CAPITAL LETTER A WITH GRAVE +00C2 # LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00E0 # LATIN SMALL LETTER A WITH GRAVE +00E2 # LATIN SMALL LETTER A WITH CIRCUMFLEX +00C7 # LATIN CAPITAL LETTER C WITH CEDILLA +00E7 # LATIN SMALL LETTER C WITH CEDILLA +00C8 # LATIN CAPITAL LETTER E WITH GRAVE +00E8 # LATIN SMALL LETTER E WITH GRAVE +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +00E9 # LATIN SMALL LETTER E WITH ACUTE +00CA # LATIN CAPITAL LETTER E WITH CIRCUMFLEX +00EA # LATIN SMALL LETTER E WITH CIRCUMFLEX +00CB # LATIN CAPITAL LETTER E WITH DIAERESIS +00EB # LATIN SMALL LETTER E WITH DIAERESIS +00CE # LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00EE # LATIN SMALL LETTER I WITH CIRCUMFLEX +00CF # LATIN CAPITAL LETTER I WITH DIAERESIS +00EF # LATIN SMALL LETTER I WITH DIAERESIS +00D4 # LATIN CAPITAL LETTER O WITH CIRCUMFLEX +00F4 # LATIN SMALL LETTER O WITH CIRCUMFLEX +0152 # LATIN CAPITAL LIGATURE OE +0153 # LATIN SMALL LIGATURE OE +00D9 # LATIN CAPITAL LETTER U WITH GRAVE +00F9 # LATIN SMALL LETTER U WITH GRAVE +00DB # LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00FB # LATIN SMALL LETTER U WITH CIRCUMFLEX +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00FC # LATIN SMALL LETTER U WITH DIAERESIS +0178 # LATIN CAPITAL LETTER Y WITH DIAERESIS +00FF # LATIN SMALL LETTER Y WITH DIAERESIS +00C6 # LATIN CAPITAL LETTER AE (ash) * +00E6 # LATIN SMALL LETTER AE (ash) * diff --git a/fontconfig/fc-lang/fur.orth b/fontconfig/fc-lang/fur.orth new file mode 100644 index 000000000..066feb0f1 --- /dev/null +++ b/fontconfig/fc-lang/fur.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/fur.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Friulian (FUR) +# +# Orthography from http://www.evertype.com/alphabets/friulian.pdf +# +0041-005a +0061-007a +00c0-00c2 +00c8 +00cc +00d2 +00d9 +00e0-00e2 +00e8 +00ec +00f2 +00f9 diff --git a/fontconfig/fc-lang/fy.orth b/fontconfig/fc-lang/fy.orth new file mode 100644 index 000000000..b17f4d68e --- /dev/null +++ b/fontconfig/fc-lang/fy.orth @@ -0,0 +1,61 @@ +# +# fontconfig/fc-lang/fy.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Frisian (FY) +# +# West Frisian orthography from +# http://www.evertype.com/alphabets/west-frisian.pdf +# +# +# Checked with orthography from eki.ee/letter which include +# a few others (commented out here). +# +# Added in ß from German orthography +# +0041-005a +0061-007a +00c2 +00c4 +00c9 +00ca +00cb +#00ce # eki.ee +00cf +00d4 +00d6 +00da +00db +00dc +00df +00e2 +00e4 +00e9 +00ea +00eb +#00ee # eki.ee +00ef +00f4 +00f6 +00fa +00fb +00fc diff --git a/fontconfig/fc-lang/ga.orth b/fontconfig/fc-lang/ga.orth new file mode 100644 index 000000000..880114e4d --- /dev/null +++ b/fontconfig/fc-lang/ga.orth @@ -0,0 +1,84 @@ +# +# fontconfig/fc-lang/ga.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Irish (GA) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +# The orthography from evertype.com includes the lenited consonants +# as indicated with seimhiu (dot above). I've included those here +# even though they're not present in the orthography listed from eki.ee; +# eki.ee mentions that the seimhiu form is still written but is +# often written by a following h instead. +# +0041-005a +0061-007a +#00C0 # LATIN CAPITAL LETTER A WITH GRAVE evertype.com +00C1 # LATIN CAPITAL LETTER A WITH ACUTE +#00C7 # LATIN CAPITAL LETTER C WITH CEDILLA evertype.com +#00C8 # LATIN CAPITAL LETTER E WITH GRAVE evertype.com +00C9 # LATIN CAPITAL LETTER E WITH ACUTE +#00CC # LATIN CAPITAL LETTER I WITH GRAVE evertype.com +00CD # LATIN CAPITAL LETTER I WITH ACUTE +#00D2 # LATIN CAPITAL LETTER O WITH GRAVE evertype.com +00D3 # LATIN CAPITAL LETTER O WITH ACUTE +#00D9 # LATIN CAPITAL LETTER U WITH GRAVE evertype.com +00DA # LATIN CAPITAL LETTER U WITH ACUTE +#00E0 # LATIN SMALL LETTER A WITH GRAVE evertype.com +00E1 # LATIN SMALL LETTER A WITH ACUTE +#00E7 # LATIN SMALL LETTER C WITH CEDILLA evertype.com +#00E8 # LATIN SMALL LETTER E WITH GRAVE evertype.com +00E9 # LATIN SMALL LETTER E WITH ACUTE +#00EC # LATIN SMALL LETTER I WITH GRAVE +00ED # LATIN SMALL LETTER I WITH ACUTE +#00F2 # LATIN SMALL LETTER O WITH GRAVE evertype.com +00F3 # LATIN SMALL LETTER O WITH ACUTE +#00F9 # LATIN SMALL LETTER U WITH GRAVE evertype.com +00FA # LATIN SMALL LETTER U WITH ACUTE +010A # LATIN CAPITAL LETTER C WITH DOT ABOVE +010B # LATIN SMALL LETTER C WITH DOT ABOVE +0120 # LATIN CAPITAL LETTER G WITH DOT ABOVE +0121 # LATIN SMALL LETTER G WITH DOT ABOVE +#017F # LATIN SMALL LETTER LONG S evertype.com +#027C # LATIN SMALL LETTER R WITH LONG LEG evertype.com +1E02 # LATIN CAPITAL LETTER B WITH DOT ABOVE +1E03 # LATIN SMALL LETTER B WITH DOT ABOVE +1E0A # LATIN CAPITAL LETTER D WITH DOT ABOVE +1E0B # LATIN SMALL LETTER D WITH DOT ABOVE +1E1E # LATIN CAPITAL LETTER F WITH DOT ABOVE +1E1F # LATIN SMALL LETTER F WITH DOT ABOVE +1E40 # LATIN CAPITAL LETTER M WITH DOT ABOVE +1E41 # LATIN SMALL LETTER M WITH DOT ABOVE +1E56 # LATIN CAPITAL LETTER P WITH DOT ABOVE +1E57 # LATIN SMALL LETTER P WITH DOT ABOVE +1E60 # LATIN CAPITAL LETTER S WITH DOT ABOVE +1E61 # LATIN SMALL LETTER S WITH DOT ABOVE +1E6A # LATIN CAPITAL LETTER T WITH DOT ABOVE +1E6B # LATIN SMALL LETTER T WITH DOT ABOVE +#1E9B # LATIN SMALL LETTER LONG S WITH DOT ABOVE evertype.com +#1680-169c # Ogham +#2018-2019 # single quotes +#201c-201d # double quotes +#204a # tironian sign et diff --git a/fontconfig/fc-lang/gd.orth b/fontconfig/fc-lang/gd.orth new file mode 100644 index 000000000..39c308efd --- /dev/null +++ b/fontconfig/fc-lang/gd.orth @@ -0,0 +1,51 @@ +# +# fontconfig/fc-lang/gd.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Scots Gaelic (GD) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +00c1 +00c7 +00c8 +00c9 +00cc +00d2 +00d3 +00d9 +00e0 +00e1 +00e7 +00e8 +00e9 +00ec +00f2 +00f3 +00f9 +#2018-2019 # single quotes +#201c-201d # double quotes diff --git a/fontconfig/fc-lang/gez.orth b/fontconfig/fc-lang/gez.orth new file mode 100644 index 000000000..7d915fa28 --- /dev/null +++ b/fontconfig/fc-lang/gez.orth @@ -0,0 +1,60 @@ +# +# fontconfig/fc-lang/gez.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ethiopic (Geez) (eth) +# +# Taken from Unicode coverage (1200-137f) +# +# Sylables +1200-1206 # he-ho +1208-1216 # le-Ho, skip HWa +1218-1226 # me-`so, skip `sWa +1228-1230 # re-sWa +1238-1246 # re-qo +1248 # qWe +124a-124d # qWi-qW +1260-1267 # be-bWa +1270-1277 # te-to +1280-1286 # `he-`ho +1288 # hWe +128a-128d # hWi-hW +1290-1297 # ne-nWa +12a0-12a7 # a-o, skip ea +12a8-12ae # ke-ko +12b0 # kWe +12b2-12b5 # kWi-kW +12c8-12ce # we-wo +12d0-12d6 # `e-`o +12d8-12df # ze-zWa +12e8-12ee # ye-yo +12f0-12f7 # de-dWa +1308-130e # ge-go +1310 # gWe +1312-1315 # gWi-gW +1320-1328 # Te-TWa +1330-1346 # Pe-`So +1348-1356 # fe-po, skip pWa, rYa, mYa, fYa +#1361-1368 # punctuation +#1369-1371 # digits +#1372-137c # numbers +# diff --git a/fontconfig/fc-lang/gl.orth b/fontconfig/fc-lang/gl.orth new file mode 100644 index 000000000..5538be580 --- /dev/null +++ b/fontconfig/fc-lang/gl.orth @@ -0,0 +1,50 @@ +# +# fontconfig/fc-lang/gl.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Galician (GL) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00a1 +#00ab +#00bb +#00bf +00c1 +00c9 +00cd +00d1 +00d3 +00da +00dc +00e1 +00e9 +00ed +00f1 +00f3 +00fa +00fc +#2019-201a # single qutoes diff --git a/fontconfig/fc-lang/gn.orth b/fontconfig/fc-lang/gn.orth new file mode 100644 index 000000000..36ddb7657 --- /dev/null +++ b/fontconfig/fc-lang/gn.orth @@ -0,0 +1,48 @@ +# +# fontconfig/fc-lang/gn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Guaraní (GN) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00e1 +00e3 +00c9 +00e9 +1ebd +#e005 # LATIN SMALL LETTER G WITH TILDE (no UCS) +00cd +00ed +0129 +00d1 +00f1 +00d3 +00f3 +00f5 +00da +00fa +0169 +1ef9 diff --git a/fontconfig/fc-lang/gu.orth b/fontconfig/fc-lang/gu.orth new file mode 100644 index 000000000..464690737 --- /dev/null +++ b/fontconfig/fc-lang/gu.orth @@ -0,0 +1,41 @@ +# +# fontconfig/fc-lang/gu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Gujarati (gu) +# +# Taken from the Unicode coverage of this language +# +0a81-0a83 +0a85-0a8b +0a8d +0a8f-0a91 +0a93-0aa8 +0aaa-0ab0 +0ab2-0ab3 +0ab5-0ab9 +0abc-0ac5 +0ac7-0ac9 +0acb-0acd +0ad0 +0ae0 +#0ae6-0aef # Digits diff --git a/fontconfig/fc-lang/gv.orth b/fontconfig/fc-lang/gv.orth new file mode 100644 index 000000000..c22c666bb --- /dev/null +++ b/fontconfig/fc-lang/gv.orth @@ -0,0 +1,31 @@ +# +# fontconfig/fc-lang/gv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Manx Gaelic (GV) +# +# Orthography from http://www.evertype.com/alphabets/manx-gaelic.pdf +# +0041-005a +0061-007a +00c7 +00e7 diff --git a/fontconfig/fc-lang/ha.orth b/fontconfig/fc-lang/ha.orth new file mode 100644 index 000000000..cea4faf73 --- /dev/null +++ b/fontconfig/fc-lang/ha.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/ha.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hausa (HA) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0181 +0253 +018a +0257 +0198-0199 +01b3 # used in Niger +01b4 # used in Niger diff --git a/fontconfig/fc-lang/haw.orth b/fontconfig/fc-lang/haw.orth new file mode 100644 index 000000000..563fbd0d9 --- /dev/null +++ b/fontconfig/fc-lang/haw.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/haw.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hawaiian (HAW) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0100-0101 +0112-0113 +012a-012b +014c-014d +016a-016b +02bb diff --git a/fontconfig/fc-lang/he.orth b/fontconfig/fc-lang/he.orth new file mode 100644 index 000000000..bd68fa42a --- /dev/null +++ b/fontconfig/fc-lang/he.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/he.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hebrew (HE) +05d0-05ea diff --git a/fontconfig/fc-lang/hi.orth b/fontconfig/fc-lang/hi.orth new file mode 100644 index 000000000..3e2226a90 --- /dev/null +++ b/fontconfig/fc-lang/hi.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/hi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hindi (Devanagari script) (HI) +# +# From Unicode coverage for Devanagari +# +0905-0914 # Independent vowels +0915-0939 # Consonants +093f-094c # Dependent vowel signs +094d # virama +#0958-095f # Additional consonants +#0960-0965 # Generic additions +#0966-096f # Digits +#0970 # Abbreviation sign diff --git a/fontconfig/fc-lang/hne.orth b/fontconfig/fc-lang/hne.orth new file mode 100644 index 000000000..3a0bacc9d --- /dev/null +++ b/fontconfig/fc-lang/hne.orth @@ -0,0 +1,28 @@ +# +# fontconfig/fc-lang/hne.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chhattisgarhi (hne) +# +# The government of India considers this a dialect of Hindi: +# including Hindi until further information is found. +include hi.orth diff --git a/fontconfig/fc-lang/ho.orth b/fontconfig/fc-lang/ho.orth new file mode 100644 index 000000000..f488c3c0e --- /dev/null +++ b/fontconfig/fc-lang/ho.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/ho.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hiri Motu (HO) +# +# I found one sample of Hiri Motu text, a translation of the first part of +# Genesis at +# http://rosettaproject.org:8080/live/search/showpages?ethnocode=POM&doctype=gen&version=1&scale=six +# +# It appears to use only ASCII glyphs, so we'll go with that for now +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/hr.orth b/fontconfig/fc-lang/hr.orth new file mode 100644 index 000000000..755c3670b --- /dev/null +++ b/fontconfig/fc-lang/hr.orth @@ -0,0 +1,49 @@ +# +# fontconfig/fc-lang/hr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Croatian (HR) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00c0 # evertype.com +#00c8 # evertype.com +#00cc # evertype.com +#00d2 # evertype.com +#00d9 # evertype.com +#00e0 # evertype.com +#00e8 # evertype.com +#00ec # evertype.com +#00f2 # evertype.com +#00f9 # evertype.com +0106-0107 +010c-010d +0110-0111 +0160-0161 +017d-017e +#01c4-01cc # evertype.com +#01f1-01f5 # evertype.com +#0200-0217 # evertype.com diff --git a/fontconfig/fc-lang/hsb.orth b/fontconfig/fc-lang/hsb.orth new file mode 100644 index 000000000..b03e45437 --- /dev/null +++ b/fontconfig/fc-lang/hsb.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/hsb.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Upper Sorbian (hsb) +# +# Sources: +# http://www.omniglot.com/writing/sorbian.htm +# http://www.evertype.com/alphabets/upper-sorbian.pdf +# +# Q, V, and X are not used +0041-005A +0061-007A +00D3 +00F3 +0106-0107 +010C-010D +011A-011B +0141-0144 +0158-0159 +0160-0161 +0179-017A +017D-017E diff --git a/fontconfig/fc-lang/ht.orth b/fontconfig/fc-lang/ht.orth new file mode 100644 index 000000000..d45302094 --- /dev/null +++ b/fontconfig/fc-lang/ht.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/ht.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Haitian/Haitian Creole (ht) +# +# Sources: +# * http://www.omniglot.com/writing/haitiancreole.htm +# * http://www.lecorde.com/creole/kreyol/index.php?page=Pronunciation +# +0041-005A +0061-007A +00C8 +00D2 +00E8 +00F2 diff --git a/fontconfig/fc-lang/hu.orth b/fontconfig/fc-lang/hu.orth new file mode 100644 index 000000000..76c024ae9 --- /dev/null +++ b/fontconfig/fc-lang/hu.orth @@ -0,0 +1,49 @@ +# +# fontconfig/fc-lang/hu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Hungarian (HU) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00C0 # LATIN CAPITAL LETTER A WITH GRAVE evertype.com +00c1 +00c9 +00cd +00d3 +00d6 +00da +00dc +#00E0 # LATIN SMALL LETTER A WITH GRAVE evertype.com +00e1 +00e9 +00ed +00f3 +00f6 +00fa +00fc +0150-0151 +0170-0171 diff --git a/fontconfig/fc-lang/hy.orth b/fontconfig/fc-lang/hy.orth new file mode 100644 index 000000000..22dd8291b --- /dev/null +++ b/fontconfig/fc-lang/hy.orth @@ -0,0 +1,26 @@ +# +# fontconfig/fc-lang/hy.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Armenian (HY) +0531-0556 +0561-0587 diff --git a/fontconfig/fc-lang/hz.orth b/fontconfig/fc-lang/hz.orth new file mode 100644 index 000000000..91a32855c --- /dev/null +++ b/fontconfig/fc-lang/hz.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/hz.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Herero (hz) +# +# Source: +# * http://www.omniglot.com/writing/herero.php +# +# C, Q, and X are not used. +# +0041-005A +0061-007A +032F # used under S and Z +1E12-1E13 +1E4A-1E4B diff --git a/fontconfig/fc-lang/ia.orth b/fontconfig/fc-lang/ia.orth new file mode 100644 index 000000000..e1ee8e76a --- /dev/null +++ b/fontconfig/fc-lang/ia.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ia.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Interlingua (IA) +# +# Orthography taken from http://www.geocities.com/linguablau/spelling_main.html +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/id.orth b/fontconfig/fc-lang/id.orth new file mode 100644 index 000000000..313c14643 --- /dev/null +++ b/fontconfig/fc-lang/id.orth @@ -0,0 +1,31 @@ +# +# fontconfig/fc-lang/id.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Indonesian (ID) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c9 +00e9 diff --git a/fontconfig/fc-lang/ie.orth b/fontconfig/fc-lang/ie.orth new file mode 100644 index 000000000..7c9440558 --- /dev/null +++ b/fontconfig/fc-lang/ie.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ie.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Interlingue (IE) +# +# Orthography taken from http://www.kolumbus.fi/allkiv/itgr/itgrix.htm +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/ig.orth b/fontconfig/fc-lang/ig.orth new file mode 100644 index 000000000..5486fea17 --- /dev/null +++ b/fontconfig/fc-lang/ig.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/ig.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Igbo (ig) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +1eca +1ecb +1ecc +1ecd +1ee4 +1ee5 diff --git a/fontconfig/fc-lang/ii.orth b/fontconfig/fc-lang/ii.orth new file mode 100644 index 000000000..52fe69966 --- /dev/null +++ b/fontconfig/fc-lang/ii.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/ii.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sichuan Yi/Nuosu (ii) +# +# Sources: +# * http://www.babelstone.co.uk/Yi/unicode.html +# * http://www.babelstone.co.uk/Yi/script.html +# * http://en.wikipedia.org/wiki/Yi_script +# +# As of Unicode 5.1, every encoded syllable (U+A000..A48C) is used. The +# radicals (U+A490..A4C6) are for linguistic use only. +# +A000-A48C diff --git a/fontconfig/fc-lang/ik.orth b/fontconfig/fc-lang/ik.orth new file mode 100644 index 000000000..138018849 --- /dev/null +++ b/fontconfig/fc-lang/ik.orth @@ -0,0 +1,100 @@ +# +# fontconfig/fc-lang/ik.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Inupiaq (Inupiak, Eskimo) (IK) +# +# I'm making a guess that this is language is set using Cyrillic +# +0401 +040e +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +045e diff --git a/fontconfig/fc-lang/io.orth b/fontconfig/fc-lang/io.orth new file mode 100644 index 000000000..eaaac3953 --- /dev/null +++ b/fontconfig/fc-lang/io.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/io.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ido (IO) +# +# Orthography taken from http://www.homunculus.com/babel/aido.html +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/is.orth b/fontconfig/fc-lang/is.orth new file mode 100644 index 000000000..c33e7d271 --- /dev/null +++ b/fontconfig/fc-lang/is.orth @@ -0,0 +1,64 @@ +# +# fontconfig/fc-lang/is.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Icelandic (IS) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +#00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS evertype.com +#00C5 # LATIN CAPITAL LETTER A WITH RING ABOVE evertype.com +00c6 +00c9 +#00CB # LATIN CAPITAL LETTER E WITH DIAERESIS evertype.com +00cd +00d0 +00d3 +#00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS eki.ee +#00D8 # LATIN CAPITAL LETTER O WITH STROKE evertype.com +00da +#00DC # LATIN CAPITAL LETTER U WITH DIAERESIS evertype.com +00dd +00de +00e1 +#00E4 # LATIN SMALL LETTER A WITH DIAERESIS evertype.com +#00E5 # LATIN SMALL LETTER A WITH RING ABOVE evertype.com +00e6 +00e9 +00ed +00f0 +00f3 +#00F6 # LATIN SMALL LETTER O WITH DIAERESIS eki.ee +#00F8 # LATIN SMALL LETTER O WITH STROKE evertype.com +00fa +#00FC # LATIN SMALL LETTER U WITH DIAERESIS evertype.com +00fd +00fe +#2018 # single quote +#201a # single quote +#201c # double quote +#201e # double quote diff --git a/fontconfig/fc-lang/iso-3166.txt b/fontconfig/fc-lang/iso-3166.txt new file mode 100644 index 000000000..715656dfb --- /dev/null +++ b/fontconfig/fc-lang/iso-3166.txt @@ -0,0 +1,242 @@ +This list states the country names (official short names in English) in alphabetical order as given in ISO 3166-1 and the corresponding ISO 3166-1-alpha-2 code elements. The list is updated whenever a change to the official code list in ISO 3166-1 is effected by the ISO 3166/MA. It lists 240 official short names and code elements. One line of text contains one entry. A country name and its code element are separated by a semicolon (;).
+
+AFGHANISTAN;AF
+LAND ISLANDS;AX
+ALBANIA;AL
+ALGERIA;DZ
+AMERICAN SAMOA;AS
+ANDORRA;AD
+ANGOLA;AO
+ANGUILLA;AI
+ANTARCTICA;AQ
+ANTIGUA AND BARBUDA;AG
+ARGENTINA;AR
+ARMENIA;AM
+ARUBA;AW
+AUSTRALIA;AU
+AUSTRIA;AT
+AZERBAIJAN;AZ
+BAHAMAS;BS
+BAHRAIN;BH
+BANGLADESH;BD
+BARBADOS;BB
+BELARUS;BY
+BELGIUM;BE
+BELIZE;BZ
+BENIN;BJ
+BERMUDA;BM
+BHUTAN;BT
+BOLIVIA;BO
+BOSNIA AND HERZEGOVINA;BA
+BOTSWANA;BW
+BOUVET ISLAND;BV
+BRAZIL;BR
+BRITISH INDIAN OCEAN TERRITORY;IO
+BRUNEI DARUSSALAM;BN
+BULGARIA;BG
+BURKINA FASO;BF
+BURUNDI;BI
+CAMBODIA;KH
+CAMEROON;CM
+CANADA;CA
+CAPE VERDE;CV
+CAYMAN ISLANDS;KY
+CENTRAL AFRICAN REPUBLIC;CF
+CHAD;TD
+CHILE;CL
+CHINA;CN
+CHRISTMAS ISLAND;CX
+COCOS (KEELING) ISLANDS;CC
+COLOMBIA;CO
+COMOROS;KM
+CONGO;CG
+CONGO, THE DEMOCRATIC REPUBLIC OF THE;CD
+COOK ISLANDS;CK
+COSTA RICA;CR
+COTE D'IVOIRE;CI
+CROATIA;HR
+CUBA;CU
+CYPRUS;CY
+CZECH REPUBLIC;CZ
+DENMARK;DK
+DJIBOUTI;DJ
+DOMINICA;DM
+DOMINICAN REPUBLIC;DO
+ECUADOR;EC
+EGYPT;EG
+EL SALVADOR;SV
+EQUATORIAL GUINEA;GQ
+ERITREA;ER
+ESTONIA;EE
+ETHIOPIA;ET
+FALKLAND ISLANDS (MALVINAS);FK
+FAROE ISLANDS;FO
+FIJI;FJ
+FINLAND;FI
+FRANCE;FR
+FRENCH GUIANA;GF
+FRENCH POLYNESIA;PF
+FRENCH SOUTHERN TERRITORIES;TF
+GABON;GA
+GAMBIA;GM
+GEORGIA;GE
+GERMANY;DE
+GHANA;GH
+GIBRALTAR;GI
+GREECE;GR
+GREENLAND;GL
+GRENADA;GD
+GUADELOUPE;GP
+GUAM;GU
+GUATEMALA;GT
+GUINEA;GN
+GUINEA-BISSAU;GW
+GUYANA;GY
+HAITI;HT
+HEARD ISLAND AND MCDONALD ISLANDS;HM
+HOLY SEE (VATICAN CITY STATE);VA
+HONDURAS;HN
+HONG KONG;HK
+HUNGARY;HU
+ICELAND;IS
+INDIA;IN
+INDONESIA;ID
+IRAN, ISLAMIC REPUBLIC OF;IR
+IRAQ;IQ
+IRELAND;IE
+ISRAEL;IL
+ITALY;IT
+JAMAICA;JM
+JAPAN;JP
+JORDAN;JO
+KAZAKHSTAN;KZ
+KENYA;KE
+KIRIBATI;KI
+KOREA, DEMOCRATIC PEOPLE'S REPUBLIC OF;KP
+KOREA, REPUBLIC OF;KR
+KUWAIT;KW
+KYRGYZSTAN;KG
+LAO PEOPLE'S DEMOCRATIC REPUBLIC;LA
+LATVIA;LV
+LEBANON;LB
+LESOTHO;LS
+LIBERIA;LR
+LIBYAN ARAB JAMAHIRIYA;LY
+LIECHTENSTEIN;LI
+LITHUANIA;LT
+LUXEMBOURG;LU
+MACAO;MO
+MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF;MK
+MADAGASCAR;MG
+MALAWI;MW
+MALAYSIA;MY
+MALDIVES;MV
+MALI;ML
+MALTA;MT
+MARSHALL ISLANDS;MH
+MARTINIQUE;MQ
+MAURITANIA;MR
+MAURITIUS;MU
+MAYOTTE;YT
+MEXICO;MX
+MICRONESIA, FEDERATED STATES OF;FM
+MOLDOVA, REPUBLIC OF;MD
+MONACO;MC
+MONGOLIA;MN
+MONTSERRAT;MS
+MOROCCO;MA
+MOZAMBIQUE;MZ
+MYANMAR;MM
+NAMIBIA;NA
+NAURU;NR
+NEPAL;NP
+NETHERLANDS;NL
+NETHERLANDS ANTILLES;AN
+NEW CALEDONIA;NC
+NEW ZEALAND;NZ
+NICARAGUA;NI
+NIGER;NE
+NIGERIA;NG
+NIUE;NU
+NORFOLK ISLAND;NF
+NORTHERN MARIANA ISLANDS;MP
+NORWAY;NO
+OMAN;OM
+PAKISTAN;PK
+PALAU;PW
+PALESTINIAN TERRITORY, OCCUPIED;PS
+PANAMA;PA
+PAPUA NEW GUINEA;PG
+PARAGUAY;PY
+PERU;PE
+PHILIPPINES;PH
+PITCAIRN;PN
+POLAND;PL
+PORTUGAL;PT
+PUERTO RICO;PR
+QATAR;QA
+REUNION;RE
+ROMANIA;RO
+RUSSIAN FEDERATION;RU
+RWANDA;RW
+SAINT HELENA;SH
+SAINT KITTS AND NEVIS;KN
+SAINT LUCIA;LC
+SAINT PIERRE AND MIQUELON;PM
+SAINT VINCENT AND THE GRENADINES;VC
+SAMOA;WS
+SAN MARINO;SM
+SAO TOME AND PRINCIPE;ST
+SAUDI ARABIA;SA
+SENEGAL;SN
+SERBIA AND MONTENEGRO;CS
+SEYCHELLES;SC
+SIERRA LEONE;SL
+SINGAPORE;SG
+SLOVAKIA;SK
+SLOVENIA;SI
+SOLOMON ISLANDS;SB
+SOMALIA;SO
+SOUTH AFRICA;ZA
+SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS;GS
+SPAIN;ES
+SRI LANKA;LK
+SUDAN;SD
+SURINAME;SR
+SVALBARD AND JAN MAYEN;SJ
+SWAZILAND;SZ
+SWEDEN;SE
+SWITZERLAND;CH
+SYRIAN ARAB REPUBLIC;SY
+TAIWAN, PROVINCE OF CHINA;TW
+TAJIKISTAN;TJ
+TANZANIA, UNITED REPUBLIC OF;TZ
+THAILAND;TH
+TIMOR-LESTE;TL
+TOGO;TG
+TOKELAU;TK
+TONGA;TO
+TRINIDAD AND TOBAGO;TT
+TUNISIA;TN
+TURKEY;TR
+TURKMENISTAN;TM
+TURKS AND CAICOS ISLANDS;TC
+TUVALU;TV
+UGANDA;UG
+UKRAINE;UA
+UNITED ARAB EMIRATES;AE
+UNITED KINGDOM;GB
+UNITED STATES;US
+UNITED STATES MINOR OUTLYING ISLANDS;UM
+URUGUAY;UY
+UZBEKISTAN;UZ
+VANUATU;VU
+VENEZUELA;VE
+VIET NAM;VN
+VIRGIN ISLANDS, BRITISH;VG
+VIRGIN ISLANDS, U.S.;VI
+WALLIS AND FUTUNA;WF
+WESTERN SAHARA;EH
+YEMEN;YE
+ZAMBIA;ZM
+ZIMBABWE;ZW
diff --git a/fontconfig/fc-lang/iso639-1 b/fontconfig/fc-lang/iso639-1 new file mode 100644 index 000000000..02e340b09 --- /dev/null +++ b/fontconfig/fc-lang/iso639-1 @@ -0,0 +1,139 @@ +AA * Afar Djibouti, N Ethiopia Hamito-Semitic F., Cushitic Br. +AB * Abkhazian Abkhazia (Georgia) Caucasian F. +AF * Afrikaans South Africa, Namibia Indo-European F., Germanic Br. 10 +AM * Amharic Ethiopia Hamito-Semitic F., Semitic Br. 20 +AR * Arabic Middle East, N Africa Hamito-Semitic F., Semitic Br. 218 +AS * Assamese Assam (India) Indo-European F., Indo-Iranian Br. 23 +AY * Aymara Bolivia, Peru Andean-Equatorial F., Andean Br. 2 +AZ * Azerbaijani Iran, Azerbaijan Uralo-Altaic F., Turkic Br. 15 +BA * Bashkir Bashkir (S Urals, Russia) Uralo-Altaic F., Turkic Br. 1 +BE * Byelorussian Byelorussia Indo-European F., Balto-Slavic Br. 10 +BG * Bulgarian Bulgaria, Yugoslavia, Greece Indo-European F., Balto-Slavic Br. 9 +BH * Bihari Bihar (India) Indo-European F., Indo-Iranian Br. +BI * Bislama Vanuatu, New Caledonia English based creole, Pacific +BN * Bengali, Bangla Bangladesh, West Bengal (India) Indo-European F., Indo-Iranian Br. 196 +BO * Tibetan Tibet, Bhutan, Nepal, India Sino-Tibetan F., Tibeto-Burmese Br. 5 BO from Bodskad +BR * Breton Britanny (W France) Indo-European F., Celtic Br. +CA * Catalan Catalania (NE Spain), Balearic Islands, Sardinia, S France, Andorra, Argentina Indo-European F., Italic Br. 9 +CO * Corsican Corsica (France) Indo-European F., Italic Br. +CS * Czech Czech Republic Indo-European F., Balto-Slavic Br. 11 +CY * Welsh Wales (United Kingdom) Indo-European F., Celtic Br. +DA * Danish Denmark, Germany Indo-European F., Germanic Br. 5 +DE * German Germany, Austria, Switzerland, U.S.A. Indo-European F., Germanic Br. 121 DE from Deutsch +DZ * Bhutani, Bhutanese Bhutan Sino-Tibetan F., Tibeto-Burmese Br. +EL * Greek Greece, Cyprus, Turkey Indo-European F., Hellenic Br. 12 +EN * English North America, British Isles, Australia, New Zealand, South Africa Indo-European F., Germanic Br. 470 +EO * Esperanto 2 Artificial language +ES * Spanish Spain, Latin America, U.S.A. Indo-European F., Italic Br. 381 +ET * Estonian Estonia Uralo-Altaic F., Finno-Ugric Br. 1 +EU * Basque W Pyrenees (France, Spain) (Isolate) EU from Euskera +FA * Persian Iran, Afghanistan Indo-European F., Indo-Iranian Br. 35 FA from Farsi +FI * Finnish, Suomi Finland, Russia, Sweden Uralo-Altaic F., Finno-Ugric Br. 6 +FJ * Fiji, Fijian Fiji Austric F., Malayo-Polynesian Br. +FO * Faroese, Faeroese Faeroe Islands (Denmark) Indo-European F., Germanic Br. +FR * French France, Belgium, Canada, U.S.A., Switzerland Indo-European F., Italic Br. 124 +FY * Frisian Frisian Islands (Netherlands-Germany) Indo-European F., Germanic Br. +GA * Irish Ireland Indo-European F., Celtic Br. GA from Gaeilge +GD * Scots Gaelic Scotland Indo-European F., Celtic Br. +GL * Galician Spanish Galicia Indo-European F., Italic Br. 4 +GN * Guaran? Paraguay, Bolivia, S Brazil Andean-Equatorial F., Equatorial Br. 4 +GU * Gujarati, Gujerati Gujarat (India), Bombay, Pakistan, South Africa Indo-European F., Indo-Iranian Br. 40 +HA * Hausa N Nigeria, Niger, Cameroun Hamito-Semitic F., Chadic Br. 37 +HE * Hebrew Israel Hamito-Semitic F., Semitic Br. 5 Formerly IW from Iwrith. See Note 4. +HI * Hindi India, Pakistan, Trinidad, Guyana, Fiji, Mauritius Indo-European F., Indo-Iranian Br. 418 Same as Urdu [UR] except for writing system. See Note 3. +HR * Croatian, Croat Croatia Indo-European F., Balto-Slavic Br. HR from Hrvatski. See Note 2. +HU * Hungarian, Magyar Hungary, Romania, Yugoslavia, Czechoslovakia Uralo-Altaic F., Finno-Ugric Br. 14 +HY * Armenian Armenia, Middle East Indo-European F., Armenian Br. 5 HY from Hayeren +IA * Interlingua Artificial language +ID * Indonesian, Bahasa Indonesia Indonesia, Malaysia, Thailand, Singapore, Brunei Austric F., Malayo-Polynesian Br. Formerly IN. See Note 4. +IE * Interlingue Artificial language. Prototype of Interlingua [IA] +IK * Inupiak Greenland, N Canada, Alaska (U.S.A.) Eskimo-Aleut F. +IS * Icelandic Iceland Indo-European F., Germanic Br. IS from Islenzk +IT * Italian Italy, U.S.A., France, Argentina, Switzerland, Canada, Brazil Indo-European F., Italic Br. 62 +IU * Inuktitut NE Canada Eskimo-Aleut F. See Note 5. +JA * Japanese, Nihongo Japan, Brazil, California (U.S.A.), Hawaii (U.S.A.) Japanese-Korean F. 126 +JW Javanese Java, Malaysia, Surinam Austric F., Malayo-Polynesian Br. 64 JW from Bahasa Jawa +KA * Georgian Georgia Caucasian F. 3 KA from Kartuli +KK * Kazakh Kazakhstan, Sinkiang (China), Afghanistan Uralo-Altaic F., Turkic Br. 8 +KL * Greenlandic Greenland Eskimo-Aleut F. KL from Kalaallisut +KM * Cambodian Cambodia, Thailand, Viet Nam Austric F., Austrio-Asiatic Br. 9 KM from Khmer +KN * Kannada Karnatuka (India) Dravidian F. 44 +KO * Korean, Choson-o South Korea, North Korea, NE China, Japan, Siberia, Hawaii (U.S.A.) Japanese-Korean F. 75 +KS * Kashmiri Kashmir (India-Pakistan) Indo-European F., Indo-Iranian Br. 4 +KU * Kurdish, Zimany Kurdy Turkey, Iran, Iraq, Syria Indo-European F., Indo-Iranian Br. 11 +KY * Kirghiz Kirghiz, Sinkiang (China), Afghanistan Uralo-Altaic F., Turkic Br. 2 KY from Kyrgyz +LA * Latin Indo-European F., Italic Br. Ancient language nearing extinction +LN * Lingala, liNgala Zaire, Congo Niger-Kordofanian F., Non-Mande Br. 7 +LO * Laothian, Pha Xa Lao, Lao Laos, Thailand Sino-Tibetan F., Sino-Siamese Br. 4 +LT * Lithuanian Lithuania Indo-European F., Balto-Slavic Br. 3 +LV * Latvian, Lettish Latvia Indo-European F., Balto-Slavic Br. 2 +MG * Malagasy Madagascar Austric F., Malayo-Polynesian Br. 12 +MI * Maori New Zealand Austric F., Malayo-Polynesian Br. +MK * Macedonian Macedonia, Bulgaria, Greece Indo-European F., Balto-Slavic Br. 2 +ML * Malayalam Kerala (SW India) Dravidian F. 35 +MN * Mongolian Mongolia Uralo-Altaic F., Mongolic Br. +MO * Moldavian +MR * Marathi, Mahrati Maharashtra (W India) Indo-European F., Indo-Iranian Br. 69 +MS Malay Malaysia, Indonesia Austric F., Malayo-Polynesian Br. 155 MS from Bahasa Malaysia +MT * Maltese Malta Hamito-Semitic F., Semitic Br. +MY * Burmese Burma, Bangladesh Sino-Tibetan F., Tibeto-Burmese Br. 30 MY from Myanmasa +NA Nauru, Nauruan Nauru Austric F., Malayo-Polynesian Br. +NE * Nepali, Nepalese Nepal, Uttar Pradesh (India) Indo-European F., Indo-Iranian Br. 16 +NL * Dutch Netherlands, Belgium Indo-European F., Germanic Br. 21 NL from Nederlands +NO * Norwegian Norway Indo-European F., Germanic Br. 5 +OC * Occitan S France Indo-European F., Italic Br. 4 +OM * (Afan) Oromo, Galla Ethiopia, Kenya Hamito-Semitic F., Cushitic Br. 10 +OR * Oriya Orissa (E India) Indo-European F., Indo-Iranian Br. 31 +PA Punjabi Punjab (India), Pakistan Indo-European F., Indo-Iranian Br. 93 PA from Panjabi +PL * Polish Poland, U.S.A. Indo-European F., Balto-Slavic Br. 44 +PS Pashto, Pushto, Pushtu Afghanistan, Pakistan Indo-European F., Indo-Iranian Br. 21 +PT * Portuguese Brazil, Portugal, Spain, Uruguay, Argentina, Azores, Goa, Madeira Indo-European F., Italic Br. 182 +QU Quechua Peru, Ecuador, Bolivia Andean-Equatorial F., Andean Br. 8 +RM * Rhaeto-Romance, Rhaeto-Romanic, Romansch S Switzerland, N Italy, Tyrol (Austria) Indo-European F., Italic Br. +RN Kirundi, kiRundi Niger-Kordofanian F., Non-Mande Br. +RO * Romanian, Rumanian Rumania Indo-European F., Italic Br. 25 +RU * Russian Russia, former USSR republics Indo-European F., Balto-Slavic Br. 288 +RW Kinyarwanda, kinyaRuanda Rwanda, Burundi, Uganda, Zaire, Tanzania Niger-Kordofanian F., Non-Mande Br. RW from Rwanda +SA * Sanskrit India Indo-European F., Indo-Iranian Br. Ancient language +SD Sindhi Pakistan, Sind (India) Indo-European F., Indo-Iranian Br. 18 +SG Sangho, Sango-Ngbandi Central African Republic, Zaire Niger-Kordofanian F., Non-Mande Br. 4 +SH * Serbo-Croatian Croatia Indo-European F., Balto-Slavic Br. 20 See Note 2. +SI * Singhalese, Sinhalese Sri Lanka Indo-European F., Indo-Iranian Br. 13 +SK * Slovak Slovakia Indo-European F., Balto-Slavic Br. 5 +SL * Slovenian, Slovene Slovenia, Italy, Austria Indo-European F., Balto-Slavic Br. 2 +SM * Samoan Samoa Austric F., Malayo-Polynesian Br. +SN Shona, chiShona Rhodesia, Mozambique Niger-Kordofanian F., Non-Mande Br. 8 +SO * Somali Somalia, Ethiopia, Kenya Hamito-Semitic F., Cushitic Br. 5 +SQ * Albanian Albania, Kosovo (Yugoslavia), Italy, Greece Indo-European F., Albanian Br. 5 SQ from Shqip +SR * Serbian Serbia Indo-European F., Balto-Slavic Br. SR from Srpski. See Note 2. +SS * Siswati, siSwati South Africa, Rhodesia, Swaziland Niger-Kordofanian F., Non-Mande Br. +ST * Sesotho, siSuthu South Africa, Lesotho, Botswana Niger-Kordofanian F., Non-Mande Br. +SU Sundanese West Java Austric F., Malayo-Polynesian Br. 26 +SV * Swedish Sweden, Finland Indo-European F., Germanic Br. 9 SV from Svenska +SW * Swahili, kiSwahili Tanzania, Comoro Islands, Kenya, Mozambique, Zaire Niger-Kordofanian F., Non-Mande Br. 48 +TA * Tamil Tamil Nadu (S India), Sri Lanka, Malaysia, Singapore Dravidian F. 71 +TE * Telugu, Telegu Andhra Pradesh (India) Dravidian F. 73 +TG * Tajik, Tajiki Tadzhikstan Indo-European F., Indo-Iranian Br. 5 +TH * Thai Thailand 50 +TI * Tigrinya N Ethiopia Hamito-Semitic F., Semitic Br. 4 +TK * Turkmen, Turkoman, Turcoman Turkmenistan, Iran, Afghanistan Uralo-Altaic F., Turkic Br. 3 +TL * Tagalog Philippines Austric F., Malayo-Polynesian Br. 54 +TN * Setswana South Africa +TO * Tonga Niger-Kordofanian F., Non-Mande Br. 7 +TR * Turkish Turkey, Bulgaria, Yugoslavia, Cyprus, Greece Uralo-Altaic F., Turkic Br. 59 +TS * Tsonga 3 +TT * Tatar, Tartar Tatarstan Uralo-Altaic F., Turkic Br. 8 +TW * Twi, Tshi W Africa Niger-Kordofanian F., Non-Mande Br. +UG * Uigur, Uighur, Uyghur Sinkiang (China), Kazakhstan, Uzbekistan, Afghanistan Uralo-Altaic F., Turkic Br. 8 See Note 5. +UK * Ukrainian Ukraine, Canada, U.S.A. Indo-European F., Balto-Slavic Br. 47 +UR * Urdu Pakistan, India Indo-European F., Indo-Iranian Br. 102 Same as Hindi [HI] except for writing system. See Note 3. +UZ * Uzbek, Uzbeg, Usbek, Usbeg Uzbekstan, Tadzhikstan, Afghanistan Uralo-Altaic F., Turkic Br. 14 +VI * Vietnamese Viet Nam, Thailand, Cambodia, Laos, New Caledonia, France, Dakar Sino-Tibetan F., Sino-Siamese Br. 65 +VO * Volap?k Artificial language +WO * Wolof Senegal, Gambia Niger-Kordofanian F., Non-Mande Br. 7 +XH * Xhosa, Xosa, isiXhosa South Africa, Rhodesia, Swaziland Niger-Kordofanian F., Non-Mande Br. 8 +YI * Yiddish U.S.A., Israel, former USSR, Latin America, Canada, E Europe Indo-European F., Germanic Br. Formerly JI from Jiddisch. See Note 4. +YO * Yoruba Western, Lagos and Kwara States (Nigeria), Benin Niger-Kordofanian F., Non-Mande Br. 20 +ZA Zhuang, Chwang, Chuang China 15 See Note 5. +ZH * Chinese China Sino-Tibetan F., Sino-Siamese Br. 1,200 ZH from Zhongwen. See Note 1. +ZU * Zulu, isiZulu South Africa, Rhodesia, Swaziland Niger-Kordofanian F., Non-Mande Br. 9 diff --git a/fontconfig/fc-lang/iso639-2 b/fontconfig/fc-lang/iso639-2 new file mode 100644 index 000000000..6b8132c0e --- /dev/null +++ b/fontconfig/fc-lang/iso639-2 @@ -0,0 +1,473 @@ +ISO 639-1 is the alpha-2 code. Multiple codes for the same language are to +be considered synonyms. Entries marked with '*' have Unicode orthographies +built. + + 639-2 639-1 Language Name (English) Language Name (French) + +* aar aa Afar afar +* abk ab Abkhazian abkhaze + ace Achinese aceh + ach Acoli acoli + ada Adangme adangme + afa Afro-Asiatic (Other) afro-asiatiques, autres langues + afh Afrihili afrihili +* afr af Afrikaans afrikaans + aka Akan akan + akk Akkadian akkadien +* alb/sqi* sq Albanian albanais + ale Aleut aléoute + alg Algonquian languages algonquines, langues +* amh am Amharic amharique + ang English, Old (ca.450-1100) anglo-saxon (ca.450-1100) + apa Apache languages apache +* ara ar Arabic arabe + arc Aramaic araméen +* arm/hye* hy Armenian arménien + arn Araucanian araucan + arp Arapaho arapaho + art Artificial (Other) artificielles, autres langues + arw Arawak arawak + asm as Assamese assamais +* ast Asturian; Bable asturien; bable + ath Athapascan languages athapascanes, langues + aus Australian languages australiennes, langues +* ava Avaric avar + ave ae Avestan avestique + awa Awadhi awadhi +* aym ay Aymara aymara +* aze az Azerbaijani azéri + bad Banda banda + bai Bamileke languages bamilékés, langues +* bak ba Bashkir bachkir + bal Baluchi baloutchi +* bam Bambara bambara + ban Balinese balinais +* baq/eus* eu Basque basque + bas Basa basa + bat Baltic (Other) baltiques, autres langues + bej Beja bedja +* bel be Belarusian biélorusse + bem Bemba bemba +* ben bn Bengali bengali + ber Berber (Other) berbères, autres langues + bho Bhojpuri bhojpuri +* bih bh Bihari bihari + bik Bikol bikol +* bin Bini bini +* bis bi Bislama bichlamar + bla Siksika blackfoot + bnt Bantu (Other) bantoues, autres langues +* tib/bod* bo Tibetan tibétain +* bos bs Bosnian bosniaque + bra Braj braj +* bre br Breton breton + btk Batak (Indonesia) batak (Indonésie) +* bua Buriat bouriate + bug Buginese bugi +* bul bg Bulgarian bulgare +* bur/mya* my Burmese birman + cad Caddo caddo + cai Central American Indian (Other) indiennes d'Amérique centrale, autres langues + car Carib caribe +* cat ca Catalan catalan + cau Caucasian (Other) caucasiennes, autres langues + ceb Cebuano cebuano + cel Celtic (Other) celtiques, autres langues +* cze/ces* cs Czech tchèque +* cha ch Chamorro chamorro + chb Chibcha chibcha +* che ce Chechen tchétchène + chg Chagatai djaghataï +* chi/zho* zh Chinese chinois + chk Chuukese chuuk +* chm Mari mari + chn Chinook jargon chinook, jargon + cho Choctaw choctaw + chp Chipewyan chipewyan +* chr Cherokee cherokee +* chu cu Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic slavon d'église; vieux slave; slavon liturgique; vieux bulgare +* chv cv Chuvash tchouvache + chy Cheyenne cheyenne + cmc Chamic languages chames, langues + cop Coptic copte +* cor kw Cornish cornique +* cos co Corsican corse + cpe Creoles and pidgins, English based (Other) créoles et pidgins anglais, autres + cpf Creoles and pidgins, French-based (Other) créoles et pidgins français, autres + cpp Creoles and pidgins, Portuguese-based (Other) créoles et pidgins portugais, autres + cre Cree cree + crp Creoles and pidgins (Other) créoles et pidgins divers + cus Cushitic (Other) couchitiques, autres langues +* wel/cym* cy Welsh gallois +* cze/ces* cs Czech tchèque + dak Dakota dakota +* dan da Danish danois + day Dayak dayak + del Delaware delaware + den Slave (Athapascan) esclave (athapascan) +* ger/deu* de German allemand + dgr Dogrib dogrib + din Dinka dinka + div Divehi maldivien + doi Dogri dogri + dra Dravidian (Other) dravidiennes, autres langues + dua Duala douala + dum Dutch, Middle (ca.1050-1350) néerlandais moyen (ca. 1050-1350) +* dut/nld* nl Dutch néerlandais + dyu Dyula dioula +* dzo dz Dzongkha dzongkha + efi Efik efik + egy Egyptian (Ancient) égyptien + eka Ekajuk ekajuk +* gre/ell* el Greek, Modern (1453-) grec moderne (après 1453) + elx Elamite élamite +* eng en English anglais + enm English, Middle (1100-1500) anglais moyen (1100-1500) +* epo eo Esperanto espéranto +* est et Estonian estonien +* baq/eus* eu Basque basque + ewe Ewe éwé + ewo Ewondo éwondo + fan Fang fang +* fao fo Faroese féroïen +* per/fas* fa Persian persan + fat Fanti fanti +* fij fj Fijian fidjien +* fin fi Finnish finnois + fiu Finno-Ugrian (Other) finno-ougriennes, autres langues + fon Fon fon +* fre/fra* fr French français + frm French, Middle (ca.1400-1800) français moyen (1400-1800) + fro French, Old (842-ca.1400) français ancien (842-ca.1400) +* fry fy Frisian frison +* ful Fulah peul +* fur Friulian frioulan + gaa Ga ga + gay Gayo gayo + gba Gbaya gbaya + gem Germanic (Other) germaniques, autres langues +* geo/kat* ka Georgian géorgien +* ger/deu* de German allemand +* gez Geez guèze + gil Gilbertese kiribati +* gla gd Gaelic; Scottish Gaelic gaélique; gaélique écossais +* gle ga Irish irlandais +* glg gl Gallegan galicien +* glv gv Manx manx; mannois + gmh German, Middle High (ca.1050-1500) allemand, moyen haut (ca. 1050-1500) + goh German, Old High (ca.750-1050) allemand, vieux haut (ca. 750-1050) + gon Gondi gond + gor Gorontalo gorontalo + got Gothic gothique + grb Grebo grebo + grc Greek, Ancient (to 1453) grec ancien (jusqu'à 1453) +* gre/ell* el Greek, Modern (1453-) grec moderne (après 1453) +* grn gn Guarani guarani +* guj gu Gujarati goudjrati + gwi Gwich´in gwich´in + hai Haida haida +* hau ha Hausa haoussa +* haw Hawaiian hawaïen +* heb he Hebrew hébreu + her hz Herero herero + hil Hiligaynon hiligaynon + him Himachali himachali +* hin hi Hindi hindi + hit Hittite hittite + hmn Hmong hmong +* hmo ho Hiri Motu hiri motu +* scr/hrv* hr Croatian croate +* hun hu Hungarian hongrois + hup Hupa hupa +* arm/hye* hy Armenian arménien + iba Iban iban +* ibo Igbo igbo +* ice/isl* is Icelandic islandais +* ido io Ido ido + ijo Ijo ijo +* iku iu Inuktitut inuktitut +* ile ie Interlingue interlingue + ilo Iloko ilocano +* ina ia Interlingua (International Auxiliary Language Association) interlingua (langue auxiliaire internationale) + inc Indic (Other) indo-aryennes, autres langues +* ind id Indonesian indonésien + ine Indo-European (Other) indo-européennes, autres langues +* ipk ik Inupiaq inupiaq + ira Iranian (Other) iraniennes, autres langues + iro Iroquoian languages iroquoises, langues (famille) +* ice/isl* is Icelandic islandais +* ita it Italian italien + jav jv Javanese javanais +* jpn ja Japanese japonais + jpr Judeo-Persian judéo-persan + jrb Judeo-Arabic judéo-arabe +* kaa Kara-Kalpak karakalpak + kab Kabyle kabyle + kac Kachin kachin +* kal kl Kalaallisut groenlandais + kam Kamba kamba +* kan kn Kannada kannada + kar Karen karen +* kas ks Kashmiri kashmiri +* geo/kat* ka Georgian géorgien + kau Kanuri kanouri + kaw Kawi kawi +* kaz kk Kazakh kazakh + kha Khasi khasi + khi Khoisan (Other) khoisan, autres langues +* khm km Khmer khmer + kho Khotanese khotanais +* kik ki Kikuyu; Gikuyu kikuyu + kin rw Kinyarwanda rwanda +* kir ky Kirghiz kirghize + kmb Kimbundu kimbundu +* kok Konkani konkani +* kom kv Komi kom + kon Kongo kongo +* kor ko Korean coréen + kos Kosraean kosrae + kpe Kpelle kpellé + kro Kru krou + kru Kurukh kurukh + kua kj Kuanyama; Kwanyama kuanyama; kwanyama +* kum Kumyk koumyk +* kur ku Kurdish kurde + kut Kutenai kutenai + lad Ladino judéo-espagnol + lah Lahnda lahnda + lam Lamba lamba +* lao lo Lao lao +* lat la Latin latin +* lav lv Latvian letton +* lez Lezghian lezghien +* lin ln Lingala lingala +* lit lt Lithuanian lituanien + lol Mongo mongo + loz Lozi lozi +* ltz lb Luxembourgish; Letzeburgesch luxembourgeois + lua Luba-Lulua luba-lulua + lub Luba-Katanga luba-katanga + lug Ganda ganda + lui Luiseno luiseno + lun Lunda lunda + luo Luo (Kenya and Tanzania) luo (Kenya et Tanzanie) + lus lushai Lushai +* mac/mkd* mk Macedonian macédonien + mad Madurese madourais + mag Magahi magahi +* mah mh Marshallese marshall + mai Maithili maithili + mak Makasar makassar +* mal ml Malayalam malayalam + man Mandingo mandingue +* mao/mri* mi Maori maori + map Austronesian (Other) malayo-polynésiennes, autres langues +* mar mr Marathi marathe + mas Masai massaï + may/msa* ms Malay malais + mdr Mandar mandar + men Mende mendé + mga Irish, Middle (900-1200) irlandais moyen (900-1200) + mic Micmac micmac + min Minangkabau minangkabau + mis Miscellaneous languages diverses, langues +* mac/mkd* mk Macedonian macédonien + mkh Mon-Khmer (Other) môn-khmer, autres langues +* mlg mg Malagasy malgache +* mlt mt Maltese maltais + mnc Manchu mandchou + mni Manipuri manipuri + mno Manobo languages manobo, langues + moh Mohawk mohawk +* mol mo Moldavian moldave +* mon mn Mongolian mongol + mos Mossi moré +* mao/mri* mi Maori maori + may/msa* ms Malay malais + mul Multiple languages multilingue + mun Munda languages mounda, langues + mus Creek muskogee + mwr Marwari marvari +* bur/mya* my Burmese birman + myn Mayan languages maya, langues + nah Nahuatl nahuatl + nai North American Indian indiennes d'Amérique du Nord, autres langues + nau na Nauru nauruan + nav nv Navajo; Navaho navaho +* nbl nr Ndebele, South; South Ndebele ndébélé du Sud + nde nd Ndebele, North; North Ndebele ndébélé du Nord + ndo ng Ndonga ndonga + nds Low German; Low Saxon; German, Low; Saxon, Low bas allemand; bas saxon; allemand, bas; saxon, bas +* nep ne Nepali népalais + new Newari newari + nia Nias nias + nic Niger-Kordofanian (Other) nigéro-congolaises, autres langues + niu Niuean niué +* dut/nld* nl Dutch néerlandais + non Norse, Old norrois, vieux +* nor no Norwegian norvégien +* nno nn Norwegian Nynorsk; Nynorsk, Norwegian norvégien nynorsk; nynorsk, norvégien +* nob nb Norwegian Bokmål; Bokmål, Norwegian norvégien bokmål; bokmål, norvégien +* nso Sotho, Northern sotho du Nord + nub Nubian languages nubiennes, langues +* nya ny Chichewa; Chewa; Nyanja chichewa; chewa; nyanja + nym Nyamwezi nyamwezi + nyn Nyankole nyankolé + nyo Nyoro nyoro + nzi Nzima nzema +* oci oc Occitan (post 1500); Provençal occitan (après 1500); provençal + oji Ojibwa ojibwa +* ori or Oriya oriya +* orm om Oromo galla + osa Osage osage +* oss os Ossetian; Ossetic ossète + ota Turkish, Ottoman (1500-1928) turc ottoman (1500-1928) + oto Otomian languages otomangue, langues + paa Papuan (Other) papoues, autres langues + pag Pangasinan pangasinan + pal Pahlavi pahlavi + pam Pampanga pampangan + pan pa Panjabi pendjabi + pap Papiamento papiamento + pau Palauan palau + peo Persian, Old (ca.600-400 B.C.) perse, vieux (ca. 600-400 av. J.-C.) +* per/fas* fa Persian persan + phi Philippine (Other) philippines, autres langues + phn Phoenician phénicien + pli pi Pali pali +* pol pl Polish polonais + pon Pohnpeian pohnpei +* por pt Portuguese portugais + pra Prakrit languages prâkrit + pro Provençal, Old (to 1500) provençal ancien (jusqu'à 1500) + pus ps Pushto pachto + qaa-qtz Reserved for local use réservée à l'usage local + que qu Quechua quechua + raj Rajasthani rajasthani + rap Rapanui rapanui + rar Rarotongan rarotonga + roa Romance (Other) romanes, autres langues +* roh rm Raeto-Romance rhéto-roman + rom Romany tsigane +* rum/ron* ro Romanian roumain + run rn Rundi rundi +* rus ru Russian russe + sad Sandawe sandawe + sag sg Sango sango +* sah Yakut iakoute + sai South American Indian (Other) indiennes d'Amérique du Sud, autres langues + sal Salishan languages salish, langues + sam Samaritan Aramaic samaritain +* san sa Sanskrit sanskrit + sas Sasak sasak + sat Santali santal +* scc/srp* sr Serbian serbe +* sco Scots écossais +* scr/hrv* hr Croatian croate +* sel Selkup selkoupe + sem Semitic (Other) sémitiques, autres langues + sga Irish, Old (to 900) irlandais ancien (jusqu'à 900) + sgn Sign Languages langues des signes + shn Shan chan + sid Sidamo sidamo +* sin si Sinhalese singhalais + sio Siouan languages sioux, langues + sit Sino-Tibetan (Other) sino-tibétaines, autres langues + sla Slavic (Other) slaves, autres langues +* slo/slk* sk Slovak slovaque +* slv sl Slovenian slovène +* sma Southern Sami sami du Sud +* sme se Northern Sami sami du Nord + smi Sami languages (Other) sami, autres langues +* smj Lule Sami sami de Lule +* smn Inari Sami sami d'Inari +* smo sm Samoan samoan +* sms Skolt Sami sami skolt + sna sn Shona shona + snd sd Sindhi sindhi + snk Soninke soninké + sog Sogdian sogdien +* som so Somali somali + son Songhai songhai +* sot st Sotho, Southern sotho du Sud +* spa es Spanish; Castilian espagnol; castillan +* alb/sqi* sq Albanian albanais + srd sc Sardinian sarde +* scc/srp* sr Serbian serbe +* sh Serbo-Croatian serbo-croate + srr Serer sérère + ssa Nilo-Saharan (Other) nilo-sahariennes, autres langues +* ssw ss Swati swati + suk Sukuma sukuma + sun su Sundanese soundanais + sus Susu soussou + sux Sumerian sumérien +* swa sw Swahili swahili +* swe sv Swedish suédois +* syr Syriac syriaque + tah ty Tahitian tahitien + tai Tai (Other) thaïes, autres langues +* tam ta Tamil tamoul +* tat tt Tatar tatar +* tel te Telugu télougou + tem Timne temne + ter Tereno tereno + tet Tetum tetum +* tgk tg Tajik tadjik +* tgl tl Tagalog tagalog +* tha th Thai thaï +* tib/bod* bo Tibetan tibétain + tig Tigre tigré +* tir ti Tigrinya tigrigna + tiv Tiv tiv + tkl Tokelau tokelau + tli Tlingit tlingit + tmh Tamashek tamacheq + tog Tonga (Nyasa) tonga (Nyasa) +* ton to Tonga (Tonga Islands) tongan (Îles Tonga) + tpi Tok Pisin tok pisin + tsi Tsimshian tsimshian +* tsn tn Tswana tswana +* tso ts Tsonga tsonga +* tuk tk Turkmen turkmène + tum Tumbuka tumbuka + tup Tupi languages tupi, langues +* tur tr Turkish turc + tut Altaic (Other) altaïques, autres langues + tvl Tuvalu tuvalu +* twi tw Twi twi +* tyv Tuvinian touva + uga Ugaritic ougaritique +* uig ug Uighur ouïgour +* ukr uk Ukrainian ukrainien + umb Umbundu umbundu + und Undetermined indéterminée +* urd ur Urdu ourdou +* uzb uz Uzbek ouszbek + vai Vai vaï +* ven Venda venda +* vie vi Vietnamese vietnamien +* vol vo Volapük volapük +* vot Votic vote + wak Wakashan languages wakashennes, langues + wal Walamo walamo + war Waray waray + was Washo washo +* wel/cym* cy Welsh gallois +* wen Sorbian languages sorabes, langues +* wln wa Walloon wallon +* wol wo Wolof wolof +* xho xh Xhosa xhosa + yao Yao yao +* yap Yapese yapois +* yid yi Yiddish yiddish +* yor yo Yoruba yoruba + ypk Yupik languages yupik, langues + zap Zapotec zapotèque + zen Zenaga zenaga + zha za Zhuang; Chuang zhuang; chuang +* chi/zho* zh Chinese chinois + znd Zande zandé +* zul zu Zulu zoulou + zun Zuni zuni + diff --git a/fontconfig/fc-lang/it.orth b/fontconfig/fc-lang/it.orth new file mode 100644 index 000000000..ad1a22d6c --- /dev/null +++ b/fontconfig/fc-lang/it.orth @@ -0,0 +1,51 @@ +# +# fontconfig/fc-lang/it.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Italian (IT) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +#00c1 +00c8-00c9 +00cc +00cd +#00ce +00cf +00d2-00d3 +00d9 +00da +00e0 +#00e1 +00e8-00e9 +00ec +00ed +#00ee +00ef +00f2-00f3 +00f9 +00fa diff --git a/fontconfig/fc-lang/iu.orth b/fontconfig/fc-lang/iu.orth new file mode 100644 index 000000000..1c1300a0b --- /dev/null +++ b/fontconfig/fc-lang/iu.orth @@ -0,0 +1,77 @@ +# +# fontconfig/fc-lang/iu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Inuktitut (IU) +# +# Taken from alphabetic coverage of the Pigiarniq font as +# produced by the legislative assembly of Nunavut +# http://www.assembly.nu.ca/unicode/fonts/ +# +1401-1406 +140a-140b +142f-1434 +1438-1439 +1449 +144c-1451 +1455-1456 +1466 +146b-1470 +1472-1473 +1483 +1489-148e +1490-1491 +14a1 +14a3-14a8 +14aa-14ab +14bb +14c0-14c5 +14c7-14c8 +14d0 +14d3-14d8 +14da-14db +14ea +14ed-14f2 +14f4-14f5 +14fa +14fc +14fe +1500 +1502 +1505 +1526-152b +152d-152e +153e +1542 +1545-1549 +154b-154c +1550 +1553-155a +155d +1575-1577 +1579-157c +157e-1585 +158b-1596 +15a0-15a6 +15a8-15ae +166f +1670-1676 diff --git a/fontconfig/fc-lang/ja.orth b/fontconfig/fc-lang/ja.orth new file mode 100644 index 000000000..572ca91e4 --- /dev/null +++ b/fontconfig/fc-lang/ja.orth @@ -0,0 +1,6565 @@ +# +# fontconfig/fc-lang/ja.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage from JIS X 0208 (1990) +# +0x3000 # IDEOGRAPHIC SPACE +0x3001 # IDEOGRAPHIC COMMA +0x3002 # IDEOGRAPHIC FULL STOP +0x3005 # IDEOGRAPHIC ITERATION MARK +0x3006 # IDEOGRAPHIC CLOSING MARK +0x3007 # IDEOGRAPHIC NUMBER ZERO +0x3041 # HIRAGANA LETTER SMALL A +0x3042 # HIRAGANA LETTER A +0x3043 # HIRAGANA LETTER SMALL I +0x3044 # HIRAGANA LETTER I +0x3045 # HIRAGANA LETTER SMALL U +0x3046 # HIRAGANA LETTER U +0x3047 # HIRAGANA LETTER SMALL E +0x3048 # HIRAGANA LETTER E +0x3049 # HIRAGANA LETTER SMALL O +0x304A # HIRAGANA LETTER O +0x304B # HIRAGANA LETTER KA +0x304C # HIRAGANA LETTER GA +0x304D # HIRAGANA LETTER KI +0x304E # HIRAGANA LETTER GI +0x304F # HIRAGANA LETTER KU +0x3050 # HIRAGANA LETTER GU +0x3051 # HIRAGANA LETTER KE +0x3052 # HIRAGANA LETTER GE +0x3053 # HIRAGANA LETTER KO +0x3054 # HIRAGANA LETTER GO +0x3055 # HIRAGANA LETTER SA +0x3056 # HIRAGANA LETTER ZA +0x3057 # HIRAGANA LETTER SI +0x3058 # HIRAGANA LETTER ZI +0x3059 # HIRAGANA LETTER SU +0x305A # HIRAGANA LETTER ZU +0x305B # HIRAGANA LETTER SE +0x305C # HIRAGANA LETTER ZE +0x305D # HIRAGANA LETTER SO +0x305E # HIRAGANA LETTER ZO +0x305F # HIRAGANA LETTER TA +0x3060 # HIRAGANA LETTER DA +0x3061 # HIRAGANA LETTER TI +0x3062 # HIRAGANA LETTER DI +0x3063 # HIRAGANA LETTER SMALL TU +0x3064 # HIRAGANA LETTER TU +0x3065 # HIRAGANA LETTER DU +0x3066 # HIRAGANA LETTER TE +0x3067 # HIRAGANA LETTER DE +0x3068 # HIRAGANA LETTER TO +0x3069 # HIRAGANA LETTER DO +0x306A # HIRAGANA LETTER NA +0x306B # HIRAGANA LETTER NI +0x306C # HIRAGANA LETTER NU +0x306D # HIRAGANA LETTER NE +0x306E # HIRAGANA LETTER NO +0x306F # HIRAGANA LETTER HA +0x3070 # HIRAGANA LETTER BA +0x3071 # HIRAGANA LETTER PA +0x3072 # HIRAGANA LETTER HI +0x3073 # HIRAGANA LETTER BI +0x3074 # HIRAGANA LETTER PI +0x3075 # HIRAGANA LETTER HU +0x3076 # HIRAGANA LETTER BU +0x3077 # HIRAGANA LETTER PU +0x3078 # HIRAGANA LETTER HE +0x3079 # HIRAGANA LETTER BE +0x307A # HIRAGANA LETTER PE +0x307B # HIRAGANA LETTER HO +0x307C # HIRAGANA LETTER BO +0x307D # HIRAGANA LETTER PO +0x307E # HIRAGANA LETTER MA +0x307F # HIRAGANA LETTER MI +0x3080 # HIRAGANA LETTER MU +0x3081 # HIRAGANA LETTER ME +0x3082 # HIRAGANA LETTER MO +0x3083 # HIRAGANA LETTER SMALL YA +0x3084 # HIRAGANA LETTER YA +0x3085 # HIRAGANA LETTER SMALL YU +0x3086 # HIRAGANA LETTER YU +0x3087 # HIRAGANA LETTER SMALL YO +0x3088 # HIRAGANA LETTER YO +0x3089 # HIRAGANA LETTER RA +0x308A # HIRAGANA LETTER RI +0x308B # HIRAGANA LETTER RU +0x308C # HIRAGANA LETTER RE +0x308D # HIRAGANA LETTER RO +0x308E # HIRAGANA LETTER SMALL WA +0x308F # HIRAGANA LETTER WA +0x3090 # HIRAGANA LETTER WI +0x3091 # HIRAGANA LETTER WE +0x3092 # HIRAGANA LETTER WO +0x3093 # HIRAGANA LETTER N +0x309B # KATAKANA-HIRAGANA VOICED SOUND MARK +0x309C # KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +0x309D # HIRAGANA ITERATION MARK +0x309E # HIRAGANA VOICED ITERATION MARK +0x30A1 # KATAKANA LETTER SMALL A +0x30A2 # KATAKANA LETTER A +0x30A3 # KATAKANA LETTER SMALL I +0x30A4 # KATAKANA LETTER I +0x30A5 # KATAKANA LETTER SMALL U +0x30A6 # KATAKANA LETTER U +0x30A7 # KATAKANA LETTER SMALL E +0x30A8 # KATAKANA LETTER E +0x30A9 # KATAKANA LETTER SMALL O +0x30AA # KATAKANA LETTER O +0x30AB # KATAKANA LETTER KA +0x30AC # KATAKANA LETTER GA +0x30AD # KATAKANA LETTER KI +0x30AE # KATAKANA LETTER GI +0x30AF # KATAKANA LETTER KU +0x30B0 # KATAKANA LETTER GU +0x30B1 # KATAKANA LETTER KE +0x30B2 # KATAKANA LETTER GE +0x30B3 # KATAKANA LETTER KO +0x30B4 # KATAKANA LETTER GO +0x30B5 # KATAKANA LETTER SA +0x30B6 # KATAKANA LETTER ZA +0x30B7 # KATAKANA LETTER SI +0x30B8 # KATAKANA LETTER ZI +0x30B9 # KATAKANA LETTER SU +0x30BA # KATAKANA LETTER ZU +0x30BB # KATAKANA LETTER SE +0x30BC # KATAKANA LETTER ZE +0x30BD # KATAKANA LETTER SO +0x30BE # KATAKANA LETTER ZO +0x30BF # KATAKANA LETTER TA +0x30C0 # KATAKANA LETTER DA +0x30C1 # KATAKANA LETTER TI +0x30C2 # KATAKANA LETTER DI +0x30C3 # KATAKANA LETTER SMALL TU +0x30C4 # KATAKANA LETTER TU +0x30C5 # KATAKANA LETTER DU +0x30C6 # KATAKANA LETTER TE +0x30C7 # KATAKANA LETTER DE +0x30C8 # KATAKANA LETTER TO +0x30C9 # KATAKANA LETTER DO +0x30CA # KATAKANA LETTER NA +0x30CB # KATAKANA LETTER NI +0x30CC # KATAKANA LETTER NU +0x30CD # KATAKANA LETTER NE +0x30CE # KATAKANA LETTER NO +0x30CF # KATAKANA LETTER HA +0x30D0 # KATAKANA LETTER BA +0x30D1 # KATAKANA LETTER PA +0x30D2 # KATAKANA LETTER HI +0x30D3 # KATAKANA LETTER BI +0x30D4 # KATAKANA LETTER PI +0x30D5 # KATAKANA LETTER HU +0x30D6 # KATAKANA LETTER BU +0x30D7 # KATAKANA LETTER PU +0x30D8 # KATAKANA LETTER HE +0x30D9 # KATAKANA LETTER BE +0x30DA # KATAKANA LETTER PE +0x30DB # KATAKANA LETTER HO +0x30DC # KATAKANA LETTER BO +0x30DD # KATAKANA LETTER PO +0x30DE # KATAKANA LETTER MA +0x30DF # KATAKANA LETTER MI +0x30E0 # KATAKANA LETTER MU +0x30E1 # KATAKANA LETTER ME +0x30E2 # KATAKANA LETTER MO +0x30E3 # KATAKANA LETTER SMALL YA +0x30E4 # KATAKANA LETTER YA +0x30E5 # KATAKANA LETTER SMALL YU +0x30E6 # KATAKANA LETTER YU +0x30E7 # KATAKANA LETTER SMALL YO +0x30E8 # KATAKANA LETTER YO +0x30E9 # KATAKANA LETTER RA +0x30EA # KATAKANA LETTER RI +0x30EB # KATAKANA LETTER RU +0x30EC # KATAKANA LETTER RE +0x30ED # KATAKANA LETTER RO +0x30EE # KATAKANA LETTER SMALL WA +0x30EF # KATAKANA LETTER WA +0x30F0 # KATAKANA LETTER WI +0x30F1 # KATAKANA LETTER WE +0x30F2 # KATAKANA LETTER WO +0x30F3 # KATAKANA LETTER N +0x30F4 # KATAKANA LETTER VU +0x30F5 # KATAKANA LETTER SMALL KA +0x30F6 # KATAKANA LETTER SMALL KE +0x30FB # KATAKANA MIDDLE DOT +0x30FC # KATAKANA-HIRAGANA PROLONGED SOUND MARK +0x30FD # KATAKANA ITERATION MARK +0x30FE # KATAKANA VOICED ITERATION MARK +0x4E00 # <CJK> +0x4E01 # <CJK> +0x4E03 # <CJK> +0x4E07 # <CJK> +0x4E08 # <CJK> +0x4E09 # <CJK> +0x4E0A # <CJK> +0x4E0B # <CJK> +0x4E0D # <CJK> +0x4E0E # <CJK> +0x4E10 # <CJK> +0x4E11 # <CJK> +0x4E14 # <CJK> +0x4E15 # <CJK> +0x4E16 # <CJK> +0x4E17 # <CJK> +0x4E18 # <CJK> +0x4E19 # <CJK> +0x4E1E # <CJK> +0x4E21 # <CJK> +0x4E26 # <CJK> +0x4E2A # <CJK> +0x4E2D # <CJK> +0x4E31 # <CJK> +0x4E32 # <CJK> +0x4E36 # <CJK> +0x4E38 # <CJK> +0x4E39 # <CJK> +0x4E3B # <CJK> +0x4E3C # <CJK> +0x4E3F # <CJK> +0x4E42 # <CJK> +0x4E43 # <CJK> +0x4E45 # <CJK> +0x4E4B # <CJK> +0x4E4D # <CJK> +0x4E4E # <CJK> +0x4E4F # <CJK> +0x4E55 # <CJK> +0x4E56 # <CJK> +0x4E57 # <CJK> +0x4E58 # <CJK> +0x4E59 # <CJK> +0x4E5D # <CJK> +0x4E5E # <CJK> +0x4E5F # <CJK> +0x4E62 # <CJK> +0x4E71 # <CJK> +0x4E73 # <CJK> +0x4E7E # <CJK> +0x4E80 # <CJK> +0x4E82 # <CJK> +0x4E85 # <CJK> +0x4E86 # <CJK> +0x4E88 # <CJK> +0x4E89 # <CJK> +0x4E8A # <CJK> +0x4E8B # <CJK> +0x4E8C # <CJK> +0x4E8E # <CJK> +0x4E91 # <CJK> +0x4E92 # <CJK> +0x4E94 # <CJK> +0x4E95 # <CJK> +0x4E98 # <CJK> +0x4E99 # <CJK> +0x4E9B # <CJK> +0x4E9C # <CJK> +0x4E9E # <CJK> +0x4E9F # <CJK> +0x4EA0 # <CJK> +0x4EA1 # <CJK> +0x4EA2 # <CJK> +0x4EA4 # <CJK> +0x4EA5 # <CJK> +0x4EA6 # <CJK> +0x4EA8 # <CJK> +0x4EAB # <CJK> +0x4EAC # <CJK> +0x4EAD # <CJK> +0x4EAE # <CJK> +0x4EB0 # <CJK> +0x4EB3 # <CJK> +0x4EB6 # <CJK> +0x4EBA # <CJK> +0x4EC0 # <CJK> +0x4EC1 # <CJK> +0x4EC2 # <CJK> +0x4EC4 # <CJK> +0x4EC6 # <CJK> +0x4EC7 # <CJK> +0x4ECA # <CJK> +0x4ECB # <CJK> +0x4ECD # <CJK> +0x4ECE # <CJK> +0x4ECF # <CJK> +0x4ED4 # <CJK> +0x4ED5 # <CJK> +0x4ED6 # <CJK> +0x4ED7 # <CJK> +0x4ED8 # <CJK> +0x4ED9 # <CJK> +0x4EDD # <CJK> +0x4EDE # <CJK> +0x4EDF # <CJK> +0x4EE3 # <CJK> +0x4EE4 # <CJK> +0x4EE5 # <CJK> +0x4EED # <CJK> +0x4EEE # <CJK> +0x4EF0 # <CJK> +0x4EF2 # <CJK> +0x4EF6 # <CJK> +0x4EF7 # <CJK> +0x4EFB # <CJK> +0x4F01 # <CJK> +0x4F09 # <CJK> +0x4F0A # <CJK> +0x4F0D # <CJK> +0x4F0E # <CJK> +0x4F0F # <CJK> +0x4F10 # <CJK> +0x4F11 # <CJK> +0x4F1A # <CJK> +0x4F1C # <CJK> +0x4F1D # <CJK> +0x4F2F # <CJK> +0x4F30 # <CJK> +0x4F34 # <CJK> +0x4F36 # <CJK> +0x4F38 # <CJK> +0x4F3A # <CJK> +0x4F3C # <CJK> +0x4F3D # <CJK> +0x4F43 # <CJK> +0x4F46 # <CJK> +0x4F47 # <CJK> +0x4F4D # <CJK> +0x4F4E # <CJK> +0x4F4F # <CJK> +0x4F50 # <CJK> +0x4F51 # <CJK> +0x4F53 # <CJK> +0x4F55 # <CJK> +0x4F57 # <CJK> +0x4F59 # <CJK> +0x4F5A # <CJK> +0x4F5B # <CJK> +0x4F5C # <CJK> +0x4F5D # <CJK> +0x4F5E # <CJK> +0x4F69 # <CJK> +0x4F6F # <CJK> +0x4F70 # <CJK> +0x4F73 # <CJK> +0x4F75 # <CJK> +0x4F76 # <CJK> +0x4F7B # <CJK> +0x4F7C # <CJK> +0x4F7F # <CJK> +0x4F83 # <CJK> +0x4F86 # <CJK> +0x4F88 # <CJK> +0x4F8B # <CJK> +0x4F8D # <CJK> +0x4F8F # <CJK> +0x4F91 # <CJK> +0x4F96 # <CJK> +0x4F98 # <CJK> +0x4F9B # <CJK> +0x4F9D # <CJK> +0x4FA0 # <CJK> +0x4FA1 # <CJK> +0x4FAB # <CJK> +0x4FAD # <CJK> +0x4FAE # <CJK> +0x4FAF # <CJK> +0x4FB5 # <CJK> +0x4FB6 # <CJK> +0x4FBF # <CJK> +0x4FC2 # <CJK> +0x4FC3 # <CJK> +0x4FC4 # <CJK> +0x4FCA # <CJK> +0x4FCE # <CJK> +0x4FD0 # <CJK> +0x4FD1 # <CJK> +0x4FD4 # <CJK> +0x4FD7 # <CJK> +0x4FD8 # <CJK> +0x4FDA # <CJK> +0x4FDB # <CJK> +0x4FDD # <CJK> +0x4FDF # <CJK> +0x4FE1 # <CJK> +0x4FE3 # <CJK> +0x4FE4 # <CJK> +0x4FE5 # <CJK> +0x4FEE # <CJK> +0x4FEF # <CJK> +0x4FF3 # <CJK> +0x4FF5 # <CJK> +0x4FF6 # <CJK> +0x4FF8 # <CJK> +0x4FFA # <CJK> +0x4FFE # <CJK> +0x5005 # <CJK> +0x5006 # <CJK> +0x5009 # <CJK> +0x500B # <CJK> +0x500D # <CJK> +0x500F # <CJK> +0x5011 # <CJK> +0x5012 # <CJK> +0x5014 # <CJK> +0x5016 # <CJK> +0x5019 # <CJK> +0x501A # <CJK> +0x501F # <CJK> +0x5021 # <CJK> +0x5023 # <CJK> +0x5024 # <CJK> +0x5025 # <CJK> +0x5026 # <CJK> +0x5028 # <CJK> +0x5029 # <CJK> +0x502A # <CJK> +0x502B # <CJK> +0x502C # <CJK> +0x502D # <CJK> +0x5036 # <CJK> +0x5039 # <CJK> +0x5043 # <CJK> +0x5047 # <CJK> +0x5048 # <CJK> +0x5049 # <CJK> +0x504F # <CJK> +0x5050 # <CJK> +0x5055 # <CJK> +0x5056 # <CJK> +0x505A # <CJK> +0x505C # <CJK> +0x5065 # <CJK> +0x506C # <CJK> +0x5072 # <CJK> +0x5074 # <CJK> +0x5075 # <CJK> +0x5076 # <CJK> +0x5078 # <CJK> +0x507D # <CJK> +0x5080 # <CJK> +0x5085 # <CJK> +0x508D # <CJK> +0x5091 # <CJK> +0x5098 # <CJK> +0x5099 # <CJK> +0x509A # <CJK> +0x50AC # <CJK> +0x50AD # <CJK> +0x50B2 # <CJK> +0x50B3 # <CJK> +0x50B4 # <CJK> +0x50B5 # <CJK> +0x50B7 # <CJK> +0x50BE # <CJK> +0x50C2 # <CJK> +0x50C5 # <CJK> +0x50C9 # <CJK> +0x50CA # <CJK> +0x50CD # <CJK> +0x50CF # <CJK> +0x50D1 # <CJK> +0x50D5 # <CJK> +0x50D6 # <CJK> +0x50DA # <CJK> +0x50DE # <CJK> +0x50E3 # <CJK> +0x50E5 # <CJK> +0x50E7 # <CJK> +0x50ED # <CJK> +0x50EE # <CJK> +0x50F5 # <CJK> +0x50F9 # <CJK> +0x50FB # <CJK> +0x5100 # <CJK> +0x5101 # <CJK> +0x5102 # <CJK> +0x5104 # <CJK> +0x5109 # <CJK> +0x5112 # <CJK> +0x5114 # <CJK> +0x5115 # <CJK> +0x5116 # <CJK> +0x5118 # <CJK> +0x511A # <CJK> +0x511F # <CJK> +0x5121 # <CJK> +0x512A # <CJK> +0x5132 # <CJK> +0x5137 # <CJK> +0x513A # <CJK> +0x513B # <CJK> +0x513C # <CJK> +0x513F # <CJK> +0x5140 # <CJK> +0x5141 # <CJK> +0x5143 # <CJK> +0x5144 # <CJK> +0x5145 # <CJK> +0x5146 # <CJK> +0x5147 # <CJK> +0x5148 # <CJK> +0x5149 # <CJK> +0x514B # <CJK> +0x514C # <CJK> +0x514D # <CJK> +0x514E # <CJK> +0x5150 # <CJK> +0x5152 # <CJK> +0x5154 # <CJK> +0x515A # <CJK> +0x515C # <CJK> +0x5162 # <CJK> +0x5165 # <CJK> +0x5168 # <CJK> +0x5169 # <CJK> +0x516A # <CJK> +0x516B # <CJK> +0x516C # <CJK> +0x516D # <CJK> +0x516E # <CJK> +0x5171 # <CJK> +0x5175 # <CJK> +0x5176 # <CJK> +0x5177 # <CJK> +0x5178 # <CJK> +0x517C # <CJK> +0x5180 # <CJK> +0x5182 # <CJK> +0x5185 # <CJK> +0x5186 # <CJK> +0x5189 # <CJK> +0x518A # <CJK> +0x518C # <CJK> +0x518D # <CJK> +0x518F # <CJK> +0x5190 # <CJK> +0x5191 # <CJK> +0x5192 # <CJK> +0x5193 # <CJK> +0x5195 # <CJK> +0x5196 # <CJK> +0x5197 # <CJK> +0x5199 # <CJK> +0x51A0 # <CJK> +0x51A2 # <CJK> +0x51A4 # <CJK> +0x51A5 # <CJK> +0x51A6 # <CJK> +0x51A8 # <CJK> +0x51A9 # <CJK> +0x51AA # <CJK> +0x51AB # <CJK> +0x51AC # <CJK> +0x51B0 # <CJK> +0x51B1 # <CJK> +0x51B2 # <CJK> +0x51B3 # <CJK> +0x51B4 # <CJK> +0x51B5 # <CJK> +0x51B6 # <CJK> +0x51B7 # <CJK> +0x51BD # <CJK> +0x51C4 # <CJK> +0x51C5 # <CJK> +0x51C6 # <CJK> +0x51C9 # <CJK> +0x51CB # <CJK> +0x51CC # <CJK> +0x51CD # <CJK> +0x51D6 # <CJK> +0x51DB # <CJK> +#0x51DC # <CJK> # not in kochi fonts +0x51DD # <CJK> +0x51E0 # <CJK> +0x51E1 # <CJK> +0x51E6 # <CJK> +0x51E7 # <CJK> +0x51E9 # <CJK> +0x51EA # <CJK> +0x51ED # <CJK> +0x51F0 # <CJK> +0x51F1 # <CJK> +0x51F5 # <CJK> +0x51F6 # <CJK> +0x51F8 # <CJK> +0x51F9 # <CJK> +0x51FA # <CJK> +0x51FD # <CJK> +0x51FE # <CJK> +0x5200 # <CJK> +0x5203 # <CJK> +0x5204 # <CJK> +0x5206 # <CJK> +0x5207 # <CJK> +0x5208 # <CJK> +0x520A # <CJK> +0x520B # <CJK> +0x520E # <CJK> +0x5211 # <CJK> +0x5214 # <CJK> +0x5217 # <CJK> +0x521D # <CJK> +0x5224 # <CJK> +0x5225 # <CJK> +0x5227 # <CJK> +0x5229 # <CJK> +0x522A # <CJK> +0x522E # <CJK> +0x5230 # <CJK> +0x5233 # <CJK> +0x5236 # <CJK> +0x5237 # <CJK> +0x5238 # <CJK> +0x5239 # <CJK> +0x523A # <CJK> +0x523B # <CJK> +0x5243 # <CJK> +0x5244 # <CJK> +0x5247 # <CJK> +0x524A # <CJK> +0x524B # <CJK> +0x524C # <CJK> +0x524D # <CJK> +0x524F # <CJK> +0x5254 # <CJK> +0x5256 # <CJK> +0x525B # <CJK> +0x525E # <CJK> +0x5263 # <CJK> +0x5264 # <CJK> +0x5265 # <CJK> +0x5269 # <CJK> +0x526A # <CJK> +0x526F # <CJK> +0x5270 # <CJK> +0x5271 # <CJK> +0x5272 # <CJK> +0x5273 # <CJK> +0x5274 # <CJK> +0x5275 # <CJK> +0x527D # <CJK> +0x527F # <CJK> +0x5283 # <CJK> +0x5287 # <CJK> +0x5288 # <CJK> +0x5289 # <CJK> +0x528D # <CJK> +0x5291 # <CJK> +0x5292 # <CJK> +0x5294 # <CJK> +0x529B # <CJK> +0x529F # <CJK> +0x52A0 # <CJK> +0x52A3 # <CJK> +0x52A9 # <CJK> +0x52AA # <CJK> +0x52AB # <CJK> +0x52AC # <CJK> +0x52AD # <CJK> +0x52B1 # <CJK> +0x52B4 # <CJK> +0x52B5 # <CJK> +0x52B9 # <CJK> +0x52BC # <CJK> +0x52BE # <CJK> +0x52C1 # <CJK> +0x52C3 # <CJK> +0x52C5 # <CJK> +0x52C7 # <CJK> +0x52C9 # <CJK> +0x52CD # <CJK> +0x52D2 # <CJK> +0x52D5 # <CJK> +0x52D7 # <CJK> +0x52D8 # <CJK> +0x52D9 # <CJK> +0x52DD # <CJK> +0x52DE # <CJK> +0x52DF # <CJK> +0x52E0 # <CJK> +0x52E2 # <CJK> +0x52E3 # <CJK> +0x52E4 # <CJK> +0x52E6 # <CJK> +0x52E7 # <CJK> +0x52F2 # <CJK> +0x52F3 # <CJK> +0x52F5 # <CJK> +0x52F8 # <CJK> +0x52F9 # <CJK> +0x52FA # <CJK> +0x52FE # <CJK> +0x52FF # <CJK> +0x5301 # <CJK> +0x5302 # <CJK> +0x5305 # <CJK> +0x5306 # <CJK> +0x5308 # <CJK> +0x530D # <CJK> +0x530F # <CJK> +0x5310 # <CJK> +0x5315 # <CJK> +0x5316 # <CJK> +0x5317 # <CJK> +0x5319 # <CJK> +0x531A # <CJK> +0x531D # <CJK> +0x5320 # <CJK> +0x5321 # <CJK> +0x5323 # <CJK> +0x532A # <CJK> +0x532F # <CJK> +0x5331 # <CJK> +0x5333 # <CJK> +0x5338 # <CJK> +0x5339 # <CJK> +0x533A # <CJK> +0x533B # <CJK> +0x533F # <CJK> +0x5340 # <CJK> +0x5341 # <CJK> +0x5343 # <CJK> +0x5345 # <CJK> +0x5346 # <CJK> +0x5347 # <CJK> +0x5348 # <CJK> +0x5349 # <CJK> +0x534A # <CJK> +0x534D # <CJK> +0x5351 # <CJK> +0x5352 # <CJK> +0x5353 # <CJK> +0x5354 # <CJK> +0x5357 # <CJK> +0x5358 # <CJK> +0x535A # <CJK> +0x535C # <CJK> +0x535E # <CJK> +0x5360 # <CJK> +0x5366 # <CJK> +0x5369 # <CJK> +0x536E # <CJK> +0x536F # <CJK> +0x5370 # <CJK> +0x5371 # <CJK> +0x5373 # <CJK> +0x5374 # <CJK> +0x5375 # <CJK> +0x5377 # <CJK> +0x5378 # <CJK> +0x537B # <CJK> +0x537F # <CJK> +0x5382 # <CJK> +0x5384 # <CJK> +0x5396 # <CJK> +0x5398 # <CJK> +0x539A # <CJK> +0x539F # <CJK> +0x53A0 # <CJK> +0x53A5 # <CJK> +0x53A6 # <CJK> +0x53A8 # <CJK> +0x53A9 # <CJK> +0x53AD # <CJK> +0x53AE # <CJK> +0x53B0 # <CJK> +0x53B3 # <CJK> +0x53B6 # <CJK> +0x53BB # <CJK> +0x53C2 # <CJK> +0x53C3 # <CJK> +0x53C8 # <CJK> +0x53C9 # <CJK> +0x53CA # <CJK> +0x53CB # <CJK> +0x53CC # <CJK> +0x53CD # <CJK> +0x53CE # <CJK> +0x53D4 # <CJK> +0x53D6 # <CJK> +0x53D7 # <CJK> +0x53D9 # <CJK> +0x53DB # <CJK> +0x53DF # <CJK> +0x53E1 # <CJK> +0x53E2 # <CJK> +0x53E3 # <CJK> +0x53E4 # <CJK> +0x53E5 # <CJK> +0x53E8 # <CJK> +0x53E9 # <CJK> +0x53EA # <CJK> +0x53EB # <CJK> +0x53EC # <CJK> +0x53ED # <CJK> +0x53EE # <CJK> +0x53EF # <CJK> +0x53F0 # <CJK> +0x53F1 # <CJK> +0x53F2 # <CJK> +0x53F3 # <CJK> +0x53F6 # <CJK> +0x53F7 # <CJK> +0x53F8 # <CJK> +0x53FA # <CJK> +0x5401 # <CJK> +0x5403 # <CJK> +0x5404 # <CJK> +0x5408 # <CJK> +0x5409 # <CJK> +0x540A # <CJK> +0x540B # <CJK> +0x540C # <CJK> +0x540D # <CJK> +0x540E # <CJK> +0x540F # <CJK> +0x5410 # <CJK> +0x5411 # <CJK> +0x541B # <CJK> +0x541D # <CJK> +0x541F # <CJK> +0x5420 # <CJK> +0x5426 # <CJK> +0x5429 # <CJK> +0x542B # <CJK> +0x542C # <CJK> +0x542D # <CJK> +0x542E # <CJK> +0x5436 # <CJK> +0x5438 # <CJK> +0x5439 # <CJK> +0x543B # <CJK> +0x543C # <CJK> +0x543D # <CJK> +0x543E # <CJK> +0x5440 # <CJK> +0x5442 # <CJK> +0x5446 # <CJK> +0x5448 # <CJK> +0x5449 # <CJK> +0x544A # <CJK> +0x544E # <CJK> +0x5451 # <CJK> +0x545F # <CJK> +0x5468 # <CJK> +0x546A # <CJK> +0x5470 # <CJK> +0x5471 # <CJK> +0x5473 # <CJK> +0x5475 # <CJK> +0x5476 # <CJK> +0x5477 # <CJK> +0x547B # <CJK> +0x547C # <CJK> +0x547D # <CJK> +0x5480 # <CJK> +0x5484 # <CJK> +0x5486 # <CJK> +0x548B # <CJK> +0x548C # <CJK> +0x548E # <CJK> +0x548F # <CJK> +0x5490 # <CJK> +0x5492 # <CJK> +0x54A2 # <CJK> +0x54A4 # <CJK> +0x54A5 # <CJK> +0x54A8 # <CJK> +0x54AB # <CJK> +0x54AC # <CJK> +0x54AF # <CJK> +0x54B2 # <CJK> +0x54B3 # <CJK> +0x54B8 # <CJK> +0x54BC # <CJK> +0x54BD # <CJK> +0x54BE # <CJK> +0x54C0 # <CJK> +0x54C1 # <CJK> +0x54C2 # <CJK> +0x54C4 # <CJK> +0x54C7 # <CJK> +0x54C8 # <CJK> +0x54C9 # <CJK> +0x54D8 # <CJK> +0x54E1 # <CJK> +0x54E2 # <CJK> +0x54E5 # <CJK> +0x54E6 # <CJK> +0x54E8 # <CJK> +0x54E9 # <CJK> +0x54ED # <CJK> +0x54EE # <CJK> +0x54F2 # <CJK> +0x54FA # <CJK> +0x54FD # <CJK> +0x5504 # <CJK> +0x5506 # <CJK> +0x5507 # <CJK> +0x550F # <CJK> +0x5510 # <CJK> +0x5514 # <CJK> +0x5516 # <CJK> +0x552E # <CJK> +0x552F # <CJK> +0x5531 # <CJK> +0x5533 # <CJK> +0x5538 # <CJK> +0x5539 # <CJK> +0x553E # <CJK> +0x5540 # <CJK> +0x5544 # <CJK> +0x5545 # <CJK> +0x5546 # <CJK> +0x554C # <CJK> +0x554F # <CJK> +0x5553 # <CJK> +0x5556 # <CJK> +0x5557 # <CJK> +0x555C # <CJK> +0x555D # <CJK> +0x5563 # <CJK> +0x557B # <CJK> +0x557C # <CJK> +0x557E # <CJK> +0x5580 # <CJK> +0x5583 # <CJK> +0x5584 # <CJK> +0x5587 # <CJK> +0x5589 # <CJK> +0x558A # <CJK> +0x558B # <CJK> +0x5598 # <CJK> +0x5599 # <CJK> +0x559A # <CJK> +0x559C # <CJK> +0x559D # <CJK> +0x559E # <CJK> +0x559F # <CJK> +0x55A7 # <CJK> +0x55A8 # <CJK> +0x55A9 # <CJK> +0x55AA # <CJK> +0x55AB # <CJK> +0x55AC # <CJK> +0x55AE # <CJK> +0x55B0 # <CJK> +0x55B6 # <CJK> +0x55C4 # <CJK> +0x55C5 # <CJK> +0x55C7 # <CJK> +0x55D4 # <CJK> +0x55DA # <CJK> +0x55DC # <CJK> +0x55DF # <CJK> +0x55E3 # <CJK> +0x55E4 # <CJK> +0x55F7 # <CJK> +0x55F9 # <CJK> +0x55FD # <CJK> +0x55FE # <CJK> +0x5606 # <CJK> +0x5609 # <CJK> +0x5614 # <CJK> +0x5616 # <CJK> +0x5617 # <CJK> +0x5618 # <CJK> +0x561B # <CJK> +0x5629 # <CJK> +0x562F # <CJK> +0x5631 # <CJK> +0x5632 # <CJK> +0x5634 # <CJK> +0x5636 # <CJK> +0x5638 # <CJK> +0x5642 # <CJK> +0x564C # <CJK> +0x564E # <CJK> +0x5650 # <CJK> +0x565B # <CJK> +0x5664 # <CJK> +0x5668 # <CJK> +0x566A # <CJK> +0x566B # <CJK> +0x566C # <CJK> +0x5674 # <CJK> +0x5678 # <CJK> +0x567A # <CJK> +0x5680 # <CJK> +0x5686 # <CJK> +0x5687 # <CJK> +0x568A # <CJK> +0x568F # <CJK> +0x5694 # <CJK> +0x56A0 # <CJK> +0x56A2 # <CJK> +0x56A5 # <CJK> +0x56AE # <CJK> +0x56B4 # <CJK> +0x56B6 # <CJK> +0x56BC # <CJK> +0x56C0 # <CJK> +0x56C1 # <CJK> +0x56C2 # <CJK> +0x56C3 # <CJK> +0x56C8 # <CJK> +0x56CE # <CJK> +0x56D1 # <CJK> +0x56D3 # <CJK> +0x56D7 # <CJK> +0x56D8 # <CJK> +0x56DA # <CJK> +0x56DB # <CJK> +0x56DE # <CJK> +0x56E0 # <CJK> +0x56E3 # <CJK> +0x56EE # <CJK> +0x56F0 # <CJK> +0x56F2 # <CJK> +0x56F3 # <CJK> +0x56F9 # <CJK> +0x56FA # <CJK> +0x56FD # <CJK> +0x56FF # <CJK> +0x5700 # <CJK> +0x5703 # <CJK> +0x5704 # <CJK> +0x5708 # <CJK> +0x5709 # <CJK> +0x570B # <CJK> +0x570D # <CJK> +0x570F # <CJK> +0x5712 # <CJK> +0x5713 # <CJK> +0x5716 # <CJK> +0x5718 # <CJK> +0x571C # <CJK> +0x571F # <CJK> +0x5726 # <CJK> +0x5727 # <CJK> +0x5728 # <CJK> +0x572D # <CJK> +0x5730 # <CJK> +0x5737 # <CJK> +0x5738 # <CJK> +0x573B # <CJK> +0x5740 # <CJK> +0x5742 # <CJK> +0x5747 # <CJK> +0x574A # <CJK> +0x574E # <CJK> +0x574F # <CJK> +0x5750 # <CJK> +0x5751 # <CJK> +0x5761 # <CJK> +0x5764 # <CJK> +0x5766 # <CJK> +0x5769 # <CJK> +0x576A # <CJK> +0x577F # <CJK> +0x5782 # <CJK> +0x5788 # <CJK> +0x5789 # <CJK> +0x578B # <CJK> +0x5793 # <CJK> +0x57A0 # <CJK> +0x57A2 # <CJK> +0x57A3 # <CJK> +0x57A4 # <CJK> +0x57AA # <CJK> +0x57B0 # <CJK> +0x57B3 # <CJK> +0x57C0 # <CJK> +0x57C3 # <CJK> +0x57C6 # <CJK> +0x57CB # <CJK> +0x57CE # <CJK> +0x57D2 # <CJK> +0x57D3 # <CJK> +0x57D4 # <CJK> +0x57D6 # <CJK> +0x57DC # <CJK> +0x57DF # <CJK> +0x57E0 # <CJK> +0x57E3 # <CJK> +0x57F4 # <CJK> +0x57F7 # <CJK> +0x57F9 # <CJK> +0x57FA # <CJK> +0x57FC # <CJK> +0x5800 # <CJK> +0x5802 # <CJK> +0x5805 # <CJK> +0x5806 # <CJK> +0x580A # <CJK> +0x580B # <CJK> +0x5815 # <CJK> +0x5819 # <CJK> +0x581D # <CJK> +0x5821 # <CJK> +0x5824 # <CJK> +0x582A # <CJK> +0x582F # <CJK> +0x5830 # <CJK> +0x5831 # <CJK> +0x5834 # <CJK> +0x5835 # <CJK> +0x583A # <CJK> +0x583D # <CJK> +0x5840 # <CJK> +0x5841 # <CJK> +0x584A # <CJK> +0x584B # <CJK> +0x5851 # <CJK> +0x5852 # <CJK> +0x5854 # <CJK> +0x5857 # <CJK> +0x5858 # <CJK> +0x5859 # <CJK> +0x585A # <CJK> +0x585E # <CJK> +0x5862 # <CJK> +0x5869 # <CJK> +0x586B # <CJK> +0x5870 # <CJK> +0x5872 # <CJK> +0x5875 # <CJK> +0x5879 # <CJK> +0x587E # <CJK> +0x5883 # <CJK> +0x5885 # <CJK> +0x5893 # <CJK> +0x5897 # <CJK> +0x589C # <CJK> +0x589F # <CJK> +0x58A8 # <CJK> +0x58AB # <CJK> +0x58AE # <CJK> +0x58B3 # <CJK> +0x58B8 # <CJK> +0x58B9 # <CJK> +0x58BA # <CJK> +0x58BB # <CJK> +0x58BE # <CJK> +0x58C1 # <CJK> +0x58C5 # <CJK> +0x58C7 # <CJK> +0x58CA # <CJK> +0x58CC # <CJK> +0x58D1 # <CJK> +0x58D3 # <CJK> +0x58D5 # <CJK> +0x58D7 # <CJK> +0x58D8 # <CJK> +0x58D9 # <CJK> +0x58DC # <CJK> +0x58DE # <CJK> +0x58DF # <CJK> +0x58E4 # <CJK> +0x58E5 # <CJK> +0x58EB # <CJK> +0x58EC # <CJK> +0x58EE # <CJK> +0x58EF # <CJK> +0x58F0 # <CJK> +0x58F1 # <CJK> +0x58F2 # <CJK> +0x58F7 # <CJK> +0x58F9 # <CJK> +0x58FA # <CJK> +0x58FB # <CJK> +0x58FC # <CJK> +0x58FD # <CJK> +0x5902 # <CJK> +0x5909 # <CJK> +0x590A # <CJK> +0x590F # <CJK> +0x5910 # <CJK> +0x5915 # <CJK> +0x5916 # <CJK> +0x5918 # <CJK> +0x5919 # <CJK> +0x591A # <CJK> +0x591B # <CJK> +0x591C # <CJK> +0x5922 # <CJK> +0x5925 # <CJK> +0x5927 # <CJK> +0x5929 # <CJK> +0x592A # <CJK> +0x592B # <CJK> +0x592C # <CJK> +0x592D # <CJK> +0x592E # <CJK> +0x5931 # <CJK> +0x5932 # <CJK> +0x5937 # <CJK> +0x5938 # <CJK> +0x593E # <CJK> +0x5944 # <CJK> +0x5947 # <CJK> +0x5948 # <CJK> +0x5949 # <CJK> +0x594E # <CJK> +0x594F # <CJK> +0x5950 # <CJK> +0x5951 # <CJK> +0x5954 # <CJK> +0x5955 # <CJK> +0x5957 # <CJK> +0x5958 # <CJK> +0x595A # <CJK> +0x5960 # <CJK> +0x5962 # <CJK> +0x5965 # <CJK> +0x5967 # <CJK> +0x5968 # <CJK> +0x5969 # <CJK> +0x596A # <CJK> +0x596C # <CJK> +0x596E # <CJK> +0x5973 # <CJK> +0x5974 # <CJK> +0x5978 # <CJK> +0x597D # <CJK> +0x5981 # <CJK> +0x5982 # <CJK> +0x5983 # <CJK> +0x5984 # <CJK> +0x598A # <CJK> +0x598D # <CJK> +0x5993 # <CJK> +0x5996 # <CJK> +0x5999 # <CJK> +0x599B # <CJK> +0x599D # <CJK> +0x59A3 # <CJK> +0x59A5 # <CJK> +0x59A8 # <CJK> +0x59AC # <CJK> +0x59B2 # <CJK> +0x59B9 # <CJK> +0x59BB # <CJK> +0x59BE # <CJK> +0x59C6 # <CJK> +0x59C9 # <CJK> +0x59CB # <CJK> +0x59D0 # <CJK> +0x59D1 # <CJK> +0x59D3 # <CJK> +0x59D4 # <CJK> +0x59D9 # <CJK> +0x59DA # <CJK> +0x59DC # <CJK> +0x59E5 # <CJK> +0x59E6 # <CJK> +0x59E8 # <CJK> +0x59EA # <CJK> +0x59EB # <CJK> +0x59F6 # <CJK> +0x59FB # <CJK> +0x59FF # <CJK> +0x5A01 # <CJK> +0x5A03 # <CJK> +0x5A09 # <CJK> +0x5A11 # <CJK> +0x5A18 # <CJK> +0x5A1A # <CJK> +0x5A1C # <CJK> +0x5A1F # <CJK> +0x5A20 # <CJK> +0x5A25 # <CJK> +0x5A29 # <CJK> +0x5A2F # <CJK> +0x5A35 # <CJK> +0x5A36 # <CJK> +0x5A3C # <CJK> +0x5A40 # <CJK> +0x5A41 # <CJK> +0x5A46 # <CJK> +0x5A49 # <CJK> +0x5A5A # <CJK> +0x5A62 # <CJK> +0x5A66 # <CJK> +0x5A6A # <CJK> +0x5A6C # <CJK> +0x5A7F # <CJK> +0x5A92 # <CJK> +0x5A9A # <CJK> +0x5A9B # <CJK> +0x5ABC # <CJK> +0x5ABD # <CJK> +0x5ABE # <CJK> +0x5AC1 # <CJK> +0x5AC2 # <CJK> +0x5AC9 # <CJK> +0x5ACB # <CJK> +0x5ACC # <CJK> +0x5AD0 # <CJK> +0x5AD6 # <CJK> +0x5AD7 # <CJK> +0x5AE1 # <CJK> +0x5AE3 # <CJK> +0x5AE6 # <CJK> +0x5AE9 # <CJK> +0x5AFA # <CJK> +0x5AFB # <CJK> +0x5B09 # <CJK> +0x5B0B # <CJK> +0x5B0C # <CJK> +0x5B16 # <CJK> +0x5B22 # <CJK> +0x5B2A # <CJK> +0x5B2C # <CJK> +0x5B30 # <CJK> +0x5B32 # <CJK> +0x5B36 # <CJK> +0x5B3E # <CJK> +0x5B40 # <CJK> +0x5B43 # <CJK> +0x5B45 # <CJK> +0x5B50 # <CJK> +0x5B51 # <CJK> +0x5B54 # <CJK> +0x5B55 # <CJK> +0x5B57 # <CJK> +0x5B58 # <CJK> +0x5B5A # <CJK> +0x5B5B # <CJK> +0x5B5C # <CJK> +0x5B5D # <CJK> +0x5B5F # <CJK> +0x5B63 # <CJK> +0x5B64 # <CJK> +0x5B65 # <CJK> +0x5B66 # <CJK> +0x5B69 # <CJK> +0x5B6B # <CJK> +0x5B70 # <CJK> +0x5B71 # <CJK> +0x5B73 # <CJK> +0x5B75 # <CJK> +0x5B78 # <CJK> +0x5B7A # <CJK> +0x5B80 # <CJK> +0x5B83 # <CJK> +0x5B85 # <CJK> +0x5B87 # <CJK> +0x5B88 # <CJK> +0x5B89 # <CJK> +0x5B8B # <CJK> +0x5B8C # <CJK> +0x5B8D # <CJK> +0x5B8F # <CJK> +0x5B95 # <CJK> +0x5B97 # <CJK> +0x5B98 # <CJK> +0x5B99 # <CJK> +0x5B9A # <CJK> +0x5B9B # <CJK> +0x5B9C # <CJK> +0x5B9D # <CJK> +0x5B9F # <CJK> +0x5BA2 # <CJK> +0x5BA3 # <CJK> +0x5BA4 # <CJK> +0x5BA5 # <CJK> +0x5BA6 # <CJK> +0x5BAE # <CJK> +0x5BB0 # <CJK> +0x5BB3 # <CJK> +0x5BB4 # <CJK> +0x5BB5 # <CJK> +0x5BB6 # <CJK> +0x5BB8 # <CJK> +0x5BB9 # <CJK> +0x5BBF # <CJK> +0x5BC2 # <CJK> +0x5BC3 # <CJK> +0x5BC4 # <CJK> +0x5BC5 # <CJK> +0x5BC6 # <CJK> +0x5BC7 # <CJK> +0x5BC9 # <CJK> +0x5BCC # <CJK> +0x5BD0 # <CJK> +0x5BD2 # <CJK> +0x5BD3 # <CJK> +0x5BD4 # <CJK> +0x5BDB # <CJK> +0x5BDD # <CJK> +0x5BDE # <CJK> +0x5BDF # <CJK> +0x5BE1 # <CJK> +0x5BE2 # <CJK> +0x5BE4 # <CJK> +0x5BE5 # <CJK> +0x5BE6 # <CJK> +0x5BE7 # <CJK> +0x5BE8 # <CJK> +0x5BE9 # <CJK> +0x5BEB # <CJK> +0x5BEE # <CJK> +0x5BF0 # <CJK> +0x5BF3 # <CJK> +0x5BF5 # <CJK> +0x5BF6 # <CJK> +0x5BF8 # <CJK> +0x5BFA # <CJK> +0x5BFE # <CJK> +0x5BFF # <CJK> +0x5C01 # <CJK> +0x5C02 # <CJK> +0x5C04 # <CJK> +0x5C05 # <CJK> +0x5C06 # <CJK> +0x5C07 # <CJK> +0x5C08 # <CJK> +0x5C09 # <CJK> +0x5C0A # <CJK> +0x5C0B # <CJK> +0x5C0D # <CJK> +0x5C0E # <CJK> +0x5C0F # <CJK> +0x5C11 # <CJK> +0x5C13 # <CJK> +0x5C16 # <CJK> +0x5C1A # <CJK> +0x5C20 # <CJK> +0x5C22 # <CJK> +0x5C24 # <CJK> +0x5C28 # <CJK> +0x5C2D # <CJK> +0x5C31 # <CJK> +0x5C38 # <CJK> +0x5C39 # <CJK> +0x5C3A # <CJK> +0x5C3B # <CJK> +0x5C3C # <CJK> +0x5C3D # <CJK> +0x5C3E # <CJK> +0x5C3F # <CJK> +0x5C40 # <CJK> +0x5C41 # <CJK> +0x5C45 # <CJK> +0x5C46 # <CJK> +0x5C48 # <CJK> +0x5C4A # <CJK> +0x5C4B # <CJK> +0x5C4D # <CJK> +0x5C4E # <CJK> +0x5C4F # <CJK> +0x5C50 # <CJK> +0x5C51 # <CJK> +0x5C53 # <CJK> +0x5C55 # <CJK> +0x5C5E # <CJK> +0x5C60 # <CJK> +0x5C61 # <CJK> +0x5C64 # <CJK> +0x5C65 # <CJK> +0x5C6C # <CJK> +0x5C6E # <CJK> +0x5C6F # <CJK> +0x5C71 # <CJK> +0x5C76 # <CJK> +0x5C79 # <CJK> +0x5C8C # <CJK> +0x5C90 # <CJK> +0x5C91 # <CJK> +0x5C94 # <CJK> +0x5CA1 # <CJK> +0x5CA8 # <CJK> +0x5CA9 # <CJK> +0x5CAB # <CJK> +0x5CAC # <CJK> +0x5CB1 # <CJK> +0x5CB3 # <CJK> +0x5CB6 # <CJK> +0x5CB7 # <CJK> +0x5CB8 # <CJK> +0x5CBB # <CJK> +0x5CBC # <CJK> +0x5CBE # <CJK> +0x5CC5 # <CJK> +0x5CC7 # <CJK> +0x5CD9 # <CJK> +0x5CE0 # <CJK> +0x5CE1 # <CJK> +0x5CE8 # <CJK> +0x5CE9 # <CJK> +0x5CEA # <CJK> +0x5CED # <CJK> +0x5CEF # <CJK> +0x5CF0 # <CJK> +0x5CF6 # <CJK> +0x5CFA # <CJK> +0x5CFB # <CJK> +0x5CFD # <CJK> +0x5D07 # <CJK> +0x5D0B # <CJK> +0x5D0E # <CJK> +0x5D11 # <CJK> +0x5D14 # <CJK> +0x5D15 # <CJK> +0x5D16 # <CJK> +0x5D17 # <CJK> +0x5D18 # <CJK> +0x5D19 # <CJK> +0x5D1A # <CJK> +0x5D1B # <CJK> +0x5D1F # <CJK> +0x5D22 # <CJK> +0x5D29 # <CJK> +0x5D4B # <CJK> +0x5D4C # <CJK> +0x5D4E # <CJK> +0x5D50 # <CJK> +0x5D52 # <CJK> +0x5D5C # <CJK> +0x5D69 # <CJK> +0x5D6C # <CJK> +0x5D6F # <CJK> +0x5D73 # <CJK> +0x5D76 # <CJK> +0x5D82 # <CJK> +0x5D84 # <CJK> +0x5D87 # <CJK> +0x5D8B # <CJK> +0x5D8C # <CJK> +0x5D90 # <CJK> +0x5D9D # <CJK> +0x5DA2 # <CJK> +0x5DAC # <CJK> +0x5DAE # <CJK> +0x5DB7 # <CJK> +0x5DBA # <CJK> +0x5DBC # <CJK> +0x5DBD # <CJK> +0x5DC9 # <CJK> +0x5DCC # <CJK> +0x5DCD # <CJK> +0x5DD2 # <CJK> +0x5DD3 # <CJK> +0x5DD6 # <CJK> +0x5DDB # <CJK> +0x5DDD # <CJK> +0x5DDE # <CJK> +0x5DE1 # <CJK> +0x5DE3 # <CJK> +0x5DE5 # <CJK> +0x5DE6 # <CJK> +0x5DE7 # <CJK> +0x5DE8 # <CJK> +0x5DEB # <CJK> +0x5DEE # <CJK> +0x5DF1 # <CJK> +0x5DF2 # <CJK> +0x5DF3 # <CJK> +0x5DF4 # <CJK> +0x5DF5 # <CJK> +0x5DF7 # <CJK> +0x5DFB # <CJK> +0x5DFD # <CJK> +0x5DFE # <CJK> +0x5E02 # <CJK> +0x5E03 # <CJK> +0x5E06 # <CJK> +0x5E0B # <CJK> +0x5E0C # <CJK> +0x5E11 # <CJK> +0x5E16 # <CJK> +0x5E19 # <CJK> +0x5E1A # <CJK> +0x5E1B # <CJK> +0x5E1D # <CJK> +0x5E25 # <CJK> +0x5E2B # <CJK> +0x5E2D # <CJK> +0x5E2F # <CJK> +0x5E30 # <CJK> +0x5E33 # <CJK> +0x5E36 # <CJK> +0x5E37 # <CJK> +0x5E38 # <CJK> +0x5E3D # <CJK> +0x5E40 # <CJK> +0x5E43 # <CJK> +0x5E44 # <CJK> +0x5E45 # <CJK> +0x5E47 # <CJK> +0x5E4C # <CJK> +0x5E4E # <CJK> +0x5E54 # <CJK> +0x5E55 # <CJK> +0x5E57 # <CJK> +0x5E5F # <CJK> +0x5E61 # <CJK> +0x5E62 # <CJK> +0x5E63 # <CJK> +0x5E64 # <CJK> +0x5E72 # <CJK> +0x5E73 # <CJK> +0x5E74 # <CJK> +0x5E75 # <CJK> +0x5E76 # <CJK> +0x5E78 # <CJK> +0x5E79 # <CJK> +0x5E7A # <CJK> +0x5E7B # <CJK> +0x5E7C # <CJK> +0x5E7D # <CJK> +0x5E7E # <CJK> +0x5E7F # <CJK> +0x5E81 # <CJK> +0x5E83 # <CJK> +0x5E84 # <CJK> +0x5E87 # <CJK> +0x5E8A # <CJK> +0x5E8F # <CJK> +0x5E95 # <CJK> +0x5E96 # <CJK> +0x5E97 # <CJK> +0x5E9A # <CJK> +0x5E9C # <CJK> +0x5EA0 # <CJK> +0x5EA6 # <CJK> +0x5EA7 # <CJK> +0x5EAB # <CJK> +0x5EAD # <CJK> +0x5EB5 # <CJK> +0x5EB6 # <CJK> +0x5EB7 # <CJK> +0x5EB8 # <CJK> +0x5EC1 # <CJK> +0x5EC2 # <CJK> +0x5EC3 # <CJK> +0x5EC8 # <CJK> +0x5EC9 # <CJK> +0x5ECA # <CJK> +0x5ECF # <CJK> +0x5ED0 # <CJK> +0x5ED3 # <CJK> +0x5ED6 # <CJK> +0x5EDA # <CJK> +0x5EDB # <CJK> +0x5EDD # <CJK> +0x5EDF # <CJK> +0x5EE0 # <CJK> +0x5EE1 # <CJK> +0x5EE2 # <CJK> +0x5EE3 # <CJK> +0x5EE8 # <CJK> +0x5EE9 # <CJK> +0x5EEC # <CJK> +0x5EF0 # <CJK> +0x5EF1 # <CJK> +0x5EF3 # <CJK> +0x5EF4 # <CJK> +0x5EF6 # <CJK> +0x5EF7 # <CJK> +0x5EF8 # <CJK> +0x5EFA # <CJK> +0x5EFB # <CJK> +0x5EFC # <CJK> +0x5EFE # <CJK> +0x5EFF # <CJK> +0x5F01 # <CJK> +0x5F03 # <CJK> +0x5F04 # <CJK> +0x5F09 # <CJK> +0x5F0A # <CJK> +0x5F0B # <CJK> +0x5F0C # <CJK> +0x5F0D # <CJK> +0x5F0F # <CJK> +0x5F10 # <CJK> +0x5F11 # <CJK> +0x5F13 # <CJK> +0x5F14 # <CJK> +0x5F15 # <CJK> +0x5F16 # <CJK> +0x5F17 # <CJK> +0x5F18 # <CJK> +0x5F1B # <CJK> +0x5F1F # <CJK> +0x5F25 # <CJK> +0x5F26 # <CJK> +0x5F27 # <CJK> +0x5F29 # <CJK> +0x5F2D # <CJK> +0x5F2F # <CJK> +0x5F31 # <CJK> +0x5F35 # <CJK> +0x5F37 # <CJK> +0x5F38 # <CJK> +0x5F3C # <CJK> +0x5F3E # <CJK> +0x5F41 # <CJK> +0x5F48 # <CJK> +0x5F4A # <CJK> +0x5F4C # <CJK> +0x5F4E # <CJK> +0x5F51 # <CJK> +0x5F53 # <CJK> +0x5F56 # <CJK> +0x5F57 # <CJK> +0x5F59 # <CJK> +0x5F5C # <CJK> +0x5F5D # <CJK> +0x5F61 # <CJK> +0x5F62 # <CJK> +0x5F66 # <CJK> +0x5F69 # <CJK> +0x5F6A # <CJK> +0x5F6B # <CJK> +0x5F6C # <CJK> +0x5F6D # <CJK> +0x5F70 # <CJK> +0x5F71 # <CJK> +0x5F73 # <CJK> +0x5F77 # <CJK> +0x5F79 # <CJK> +0x5F7C # <CJK> +0x5F7F # <CJK> +0x5F80 # <CJK> +0x5F81 # <CJK> +0x5F82 # <CJK> +0x5F83 # <CJK> +0x5F84 # <CJK> +0x5F85 # <CJK> +0x5F87 # <CJK> +0x5F88 # <CJK> +0x5F8A # <CJK> +0x5F8B # <CJK> +0x5F8C # <CJK> +0x5F90 # <CJK> +0x5F91 # <CJK> +0x5F92 # <CJK> +0x5F93 # <CJK> +0x5F97 # <CJK> +0x5F98 # <CJK> +0x5F99 # <CJK> +0x5F9E # <CJK> +0x5FA0 # <CJK> +0x5FA1 # <CJK> +0x5FA8 # <CJK> +0x5FA9 # <CJK> +0x5FAA # <CJK> +0x5FAD # <CJK> +0x5FAE # <CJK> +0x5FB3 # <CJK> +0x5FB4 # <CJK> +0x5FB9 # <CJK> +0x5FBC # <CJK> +0x5FBD # <CJK> +0x5FC3 # <CJK> +0x5FC5 # <CJK> +0x5FCC # <CJK> +0x5FCD # <CJK> +0x5FD6 # <CJK> +0x5FD7 # <CJK> +0x5FD8 # <CJK> +0x5FD9 # <CJK> +0x5FDC # <CJK> +0x5FDD # <CJK> +0x5FE0 # <CJK> +0x5FE4 # <CJK> +0x5FEB # <CJK> +0x5FF0 # <CJK> +0x5FF1 # <CJK> +0x5FF5 # <CJK> +0x5FF8 # <CJK> +0x5FFB # <CJK> +0x5FFD # <CJK> +0x5FFF # <CJK> +0x600E # <CJK> +0x600F # <CJK> +0x6010 # <CJK> +0x6012 # <CJK> +0x6015 # <CJK> +0x6016 # <CJK> +0x6019 # <CJK> +0x601B # <CJK> +0x601C # <CJK> +0x601D # <CJK> +0x6020 # <CJK> +0x6021 # <CJK> +0x6025 # <CJK> +0x6026 # <CJK> +0x6027 # <CJK> +0x6028 # <CJK> +0x6029 # <CJK> +0x602A # <CJK> +0x602B # <CJK> +0x602F # <CJK> +0x6031 # <CJK> +0x603A # <CJK> +0x6041 # <CJK> +0x6042 # <CJK> +0x6043 # <CJK> +0x6046 # <CJK> +0x604A # <CJK> +0x604B # <CJK> +0x604D # <CJK> +0x6050 # <CJK> +0x6052 # <CJK> +0x6055 # <CJK> +0x6059 # <CJK> +0x605A # <CJK> +0x605F # <CJK> +0x6060 # <CJK> +0x6062 # <CJK> +0x6063 # <CJK> +0x6064 # <CJK> +0x6065 # <CJK> +0x6068 # <CJK> +0x6069 # <CJK> +0x606A # <CJK> +0x606B # <CJK> +0x606C # <CJK> +0x606D # <CJK> +0x606F # <CJK> +0x6070 # <CJK> +0x6075 # <CJK> +0x6077 # <CJK> +0x6081 # <CJK> +0x6083 # <CJK> +0x6084 # <CJK> +0x6089 # <CJK> +0x608B # <CJK> +0x608C # <CJK> +0x608D # <CJK> +0x6092 # <CJK> +0x6094 # <CJK> +0x6096 # <CJK> +0x6097 # <CJK> +0x609A # <CJK> +0x609B # <CJK> +0x609F # <CJK> +0x60A0 # <CJK> +0x60A3 # <CJK> +0x60A6 # <CJK> +0x60A7 # <CJK> +0x60A9 # <CJK> +0x60AA # <CJK> +0x60B2 # <CJK> +0x60B3 # <CJK> +0x60B4 # <CJK> +0x60B5 # <CJK> +0x60B6 # <CJK> +0x60B8 # <CJK> +0x60BC # <CJK> +0x60BD # <CJK> +0x60C5 # <CJK> +0x60C6 # <CJK> +0x60C7 # <CJK> +0x60D1 # <CJK> +0x60D3 # <CJK> +0x60D8 # <CJK> +0x60DA # <CJK> +0x60DC # <CJK> +0x60DF # <CJK> +0x60E0 # <CJK> +0x60E1 # <CJK> +0x60E3 # <CJK> +0x60E7 # <CJK> +0x60E8 # <CJK> +0x60F0 # <CJK> +0x60F1 # <CJK> +0x60F3 # <CJK> +0x60F4 # <CJK> +0x60F6 # <CJK> +0x60F7 # <CJK> +0x60F9 # <CJK> +0x60FA # <CJK> +0x60FB # <CJK> +0x6100 # <CJK> +0x6101 # <CJK> +0x6103 # <CJK> +0x6106 # <CJK> +0x6108 # <CJK> +0x6109 # <CJK> +0x610D # <CJK> +0x610E # <CJK> +0x610F # <CJK> +0x6115 # <CJK> +0x611A # <CJK> +0x611B # <CJK> +0x611F # <CJK> +0x6121 # <CJK> +0x6127 # <CJK> +0x6128 # <CJK> +0x612C # <CJK> +0x6134 # <CJK> +0x613C # <CJK> +0x613D # <CJK> +0x613E # <CJK> +0x613F # <CJK> +0x6142 # <CJK> +0x6144 # <CJK> +0x6147 # <CJK> +0x6148 # <CJK> +0x614A # <CJK> +0x614B # <CJK> +0x614C # <CJK> +0x614D # <CJK> +0x614E # <CJK> +0x6153 # <CJK> +0x6155 # <CJK> +0x6158 # <CJK> +0x6159 # <CJK> +0x615A # <CJK> +0x615D # <CJK> +0x615F # <CJK> +0x6162 # <CJK> +0x6163 # <CJK> +0x6165 # <CJK> +0x6167 # <CJK> +0x6168 # <CJK> +0x616B # <CJK> +0x616E # <CJK> +0x616F # <CJK> +0x6170 # <CJK> +0x6171 # <CJK> +0x6173 # <CJK> +0x6174 # <CJK> +0x6175 # <CJK> +0x6176 # <CJK> +0x6177 # <CJK> +0x617E # <CJK> +0x6182 # <CJK> +0x6187 # <CJK> +0x618A # <CJK> +0x618E # <CJK> +0x6190 # <CJK> +0x6191 # <CJK> +0x6194 # <CJK> +0x6196 # <CJK> +0x6199 # <CJK> +0x619A # <CJK> +0x61A4 # <CJK> +0x61A7 # <CJK> +0x61A9 # <CJK> +0x61AB # <CJK> +0x61AC # <CJK> +0x61AE # <CJK> +0x61B2 # <CJK> +0x61B6 # <CJK> +0x61BA # <CJK> +0x61BE # <CJK> +0x61C3 # <CJK> +0x61C6 # <CJK> +0x61C7 # <CJK> +0x61C8 # <CJK> +0x61C9 # <CJK> +0x61CA # <CJK> +0x61CB # <CJK> +0x61CC # <CJK> +0x61CD # <CJK> +0x61D0 # <CJK> +0x61E3 # <CJK> +0x61E6 # <CJK> +0x61F2 # <CJK> +0x61F4 # <CJK> +0x61F6 # <CJK> +0x61F7 # <CJK> +0x61F8 # <CJK> +0x61FA # <CJK> +0x61FC # <CJK> +0x61FD # <CJK> +0x61FE # <CJK> +0x61FF # <CJK> +0x6200 # <CJK> +0x6208 # <CJK> +0x6209 # <CJK> +0x620A # <CJK> +0x620C # <CJK> +0x620D # <CJK> +0x620E # <CJK> +0x6210 # <CJK> +0x6211 # <CJK> +0x6212 # <CJK> +0x6214 # <CJK> +0x6216 # <CJK> +0x621A # <CJK> +0x621B # <CJK> +0x621D # <CJK> +0x621E # <CJK> +0x621F # <CJK> +0x6221 # <CJK> +0x6226 # <CJK> +0x622A # <CJK> +0x622E # <CJK> +0x622F # <CJK> +0x6230 # <CJK> +0x6232 # <CJK> +0x6233 # <CJK> +0x6234 # <CJK> +0x6238 # <CJK> +0x623B # <CJK> +0x623F # <CJK> +0x6240 # <CJK> +0x6241 # <CJK> +0x6247 # <CJK> +0x6248 # <CJK> +0x6249 # <CJK> +0x624B # <CJK> +0x624D # <CJK> +0x624E # <CJK> +0x6253 # <CJK> +0x6255 # <CJK> +0x6258 # <CJK> +0x625B # <CJK> +0x625E # <CJK> +0x6260 # <CJK> +0x6263 # <CJK> +0x6268 # <CJK> +0x626E # <CJK> +0x6271 # <CJK> +0x6276 # <CJK> +0x6279 # <CJK> +0x627C # <CJK> +0x627E # <CJK> +0x627F # <CJK> +0x6280 # <CJK> +0x6282 # <CJK> +0x6283 # <CJK> +0x6284 # <CJK> +0x6289 # <CJK> +0x628A # <CJK> +0x6291 # <CJK> +0x6292 # <CJK> +0x6293 # <CJK> +0x6294 # <CJK> +0x6295 # <CJK> +0x6296 # <CJK> +0x6297 # <CJK> +0x6298 # <CJK> +0x629B # <CJK> +0x629C # <CJK> +0x629E # <CJK> +0x62AB # <CJK> +0x62AC # <CJK> +0x62B1 # <CJK> +0x62B5 # <CJK> +0x62B9 # <CJK> +0x62BB # <CJK> +0x62BC # <CJK> +0x62BD # <CJK> +0x62C2 # <CJK> +0x62C5 # <CJK> +0x62C6 # <CJK> +0x62C7 # <CJK> +0x62C8 # <CJK> +0x62C9 # <CJK> +0x62CA # <CJK> +0x62CC # <CJK> +0x62CD # <CJK> +0x62CF # <CJK> +0x62D0 # <CJK> +0x62D1 # <CJK> +0x62D2 # <CJK> +0x62D3 # <CJK> +0x62D4 # <CJK> +0x62D7 # <CJK> +0x62D8 # <CJK> +0x62D9 # <CJK> +0x62DB # <CJK> +0x62DC # <CJK> +0x62DD # <CJK> +0x62E0 # <CJK> +0x62E1 # <CJK> +0x62EC # <CJK> +0x62ED # <CJK> +0x62EE # <CJK> +0x62EF # <CJK> +0x62F1 # <CJK> +0x62F3 # <CJK> +0x62F5 # <CJK> +0x62F6 # <CJK> +0x62F7 # <CJK> +0x62FE # <CJK> +0x62FF # <CJK> +0x6301 # <CJK> +0x6302 # <CJK> +0x6307 # <CJK> +0x6308 # <CJK> +0x6309 # <CJK> +0x630C # <CJK> +0x6311 # <CJK> +0x6319 # <CJK> +0x631F # <CJK> +0x6327 # <CJK> +0x6328 # <CJK> +0x632B # <CJK> +0x632F # <CJK> +0x633A # <CJK> +0x633D # <CJK> +0x633E # <CJK> +0x633F # <CJK> +0x6349 # <CJK> +0x634C # <CJK> +0x634D # <CJK> +0x634F # <CJK> +0x6350 # <CJK> +0x6355 # <CJK> +0x6357 # <CJK> +0x635C # <CJK> +0x6367 # <CJK> +0x6368 # <CJK> +0x6369 # <CJK> +0x636B # <CJK> +0x636E # <CJK> +0x6372 # <CJK> +0x6376 # <CJK> +0x6377 # <CJK> +0x637A # <CJK> +0x637B # <CJK> +0x6380 # <CJK> +0x6383 # <CJK> +0x6388 # <CJK> +0x6389 # <CJK> +0x638C # <CJK> +0x638E # <CJK> +0x638F # <CJK> +0x6392 # <CJK> +0x6396 # <CJK> +0x6398 # <CJK> +0x639B # <CJK> +0x639F # <CJK> +0x63A0 # <CJK> +0x63A1 # <CJK> +0x63A2 # <CJK> +0x63A3 # <CJK> +0x63A5 # <CJK> +0x63A7 # <CJK> +0x63A8 # <CJK> +0x63A9 # <CJK> +0x63AA # <CJK> +0x63AB # <CJK> +0x63AC # <CJK> +0x63B2 # <CJK> +0x63B4 # <CJK> +0x63B5 # <CJK> +0x63BB # <CJK> +0x63BE # <CJK> +0x63C0 # <CJK> +0x63C3 # <CJK> +0x63C4 # <CJK> +0x63C6 # <CJK> +0x63C9 # <CJK> +0x63CF # <CJK> +0x63D0 # <CJK> +0x63D2 # <CJK> +0x63D6 # <CJK> +0x63DA # <CJK> +0x63DB # <CJK> +0x63E1 # <CJK> +0x63E3 # <CJK> +0x63E9 # <CJK> +0x63EE # <CJK> +0x63F4 # <CJK> +0x63F6 # <CJK> +0x63FA # <CJK> +0x6406 # <CJK> +0x640D # <CJK> +0x640F # <CJK> +0x6413 # <CJK> +0x6416 # <CJK> +0x6417 # <CJK> +0x641C # <CJK> +0x6426 # <CJK> +0x6428 # <CJK> +0x642C # <CJK> +0x642D # <CJK> +0x6434 # <CJK> +0x6436 # <CJK> +0x643A # <CJK> +0x643E # <CJK> +0x6442 # <CJK> +0x644E # <CJK> +0x6458 # <CJK> +0x6467 # <CJK> +0x6469 # <CJK> +0x646F # <CJK> +0x6476 # <CJK> +0x6478 # <CJK> +0x647A # <CJK> +0x6483 # <CJK> +0x6488 # <CJK> +0x6492 # <CJK> +0x6493 # <CJK> +0x6495 # <CJK> +0x649A # <CJK> +0x649E # <CJK> +0x64A4 # <CJK> +0x64A5 # <CJK> +0x64A9 # <CJK> +0x64AB # <CJK> +0x64AD # <CJK> +0x64AE # <CJK> +0x64B0 # <CJK> +0x64B2 # <CJK> +0x64B9 # <CJK> +0x64BB # <CJK> +0x64BC # <CJK> +0x64C1 # <CJK> +0x64C2 # <CJK> +0x64C5 # <CJK> +0x64C7 # <CJK> +0x64CD # <CJK> +0x64D2 # <CJK> +0x64D4 # <CJK> +0x64D8 # <CJK> +0x64DA # <CJK> +0x64E0 # <CJK> +0x64E1 # <CJK> +0x64E2 # <CJK> +0x64E3 # <CJK> +0x64E6 # <CJK> +0x64E7 # <CJK> +0x64EC # <CJK> +0x64EF # <CJK> +0x64F1 # <CJK> +0x64F2 # <CJK> +0x64F4 # <CJK> +0x64F6 # <CJK> +0x64FA # <CJK> +0x64FD # <CJK> +0x64FE # <CJK> +0x6500 # <CJK> +0x6505 # <CJK> +0x6518 # <CJK> +0x651C # <CJK> +0x651D # <CJK> +0x6523 # <CJK> +0x6524 # <CJK> +0x652A # <CJK> +0x652B # <CJK> +0x652C # <CJK> +0x652F # <CJK> +0x6534 # <CJK> +0x6535 # <CJK> +0x6536 # <CJK> +0x6537 # <CJK> +0x6538 # <CJK> +0x6539 # <CJK> +0x653B # <CJK> +0x653E # <CJK> +0x653F # <CJK> +0x6545 # <CJK> +0x6548 # <CJK> +0x654D # <CJK> +0x654F # <CJK> +0x6551 # <CJK> +0x6555 # <CJK> +0x6556 # <CJK> +0x6557 # <CJK> +0x6558 # <CJK> +0x6559 # <CJK> +0x655D # <CJK> +0x655E # <CJK> +0x6562 # <CJK> +0x6563 # <CJK> +0x6566 # <CJK> +0x656C # <CJK> +0x6570 # <CJK> +0x6572 # <CJK> +0x6574 # <CJK> +0x6575 # <CJK> +0x6577 # <CJK> +0x6578 # <CJK> +0x6582 # <CJK> +0x6583 # <CJK> +0x6587 # <CJK> +0x6588 # <CJK> +0x6589 # <CJK> +0x658C # <CJK> +0x658E # <CJK> +0x6590 # <CJK> +0x6591 # <CJK> +0x6597 # <CJK> +0x6599 # <CJK> +0x659B # <CJK> +0x659C # <CJK> +0x659F # <CJK> +0x65A1 # <CJK> +0x65A4 # <CJK> +0x65A5 # <CJK> +0x65A7 # <CJK> +0x65AB # <CJK> +0x65AC # <CJK> +0x65AD # <CJK> +0x65AF # <CJK> +0x65B0 # <CJK> +0x65B7 # <CJK> +0x65B9 # <CJK> +0x65BC # <CJK> +0x65BD # <CJK> +0x65C1 # <CJK> +0x65C3 # <CJK> +0x65C4 # <CJK> +0x65C5 # <CJK> +0x65C6 # <CJK> +0x65CB # <CJK> +0x65CC # <CJK> +0x65CF # <CJK> +0x65D2 # <CJK> +0x65D7 # <CJK> +0x65D9 # <CJK> +0x65DB # <CJK> +0x65E0 # <CJK> +0x65E1 # <CJK> +0x65E2 # <CJK> +0x65E5 # <CJK> +0x65E6 # <CJK> +0x65E7 # <CJK> +0x65E8 # <CJK> +0x65E9 # <CJK> +0x65EC # <CJK> +0x65ED # <CJK> +0x65F1 # <CJK> +0x65FA # <CJK> +0x65FB # <CJK> +0x6602 # <CJK> +0x6603 # <CJK> +0x6606 # <CJK> +0x6607 # <CJK> +0x660A # <CJK> +0x660C # <CJK> +0x660E # <CJK> +0x660F # <CJK> +0x6613 # <CJK> +0x6614 # <CJK> +0x661C # <CJK> +0x661F # <CJK> +0x6620 # <CJK> +0x6625 # <CJK> +0x6627 # <CJK> +0x6628 # <CJK> +0x662D # <CJK> +0x662F # <CJK> +0x6634 # <CJK> +0x6635 # <CJK> +0x6636 # <CJK> +0x663C # <CJK> +0x663F # <CJK> +0x6641 # <CJK> +0x6642 # <CJK> +0x6643 # <CJK> +0x6644 # <CJK> +0x6649 # <CJK> +0x664B # <CJK> +0x664F # <CJK> +0x6652 # <CJK> +0x665D # <CJK> +0x665E # <CJK> +0x665F # <CJK> +0x6662 # <CJK> +0x6664 # <CJK> +0x6666 # <CJK> +0x6667 # <CJK> +0x6668 # <CJK> +0x6669 # <CJK> +0x666E # <CJK> +0x666F # <CJK> +0x6670 # <CJK> +0x6674 # <CJK> +0x6676 # <CJK> +0x667A # <CJK> +0x6681 # <CJK> +0x6683 # <CJK> +0x6684 # <CJK> +0x6687 # <CJK> +0x6688 # <CJK> +0x6689 # <CJK> +0x668E # <CJK> +0x6691 # <CJK> +0x6696 # <CJK> +0x6697 # <CJK> +0x6698 # <CJK> +0x669D # <CJK> +0x66A2 # <CJK> +0x66A6 # <CJK> +0x66AB # <CJK> +0x66AE # <CJK> +0x66B4 # <CJK> +0x66B8 # <CJK> +0x66B9 # <CJK> +0x66BC # <CJK> +0x66BE # <CJK> +0x66C1 # <CJK> +0x66C4 # <CJK> +0x66C7 # <CJK> +0x66C9 # <CJK> +0x66D6 # <CJK> +0x66D9 # <CJK> +0x66DA # <CJK> +0x66DC # <CJK> +0x66DD # <CJK> +0x66E0 # <CJK> +0x66E6 # <CJK> +0x66E9 # <CJK> +0x66F0 # <CJK> +0x66F2 # <CJK> +0x66F3 # <CJK> +0x66F4 # <CJK> +0x66F5 # <CJK> +0x66F7 # <CJK> +0x66F8 # <CJK> +0x66F9 # <CJK> +0x66FC # <CJK> +0x66FD # <CJK> +0x66FE # <CJK> +0x66FF # <CJK> +0x6700 # <CJK> +0x6703 # <CJK> +0x6708 # <CJK> +0x6709 # <CJK> +0x670B # <CJK> +0x670D # <CJK> +0x670F # <CJK> +0x6714 # <CJK> +0x6715 # <CJK> +0x6716 # <CJK> +0x6717 # <CJK> +0x671B # <CJK> +0x671D # <CJK> +0x671E # <CJK> +0x671F # <CJK> +0x6726 # <CJK> +0x6727 # <CJK> +0x6728 # <CJK> +0x672A # <CJK> +0x672B # <CJK> +0x672C # <CJK> +0x672D # <CJK> +0x672E # <CJK> +0x6731 # <CJK> +0x6734 # <CJK> +0x6736 # <CJK> +0x6737 # <CJK> +0x6738 # <CJK> +0x673A # <CJK> +0x673D # <CJK> +0x673F # <CJK> +0x6741 # <CJK> +0x6746 # <CJK> +0x6749 # <CJK> +0x674E # <CJK> +0x674F # <CJK> +0x6750 # <CJK> +0x6751 # <CJK> +0x6753 # <CJK> +0x6756 # <CJK> +0x6759 # <CJK> +0x675C # <CJK> +0x675E # <CJK> +0x675F # <CJK> +0x6760 # <CJK> +0x6761 # <CJK> +0x6762 # <CJK> +0x6763 # <CJK> +0x6764 # <CJK> +0x6765 # <CJK> +0x676A # <CJK> +0x676D # <CJK> +0x676F # <CJK> +0x6770 # <CJK> +0x6771 # <CJK> +0x6772 # <CJK> +0x6773 # <CJK> +0x6775 # <CJK> +0x6777 # <CJK> +0x677C # <CJK> +0x677E # <CJK> +0x677F # <CJK> +0x6785 # <CJK> +0x6787 # <CJK> +0x6789 # <CJK> +0x678B # <CJK> +0x678C # <CJK> +0x6790 # <CJK> +0x6795 # <CJK> +0x6797 # <CJK> +0x679A # <CJK> +0x679C # <CJK> +0x679D # <CJK> +0x67A0 # <CJK> +0x67A1 # <CJK> +0x67A2 # <CJK> +0x67A6 # <CJK> +0x67A9 # <CJK> +0x67AF # <CJK> +0x67B3 # <CJK> +0x67B4 # <CJK> +0x67B6 # <CJK> +0x67B7 # <CJK> +0x67B8 # <CJK> +0x67B9 # <CJK> +0x67C1 # <CJK> +0x67C4 # <CJK> +0x67C6 # <CJK> +0x67CA # <CJK> +0x67CE # <CJK> +0x67CF # <CJK> +0x67D0 # <CJK> +0x67D1 # <CJK> +0x67D3 # <CJK> +0x67D4 # <CJK> +0x67D8 # <CJK> +0x67DA # <CJK> +0x67DD # <CJK> +0x67DE # <CJK> +0x67E2 # <CJK> +0x67E4 # <CJK> +0x67E7 # <CJK> +0x67E9 # <CJK> +0x67EC # <CJK> +0x67EE # <CJK> +0x67EF # <CJK> +0x67F1 # <CJK> +0x67F3 # <CJK> +0x67F4 # <CJK> +0x67F5 # <CJK> +0x67FB # <CJK> +0x67FE # <CJK> +0x67FF # <CJK> +0x6802 # <CJK> +0x6803 # <CJK> +0x6804 # <CJK> +0x6813 # <CJK> +0x6816 # <CJK> +0x6817 # <CJK> +0x681E # <CJK> +0x6821 # <CJK> +0x6822 # <CJK> +0x6829 # <CJK> +0x682A # <CJK> +0x682B # <CJK> +0x6832 # <CJK> +0x6834 # <CJK> +0x6838 # <CJK> +0x6839 # <CJK> +0x683C # <CJK> +0x683D # <CJK> +0x6840 # <CJK> +0x6841 # <CJK> +0x6842 # <CJK> +0x6843 # <CJK> +0x6846 # <CJK> +0x6848 # <CJK> +0x684D # <CJK> +0x684E # <CJK> +0x6850 # <CJK> +0x6851 # <CJK> +0x6853 # <CJK> +0x6854 # <CJK> +0x6859 # <CJK> +0x685C # <CJK> +0x685D # <CJK> +0x685F # <CJK> +0x6863 # <CJK> +0x6867 # <CJK> +0x6874 # <CJK> +0x6876 # <CJK> +0x6877 # <CJK> +0x687E # <CJK> +0x687F # <CJK> +0x6881 # <CJK> +0x6883 # <CJK> +0x6885 # <CJK> +0x688D # <CJK> +0x688F # <CJK> +0x6893 # <CJK> +0x6894 # <CJK> +0x6897 # <CJK> +0x689B # <CJK> +0x689D # <CJK> +0x689F # <CJK> +0x68A0 # <CJK> +0x68A2 # <CJK> +0x68A6 # <CJK> +0x68A7 # <CJK> +0x68A8 # <CJK> +0x68AD # <CJK> +0x68AF # <CJK> +0x68B0 # <CJK> +0x68B1 # <CJK> +0x68B3 # <CJK> +0x68B5 # <CJK> +0x68B6 # <CJK> +0x68B9 # <CJK> +0x68BA # <CJK> +0x68BC # <CJK> +0x68C4 # <CJK> +0x68C6 # <CJK> +0x68C9 # <CJK> +0x68CA # <CJK> +0x68CB # <CJK> +0x68CD # <CJK> +0x68D2 # <CJK> +0x68D4 # <CJK> +0x68D5 # <CJK> +0x68D7 # <CJK> +0x68D8 # <CJK> +0x68DA # <CJK> +0x68DF # <CJK> +0x68E0 # <CJK> +0x68E1 # <CJK> +0x68E3 # <CJK> +0x68E7 # <CJK> +0x68EE # <CJK> +0x68EF # <CJK> +0x68F2 # <CJK> +0x68F9 # <CJK> +0x68FA # <CJK> +0x6900 # <CJK> +0x6901 # <CJK> +0x6904 # <CJK> +0x6905 # <CJK> +0x6908 # <CJK> +0x690B # <CJK> +0x690C # <CJK> +0x690D # <CJK> +0x690E # <CJK> +0x690F # <CJK> +0x6912 # <CJK> +0x6919 # <CJK> +0x691A # <CJK> +0x691B # <CJK> +0x691C # <CJK> +0x6921 # <CJK> +0x6922 # <CJK> +0x6923 # <CJK> +0x6925 # <CJK> +0x6926 # <CJK> +0x6928 # <CJK> +0x692A # <CJK> +0x6930 # <CJK> +0x6934 # <CJK> +0x6936 # <CJK> +0x6939 # <CJK> +0x693D # <CJK> +0x693F # <CJK> +0x694A # <CJK> +0x6953 # <CJK> +0x6954 # <CJK> +0x6955 # <CJK> +0x6959 # <CJK> +0x695A # <CJK> +0x695C # <CJK> +0x695D # <CJK> +0x695E # <CJK> +0x6960 # <CJK> +0x6961 # <CJK> +0x6962 # <CJK> +0x696A # <CJK> +0x696B # <CJK> +0x696D # <CJK> +0x696E # <CJK> +0x696F # <CJK> +0x6973 # <CJK> +0x6974 # <CJK> +0x6975 # <CJK> +0x6977 # <CJK> +0x6978 # <CJK> +0x6979 # <CJK> +0x697C # <CJK> +0x697D # <CJK> +0x697E # <CJK> +0x6981 # <CJK> +0x6982 # <CJK> +0x698A # <CJK> +0x698E # <CJK> +0x6991 # <CJK> +0x6994 # <CJK> +0x6995 # <CJK> +0x699B # <CJK> +0x699C # <CJK> +0x69A0 # <CJK> +0x69A7 # <CJK> +0x69AE # <CJK> +0x69B1 # <CJK> +0x69B2 # <CJK> +0x69B4 # <CJK> +0x69BB # <CJK> +0x69BE # <CJK> +0x69BF # <CJK> +0x69C1 # <CJK> +0x69C3 # <CJK> +0x69C7 # <CJK> +0x69CA # <CJK> +0x69CB # <CJK> +0x69CC # <CJK> +0x69CD # <CJK> +0x69CE # <CJK> +0x69D0 # <CJK> +0x69D3 # <CJK> +0x69D8 # <CJK> +0x69D9 # <CJK> +0x69DD # <CJK> +0x69DE # <CJK> +0x69E7 # <CJK> +0x69E8 # <CJK> +0x69EB # <CJK> +0x69ED # <CJK> +0x69F2 # <CJK> +0x69F9 # <CJK> +0x69FB # <CJK> +0x69FD # <CJK> +0x69FF # <CJK> +0x6A02 # <CJK> +0x6A05 # <CJK> +0x6A0A # <CJK> +0x6A0B # <CJK> +0x6A0C # <CJK> +0x6A12 # <CJK> +0x6A13 # <CJK> +0x6A14 # <CJK> +0x6A17 # <CJK> +0x6A19 # <CJK> +0x6A1B # <CJK> +0x6A1E # <CJK> +0x6A1F # <CJK> +0x6A21 # <CJK> +0x6A22 # <CJK> +0x6A23 # <CJK> +0x6A29 # <CJK> +0x6A2A # <CJK> +0x6A2B # <CJK> +0x6A2E # <CJK> +0x6A35 # <CJK> +0x6A36 # <CJK> +0x6A38 # <CJK> +0x6A39 # <CJK> +0x6A3A # <CJK> +0x6A3D # <CJK> +0x6A44 # <CJK> +0x6A47 # <CJK> +0x6A48 # <CJK> +0x6A4B # <CJK> +0x6A58 # <CJK> +0x6A59 # <CJK> +0x6A5F # <CJK> +0x6A61 # <CJK> +0x6A62 # <CJK> +0x6A66 # <CJK> +0x6A72 # <CJK> +0x6A78 # <CJK> +0x6A7F # <CJK> +0x6A80 # <CJK> +0x6A84 # <CJK> +0x6A8D # <CJK> +0x6A8E # <CJK> +0x6A90 # <CJK> +0x6A97 # <CJK> +0x6A9C # <CJK> +0x6AA0 # <CJK> +0x6AA2 # <CJK> +0x6AA3 # <CJK> +0x6AAA # <CJK> +0x6AAC # <CJK> +0x6AAE # <CJK> +0x6AB3 # <CJK> +0x6AB8 # <CJK> +0x6ABB # <CJK> +0x6AC1 # <CJK> +0x6AC2 # <CJK> +0x6AC3 # <CJK> +0x6AD1 # <CJK> +0x6AD3 # <CJK> +0x6ADA # <CJK> +0x6ADB # <CJK> +0x6ADE # <CJK> +0x6ADF # <CJK> +0x6AE8 # <CJK> +0x6AEA # <CJK> +0x6AFA # <CJK> +0x6AFB # <CJK> +0x6B04 # <CJK> +0x6B05 # <CJK> +0x6B0A # <CJK> +0x6B12 # <CJK> +0x6B16 # <CJK> +0x6B1D # <CJK> +0x6B1F # <CJK> +0x6B20 # <CJK> +0x6B21 # <CJK> +0x6B23 # <CJK> +0x6B27 # <CJK> +0x6B32 # <CJK> +0x6B37 # <CJK> +0x6B38 # <CJK> +0x6B39 # <CJK> +0x6B3A # <CJK> +0x6B3D # <CJK> +0x6B3E # <CJK> +0x6B43 # <CJK> +0x6B47 # <CJK> +0x6B49 # <CJK> +0x6B4C # <CJK> +0x6B4E # <CJK> +0x6B50 # <CJK> +0x6B53 # <CJK> +0x6B54 # <CJK> +0x6B59 # <CJK> +0x6B5B # <CJK> +0x6B5F # <CJK> +0x6B61 # <CJK> +0x6B62 # <CJK> +0x6B63 # <CJK> +0x6B64 # <CJK> +0x6B66 # <CJK> +0x6B69 # <CJK> +0x6B6A # <CJK> +0x6B6F # <CJK> +0x6B73 # <CJK> +0x6B74 # <CJK> +0x6B78 # <CJK> +0x6B79 # <CJK> +0x6B7B # <CJK> +0x6B7F # <CJK> +0x6B80 # <CJK> +0x6B83 # <CJK> +0x6B84 # <CJK> +0x6B86 # <CJK> +0x6B89 # <CJK> +0x6B8A # <CJK> +0x6B8B # <CJK> +0x6B8D # <CJK> +0x6B95 # <CJK> +0x6B96 # <CJK> +0x6B98 # <CJK> +0x6B9E # <CJK> +0x6BA4 # <CJK> +0x6BAA # <CJK> +0x6BAB # <CJK> +0x6BAF # <CJK> +0x6BB1 # <CJK> +0x6BB2 # <CJK> +0x6BB3 # <CJK> +0x6BB4 # <CJK> +0x6BB5 # <CJK> +0x6BB7 # <CJK> +0x6BBA # <CJK> +0x6BBB # <CJK> +0x6BBC # <CJK> +0x6BBF # <CJK> +0x6BC0 # <CJK> +0x6BC5 # <CJK> +0x6BC6 # <CJK> +0x6BCB # <CJK> +0x6BCD # <CJK> +0x6BCE # <CJK> +0x6BD2 # <CJK> +0x6BD3 # <CJK> +0x6BD4 # <CJK> +0x6BD8 # <CJK> +0x6BDB # <CJK> +0x6BDF # <CJK> +0x6BEB # <CJK> +0x6BEC # <CJK> +0x6BEF # <CJK> +0x6BF3 # <CJK> +0x6C08 # <CJK> +0x6C0F # <CJK> +0x6C11 # <CJK> +0x6C13 # <CJK> +0x6C14 # <CJK> +0x6C17 # <CJK> +0x6C1B # <CJK> +0x6C23 # <CJK> +0x6C24 # <CJK> +0x6C34 # <CJK> +0x6C37 # <CJK> +0x6C38 # <CJK> +0x6C3E # <CJK> +0x6C40 # <CJK> +0x6C41 # <CJK> +0x6C42 # <CJK> +0x6C4E # <CJK> +0x6C50 # <CJK> +0x6C55 # <CJK> +0x6C57 # <CJK> +0x6C5A # <CJK> +0x6C5D # <CJK> +0x6C5E # <CJK> +0x6C5F # <CJK> +0x6C60 # <CJK> +0x6C62 # <CJK> +0x6C68 # <CJK> +0x6C6A # <CJK> +0x6C70 # <CJK> +0x6C72 # <CJK> +0x6C73 # <CJK> +0x6C7A # <CJK> +0x6C7D # <CJK> +0x6C7E # <CJK> +0x6C81 # <CJK> +0x6C82 # <CJK> +0x6C83 # <CJK> +0x6C88 # <CJK> +0x6C8C # <CJK> +0x6C8D # <CJK> +0x6C90 # <CJK> +0x6C92 # <CJK> +0x6C93 # <CJK> +0x6C96 # <CJK> +0x6C99 # <CJK> +0x6C9A # <CJK> +0x6C9B # <CJK> +0x6CA1 # <CJK> +0x6CA2 # <CJK> +0x6CAB # <CJK> +0x6CAE # <CJK> +0x6CB1 # <CJK> +0x6CB3 # <CJK> +0x6CB8 # <CJK> +0x6CB9 # <CJK> +0x6CBA # <CJK> +0x6CBB # <CJK> +0x6CBC # <CJK> +0x6CBD # <CJK> +0x6CBE # <CJK> +0x6CBF # <CJK> +0x6CC1 # <CJK> +0x6CC4 # <CJK> +0x6CC5 # <CJK> +0x6CC9 # <CJK> +0x6CCA # <CJK> +0x6CCC # <CJK> +0x6CD3 # <CJK> +0x6CD5 # <CJK> +0x6CD7 # <CJK> +0x6CD9 # <CJK> +0x6CDB # <CJK> +0x6CDD # <CJK> +0x6CE1 # <CJK> +0x6CE2 # <CJK> +0x6CE3 # <CJK> +0x6CE5 # <CJK> +0x6CE8 # <CJK> +0x6CEA # <CJK> +0x6CEF # <CJK> +0x6CF0 # <CJK> +0x6CF1 # <CJK> +0x6CF3 # <CJK> +0x6D0B # <CJK> +0x6D0C # <CJK> +0x6D12 # <CJK> +0x6D17 # <CJK> +0x6D19 # <CJK> +0x6D1B # <CJK> +0x6D1E # <CJK> +0x6D1F # <CJK> +0x6D25 # <CJK> +0x6D29 # <CJK> +0x6D2A # <CJK> +0x6D2B # <CJK> +0x6D32 # <CJK> +0x6D33 # <CJK> +0x6D35 # <CJK> +0x6D36 # <CJK> +0x6D38 # <CJK> +0x6D3B # <CJK> +0x6D3D # <CJK> +0x6D3E # <CJK> +0x6D41 # <CJK> +0x6D44 # <CJK> +0x6D45 # <CJK> +0x6D59 # <CJK> +0x6D5A # <CJK> +0x6D5C # <CJK> +0x6D63 # <CJK> +0x6D64 # <CJK> +0x6D66 # <CJK> +0x6D69 # <CJK> +0x6D6A # <CJK> +0x6D6C # <CJK> +0x6D6E # <CJK> +0x6D74 # <CJK> +0x6D77 # <CJK> +0x6D78 # <CJK> +0x6D79 # <CJK> +0x6D85 # <CJK> +0x6D88 # <CJK> +0x6D8C # <CJK> +0x6D8E # <CJK> +0x6D93 # <CJK> +0x6D95 # <CJK> +0x6D99 # <CJK> +0x6D9B # <CJK> +0x6D9C # <CJK> +0x6DAF # <CJK> +0x6DB2 # <CJK> +0x6DB5 # <CJK> +0x6DB8 # <CJK> +0x6DBC # <CJK> +0x6DC0 # <CJK> +0x6DC5 # <CJK> +0x6DC6 # <CJK> +0x6DC7 # <CJK> +0x6DCB # <CJK> +0x6DCC # <CJK> +0x6DD1 # <CJK> +0x6DD2 # <CJK> +0x6DD5 # <CJK> +0x6DD8 # <CJK> +0x6DD9 # <CJK> +0x6DDE # <CJK> +0x6DE1 # <CJK> +0x6DE4 # <CJK> +0x6DE6 # <CJK> +0x6DE8 # <CJK> +0x6DEA # <CJK> +0x6DEB # <CJK> +0x6DEC # <CJK> +0x6DEE # <CJK> +0x6DF1 # <CJK> +0x6DF3 # <CJK> +0x6DF5 # <CJK> +0x6DF7 # <CJK> +0x6DF9 # <CJK> +0x6DFA # <CJK> +0x6DFB # <CJK> +0x6E05 # <CJK> +0x6E07 # <CJK> +0x6E08 # <CJK> +0x6E09 # <CJK> +0x6E0A # <CJK> +0x6E0B # <CJK> +0x6E13 # <CJK> +0x6E15 # <CJK> +0x6E19 # <CJK> +0x6E1A # <CJK> +0x6E1B # <CJK> +0x6E1D # <CJK> +0x6E1F # <CJK> +0x6E20 # <CJK> +0x6E21 # <CJK> +0x6E23 # <CJK> +0x6E24 # <CJK> +0x6E25 # <CJK> +0x6E26 # <CJK> +0x6E29 # <CJK> +0x6E2B # <CJK> +0x6E2C # <CJK> +0x6E2D # <CJK> +0x6E2E # <CJK> +0x6E2F # <CJK> +0x6E38 # <CJK> +0x6E3A # <CJK> +0x6E3E # <CJK> +0x6E43 # <CJK> +0x6E4A # <CJK> +0x6E4D # <CJK> +0x6E4E # <CJK> +0x6E56 # <CJK> +0x6E58 # <CJK> +0x6E5B # <CJK> +0x6E5F # <CJK> +0x6E67 # <CJK> +0x6E6B # <CJK> +0x6E6E # <CJK> +0x6E6F # <CJK> +0x6E72 # <CJK> +0x6E76 # <CJK> +0x6E7E # <CJK> +0x6E7F # <CJK> +0x6E80 # <CJK> +0x6E82 # <CJK> +0x6E8C # <CJK> +0x6E8F # <CJK> +0x6E90 # <CJK> +0x6E96 # <CJK> +0x6E98 # <CJK> +0x6E9C # <CJK> +0x6E9D # <CJK> +0x6E9F # <CJK> +0x6EA2 # <CJK> +0x6EA5 # <CJK> +0x6EAA # <CJK> +0x6EAF # <CJK> +0x6EB2 # <CJK> +0x6EB6 # <CJK> +0x6EB7 # <CJK> +0x6EBA # <CJK> +0x6EBD # <CJK> +0x6EC2 # <CJK> +0x6EC4 # <CJK> +0x6EC5 # <CJK> +0x6EC9 # <CJK> +0x6ECB # <CJK> +0x6ECC # <CJK> +0x6ED1 # <CJK> +0x6ED3 # <CJK> +0x6ED4 # <CJK> +0x6ED5 # <CJK> +0x6EDD # <CJK> +0x6EDE # <CJK> +0x6EEC # <CJK> +0x6EEF # <CJK> +0x6EF2 # <CJK> +0x6EF4 # <CJK> +0x6EF7 # <CJK> +0x6EF8 # <CJK> +0x6EFE # <CJK> +0x6EFF # <CJK> +0x6F01 # <CJK> +0x6F02 # <CJK> +0x6F06 # <CJK> +0x6F09 # <CJK> +0x6F0F # <CJK> +0x6F11 # <CJK> +0x6F13 # <CJK> +0x6F14 # <CJK> +0x6F15 # <CJK> +0x6F20 # <CJK> +0x6F22 # <CJK> +0x6F23 # <CJK> +0x6F2B # <CJK> +0x6F2C # <CJK> +0x6F31 # <CJK> +0x6F32 # <CJK> +0x6F38 # <CJK> +0x6F3E # <CJK> +0x6F3F # <CJK> +0x6F41 # <CJK> +0x6F45 # <CJK> +0x6F54 # <CJK> +0x6F58 # <CJK> +0x6F5B # <CJK> +0x6F5C # <CJK> +0x6F5F # <CJK> +0x6F64 # <CJK> +0x6F66 # <CJK> +0x6F6D # <CJK> +0x6F6E # <CJK> +0x6F6F # <CJK> +0x6F70 # <CJK> +0x6F74 # <CJK> +0x6F78 # <CJK> +0x6F7A # <CJK> +0x6F7C # <CJK> +0x6F80 # <CJK> +0x6F81 # <CJK> +0x6F82 # <CJK> +0x6F84 # <CJK> +0x6F86 # <CJK> +0x6F8E # <CJK> +0x6F91 # <CJK> +0x6F97 # <CJK> +0x6FA1 # <CJK> +0x6FA3 # <CJK> +0x6FA4 # <CJK> +0x6FAA # <CJK> +0x6FB1 # <CJK> +0x6FB3 # <CJK> +0x6FB9 # <CJK> +0x6FC0 # <CJK> +0x6FC1 # <CJK> +0x6FC2 # <CJK> +0x6FC3 # <CJK> +0x6FC6 # <CJK> +0x6FD4 # <CJK> +0x6FD5 # <CJK> +0x6FD8 # <CJK> +0x6FDB # <CJK> +0x6FDF # <CJK> +0x6FE0 # <CJK> +0x6FE1 # <CJK> +0x6FE4 # <CJK> +0x6FEB # <CJK> +0x6FEC # <CJK> +0x6FEE # <CJK> +0x6FEF # <CJK> +0x6FF1 # <CJK> +0x6FF3 # <CJK> +0x6FF6 # <CJK> +0x6FFA # <CJK> +0x6FFE # <CJK> +0x7001 # <CJK> +0x7009 # <CJK> +0x700B # <CJK> +0x700F # <CJK> +0x7011 # <CJK> +0x7015 # <CJK> +0x7018 # <CJK> +0x701A # <CJK> +0x701B # <CJK> +0x701D # <CJK> +0x701E # <CJK> +0x701F # <CJK> +0x7026 # <CJK> +0x7027 # <CJK> +0x702C # <CJK> +0x7030 # <CJK> +0x7032 # <CJK> +0x703E # <CJK> +0x704C # <CJK> +0x7051 # <CJK> +0x7058 # <CJK> +0x7063 # <CJK> +0x706B # <CJK> +0x706F # <CJK> +0x7070 # <CJK> +0x7078 # <CJK> +0x707C # <CJK> +0x707D # <CJK> +0x7089 # <CJK> +0x708A # <CJK> +0x708E # <CJK> +0x7092 # <CJK> +0x7099 # <CJK> +0x70AC # <CJK> +0x70AD # <CJK> +0x70AE # <CJK> +0x70AF # <CJK> +0x70B3 # <CJK> +0x70B8 # <CJK> +0x70B9 # <CJK> +0x70BA # <CJK> +0x70C8 # <CJK> +0x70CB # <CJK> +0x70CF # <CJK> +0x70D9 # <CJK> +0x70DD # <CJK> +0x70DF # <CJK> +0x70F1 # <CJK> +0x70F9 # <CJK> +0x70FD # <CJK> +0x7109 # <CJK> +0x7114 # <CJK> +0x7119 # <CJK> +0x711A # <CJK> +0x711C # <CJK> +0x7121 # <CJK> +0x7126 # <CJK> +0x7136 # <CJK> +0x713C # <CJK> +0x7149 # <CJK> +0x714C # <CJK> +0x714E # <CJK> +0x7155 # <CJK> +0x7156 # <CJK> +0x7159 # <CJK> +0x7162 # <CJK> +0x7164 # <CJK> +0x7165 # <CJK> +0x7166 # <CJK> +0x7167 # <CJK> +0x7169 # <CJK> +0x716C # <CJK> +0x716E # <CJK> +0x717D # <CJK> +0x7184 # <CJK> +0x7188 # <CJK> +0x718A # <CJK> +0x718F # <CJK> +0x7194 # <CJK> +0x7195 # <CJK> +#0x7199 # <CJK> # not in kochi fonts +0x719F # <CJK> +0x71A8 # <CJK> +0x71AC # <CJK> +0x71B1 # <CJK> +0x71B9 # <CJK> +0x71BE # <CJK> +0x71C3 # <CJK> +0x71C8 # <CJK> +0x71C9 # <CJK> +0x71CE # <CJK> +0x71D0 # <CJK> +0x71D2 # <CJK> +0x71D4 # <CJK> +0x71D5 # <CJK> +0x71D7 # <CJK> +0x71DF # <CJK> +0x71E0 # <CJK> +0x71E5 # <CJK> +0x71E6 # <CJK> +0x71E7 # <CJK> +0x71EC # <CJK> +0x71ED # <CJK> +0x71EE # <CJK> +0x71F5 # <CJK> +0x71F9 # <CJK> +0x71FB # <CJK> +0x71FC # <CJK> +0x71FF # <CJK> +0x7206 # <CJK> +0x720D # <CJK> +0x7210 # <CJK> +0x721B # <CJK> +0x7228 # <CJK> +0x722A # <CJK> +0x722C # <CJK> +0x722D # <CJK> +0x7230 # <CJK> +0x7232 # <CJK> +0x7235 # <CJK> +0x7236 # <CJK> +0x723A # <CJK> +0x723B # <CJK> +0x723C # <CJK> +0x723D # <CJK> +0x723E # <CJK> +0x723F # <CJK> +0x7240 # <CJK> +0x7246 # <CJK> +0x7247 # <CJK> +0x7248 # <CJK> +0x724B # <CJK> +0x724C # <CJK> +0x7252 # <CJK> +0x7258 # <CJK> +0x7259 # <CJK> +0x725B # <CJK> +0x725D # <CJK> +0x725F # <CJK> +0x7261 # <CJK> +0x7262 # <CJK> +0x7267 # <CJK> +0x7269 # <CJK> +0x7272 # <CJK> +0x7274 # <CJK> +0x7279 # <CJK> +0x727D # <CJK> +0x727E # <CJK> +0x7280 # <CJK> +0x7281 # <CJK> +0x7282 # <CJK> +0x7287 # <CJK> +0x7292 # <CJK> +0x7296 # <CJK> +0x72A0 # <CJK> +0x72A2 # <CJK> +0x72A7 # <CJK> +0x72AC # <CJK> +0x72AF # <CJK> +0x72B2 # <CJK> +0x72B6 # <CJK> +0x72B9 # <CJK> +0x72C2 # <CJK> +0x72C3 # <CJK> +0x72C4 # <CJK> +0x72C6 # <CJK> +0x72CE # <CJK> +0x72D0 # <CJK> +0x72D2 # <CJK> +0x72D7 # <CJK> +0x72D9 # <CJK> +0x72DB # <CJK> +0x72E0 # <CJK> +0x72E1 # <CJK> +0x72E2 # <CJK> +0x72E9 # <CJK> +0x72EC # <CJK> +0x72ED # <CJK> +0x72F7 # <CJK> +0x72F8 # <CJK> +0x72F9 # <CJK> +0x72FC # <CJK> +0x72FD # <CJK> +0x730A # <CJK> +0x7316 # <CJK> +0x7317 # <CJK> +0x731B # <CJK> +0x731C # <CJK> +0x731D # <CJK> +0x731F # <CJK> +0x7325 # <CJK> +0x7329 # <CJK> +0x732A # <CJK> +0x732B # <CJK> +0x732E # <CJK> +0x732F # <CJK> +0x7334 # <CJK> +0x7336 # <CJK> +0x7337 # <CJK> +0x733E # <CJK> +0x733F # <CJK> +0x7344 # <CJK> +0x7345 # <CJK> +0x734E # <CJK> +0x734F # <CJK> +0x7357 # <CJK> +0x7363 # <CJK> +0x7368 # <CJK> +0x736A # <CJK> +0x7370 # <CJK> +0x7372 # <CJK> +0x7375 # <CJK> +0x7378 # <CJK> +0x737A # <CJK> +0x737B # <CJK> +0x7384 # <CJK> +0x7387 # <CJK> +0x7389 # <CJK> +0x738B # <CJK> +0x7396 # <CJK> +0x73A9 # <CJK> +0x73B2 # <CJK> +0x73B3 # <CJK> +0x73BB # <CJK> +0x73C0 # <CJK> +0x73C2 # <CJK> +0x73C8 # <CJK> +0x73CA # <CJK> +0x73CD # <CJK> +0x73CE # <CJK> +0x73DE # <CJK> +0x73E0 # <CJK> +0x73E5 # <CJK> +0x73EA # <CJK> +0x73ED # <CJK> +0x73EE # <CJK> +0x73F1 # <CJK> +0x73F8 # <CJK> +0x73FE # <CJK> +0x7403 # <CJK> +0x7405 # <CJK> +0x7406 # <CJK> +0x7409 # <CJK> +0x7422 # <CJK> +0x7425 # <CJK> +0x7432 # <CJK> +0x7433 # <CJK> +0x7434 # <CJK> +0x7435 # <CJK> +0x7436 # <CJK> +0x743A # <CJK> +0x743F # <CJK> +0x7441 # <CJK> +0x7455 # <CJK> +0x7459 # <CJK> +0x745A # <CJK> +0x745B # <CJK> +0x745C # <CJK> +0x745E # <CJK> +0x745F # <CJK> +0x7460 # <CJK> +0x7463 # <CJK> +0x7464 # <CJK> +0x7469 # <CJK> +0x746A # <CJK> +0x746F # <CJK> +0x7470 # <CJK> +0x7473 # <CJK> +0x7476 # <CJK> +0x747E # <CJK> +0x7483 # <CJK> +0x748B # <CJK> +0x749E # <CJK> +0x74A2 # <CJK> +0x74A7 # <CJK> +0x74B0 # <CJK> +0x74BD # <CJK> +0x74CA # <CJK> +0x74CF # <CJK> +0x74D4 # <CJK> +0x74DC # <CJK> +0x74E0 # <CJK> +0x74E2 # <CJK> +0x74E3 # <CJK> +0x74E6 # <CJK> +0x74E7 # <CJK> +0x74E9 # <CJK> +0x74EE # <CJK> +0x74F0 # <CJK> +0x74F1 # <CJK> +0x74F2 # <CJK> +0x74F6 # <CJK> +0x74F7 # <CJK> +0x74F8 # <CJK> +0x7503 # <CJK> +0x7504 # <CJK> +0x7505 # <CJK> +0x750C # <CJK> +0x750D # <CJK> +0x750E # <CJK> +0x7511 # <CJK> +0x7513 # <CJK> +0x7515 # <CJK> +0x7518 # <CJK> +0x751A # <CJK> +0x751C # <CJK> +0x751E # <CJK> +0x751F # <CJK> +0x7523 # <CJK> +0x7525 # <CJK> +0x7526 # <CJK> +0x7528 # <CJK> +0x752B # <CJK> +0x752C # <CJK> +0x7530 # <CJK> +0x7531 # <CJK> +0x7532 # <CJK> +0x7533 # <CJK> +0x7537 # <CJK> +0x7538 # <CJK> +0x753A # <CJK> +0x753B # <CJK> +0x753C # <CJK> +0x7544 # <CJK> +0x7546 # <CJK> +0x7549 # <CJK> +0x754A # <CJK> +0x754B # <CJK> +0x754C # <CJK> +0x754D # <CJK> +0x754F # <CJK> +0x7551 # <CJK> +0x7554 # <CJK> +0x7559 # <CJK> +0x755A # <CJK> +0x755B # <CJK> +0x755C # <CJK> +0x755D # <CJK> +0x7560 # <CJK> +0x7562 # <CJK> +0x7564 # <CJK> +0x7565 # <CJK> +0x7566 # <CJK> +0x7567 # <CJK> +0x7569 # <CJK> +0x756A # <CJK> +0x756B # <CJK> +0x756D # <CJK> +0x7570 # <CJK> +0x7573 # <CJK> +0x7574 # <CJK> +0x7576 # <CJK> +0x7577 # <CJK> +0x7578 # <CJK> +0x757F # <CJK> +0x7582 # <CJK> +0x7586 # <CJK> +0x7587 # <CJK> +0x7589 # <CJK> +0x758A # <CJK> +0x758B # <CJK> +0x758E # <CJK> +0x758F # <CJK> +0x7591 # <CJK> +0x7594 # <CJK> +0x759A # <CJK> +0x759D # <CJK> +0x75A3 # <CJK> +0x75A5 # <CJK> +0x75AB # <CJK> +0x75B1 # <CJK> +0x75B2 # <CJK> +0x75B3 # <CJK> +0x75B5 # <CJK> +0x75B8 # <CJK> +0x75B9 # <CJK> +0x75BC # <CJK> +0x75BD # <CJK> +0x75BE # <CJK> +0x75C2 # <CJK> +0x75C3 # <CJK> +0x75C5 # <CJK> +0x75C7 # <CJK> +0x75CA # <CJK> +0x75CD # <CJK> +0x75D2 # <CJK> +0x75D4 # <CJK> +0x75D5 # <CJK> +0x75D8 # <CJK> +0x75D9 # <CJK> +0x75DB # <CJK> +0x75DE # <CJK> +0x75E2 # <CJK> +0x75E3 # <CJK> +0x75E9 # <CJK> +0x75F0 # <CJK> +0x75F2 # <CJK> +0x75F3 # <CJK> +0x75F4 # <CJK> +0x75FA # <CJK> +0x75FC # <CJK> +0x75FE # <CJK> +0x75FF # <CJK> +0x7601 # <CJK> +0x7609 # <CJK> +0x760B # <CJK> +0x760D # <CJK> +0x761F # <CJK> +0x7620 # <CJK> +0x7621 # <CJK> +0x7622 # <CJK> +0x7624 # <CJK> +0x7627 # <CJK> +0x7630 # <CJK> +0x7634 # <CJK> +0x763B # <CJK> +0x7642 # <CJK> +0x7646 # <CJK> +0x7647 # <CJK> +0x7648 # <CJK> +0x764C # <CJK> +0x7652 # <CJK> +0x7656 # <CJK> +0x7658 # <CJK> +0x765C # <CJK> +0x7661 # <CJK> +0x7662 # <CJK> +0x7667 # <CJK> +0x7668 # <CJK> +0x7669 # <CJK> +0x766A # <CJK> +0x766C # <CJK> +0x7670 # <CJK> +0x7672 # <CJK> +0x7676 # <CJK> +0x7678 # <CJK> +0x767A # <CJK> +0x767B # <CJK> +0x767C # <CJK> +0x767D # <CJK> +0x767E # <CJK> +0x7680 # <CJK> +0x7683 # <CJK> +0x7684 # <CJK> +0x7686 # <CJK> +0x7687 # <CJK> +0x7688 # <CJK> +0x768B # <CJK> +0x768E # <CJK> +0x7690 # <CJK> +0x7693 # <CJK> +0x7696 # <CJK> +0x7699 # <CJK> +0x769A # <CJK> +0x76AE # <CJK> +0x76B0 # <CJK> +0x76B4 # <CJK> +0x76B7 # <CJK> +0x76B8 # <CJK> +0x76B9 # <CJK> +0x76BA # <CJK> +0x76BF # <CJK> +0x76C2 # <CJK> +0x76C3 # <CJK> +0x76C6 # <CJK> +0x76C8 # <CJK> +0x76CA # <CJK> +0x76CD # <CJK> +0x76D2 # <CJK> +0x76D6 # <CJK> +0x76D7 # <CJK> +0x76DB # <CJK> +0x76DC # <CJK> +0x76DE # <CJK> +0x76DF # <CJK> +0x76E1 # <CJK> +0x76E3 # <CJK> +0x76E4 # <CJK> +0x76E5 # <CJK> +0x76E7 # <CJK> +0x76EA # <CJK> +0x76EE # <CJK> +0x76F2 # <CJK> +0x76F4 # <CJK> +0x76F8 # <CJK> +0x76FB # <CJK> +0x76FE # <CJK> +0x7701 # <CJK> +0x7704 # <CJK> +0x7707 # <CJK> +0x7708 # <CJK> +0x7709 # <CJK> +0x770B # <CJK> +0x770C # <CJK> +0x771B # <CJK> +0x771E # <CJK> +0x771F # <CJK> +0x7720 # <CJK> +0x7724 # <CJK> +0x7725 # <CJK> +0x7726 # <CJK> +0x7729 # <CJK> +0x7737 # <CJK> +0x7738 # <CJK> +0x773A # <CJK> +0x773C # <CJK> +0x7740 # <CJK> +0x7747 # <CJK> +0x775A # <CJK> +0x775B # <CJK> +0x7761 # <CJK> +0x7763 # <CJK> +0x7765 # <CJK> +0x7766 # <CJK> +0x7768 # <CJK> +0x776B # <CJK> +0x7779 # <CJK> +0x777E # <CJK> +0x777F # <CJK> +0x778B # <CJK> +0x778E # <CJK> +0x7791 # <CJK> +0x779E # <CJK> +0x77A0 # <CJK> +0x77A5 # <CJK> +0x77AC # <CJK> +0x77AD # <CJK> +0x77B0 # <CJK> +0x77B3 # <CJK> +0x77B6 # <CJK> +0x77B9 # <CJK> +0x77BB # <CJK> +0x77BC # <CJK> +0x77BD # <CJK> +0x77BF # <CJK> +0x77C7 # <CJK> +0x77CD # <CJK> +0x77D7 # <CJK> +0x77DA # <CJK> +0x77DB # <CJK> +0x77DC # <CJK> +0x77E2 # <CJK> +0x77E3 # <CJK> +0x77E5 # <CJK> +0x77E7 # <CJK> +0x77E9 # <CJK> +0x77ED # <CJK> +0x77EE # <CJK> +0x77EF # <CJK> +0x77F3 # <CJK> +0x77FC # <CJK> +0x7802 # <CJK> +0x780C # <CJK> +0x7812 # <CJK> +0x7814 # <CJK> +0x7815 # <CJK> +0x7820 # <CJK> +0x7825 # <CJK> +0x7826 # <CJK> +0x7827 # <CJK> +0x7832 # <CJK> +0x7834 # <CJK> +0x783A # <CJK> +0x783F # <CJK> +0x7845 # <CJK> +0x785D # <CJK> +0x786B # <CJK> +0x786C # <CJK> +0x786F # <CJK> +0x7872 # <CJK> +0x7874 # <CJK> +0x787C # <CJK> +0x7881 # <CJK> +0x7886 # <CJK> +0x7887 # <CJK> +0x788C # <CJK> +0x788D # <CJK> +0x788E # <CJK> +0x7891 # <CJK> +0x7893 # <CJK> +0x7895 # <CJK> +0x7897 # <CJK> +0x789A # <CJK> +0x78A3 # <CJK> +0x78A7 # <CJK> +0x78A9 # <CJK> +0x78AA # <CJK> +0x78AF # <CJK> +0x78B5 # <CJK> +0x78BA # <CJK> +0x78BC # <CJK> +0x78BE # <CJK> +0x78C1 # <CJK> +0x78C5 # <CJK> +0x78C6 # <CJK> +0x78CA # <CJK> +0x78CB # <CJK> +0x78D0 # <CJK> +0x78D1 # <CJK> +0x78D4 # <CJK> +0x78DA # <CJK> +0x78E7 # <CJK> +0x78E8 # <CJK> +0x78EC # <CJK> +0x78EF # <CJK> +0x78F4 # <CJK> +0x78FD # <CJK> +0x7901 # <CJK> +0x7907 # <CJK> +0x790E # <CJK> +0x7911 # <CJK> +0x7912 # <CJK> +0x7919 # <CJK> +0x7926 # <CJK> +0x792A # <CJK> +0x792B # <CJK> +0x792C # <CJK> +0x793A # <CJK> +0x793C # <CJK> +0x793E # <CJK> +0x7940 # <CJK> +0x7941 # <CJK> +0x7947 # <CJK> +0x7948 # <CJK> +0x7949 # <CJK> +0x7950 # <CJK> +0x7953 # <CJK> +0x7955 # <CJK> +0x7956 # <CJK> +0x7957 # <CJK> +0x795A # <CJK> +0x795D # <CJK> +0x795E # <CJK> +0x795F # <CJK> +0x7960 # <CJK> +0x7962 # <CJK> +0x7965 # <CJK> +0x7968 # <CJK> +0x796D # <CJK> +0x7977 # <CJK> +0x797A # <CJK> +0x797F # <CJK> +0x7980 # <CJK> +0x7981 # <CJK> +0x7984 # <CJK> +0x7985 # <CJK> +0x798A # <CJK> +0x798D # <CJK> +0x798E # <CJK> +0x798F # <CJK> +0x799D # <CJK> +0x79A6 # <CJK> +0x79A7 # <CJK> +0x79AA # <CJK> +0x79AE # <CJK> +0x79B0 # <CJK> +0x79B3 # <CJK> +0x79B9 # <CJK> +0x79BA # <CJK> +0x79BD # <CJK> +0x79BE # <CJK> +0x79BF # <CJK> +0x79C0 # <CJK> +0x79C1 # <CJK> +0x79C9 # <CJK> +0x79CB # <CJK> +0x79D1 # <CJK> +0x79D2 # <CJK> +0x79D5 # <CJK> +0x79D8 # <CJK> +0x79DF # <CJK> +0x79E1 # <CJK> +0x79E3 # <CJK> +0x79E4 # <CJK> +0x79E6 # <CJK> +0x79E7 # <CJK> +0x79E9 # <CJK> +0x79EC # <CJK> +0x79F0 # <CJK> +0x79FB # <CJK> +0x7A00 # <CJK> +0x7A08 # <CJK> +0x7A0B # <CJK> +0x7A0D # <CJK> +0x7A0E # <CJK> +0x7A14 # <CJK> +0x7A17 # <CJK> +0x7A18 # <CJK> +0x7A19 # <CJK> +0x7A1A # <CJK> +0x7A1C # <CJK> +0x7A1F # <CJK> +0x7A20 # <CJK> +0x7A2E # <CJK> +0x7A31 # <CJK> +0x7A32 # <CJK> +0x7A37 # <CJK> +0x7A3B # <CJK> +0x7A3C # <CJK> +0x7A3D # <CJK> +0x7A3E # <CJK> +0x7A3F # <CJK> +0x7A40 # <CJK> +0x7A42 # <CJK> +0x7A43 # <CJK> +0x7A46 # <CJK> +0x7A49 # <CJK> +0x7A4D # <CJK> +0x7A4E # <CJK> +0x7A4F # <CJK> +0x7A50 # <CJK> +0x7A57 # <CJK> +0x7A61 # <CJK> +0x7A62 # <CJK> +0x7A63 # <CJK> +0x7A69 # <CJK> +0x7A6B # <CJK> +0x7A70 # <CJK> +0x7A74 # <CJK> +0x7A76 # <CJK> +0x7A79 # <CJK> +0x7A7A # <CJK> +0x7A7D # <CJK> +0x7A7F # <CJK> +0x7A81 # <CJK> +0x7A83 # <CJK> +0x7A84 # <CJK> +0x7A88 # <CJK> +0x7A92 # <CJK> +0x7A93 # <CJK> +0x7A95 # <CJK> +0x7A96 # <CJK> +0x7A97 # <CJK> +0x7A98 # <CJK> +0x7A9F # <CJK> +0x7AA9 # <CJK> +0x7AAA # <CJK> +0x7AAE # <CJK> +0x7AAF # <CJK> +0x7AB0 # <CJK> +0x7AB6 # <CJK> +0x7ABA # <CJK> +0x7ABF # <CJK> +0x7AC3 # <CJK> +0x7AC4 # <CJK> +0x7AC5 # <CJK> +0x7AC7 # <CJK> +0x7AC8 # <CJK> +0x7ACA # <CJK> +0x7ACB # <CJK> +0x7ACD # <CJK> +0x7ACF # <CJK> +0x7AD2 # <CJK> +0x7AD3 # <CJK> +0x7AD5 # <CJK> +0x7AD9 # <CJK> +0x7ADA # <CJK> +0x7ADC # <CJK> +0x7ADD # <CJK> +0x7ADF # <CJK> +0x7AE0 # <CJK> +0x7AE1 # <CJK> +0x7AE2 # <CJK> +0x7AE3 # <CJK> +0x7AE5 # <CJK> +0x7AE6 # <CJK> +0x7AEA # <CJK> +0x7AED # <CJK> +0x7AEF # <CJK> +0x7AF0 # <CJK> +0x7AF6 # <CJK> +0x7AF8 # <CJK> +0x7AF9 # <CJK> +0x7AFA # <CJK> +0x7AFF # <CJK> +0x7B02 # <CJK> +0x7B04 # <CJK> +0x7B06 # <CJK> +0x7B08 # <CJK> +0x7B0A # <CJK> +0x7B0B # <CJK> +0x7B0F # <CJK> +0x7B11 # <CJK> +0x7B18 # <CJK> +0x7B19 # <CJK> +0x7B1B # <CJK> +0x7B1E # <CJK> +0x7B20 # <CJK> +0x7B25 # <CJK> +0x7B26 # <CJK> +0x7B28 # <CJK> +0x7B2C # <CJK> +0x7B33 # <CJK> +0x7B35 # <CJK> +0x7B36 # <CJK> +0x7B39 # <CJK> +0x7B45 # <CJK> +0x7B46 # <CJK> +0x7B48 # <CJK> +0x7B49 # <CJK> +0x7B4B # <CJK> +0x7B4C # <CJK> +0x7B4D # <CJK> +0x7B4F # <CJK> +0x7B50 # <CJK> +0x7B51 # <CJK> +0x7B52 # <CJK> +0x7B54 # <CJK> +0x7B56 # <CJK> +0x7B5D # <CJK> +0x7B65 # <CJK> +0x7B67 # <CJK> +0x7B6C # <CJK> +0x7B6E # <CJK> +0x7B70 # <CJK> +0x7B71 # <CJK> +0x7B74 # <CJK> +0x7B75 # <CJK> +0x7B7A # <CJK> +0x7B86 # <CJK> +0x7B87 # <CJK> +0x7B8B # <CJK> +0x7B8D # <CJK> +0x7B8F # <CJK> +0x7B92 # <CJK> +0x7B94 # <CJK> +0x7B95 # <CJK> +0x7B97 # <CJK> +0x7B98 # <CJK> +0x7B99 # <CJK> +0x7B9A # <CJK> +0x7B9C # <CJK> +0x7B9D # <CJK> +0x7B9F # <CJK> +0x7BA1 # <CJK> +0x7BAA # <CJK> +0x7BAD # <CJK> +0x7BB1 # <CJK> +0x7BB4 # <CJK> +0x7BB8 # <CJK> +0x7BC0 # <CJK> +0x7BC1 # <CJK> +0x7BC4 # <CJK> +0x7BC6 # <CJK> +0x7BC7 # <CJK> +0x7BC9 # <CJK> +0x7BCB # <CJK> +0x7BCC # <CJK> +0x7BCF # <CJK> +0x7BDD # <CJK> +0x7BE0 # <CJK> +0x7BE4 # <CJK> +0x7BE5 # <CJK> +0x7BE6 # <CJK> +0x7BE9 # <CJK> +0x7BED # <CJK> +0x7BF3 # <CJK> +0x7BF6 # <CJK> +0x7BF7 # <CJK> +0x7C00 # <CJK> +0x7C07 # <CJK> +0x7C0D # <CJK> +0x7C11 # <CJK> +0x7C12 # <CJK> +0x7C13 # <CJK> +0x7C14 # <CJK> +0x7C17 # <CJK> +0x7C1F # <CJK> +0x7C21 # <CJK> +0x7C23 # <CJK> +0x7C27 # <CJK> +0x7C2A # <CJK> +0x7C2B # <CJK> +0x7C37 # <CJK> +0x7C38 # <CJK> +0x7C3D # <CJK> +0x7C3E # <CJK> +0x7C3F # <CJK> +0x7C40 # <CJK> +0x7C43 # <CJK> +0x7C4C # <CJK> +0x7C4D # <CJK> +0x7C4F # <CJK> +0x7C50 # <CJK> +0x7C54 # <CJK> +0x7C56 # <CJK> +0x7C58 # <CJK> +0x7C5F # <CJK> +0x7C60 # <CJK> +0x7C64 # <CJK> +0x7C65 # <CJK> +0x7C6C # <CJK> +0x7C73 # <CJK> +0x7C75 # <CJK> +0x7C7E # <CJK> +0x7C81 # <CJK> +0x7C82 # <CJK> +0x7C83 # <CJK> +0x7C89 # <CJK> +0x7C8B # <CJK> +0x7C8D # <CJK> +0x7C90 # <CJK> +0x7C92 # <CJK> +0x7C95 # <CJK> +0x7C97 # <CJK> +0x7C98 # <CJK> +0x7C9B # <CJK> +0x7C9F # <CJK> +0x7CA1 # <CJK> +0x7CA2 # <CJK> +0x7CA4 # <CJK> +0x7CA5 # <CJK> +0x7CA7 # <CJK> +0x7CA8 # <CJK> +0x7CAB # <CJK> +0x7CAD # <CJK> +0x7CAE # <CJK> +0x7CB1 # <CJK> +0x7CB2 # <CJK> +0x7CB3 # <CJK> +0x7CB9 # <CJK> +0x7CBD # <CJK> +0x7CBE # <CJK> +0x7CC0 # <CJK> +0x7CC2 # <CJK> +0x7CC5 # <CJK> +0x7CCA # <CJK> +0x7CCE # <CJK> +0x7CD2 # <CJK> +0x7CD6 # <CJK> +0x7CD8 # <CJK> +0x7CDC # <CJK> +0x7CDE # <CJK> +0x7CDF # <CJK> +0x7CE0 # <CJK> +0x7CE2 # <CJK> +0x7CE7 # <CJK> +0x7CEF # <CJK> +0x7CF2 # <CJK> +0x7CF4 # <CJK> +0x7CF6 # <CJK> +0x7CF8 # <CJK> +0x7CFA # <CJK> +0x7CFB # <CJK> +0x7CFE # <CJK> +0x7D00 # <CJK> +0x7D02 # <CJK> +0x7D04 # <CJK> +0x7D05 # <CJK> +0x7D06 # <CJK> +0x7D0A # <CJK> +0x7D0B # <CJK> +0x7D0D # <CJK> +0x7D10 # <CJK> +0x7D14 # <CJK> +0x7D15 # <CJK> +0x7D17 # <CJK> +0x7D18 # <CJK> +0x7D19 # <CJK> +0x7D1A # <CJK> +0x7D1B # <CJK> +0x7D1C # <CJK> +0x7D20 # <CJK> +0x7D21 # <CJK> +0x7D22 # <CJK> +0x7D2B # <CJK> +0x7D2C # <CJK> +0x7D2E # <CJK> +0x7D2F # <CJK> +0x7D30 # <CJK> +0x7D32 # <CJK> +0x7D33 # <CJK> +0x7D35 # <CJK> +0x7D39 # <CJK> +0x7D3A # <CJK> +0x7D3F # <CJK> +0x7D42 # <CJK> +0x7D43 # <CJK> +0x7D44 # <CJK> +0x7D45 # <CJK> +0x7D46 # <CJK> +0x7D4B # <CJK> +0x7D4C # <CJK> +0x7D4E # <CJK> +0x7D4F # <CJK> +0x7D50 # <CJK> +0x7D56 # <CJK> +0x7D5B # <CJK> +0x7D5E # <CJK> +0x7D61 # <CJK> +0x7D62 # <CJK> +0x7D63 # <CJK> +0x7D66 # <CJK> +0x7D68 # <CJK> +0x7D6E # <CJK> +0x7D71 # <CJK> +0x7D72 # <CJK> +0x7D73 # <CJK> +0x7D75 # <CJK> +0x7D76 # <CJK> +0x7D79 # <CJK> +0x7D7D # <CJK> +0x7D89 # <CJK> +0x7D8F # <CJK> +0x7D93 # <CJK> +0x7D99 # <CJK> +0x7D9A # <CJK> +0x7D9B # <CJK> +0x7D9C # <CJK> +0x7D9F # <CJK> +0x7DA2 # <CJK> +0x7DA3 # <CJK> +0x7DAB # <CJK> +0x7DAC # <CJK> +0x7DAD # <CJK> +0x7DAE # <CJK> +0x7DAF # <CJK> +0x7DB0 # <CJK> +0x7DB1 # <CJK> +0x7DB2 # <CJK> +0x7DB4 # <CJK> +0x7DB5 # <CJK> +0x7DB8 # <CJK> +0x7DBA # <CJK> +0x7DBB # <CJK> +0x7DBD # <CJK> +0x7DBE # <CJK> +0x7DBF # <CJK> +0x7DC7 # <CJK> +0x7DCA # <CJK> +0x7DCB # <CJK> +0x7DCF # <CJK> +0x7DD1 # <CJK> +0x7DD2 # <CJK> +0x7DD5 # <CJK> +0x7DD8 # <CJK> +0x7DDA # <CJK> +0x7DDC # <CJK> +0x7DDD # <CJK> +0x7DDE # <CJK> +0x7DE0 # <CJK> +0x7DE1 # <CJK> +0x7DE4 # <CJK> +0x7DE8 # <CJK> +0x7DE9 # <CJK> +0x7DEC # <CJK> +0x7DEF # <CJK> +0x7DF2 # <CJK> +0x7DF4 # <CJK> +0x7DFB # <CJK> +0x7E01 # <CJK> +0x7E04 # <CJK> +0x7E05 # <CJK> +0x7E09 # <CJK> +0x7E0A # <CJK> +0x7E0B # <CJK> +0x7E12 # <CJK> +0x7E1B # <CJK> +0x7E1E # <CJK> +0x7E1F # <CJK> +0x7E21 # <CJK> +0x7E22 # <CJK> +0x7E23 # <CJK> +0x7E26 # <CJK> +0x7E2B # <CJK> +0x7E2E # <CJK> +0x7E31 # <CJK> +0x7E32 # <CJK> +0x7E35 # <CJK> +0x7E37 # <CJK> +0x7E39 # <CJK> +0x7E3A # <CJK> +0x7E3B # <CJK> +0x7E3D # <CJK> +0x7E3E # <CJK> +0x7E41 # <CJK> +0x7E43 # <CJK> +0x7E46 # <CJK> +0x7E4A # <CJK> +0x7E4B # <CJK> +0x7E4D # <CJK> +0x7E54 # <CJK> +0x7E55 # <CJK> +0x7E56 # <CJK> +0x7E59 # <CJK> +0x7E5A # <CJK> +0x7E5D # <CJK> +0x7E5E # <CJK> +0x7E66 # <CJK> +0x7E67 # <CJK> +0x7E69 # <CJK> +0x7E6A # <CJK> +0x7E6D # <CJK> +0x7E70 # <CJK> +0x7E79 # <CJK> +0x7E7B # <CJK> +0x7E7C # <CJK> +0x7E7D # <CJK> +0x7E7F # <CJK> +0x7E82 # <CJK> +0x7E83 # <CJK> +0x7E88 # <CJK> +0x7E89 # <CJK> +0x7E8C # <CJK> +0x7E8E # <CJK> +0x7E8F # <CJK> +0x7E90 # <CJK> +0x7E92 # <CJK> +0x7E93 # <CJK> +0x7E94 # <CJK> +0x7E96 # <CJK> +0x7E9B # <CJK> +0x7E9C # <CJK> +0x7F36 # <CJK> +0x7F38 # <CJK> +0x7F3A # <CJK> +0x7F45 # <CJK> +0x7F4C # <CJK> +0x7F4D # <CJK> +0x7F4E # <CJK> +0x7F50 # <CJK> +0x7F51 # <CJK> +0x7F54 # <CJK> +0x7F55 # <CJK> +0x7F58 # <CJK> +0x7F5F # <CJK> +0x7F60 # <CJK> +0x7F67 # <CJK> +0x7F68 # <CJK> +0x7F69 # <CJK> +0x7F6A # <CJK> +0x7F6B # <CJK> +0x7F6E # <CJK> +0x7F70 # <CJK> +0x7F72 # <CJK> +0x7F75 # <CJK> +0x7F77 # <CJK> +0x7F78 # <CJK> +0x7F79 # <CJK> +0x7F82 # <CJK> +0x7F83 # <CJK> +0x7F85 # <CJK> +0x7F86 # <CJK> +0x7F87 # <CJK> +0x7F88 # <CJK> +0x7F8A # <CJK> +0x7F8C # <CJK> +0x7F8E # <CJK> +0x7F94 # <CJK> +0x7F9A # <CJK> +0x7F9D # <CJK> +0x7F9E # <CJK> +0x7FA3 # <CJK> +0x7FA4 # <CJK> +0x7FA8 # <CJK> +0x7FA9 # <CJK> +0x7FAE # <CJK> +0x7FAF # <CJK> +0x7FB2 # <CJK> +0x7FB6 # <CJK> +0x7FB8 # <CJK> +0x7FB9 # <CJK> +0x7FBD # <CJK> +0x7FC1 # <CJK> +0x7FC5 # <CJK> +0x7FC6 # <CJK> +0x7FCA # <CJK> +0x7FCC # <CJK> +0x7FD2 # <CJK> +0x7FD4 # <CJK> +0x7FD5 # <CJK> +0x7FE0 # <CJK> +0x7FE1 # <CJK> +0x7FE6 # <CJK> +0x7FE9 # <CJK> +0x7FEB # <CJK> +0x7FF0 # <CJK> +0x7FF3 # <CJK> +0x7FF9 # <CJK> +0x7FFB # <CJK> +0x7FFC # <CJK> +0x8000 # <CJK> +0x8001 # <CJK> +0x8003 # <CJK> +0x8004 # <CJK> +0x8005 # <CJK> +0x8006 # <CJK> +0x800B # <CJK> +0x800C # <CJK> +0x8010 # <CJK> +0x8012 # <CJK> +0x8015 # <CJK> +0x8017 # <CJK> +0x8018 # <CJK> +0x8019 # <CJK> +0x801C # <CJK> +0x8021 # <CJK> +0x8028 # <CJK> +0x8033 # <CJK> +0x8036 # <CJK> +0x803B # <CJK> +0x803D # <CJK> +0x803F # <CJK> +0x8046 # <CJK> +0x804A # <CJK> +0x8052 # <CJK> +0x8056 # <CJK> +0x8058 # <CJK> +0x805A # <CJK> +0x805E # <CJK> +0x805F # <CJK> +0x8061 # <CJK> +0x8062 # <CJK> +0x8068 # <CJK> +0x806F # <CJK> +0x8070 # <CJK> +0x8072 # <CJK> +0x8073 # <CJK> +0x8074 # <CJK> +0x8076 # <CJK> +0x8077 # <CJK> +0x8079 # <CJK> +0x807D # <CJK> +0x807E # <CJK> +0x807F # <CJK> +0x8084 # <CJK> +0x8085 # <CJK> +0x8086 # <CJK> +0x8087 # <CJK> +0x8089 # <CJK> +0x808B # <CJK> +0x808C # <CJK> +0x8093 # <CJK> +0x8096 # <CJK> +0x8098 # <CJK> +0x809A # <CJK> +0x809B # <CJK> +0x809D # <CJK> +0x80A1 # <CJK> +0x80A2 # <CJK> +0x80A5 # <CJK> +0x80A9 # <CJK> +0x80AA # <CJK> +0x80AC # <CJK> +0x80AD # <CJK> +0x80AF # <CJK> +0x80B1 # <CJK> +0x80B2 # <CJK> +0x80B4 # <CJK> +0x80BA # <CJK> +0x80C3 # <CJK> +0x80C4 # <CJK> +0x80C6 # <CJK> +0x80CC # <CJK> +0x80CE # <CJK> +0x80D6 # <CJK> +0x80D9 # <CJK> +0x80DA # <CJK> +0x80DB # <CJK> +0x80DD # <CJK> +0x80DE # <CJK> +0x80E1 # <CJK> +0x80E4 # <CJK> +0x80E5 # <CJK> +0x80EF # <CJK> +0x80F1 # <CJK> +0x80F4 # <CJK> +0x80F8 # <CJK> +0x80FC # <CJK> +0x80FD # <CJK> +0x8102 # <CJK> +0x8105 # <CJK> +0x8106 # <CJK> +0x8107 # <CJK> +0x8108 # <CJK> +0x8109 # <CJK> +0x810A # <CJK> +0x811A # <CJK> +0x811B # <CJK> +0x8123 # <CJK> +0x8129 # <CJK> +0x812F # <CJK> +0x8131 # <CJK> +0x8133 # <CJK> +0x8139 # <CJK> +0x813E # <CJK> +0x8146 # <CJK> +0x814B # <CJK> +0x814E # <CJK> +0x8150 # <CJK> +0x8151 # <CJK> +0x8153 # <CJK> +0x8154 # <CJK> +0x8155 # <CJK> +0x815F # <CJK> +0x8165 # <CJK> +0x8166 # <CJK> +0x816B # <CJK> +0x816E # <CJK> +0x8170 # <CJK> +0x8171 # <CJK> +0x8174 # <CJK> +0x8178 # <CJK> +0x8179 # <CJK> +0x817A # <CJK> +0x817F # <CJK> +0x8180 # <CJK> +0x8182 # <CJK> +0x8183 # <CJK> +0x8188 # <CJK> +0x818A # <CJK> +0x818F # <CJK> +0x8193 # <CJK> +0x8195 # <CJK> +0x819A # <CJK> +0x819C # <CJK> +0x819D # <CJK> +0x81A0 # <CJK> +0x81A3 # <CJK> +0x81A4 # <CJK> +0x81A8 # <CJK> +0x81A9 # <CJK> +0x81B0 # <CJK> +0x81B3 # <CJK> +0x81B5 # <CJK> +0x81B8 # <CJK> +0x81BA # <CJK> +0x81BD # <CJK> +0x81BE # <CJK> +0x81BF # <CJK> +0x81C0 # <CJK> +0x81C2 # <CJK> +0x81C6 # <CJK> +0x81C8 # <CJK> +0x81C9 # <CJK> +0x81CD # <CJK> +0x81D1 # <CJK> +0x81D3 # <CJK> +0x81D8 # <CJK> +0x81D9 # <CJK> +0x81DA # <CJK> +0x81DF # <CJK> +0x81E0 # <CJK> +0x81E3 # <CJK> +0x81E5 # <CJK> +0x81E7 # <CJK> +0x81E8 # <CJK> +0x81EA # <CJK> +0x81ED # <CJK> +0x81F3 # <CJK> +0x81F4 # <CJK> +0x81FA # <CJK> +0x81FB # <CJK> +0x81FC # <CJK> +0x81FE # <CJK> +0x8201 # <CJK> +0x8202 # <CJK> +0x8205 # <CJK> +0x8207 # <CJK> +0x8208 # <CJK> +0x8209 # <CJK> +0x820A # <CJK> +0x820C # <CJK> +0x820D # <CJK> +0x820E # <CJK> +0x8210 # <CJK> +0x8212 # <CJK> +0x8216 # <CJK> +0x8217 # <CJK> +0x8218 # <CJK> +0x821B # <CJK> +0x821C # <CJK> +0x821E # <CJK> +0x821F # <CJK> +0x8229 # <CJK> +0x822A # <CJK> +0x822B # <CJK> +0x822C # <CJK> +0x822E # <CJK> +0x8233 # <CJK> +0x8235 # <CJK> +0x8236 # <CJK> +0x8237 # <CJK> +0x8238 # <CJK> +0x8239 # <CJK> +0x8240 # <CJK> +0x8247 # <CJK> +0x8258 # <CJK> +0x8259 # <CJK> +0x825A # <CJK> +0x825D # <CJK> +0x825F # <CJK> +0x8262 # <CJK> +0x8264 # <CJK> +0x8266 # <CJK> +0x8268 # <CJK> +0x826A # <CJK> +0x826B # <CJK> +0x826E # <CJK> +0x826F # <CJK> +0x8271 # <CJK> +0x8272 # <CJK> +0x8276 # <CJK> +0x8277 # <CJK> +0x8278 # <CJK> +0x827E # <CJK> +0x828B # <CJK> +0x828D # <CJK> +0x8292 # <CJK> +0x8299 # <CJK> +0x829D # <CJK> +0x829F # <CJK> +0x82A5 # <CJK> +0x82A6 # <CJK> +0x82AB # <CJK> +0x82AC # <CJK> +0x82AD # <CJK> +0x82AF # <CJK> +0x82B1 # <CJK> +0x82B3 # <CJK> +0x82B8 # <CJK> +0x82B9 # <CJK> +0x82BB # <CJK> +0x82BD # <CJK> +0x82C5 # <CJK> +0x82D1 # <CJK> +0x82D2 # <CJK> +0x82D3 # <CJK> +0x82D4 # <CJK> +0x82D7 # <CJK> +0x82D9 # <CJK> +0x82DB # <CJK> +0x82DC # <CJK> +0x82DE # <CJK> +0x82DF # <CJK> +0x82E1 # <CJK> +0x82E3 # <CJK> +0x82E5 # <CJK> +0x82E6 # <CJK> +0x82E7 # <CJK> +0x82EB # <CJK> +0x82F1 # <CJK> +0x82F3 # <CJK> +0x82F4 # <CJK> +0x82F9 # <CJK> +0x82FA # <CJK> +0x82FB # <CJK> +0x8302 # <CJK> +0x8303 # <CJK> +0x8304 # <CJK> +0x8305 # <CJK> +0x8306 # <CJK> +0x8309 # <CJK> +0x830E # <CJK> +0x8316 # <CJK> +0x8317 # <CJK> +0x8318 # <CJK> +0x831C # <CJK> +0x8323 # <CJK> +0x8328 # <CJK> +0x832B # <CJK> +0x832F # <CJK> +0x8331 # <CJK> +0x8332 # <CJK> +0x8334 # <CJK> +0x8335 # <CJK> +0x8336 # <CJK> +0x8338 # <CJK> +0x8339 # <CJK> +0x8340 # <CJK> +0x8345 # <CJK> +0x8349 # <CJK> +0x834A # <CJK> +0x834F # <CJK> +0x8350 # <CJK> +0x8352 # <CJK> +0x8358 # <CJK> +0x8373 # <CJK> +0x8375 # <CJK> +0x8377 # <CJK> +0x837B # <CJK> +0x837C # <CJK> +0x8385 # <CJK> +0x8387 # <CJK> +0x8389 # <CJK> +0x838A # <CJK> +0x838E # <CJK> +0x8393 # <CJK> +0x8396 # <CJK> +0x839A # <CJK> +0x839E # <CJK> +0x839F # <CJK> +0x83A0 # <CJK> +0x83A2 # <CJK> +0x83A8 # <CJK> +0x83AA # <CJK> +0x83AB # <CJK> +0x83B1 # <CJK> +0x83B5 # <CJK> +0x83BD # <CJK> +0x83C1 # <CJK> +0x83C5 # <CJK> +0x83CA # <CJK> +0x83CC # <CJK> +0x83CE # <CJK> +0x83D3 # <CJK> +0x83D6 # <CJK> +0x83D8 # <CJK> +0x83DC # <CJK> +0x83DF # <CJK> +0x83E0 # <CJK> +0x83E9 # <CJK> +0x83EB # <CJK> +0x83EF # <CJK> +0x83F0 # <CJK> +0x83F1 # <CJK> +0x83F2 # <CJK> +0x83F4 # <CJK> +0x83F7 # <CJK> +0x83FB # <CJK> +0x83FD # <CJK> +0x8403 # <CJK> +0x8404 # <CJK> +0x8407 # <CJK> +0x840B # <CJK> +0x840C # <CJK> +0x840D # <CJK> +0x840E # <CJK> +0x8413 # <CJK> +0x8420 # <CJK> +0x8422 # <CJK> +0x8429 # <CJK> +0x842A # <CJK> +0x842C # <CJK> +0x8431 # <CJK> +0x8435 # <CJK> +0x8438 # <CJK> +0x843C # <CJK> +0x843D # <CJK> +0x8446 # <CJK> +0x8449 # <CJK> +0x844E # <CJK> +0x8457 # <CJK> +0x845B # <CJK> +0x8461 # <CJK> +0x8462 # <CJK> +0x8463 # <CJK> +0x8466 # <CJK> +0x8469 # <CJK> +0x846B # <CJK> +0x846C # <CJK> +0x846D # <CJK> +0x846E # <CJK> +0x846F # <CJK> +0x8471 # <CJK> +0x8475 # <CJK> +0x8477 # <CJK> +0x8479 # <CJK> +0x847A # <CJK> +0x8482 # <CJK> +0x8484 # <CJK> +0x848B # <CJK> +0x8490 # <CJK> +0x8494 # <CJK> +0x8499 # <CJK> +0x849C # <CJK> +0x849F # <CJK> +0x84A1 # <CJK> +0x84AD # <CJK> +0x84B2 # <CJK> +0x84B8 # <CJK> +0x84B9 # <CJK> +0x84BB # <CJK> +0x84BC # <CJK> +0x84BF # <CJK> +0x84C1 # <CJK> +0x84C4 # <CJK> +0x84C6 # <CJK> +0x84C9 # <CJK> +0x84CA # <CJK> +0x84CB # <CJK> +0x84CD # <CJK> +0x84D0 # <CJK> +0x84D1 # <CJK> +0x84D6 # <CJK> +0x84D9 # <CJK> +0x84DA # <CJK> +0x84EC # <CJK> +0x84EE # <CJK> +0x84F4 # <CJK> +0x84FC # <CJK> +0x84FF # <CJK> +0x8500 # <CJK> +0x8506 # <CJK> +0x8511 # <CJK> +0x8513 # <CJK> +0x8514 # <CJK> +0x8515 # <CJK> +0x8517 # <CJK> +0x8518 # <CJK> +0x851A # <CJK> +0x851F # <CJK> +0x8521 # <CJK> +0x8526 # <CJK> +0x852C # <CJK> +0x852D # <CJK> +0x8535 # <CJK> +0x853D # <CJK> +0x8540 # <CJK> +0x8541 # <CJK> +0x8543 # <CJK> +0x8548 # <CJK> +0x8549 # <CJK> +0x854A # <CJK> +0x854B # <CJK> +0x854E # <CJK> +0x8555 # <CJK> +0x8557 # <CJK> +0x8558 # <CJK> +0x855A # <CJK> +0x8563 # <CJK> +0x8568 # <CJK> +0x8569 # <CJK> +0x856A # <CJK> +0x856D # <CJK> +0x8577 # <CJK> +0x857E # <CJK> +0x8580 # <CJK> +0x8584 # <CJK> +0x8587 # <CJK> +0x8588 # <CJK> +0x858A # <CJK> +0x8590 # <CJK> +0x8591 # <CJK> +0x8594 # <CJK> +0x8597 # <CJK> +0x8599 # <CJK> +0x859B # <CJK> +0x859C # <CJK> +0x85A4 # <CJK> +0x85A6 # <CJK> +0x85A8 # <CJK> +0x85A9 # <CJK> +0x85AA # <CJK> +0x85AB # <CJK> +0x85AC # <CJK> +0x85AE # <CJK> +0x85AF # <CJK> +0x85B9 # <CJK> +0x85BA # <CJK> +0x85C1 # <CJK> +0x85C9 # <CJK> +0x85CD # <CJK> +0x85CF # <CJK> +0x85D0 # <CJK> +0x85D5 # <CJK> +0x85DC # <CJK> +0x85DD # <CJK> +0x85E4 # <CJK> +0x85E5 # <CJK> +0x85E9 # <CJK> +0x85EA # <CJK> +0x85F7 # <CJK> +0x85F9 # <CJK> +0x85FA # <CJK> +0x85FB # <CJK> +0x85FE # <CJK> +0x8602 # <CJK> +0x8606 # <CJK> +0x8607 # <CJK> +0x860A # <CJK> +0x860B # <CJK> +0x8613 # <CJK> +0x8616 # <CJK> +0x8617 # <CJK> +0x861A # <CJK> +0x8622 # <CJK> +0x862D # <CJK> +0x862F # <CJK> +0x8630 # <CJK> +0x863F # <CJK> +0x864D # <CJK> +0x864E # <CJK> +0x8650 # <CJK> +0x8654 # <CJK> +0x8655 # <CJK> +0x865A # <CJK> +0x865C # <CJK> +0x865E # <CJK> +0x865F # <CJK> +0x8667 # <CJK> +0x866B # <CJK> +0x8671 # <CJK> +0x8679 # <CJK> +0x867B # <CJK> +0x868A # <CJK> +0x868B # <CJK> +0x868C # <CJK> +0x8693 # <CJK> +0x8695 # <CJK> +0x86A3 # <CJK> +0x86A4 # <CJK> +0x86A9 # <CJK> +0x86AA # <CJK> +0x86AB # <CJK> +0x86AF # <CJK> +0x86B0 # <CJK> +0x86B6 # <CJK> +0x86C4 # <CJK> +0x86C6 # <CJK> +0x86C7 # <CJK> +0x86C9 # <CJK> +0x86CB # <CJK> +0x86CD # <CJK> +0x86CE # <CJK> +0x86D4 # <CJK> +0x86D9 # <CJK> +0x86DB # <CJK> +0x86DE # <CJK> +0x86DF # <CJK> +0x86E4 # <CJK> +0x86E9 # <CJK> +0x86EC # <CJK> +0x86ED # <CJK> +0x86EE # <CJK> +0x86EF # <CJK> +0x86F8 # <CJK> +0x86F9 # <CJK> +0x86FB # <CJK> +0x86FE # <CJK> +0x8700 # <CJK> +0x8702 # <CJK> +0x8703 # <CJK> +0x8706 # <CJK> +0x8708 # <CJK> +0x8709 # <CJK> +0x870A # <CJK> +0x870D # <CJK> +0x8711 # <CJK> +0x8712 # <CJK> +0x8718 # <CJK> +0x871A # <CJK> +0x871C # <CJK> +0x8725 # <CJK> +0x8729 # <CJK> +0x8734 # <CJK> +0x8737 # <CJK> +0x873B # <CJK> +0x873F # <CJK> +0x8749 # <CJK> +0x874B # <CJK> +0x874C # <CJK> +0x874E # <CJK> +0x8753 # <CJK> +0x8755 # <CJK> +0x8757 # <CJK> +0x8759 # <CJK> +0x875F # <CJK> +0x8760 # <CJK> +0x8763 # <CJK> +0x8766 # <CJK> +0x8768 # <CJK> +0x876A # <CJK> +0x876E # <CJK> +0x8774 # <CJK> +0x8776 # <CJK> +0x8778 # <CJK> +0x877F # <CJK> +0x8782 # <CJK> +0x878D # <CJK> +0x879F # <CJK> +0x87A2 # <CJK> +0x87AB # <CJK> +0x87AF # <CJK> +0x87B3 # <CJK> +0x87BA # <CJK> +0x87BB # <CJK> +0x87BD # <CJK> +0x87C0 # <CJK> +0x87C4 # <CJK> +0x87C6 # <CJK> +0x87C7 # <CJK> +0x87CB # <CJK> +0x87D0 # <CJK> +0x87D2 # <CJK> +0x87E0 # <CJK> +0x87EF # <CJK> +0x87F2 # <CJK> +0x87F6 # <CJK> +0x87F7 # <CJK> +0x87F9 # <CJK> +0x87FB # <CJK> +0x87FE # <CJK> +0x8805 # <CJK> +0x880D # <CJK> +0x880E # <CJK> +0x880F # <CJK> +0x8811 # <CJK> +0x8815 # <CJK> +0x8816 # <CJK> +0x8821 # <CJK> +0x8822 # <CJK> +0x8823 # <CJK> +0x8827 # <CJK> +0x8831 # <CJK> +0x8836 # <CJK> +0x8839 # <CJK> +0x883B # <CJK> +0x8840 # <CJK> +0x8842 # <CJK> +0x8844 # <CJK> +0x8846 # <CJK> +0x884C # <CJK> +0x884D # <CJK> +0x8852 # <CJK> +0x8853 # <CJK> +0x8857 # <CJK> +0x8859 # <CJK> +0x885B # <CJK> +0x885D # <CJK> +0x885E # <CJK> +0x8861 # <CJK> +0x8862 # <CJK> +0x8863 # <CJK> +0x8868 # <CJK> +0x886B # <CJK> +0x8870 # <CJK> +0x8872 # <CJK> +0x8875 # <CJK> +0x8877 # <CJK> +0x887D # <CJK> +0x887E # <CJK> +0x887F # <CJK> +0x8881 # <CJK> +0x8882 # <CJK> +0x8888 # <CJK> +0x888B # <CJK> +0x888D # <CJK> +0x8892 # <CJK> +0x8896 # <CJK> +0x8897 # <CJK> +0x8899 # <CJK> +0x889E # <CJK> +0x88A2 # <CJK> +0x88A4 # <CJK> +0x88AB # <CJK> +0x88AE # <CJK> +0x88B0 # <CJK> +0x88B1 # <CJK> +0x88B4 # <CJK> +0x88B5 # <CJK> +0x88B7 # <CJK> +0x88BF # <CJK> +0x88C1 # <CJK> +0x88C2 # <CJK> +0x88C3 # <CJK> +0x88C4 # <CJK> +0x88C5 # <CJK> +0x88CF # <CJK> +0x88D4 # <CJK> +0x88D5 # <CJK> +0x88D8 # <CJK> +0x88D9 # <CJK> +0x88DC # <CJK> +0x88DD # <CJK> +0x88DF # <CJK> +0x88E1 # <CJK> +0x88E8 # <CJK> +0x88F2 # <CJK> +0x88F3 # <CJK> +0x88F4 # <CJK> +0x88F8 # <CJK> +0x88F9 # <CJK> +0x88FC # <CJK> +0x88FD # <CJK> +0x88FE # <CJK> +0x8902 # <CJK> +0x8904 # <CJK> +0x8907 # <CJK> +0x890A # <CJK> +0x890C # <CJK> +0x8910 # <CJK> +0x8912 # <CJK> +0x8913 # <CJK> +0x891D # <CJK> +0x891E # <CJK> +0x8925 # <CJK> +0x892A # <CJK> +0x892B # <CJK> +0x8936 # <CJK> +0x8938 # <CJK> +0x893B # <CJK> +0x8941 # <CJK> +0x8943 # <CJK> +0x8944 # <CJK> +0x894C # <CJK> +0x894D # <CJK> +0x8956 # <CJK> +0x895E # <CJK> +0x895F # <CJK> +0x8960 # <CJK> +0x8964 # <CJK> +0x8966 # <CJK> +0x896A # <CJK> +0x896D # <CJK> +0x896F # <CJK> +0x8972 # <CJK> +0x8974 # <CJK> +0x8977 # <CJK> +0x897E # <CJK> +0x897F # <CJK> +0x8981 # <CJK> +0x8983 # <CJK> +0x8986 # <CJK> +0x8987 # <CJK> +0x8988 # <CJK> +0x898A # <CJK> +0x898B # <CJK> +0x898F # <CJK> +0x8993 # <CJK> +0x8996 # <CJK> +0x8997 # <CJK> +0x8998 # <CJK> +0x899A # <CJK> +0x89A1 # <CJK> +0x89A6 # <CJK> +0x89A7 # <CJK> +0x89A9 # <CJK> +0x89AA # <CJK> +0x89AC # <CJK> +0x89AF # <CJK> +0x89B2 # <CJK> +0x89B3 # <CJK> +0x89BA # <CJK> +0x89BD # <CJK> +0x89BF # <CJK> +0x89C0 # <CJK> +0x89D2 # <CJK> +0x89DA # <CJK> +0x89DC # <CJK> +0x89DD # <CJK> +0x89E3 # <CJK> +0x89E6 # <CJK> +0x89E7 # <CJK> +0x89F4 # <CJK> +0x89F8 # <CJK> +0x8A00 # <CJK> +0x8A02 # <CJK> +0x8A03 # <CJK> +0x8A08 # <CJK> +0x8A0A # <CJK> +0x8A0C # <CJK> +0x8A0E # <CJK> +0x8A10 # <CJK> +0x8A13 # <CJK> +0x8A16 # <CJK> +0x8A17 # <CJK> +0x8A18 # <CJK> +0x8A1B # <CJK> +0x8A1D # <CJK> +0x8A1F # <CJK> +0x8A23 # <CJK> +0x8A25 # <CJK> +0x8A2A # <CJK> +0x8A2D # <CJK> +0x8A31 # <CJK> +0x8A33 # <CJK> +0x8A34 # <CJK> +0x8A36 # <CJK> +0x8A3A # <CJK> +0x8A3B # <CJK> +0x8A3C # <CJK> +0x8A41 # <CJK> +0x8A46 # <CJK> +0x8A48 # <CJK> +0x8A50 # <CJK> +0x8A51 # <CJK> +0x8A52 # <CJK> +0x8A54 # <CJK> +0x8A55 # <CJK> +0x8A5B # <CJK> +0x8A5E # <CJK> +0x8A60 # <CJK> +0x8A62 # <CJK> +0x8A63 # <CJK> +0x8A66 # <CJK> +0x8A69 # <CJK> +0x8A6B # <CJK> +0x8A6C # <CJK> +0x8A6D # <CJK> +0x8A6E # <CJK> +0x8A70 # <CJK> +0x8A71 # <CJK> +0x8A72 # <CJK> +0x8A73 # <CJK> +0x8A7C # <CJK> +0x8A82 # <CJK> +0x8A84 # <CJK> +0x8A85 # <CJK> +0x8A87 # <CJK> +0x8A89 # <CJK> +0x8A8C # <CJK> +0x8A8D # <CJK> +0x8A91 # <CJK> +0x8A93 # <CJK> +0x8A95 # <CJK> +0x8A98 # <CJK> +0x8A9A # <CJK> +0x8A9E # <CJK> +0x8AA0 # <CJK> +0x8AA1 # <CJK> +0x8AA3 # <CJK> +0x8AA4 # <CJK> +0x8AA5 # <CJK> +0x8AA6 # <CJK> +0x8AA8 # <CJK> +0x8AAC # <CJK> +0x8AAD # <CJK> +0x8AB0 # <CJK> +0x8AB2 # <CJK> +0x8AB9 # <CJK> +0x8ABC # <CJK> +0x8ABF # <CJK> +0x8AC2 # <CJK> +0x8AC4 # <CJK> +0x8AC7 # <CJK> +0x8ACB # <CJK> +0x8ACC # <CJK> +0x8ACD # <CJK> +0x8ACF # <CJK> +0x8AD2 # <CJK> +0x8AD6 # <CJK> +0x8ADA # <CJK> +0x8ADB # <CJK> +0x8ADC # <CJK> +0x8ADE # <CJK> +0x8AE0 # <CJK> +0x8AE1 # <CJK> +0x8AE2 # <CJK> +0x8AE4 # <CJK> +0x8AE6 # <CJK> +0x8AE7 # <CJK> +0x8AEB # <CJK> +0x8AED # <CJK> +0x8AEE # <CJK> +0x8AF1 # <CJK> +0x8AF3 # <CJK> +0x8AF7 # <CJK> +0x8AF8 # <CJK> +0x8AFA # <CJK> +0x8AFE # <CJK> +0x8B00 # <CJK> +0x8B01 # <CJK> +0x8B02 # <CJK> +0x8B04 # <CJK> +0x8B07 # <CJK> +0x8B0C # <CJK> +0x8B0E # <CJK> +0x8B10 # <CJK> +0x8B14 # <CJK> +0x8B16 # <CJK> +0x8B17 # <CJK> +0x8B19 # <CJK> +0x8B1A # <CJK> +0x8B1B # <CJK> +0x8B1D # <CJK> +0x8B20 # <CJK> +0x8B21 # <CJK> +0x8B26 # <CJK> +0x8B28 # <CJK> +0x8B2B # <CJK> +0x8B2C # <CJK> +0x8B33 # <CJK> +0x8B39 # <CJK> +0x8B3E # <CJK> +0x8B41 # <CJK> +0x8B49 # <CJK> +0x8B4C # <CJK> +0x8B4E # <CJK> +0x8B4F # <CJK> +0x8B56 # <CJK> +0x8B58 # <CJK> +0x8B5A # <CJK> +0x8B5B # <CJK> +0x8B5C # <CJK> +0x8B5F # <CJK> +0x8B66 # <CJK> +0x8B6B # <CJK> +0x8B6C # <CJK> +0x8B6F # <CJK> +0x8B70 # <CJK> +0x8B71 # <CJK> +0x8B72 # <CJK> +0x8B74 # <CJK> +0x8B77 # <CJK> +0x8B7D # <CJK> +0x8B80 # <CJK> +0x8B83 # <CJK> +0x8B8A # <CJK> +0x8B8C # <CJK> +0x8B8E # <CJK> +0x8B90 # <CJK> +0x8B92 # <CJK> +0x8B93 # <CJK> +0x8B96 # <CJK> +0x8B99 # <CJK> +0x8B9A # <CJK> +0x8C37 # <CJK> +0x8C3A # <CJK> +0x8C3F # <CJK> +0x8C41 # <CJK> +0x8C46 # <CJK> +0x8C48 # <CJK> +0x8C4A # <CJK> +0x8C4C # <CJK> +0x8C4E # <CJK> +0x8C50 # <CJK> +0x8C55 # <CJK> +0x8C5A # <CJK> +0x8C61 # <CJK> +0x8C62 # <CJK> +0x8C6A # <CJK> +0x8C6B # <CJK> +0x8C6C # <CJK> +0x8C78 # <CJK> +0x8C79 # <CJK> +0x8C7A # <CJK> +0x8C7C # <CJK> +0x8C82 # <CJK> +0x8C85 # <CJK> +0x8C89 # <CJK> +0x8C8A # <CJK> +0x8C8C # <CJK> +0x8C8D # <CJK> +0x8C8E # <CJK> +0x8C94 # <CJK> +0x8C98 # <CJK> +0x8C9D # <CJK> +0x8C9E # <CJK> +0x8CA0 # <CJK> +0x8CA1 # <CJK> +0x8CA2 # <CJK> +0x8CA7 # <CJK> +0x8CA8 # <CJK> +0x8CA9 # <CJK> +0x8CAA # <CJK> +0x8CAB # <CJK> +0x8CAC # <CJK> +0x8CAD # <CJK> +0x8CAE # <CJK> +0x8CAF # <CJK> +0x8CB0 # <CJK> +0x8CB2 # <CJK> +0x8CB3 # <CJK> +0x8CB4 # <CJK> +0x8CB6 # <CJK> +0x8CB7 # <CJK> +0x8CB8 # <CJK> +0x8CBB # <CJK> +0x8CBC # <CJK> +0x8CBD # <CJK> +0x8CBF # <CJK> +0x8CC0 # <CJK> +0x8CC1 # <CJK> +0x8CC2 # <CJK> +0x8CC3 # <CJK> +0x8CC4 # <CJK> +0x8CC7 # <CJK> +0x8CC8 # <CJK> +0x8CCA # <CJK> +0x8CCD # <CJK> +0x8CCE # <CJK> +0x8CD1 # <CJK> +0x8CD3 # <CJK> +0x8CDA # <CJK> +0x8CDB # <CJK> +0x8CDC # <CJK> +0x8CDE # <CJK> +0x8CE0 # <CJK> +0x8CE2 # <CJK> +0x8CE3 # <CJK> +0x8CE4 # <CJK> +0x8CE6 # <CJK> +0x8CEA # <CJK> +0x8CED # <CJK> +0x8CFA # <CJK> +0x8CFB # <CJK> +0x8CFC # <CJK> +0x8CFD # <CJK> +0x8D04 # <CJK> +0x8D05 # <CJK> +0x8D07 # <CJK> +0x8D08 # <CJK> +0x8D0A # <CJK> +0x8D0B # <CJK> +0x8D0D # <CJK> +0x8D0F # <CJK> +0x8D10 # <CJK> +0x8D13 # <CJK> +0x8D14 # <CJK> +0x8D16 # <CJK> +0x8D64 # <CJK> +0x8D66 # <CJK> +0x8D67 # <CJK> +0x8D6B # <CJK> +0x8D6D # <CJK> +0x8D70 # <CJK> +0x8D71 # <CJK> +0x8D73 # <CJK> +0x8D74 # <CJK> +0x8D77 # <CJK> +0x8D81 # <CJK> +0x8D85 # <CJK> +0x8D8A # <CJK> +0x8D99 # <CJK> +0x8DA3 # <CJK> +0x8DA8 # <CJK> +0x8DB3 # <CJK> +0x8DBA # <CJK> +0x8DBE # <CJK> +0x8DC2 # <CJK> +0x8DCB # <CJK> +0x8DCC # <CJK> +0x8DCF # <CJK> +0x8DD6 # <CJK> +0x8DDA # <CJK> +0x8DDB # <CJK> +0x8DDD # <CJK> +0x8DDF # <CJK> +0x8DE1 # <CJK> +0x8DE3 # <CJK> +0x8DE8 # <CJK> +0x8DEA # <CJK> +0x8DEB # <CJK> +0x8DEF # <CJK> +0x8DF3 # <CJK> +0x8DF5 # <CJK> +0x8DFC # <CJK> +0x8DFF # <CJK> +0x8E08 # <CJK> +0x8E09 # <CJK> +0x8E0A # <CJK> +0x8E0F # <CJK> +0x8E10 # <CJK> +0x8E1D # <CJK> +0x8E1E # <CJK> +0x8E1F # <CJK> +0x8E2A # <CJK> +0x8E30 # <CJK> +0x8E34 # <CJK> +0x8E35 # <CJK> +0x8E42 # <CJK> +0x8E44 # <CJK> +0x8E47 # <CJK> +0x8E48 # <CJK> +0x8E49 # <CJK> +0x8E4A # <CJK> +0x8E4C # <CJK> +0x8E50 # <CJK> +0x8E55 # <CJK> +0x8E59 # <CJK> +0x8E5F # <CJK> +0x8E60 # <CJK> +0x8E63 # <CJK> +0x8E64 # <CJK> +0x8E72 # <CJK> +0x8E74 # <CJK> +0x8E76 # <CJK> +0x8E7C # <CJK> +0x8E81 # <CJK> +0x8E84 # <CJK> +0x8E85 # <CJK> +0x8E87 # <CJK> +0x8E8A # <CJK> +0x8E8B # <CJK> +0x8E8D # <CJK> +0x8E91 # <CJK> +0x8E93 # <CJK> +0x8E94 # <CJK> +0x8E99 # <CJK> +0x8EA1 # <CJK> +0x8EAA # <CJK> +0x8EAB # <CJK> +0x8EAC # <CJK> +0x8EAF # <CJK> +0x8EB0 # <CJK> +0x8EB1 # <CJK> +0x8EBE # <CJK> +0x8EC5 # <CJK> +0x8EC6 # <CJK> +0x8EC8 # <CJK> +0x8ECA # <CJK> +0x8ECB # <CJK> +0x8ECC # <CJK> +0x8ECD # <CJK> +0x8ED2 # <CJK> +0x8EDB # <CJK> +0x8EDF # <CJK> +0x8EE2 # <CJK> +0x8EE3 # <CJK> +0x8EEB # <CJK> +0x8EF8 # <CJK> +0x8EFB # <CJK> +0x8EFC # <CJK> +0x8EFD # <CJK> +0x8EFE # <CJK> +0x8F03 # <CJK> +0x8F05 # <CJK> +0x8F09 # <CJK> +0x8F0A # <CJK> +0x8F0C # <CJK> +0x8F12 # <CJK> +0x8F13 # <CJK> +0x8F14 # <CJK> +0x8F15 # <CJK> +0x8F19 # <CJK> +0x8F1B # <CJK> +0x8F1C # <CJK> +0x8F1D # <CJK> +0x8F1F # <CJK> +0x8F26 # <CJK> +0x8F29 # <CJK> +0x8F2A # <CJK> +0x8F2F # <CJK> +0x8F33 # <CJK> +0x8F38 # <CJK> +0x8F39 # <CJK> +0x8F3B # <CJK> +0x8F3E # <CJK> +0x8F3F # <CJK> +0x8F42 # <CJK> +0x8F44 # <CJK> +0x8F45 # <CJK> +0x8F46 # <CJK> +0x8F49 # <CJK> +0x8F4C # <CJK> +0x8F4D # <CJK> +0x8F4E # <CJK> +0x8F57 # <CJK> +0x8F5C # <CJK> +0x8F5F # <CJK> +0x8F61 # <CJK> +0x8F62 # <CJK> +0x8F63 # <CJK> +0x8F64 # <CJK> +0x8F9B # <CJK> +0x8F9C # <CJK> +0x8F9E # <CJK> +0x8F9F # <CJK> +0x8FA3 # <CJK> +0x8FA7 # <CJK> +0x8FA8 # <CJK> +0x8FAD # <CJK> +0x8FAE # <CJK> +0x8FAF # <CJK> +0x8FB0 # <CJK> +0x8FB1 # <CJK> +0x8FB2 # <CJK> +0x8FB7 # <CJK> +0x8FBA # <CJK> +0x8FBB # <CJK> +0x8FBC # <CJK> +0x8FBF # <CJK> +0x8FC2 # <CJK> +0x8FC4 # <CJK> +0x8FC5 # <CJK> +0x8FCE # <CJK> +0x8FD1 # <CJK> +0x8FD4 # <CJK> +0x8FDA # <CJK> +0x8FE2 # <CJK> +0x8FE5 # <CJK> +0x8FE6 # <CJK> +0x8FE9 # <CJK> +0x8FEA # <CJK> +0x8FEB # <CJK> +0x8FED # <CJK> +0x8FEF # <CJK> +0x8FF0 # <CJK> +0x8FF4 # <CJK> +0x8FF7 # <CJK> +0x8FF8 # <CJK> +0x8FF9 # <CJK> +0x8FFA # <CJK> +0x8FFD # <CJK> +0x9000 # <CJK> +0x9001 # <CJK> +0x9003 # <CJK> +0x9005 # <CJK> +0x9006 # <CJK> +0x900B # <CJK> +0x900D # <CJK> +0x900E # <CJK> +0x900F # <CJK> +0x9010 # <CJK> +0x9011 # <CJK> +0x9013 # <CJK> +0x9014 # <CJK> +0x9015 # <CJK> +0x9016 # <CJK> +0x9017 # <CJK> +0x9019 # <CJK> +0x901A # <CJK> +0x901D # <CJK> +0x901E # <CJK> +0x901F # <CJK> +0x9020 # <CJK> +0x9021 # <CJK> +0x9022 # <CJK> +0x9023 # <CJK> +0x9027 # <CJK> +0x902E # <CJK> +0x9031 # <CJK> +0x9032 # <CJK> +0x9035 # <CJK> +0x9036 # <CJK> +0x9038 # <CJK> +0x9039 # <CJK> +0x903C # <CJK> +0x903E # <CJK> +0x9041 # <CJK> +0x9042 # <CJK> +0x9045 # <CJK> +0x9047 # <CJK> +0x9049 # <CJK> +0x904A # <CJK> +0x904B # <CJK> +0x904D # <CJK> +0x904E # <CJK> +0x904F # <CJK> +0x9050 # <CJK> +0x9051 # <CJK> +0x9052 # <CJK> +0x9053 # <CJK> +0x9054 # <CJK> +0x9055 # <CJK> +0x9056 # <CJK> +0x9058 # <CJK> +0x9059 # <CJK> +0x905C # <CJK> +0x905E # <CJK> +0x9060 # <CJK> +0x9061 # <CJK> +0x9063 # <CJK> +0x9065 # <CJK> +0x9068 # <CJK> +0x9069 # <CJK> +0x906D # <CJK> +0x906E # <CJK> +0x906F # <CJK> +0x9072 # <CJK> +0x9075 # <CJK> +0x9076 # <CJK> +0x9077 # <CJK> +0x9078 # <CJK> +0x907A # <CJK> +0x907C # <CJK> +0x907D # <CJK> +0x907F # <CJK> +0x9080 # <CJK> +0x9081 # <CJK> +0x9082 # <CJK> +0x9083 # <CJK> +0x9084 # <CJK> +0x9087 # <CJK> +0x9089 # <CJK> +0x908A # <CJK> +0x908F # <CJK> +0x9091 # <CJK> +0x90A3 # <CJK> +0x90A6 # <CJK> +0x90A8 # <CJK> +0x90AA # <CJK> +0x90AF # <CJK> +0x90B1 # <CJK> +0x90B5 # <CJK> +0x90B8 # <CJK> +0x90C1 # <CJK> +0x90CA # <CJK> +0x90CE # <CJK> +0x90DB # <CJK> +0x90E1 # <CJK> +0x90E2 # <CJK> +0x90E4 # <CJK> +0x90E8 # <CJK> +0x90ED # <CJK> +0x90F5 # <CJK> +0x90F7 # <CJK> +0x90FD # <CJK> +0x9102 # <CJK> +0x9112 # <CJK> +0x9119 # <CJK> +0x912D # <CJK> +0x9130 # <CJK> +0x9132 # <CJK> +0x9149 # <CJK> +0x914A # <CJK> +0x914B # <CJK> +0x914C # <CJK> +0x914D # <CJK> +0x914E # <CJK> +0x9152 # <CJK> +0x9154 # <CJK> +0x9156 # <CJK> +0x9158 # <CJK> +0x9162 # <CJK> +0x9163 # <CJK> +0x9165 # <CJK> +0x9169 # <CJK> +0x916A # <CJK> +0x916C # <CJK> +0x9172 # <CJK> +0x9173 # <CJK> +0x9175 # <CJK> +0x9177 # <CJK> +0x9178 # <CJK> +0x9182 # <CJK> +0x9187 # <CJK> +0x9189 # <CJK> +0x918B # <CJK> +0x918D # <CJK> +0x9190 # <CJK> +0x9192 # <CJK> +0x9197 # <CJK> +0x919C # <CJK> +0x91A2 # <CJK> +0x91A4 # <CJK> +0x91AA # <CJK> +0x91AB # <CJK> +0x91AF # <CJK> +0x91B4 # <CJK> +0x91B5 # <CJK> +0x91B8 # <CJK> +0x91BA # <CJK> +0x91C0 # <CJK> +0x91C1 # <CJK> +0x91C6 # <CJK> +0x91C7 # <CJK> +0x91C8 # <CJK> +0x91C9 # <CJK> +0x91CB # <CJK> +0x91CC # <CJK> +0x91CD # <CJK> +0x91CE # <CJK> +0x91CF # <CJK> +0x91D0 # <CJK> +0x91D1 # <CJK> +0x91D6 # <CJK> +0x91D8 # <CJK> +0x91DB # <CJK> +0x91DC # <CJK> +0x91DD # <CJK> +0x91DF # <CJK> +0x91E1 # <CJK> +0x91E3 # <CJK> +0x91E6 # <CJK> +0x91E7 # <CJK> +0x91F5 # <CJK> +0x91F6 # <CJK> +0x91FC # <CJK> +0x91FF # <CJK> +0x920D # <CJK> +0x920E # <CJK> +0x9211 # <CJK> +0x9214 # <CJK> +0x9215 # <CJK> +0x921E # <CJK> +0x9229 # <CJK> +0x922C # <CJK> +0x9234 # <CJK> +0x9237 # <CJK> +0x923F # <CJK> +0x9244 # <CJK> +0x9245 # <CJK> +0x9248 # <CJK> +0x9249 # <CJK> +0x924B # <CJK> +0x9250 # <CJK> +0x9257 # <CJK> +0x925A # <CJK> +0x925B # <CJK> +0x925E # <CJK> +0x9262 # <CJK> +0x9264 # <CJK> +0x9266 # <CJK> +0x9271 # <CJK> +0x927E # <CJK> +0x9280 # <CJK> +0x9283 # <CJK> +0x9285 # <CJK> +0x9291 # <CJK> +0x9293 # <CJK> +0x9295 # <CJK> +0x9296 # <CJK> +0x9298 # <CJK> +0x929A # <CJK> +0x929B # <CJK> +0x929C # <CJK> +0x92AD # <CJK> +0x92B7 # <CJK> +0x92B9 # <CJK> +0x92CF # <CJK> +0x92D2 # <CJK> +0x92E4 # <CJK> +0x92E9 # <CJK> +0x92EA # <CJK> +0x92ED # <CJK> +0x92F2 # <CJK> +0x92F3 # <CJK> +0x92F8 # <CJK> +0x92FA # <CJK> +0x92FC # <CJK> +0x9306 # <CJK> +0x930F # <CJK> +0x9310 # <CJK> +0x9318 # <CJK> +0x9319 # <CJK> +0x931A # <CJK> +0x9320 # <CJK> +0x9322 # <CJK> +0x9323 # <CJK> +0x9326 # <CJK> +0x9328 # <CJK> +0x932B # <CJK> +0x932C # <CJK> +0x932E # <CJK> +0x932F # <CJK> +0x9332 # <CJK> +0x9335 # <CJK> +0x933A # <CJK> +0x933B # <CJK> +0x9344 # <CJK> +0x934B # <CJK> +0x934D # <CJK> +0x9354 # <CJK> +0x9356 # <CJK> +0x935B # <CJK> +0x935C # <CJK> +0x9360 # <CJK> +0x936C # <CJK> +0x936E # <CJK> +0x9375 # <CJK> +0x937C # <CJK> +0x937E # <CJK> +0x938C # <CJK> +0x9394 # <CJK> +0x9396 # <CJK> +0x9397 # <CJK> +0x939A # <CJK> +0x93A7 # <CJK> +0x93AC # <CJK> +0x93AD # <CJK> +0x93AE # <CJK> +0x93B0 # <CJK> +0x93B9 # <CJK> +0x93C3 # <CJK> +0x93C8 # <CJK> +0x93D0 # <CJK> +0x93D1 # <CJK> +0x93D6 # <CJK> +0x93D7 # <CJK> +0x93D8 # <CJK> +0x93DD # <CJK> +0x93E1 # <CJK> +0x93E4 # <CJK> +0x93E5 # <CJK> +0x93E8 # <CJK> +0x9403 # <CJK> +0x9407 # <CJK> +0x9410 # <CJK> +0x9413 # <CJK> +0x9414 # <CJK> +0x9418 # <CJK> +0x9419 # <CJK> +0x941A # <CJK> +0x9421 # <CJK> +0x942B # <CJK> +0x9435 # <CJK> +0x9436 # <CJK> +0x9438 # <CJK> +0x943A # <CJK> +0x9441 # <CJK> +0x9444 # <CJK> +0x9451 # <CJK> +0x9452 # <CJK> +0x9453 # <CJK> +0x945A # <CJK> +0x945B # <CJK> +0x945E # <CJK> +0x9460 # <CJK> +0x9462 # <CJK> +0x946A # <CJK> +0x9470 # <CJK> +0x9475 # <CJK> +0x9477 # <CJK> +0x947C # <CJK> +0x947D # <CJK> +0x947E # <CJK> +0x947F # <CJK> +0x9481 # <CJK> +0x9577 # <CJK> +0x9580 # <CJK> +0x9582 # <CJK> +0x9583 # <CJK> +0x9587 # <CJK> +0x9589 # <CJK> +0x958A # <CJK> +0x958B # <CJK> +0x958F # <CJK> +0x9591 # <CJK> +0x9593 # <CJK> +0x9594 # <CJK> +0x9596 # <CJK> +0x9598 # <CJK> +0x9599 # <CJK> +0x95A0 # <CJK> +0x95A2 # <CJK> +0x95A3 # <CJK> +0x95A4 # <CJK> +0x95A5 # <CJK> +0x95A7 # <CJK> +0x95A8 # <CJK> +0x95AD # <CJK> +0x95B2 # <CJK> +0x95B9 # <CJK> +0x95BB # <CJK> +0x95BC # <CJK> +0x95BE # <CJK> +0x95C3 # <CJK> +0x95C7 # <CJK> +0x95CA # <CJK> +0x95CC # <CJK> +0x95CD # <CJK> +0x95D4 # <CJK> +0x95D5 # <CJK> +0x95D6 # <CJK> +0x95D8 # <CJK> +0x95DC # <CJK> +0x95E1 # <CJK> +0x95E2 # <CJK> +0x95E5 # <CJK> +0x961C # <CJK> +0x9621 # <CJK> +0x9628 # <CJK> +0x962A # <CJK> +0x962E # <CJK> +0x962F # <CJK> +0x9632 # <CJK> +0x963B # <CJK> +0x963F # <CJK> +0x9640 # <CJK> +0x9642 # <CJK> +0x9644 # <CJK> +0x964B # <CJK> +0x964C # <CJK> +0x964D # <CJK> +0x964F # <CJK> +0x9650 # <CJK> +0x965B # <CJK> +0x965C # <CJK> +0x965D # <CJK> +0x965E # <CJK> +0x965F # <CJK> +0x9662 # <CJK> +0x9663 # <CJK> +0x9664 # <CJK> +0x9665 # <CJK> +0x9666 # <CJK> +0x966A # <CJK> +0x966C # <CJK> +0x9670 # <CJK> +0x9672 # <CJK> +0x9673 # <CJK> +0x9675 # <CJK> +0x9676 # <CJK> +0x9677 # <CJK> +0x9678 # <CJK> +0x967A # <CJK> +0x967D # <CJK> +0x9685 # <CJK> +0x9686 # <CJK> +0x9688 # <CJK> +0x968A # <CJK> +0x968B # <CJK> +0x968D # <CJK> +0x968E # <CJK> +0x968F # <CJK> +0x9694 # <CJK> +0x9695 # <CJK> +0x9697 # <CJK> +0x9698 # <CJK> +0x9699 # <CJK> +0x969B # <CJK> +0x969C # <CJK> +0x96A0 # <CJK> +0x96A3 # <CJK> +0x96A7 # <CJK> +0x96A8 # <CJK> +0x96AA # <CJK> +0x96B0 # <CJK> +0x96B1 # <CJK> +0x96B2 # <CJK> +0x96B4 # <CJK> +0x96B6 # <CJK> +0x96B7 # <CJK> +0x96B8 # <CJK> +0x96B9 # <CJK> +0x96BB # <CJK> +0x96BC # <CJK> +0x96C0 # <CJK> +0x96C1 # <CJK> +0x96C4 # <CJK> +0x96C5 # <CJK> +0x96C6 # <CJK> +0x96C7 # <CJK> +0x96C9 # <CJK> +0x96CB # <CJK> +0x96CC # <CJK> +0x96CD # <CJK> +0x96CE # <CJK> +0x96D1 # <CJK> +0x96D5 # <CJK> +0x96D6 # <CJK> +0x96D9 # <CJK> +0x96DB # <CJK> +0x96DC # <CJK> +0x96E2 # <CJK> +0x96E3 # <CJK> +0x96E8 # <CJK> +0x96EA # <CJK> +0x96EB # <CJK> +0x96F0 # <CJK> +0x96F2 # <CJK> +0x96F6 # <CJK> +0x96F7 # <CJK> +0x96F9 # <CJK> +0x96FB # <CJK> +0x9700 # <CJK> +0x9704 # <CJK> +0x9706 # <CJK> +0x9707 # <CJK> +0x9708 # <CJK> +0x970A # <CJK> +0x970D # <CJK> +0x970E # <CJK> +0x970F # <CJK> +0x9711 # <CJK> +0x9713 # <CJK> +0x9716 # <CJK> +0x9719 # <CJK> +0x971C # <CJK> +0x971E # <CJK> +0x9724 # <CJK> +0x9727 # <CJK> +0x972A # <CJK> +0x9730 # <CJK> +0x9732 # <CJK> +0x9738 # <CJK> +0x9739 # <CJK> +0x973D # <CJK> +0x973E # <CJK> +0x9742 # <CJK> +0x9744 # <CJK> +0x9746 # <CJK> +0x9748 # <CJK> +0x9749 # <CJK> +0x9752 # <CJK> +0x9756 # <CJK> +0x9759 # <CJK> +0x975C # <CJK> +0x975E # <CJK> +0x9760 # <CJK> +0x9761 # <CJK> +0x9762 # <CJK> +0x9764 # <CJK> +0x9766 # <CJK> +0x9768 # <CJK> +0x9769 # <CJK> +0x976B # <CJK> +0x976D # <CJK> +0x9771 # <CJK> +0x9774 # <CJK> +0x9779 # <CJK> +0x977A # <CJK> +0x977C # <CJK> +0x9781 # <CJK> +0x9784 # <CJK> +0x9785 # <CJK> +0x9786 # <CJK> +0x978B # <CJK> +0x978D # <CJK> +0x978F # <CJK> +0x9790 # <CJK> +0x9798 # <CJK> +0x979C # <CJK> +0x97A0 # <CJK> +0x97A3 # <CJK> +0x97A6 # <CJK> +0x97A8 # <CJK> +0x97AB # <CJK> +0x97AD # <CJK> +0x97B3 # <CJK> +0x97B4 # <CJK> +0x97C3 # <CJK> +0x97C6 # <CJK> +0x97C8 # <CJK> +0x97CB # <CJK> +0x97D3 # <CJK> +0x97DC # <CJK> +0x97ED # <CJK> +0x97EE # <CJK> +0x97F2 # <CJK> +0x97F3 # <CJK> +0x97F5 # <CJK> +0x97F6 # <CJK> +0x97FB # <CJK> +0x97FF # <CJK> +0x9801 # <CJK> +0x9802 # <CJK> +0x9803 # <CJK> +0x9805 # <CJK> +0x9806 # <CJK> +0x9808 # <CJK> +0x980C # <CJK> +0x980F # <CJK> +0x9810 # <CJK> +0x9811 # <CJK> +0x9812 # <CJK> +0x9813 # <CJK> +0x9817 # <CJK> +0x9818 # <CJK> +0x981A # <CJK> +0x9821 # <CJK> +0x9824 # <CJK> +0x982C # <CJK> +0x982D # <CJK> +0x9834 # <CJK> +0x9837 # <CJK> +0x9838 # <CJK> +0x983B # <CJK> +0x983C # <CJK> +0x983D # <CJK> +0x9846 # <CJK> +0x984B # <CJK> +0x984C # <CJK> +0x984D # <CJK> +0x984E # <CJK> +0x984F # <CJK> +0x9854 # <CJK> +0x9855 # <CJK> +0x9858 # <CJK> +0x985B # <CJK> +0x985E # <CJK> +0x9867 # <CJK> +0x986B # <CJK> +0x986F # <CJK> +0x9870 # <CJK> +0x9871 # <CJK> +0x9873 # <CJK> +0x9874 # <CJK> +0x98A8 # <CJK> +0x98AA # <CJK> +0x98AF # <CJK> +0x98B1 # <CJK> +0x98B6 # <CJK> +0x98C3 # <CJK> +0x98C4 # <CJK> +0x98C6 # <CJK> +0x98DB # <CJK> +0x98DC # <CJK> +0x98DF # <CJK> +0x98E2 # <CJK> +0x98E9 # <CJK> +0x98EB # <CJK> +0x98ED # <CJK> +0x98EE # <CJK> +0x98EF # <CJK> +0x98F2 # <CJK> +0x98F4 # <CJK> +0x98FC # <CJK> +0x98FD # <CJK> +0x98FE # <CJK> +0x9903 # <CJK> +0x9905 # <CJK> +0x9909 # <CJK> +0x990A # <CJK> +0x990C # <CJK> +0x9910 # <CJK> +0x9912 # <CJK> +0x9913 # <CJK> +0x9914 # <CJK> +0x9918 # <CJK> +0x991D # <CJK> +0x991E # <CJK> +0x9920 # <CJK> +0x9921 # <CJK> +0x9924 # <CJK> +0x9928 # <CJK> +0x992C # <CJK> +0x992E # <CJK> +0x993D # <CJK> +0x993E # <CJK> +0x9942 # <CJK> +0x9945 # <CJK> +0x9949 # <CJK> +0x994B # <CJK> +0x994C # <CJK> +0x9950 # <CJK> +0x9951 # <CJK> +0x9952 # <CJK> +0x9955 # <CJK> +0x9957 # <CJK> +0x9996 # <CJK> +0x9997 # <CJK> +0x9998 # <CJK> +0x9999 # <CJK> +0x99A5 # <CJK> +0x99A8 # <CJK> +0x99AC # <CJK> +0x99AD # <CJK> +0x99AE # <CJK> +0x99B3 # <CJK> +0x99B4 # <CJK> +0x99BC # <CJK> +0x99C1 # <CJK> +0x99C4 # <CJK> +0x99C5 # <CJK> +0x99C6 # <CJK> +0x99C8 # <CJK> +0x99D0 # <CJK> +0x99D1 # <CJK> +0x99D2 # <CJK> +0x99D5 # <CJK> +0x99D8 # <CJK> +0x99DB # <CJK> +0x99DD # <CJK> +0x99DF # <CJK> +0x99E2 # <CJK> +0x99ED # <CJK> +0x99EE # <CJK> +0x99F1 # <CJK> +0x99F2 # <CJK> +0x99F8 # <CJK> +0x99FB # <CJK> +0x99FF # <CJK> +0x9A01 # <CJK> +0x9A05 # <CJK> +0x9A0E # <CJK> +0x9A0F # <CJK> +0x9A12 # <CJK> +0x9A13 # <CJK> +0x9A19 # <CJK> +0x9A28 # <CJK> +0x9A2B # <CJK> +0x9A30 # <CJK> +0x9A37 # <CJK> +0x9A3E # <CJK> +0x9A40 # <CJK> +0x9A42 # <CJK> +0x9A43 # <CJK> +0x9A45 # <CJK> +0x9A4D # <CJK> +0x9A55 # <CJK> +0x9A57 # <CJK> +0x9A5A # <CJK> +0x9A5B # <CJK> +0x9A5F # <CJK> +0x9A62 # <CJK> +0x9A64 # <CJK> +0x9A65 # <CJK> +0x9A69 # <CJK> +0x9A6A # <CJK> +0x9A6B # <CJK> +0x9AA8 # <CJK> +0x9AAD # <CJK> +0x9AB0 # <CJK> +0x9AB8 # <CJK> +0x9ABC # <CJK> +0x9AC0 # <CJK> +0x9AC4 # <CJK> +0x9ACF # <CJK> +0x9AD1 # <CJK> +0x9AD3 # <CJK> +0x9AD4 # <CJK> +0x9AD8 # <CJK> +0x9ADE # <CJK> +0x9ADF # <CJK> +0x9AE2 # <CJK> +0x9AE3 # <CJK> +0x9AE6 # <CJK> +0x9AEA # <CJK> +0x9AEB # <CJK> +0x9AED # <CJK> +0x9AEE # <CJK> +0x9AEF # <CJK> +0x9AF1 # <CJK> +0x9AF4 # <CJK> +0x9AF7 # <CJK> +0x9AFB # <CJK> +0x9B06 # <CJK> +0x9B18 # <CJK> +0x9B1A # <CJK> +0x9B1F # <CJK> +0x9B22 # <CJK> +0x9B23 # <CJK> +0x9B25 # <CJK> +0x9B27 # <CJK> +0x9B28 # <CJK> +0x9B29 # <CJK> +0x9B2A # <CJK> +0x9B2E # <CJK> +0x9B2F # <CJK> +0x9B31 # <CJK> +0x9B32 # <CJK> +0x9B3B # <CJK> +0x9B3C # <CJK> +0x9B41 # <CJK> +0x9B42 # <CJK> +0x9B43 # <CJK> +0x9B44 # <CJK> +0x9B45 # <CJK> +0x9B4D # <CJK> +0x9B4E # <CJK> +0x9B4F # <CJK> +0x9B51 # <CJK> +0x9B54 # <CJK> +0x9B58 # <CJK> +0x9B5A # <CJK> +0x9B6F # <CJK> +0x9B74 # <CJK> +0x9B83 # <CJK> +0x9B8E # <CJK> +0x9B91 # <CJK> +0x9B92 # <CJK> +0x9B93 # <CJK> +0x9B96 # <CJK> +0x9B97 # <CJK> +0x9B9F # <CJK> +0x9BA0 # <CJK> +0x9BA8 # <CJK> +0x9BAA # <CJK> +0x9BAB # <CJK> +0x9BAD # <CJK> +0x9BAE # <CJK> +0x9BB4 # <CJK> +0x9BB9 # <CJK> +0x9BC0 # <CJK> +0x9BC6 # <CJK> +0x9BC9 # <CJK> +0x9BCA # <CJK> +0x9BCF # <CJK> +0x9BD1 # <CJK> +0x9BD2 # <CJK> +0x9BD4 # <CJK> +0x9BD6 # <CJK> +0x9BDB # <CJK> +0x9BE1 # <CJK> +0x9BE2 # <CJK> +0x9BE3 # <CJK> +0x9BE4 # <CJK> +0x9BE8 # <CJK> +0x9BF0 # <CJK> +0x9BF1 # <CJK> +0x9BF2 # <CJK> +0x9BF5 # <CJK> +0x9C04 # <CJK> +0x9C06 # <CJK> +0x9C08 # <CJK> +0x9C09 # <CJK> +0x9C0A # <CJK> +0x9C0C # <CJK> +0x9C0D # <CJK> +0x9C10 # <CJK> +0x9C12 # <CJK> +0x9C13 # <CJK> +0x9C14 # <CJK> +0x9C15 # <CJK> +0x9C1B # <CJK> +0x9C21 # <CJK> +0x9C24 # <CJK> +0x9C25 # <CJK> +0x9C2D # <CJK> +0x9C2E # <CJK> +0x9C2F # <CJK> +0x9C30 # <CJK> +0x9C32 # <CJK> +0x9C39 # <CJK> +0x9C3A # <CJK> +0x9C3B # <CJK> +0x9C3E # <CJK> +0x9C46 # <CJK> +0x9C47 # <CJK> +0x9C48 # <CJK> +0x9C52 # <CJK> +0x9C57 # <CJK> +0x9C5A # <CJK> +0x9C60 # <CJK> +0x9C67 # <CJK> +0x9C76 # <CJK> +0x9C78 # <CJK> +0x9CE5 # <CJK> +0x9CE7 # <CJK> +0x9CE9 # <CJK> +0x9CEB # <CJK> +0x9CEC # <CJK> +0x9CF0 # <CJK> +0x9CF3 # <CJK> +0x9CF4 # <CJK> +0x9CF6 # <CJK> +0x9D03 # <CJK> +0x9D06 # <CJK> +0x9D07 # <CJK> +0x9D08 # <CJK> +0x9D09 # <CJK> +0x9D0E # <CJK> +0x9D12 # <CJK> +0x9D15 # <CJK> +0x9D1B # <CJK> +0x9D1F # <CJK> +0x9D23 # <CJK> +0x9D26 # <CJK> +0x9D28 # <CJK> +0x9D2A # <CJK> +0x9D2B # <CJK> +0x9D2C # <CJK> +0x9D3B # <CJK> +0x9D3E # <CJK> +0x9D3F # <CJK> +0x9D41 # <CJK> +0x9D44 # <CJK> +0x9D46 # <CJK> +0x9D48 # <CJK> +0x9D50 # <CJK> +0x9D51 # <CJK> +0x9D59 # <CJK> +0x9D5C # <CJK> +0x9D5D # <CJK> +0x9D5E # <CJK> +0x9D60 # <CJK> +0x9D61 # <CJK> +0x9D64 # <CJK> +0x9D6C # <CJK> +0x9D6F # <CJK> +0x9D72 # <CJK> +0x9D7A # <CJK> +0x9D87 # <CJK> +0x9D89 # <CJK> +0x9D8F # <CJK> +0x9D9A # <CJK> +0x9DA4 # <CJK> +0x9DA9 # <CJK> +0x9DAB # <CJK> +0x9DAF # <CJK> +0x9DB2 # <CJK> +0x9DB4 # <CJK> +0x9DB8 # <CJK> +0x9DBA # <CJK> +0x9DBB # <CJK> +0x9DC1 # <CJK> +0x9DC2 # <CJK> +0x9DC4 # <CJK> +0x9DC6 # <CJK> +0x9DCF # <CJK> +0x9DD3 # <CJK> +0x9DD9 # <CJK> +0x9DE6 # <CJK> +0x9DED # <CJK> +0x9DEF # <CJK> +0x9DF2 # <CJK> +0x9DF8 # <CJK> +0x9DF9 # <CJK> +0x9DFA # <CJK> +0x9DFD # <CJK> +0x9E1A # <CJK> +0x9E1B # <CJK> +0x9E1E # <CJK> +0x9E75 # <CJK> +0x9E78 # <CJK> +0x9E79 # <CJK> +0x9E7D # <CJK> +0x9E7F # <CJK> +0x9E81 # <CJK> +0x9E88 # <CJK> +0x9E8B # <CJK> +0x9E8C # <CJK> +0x9E91 # <CJK> +0x9E92 # <CJK> +0x9E93 # <CJK> +0x9E95 # <CJK> +0x9E97 # <CJK> +0x9E9D # <CJK> +0x9E9F # <CJK> +0x9EA5 # <CJK> +0x9EA6 # <CJK> +0x9EA9 # <CJK> +0x9EAA # <CJK> +0x9EAD # <CJK> +0x9EB8 # <CJK> +0x9EB9 # <CJK> +0x9EBA # <CJK> +0x9EBB # <CJK> +0x9EBC # <CJK> +0x9EBE # <CJK> +0x9EBF # <CJK> +0x9EC4 # <CJK> +0x9ECC # <CJK> +0x9ECD # <CJK> +0x9ECE # <CJK> +0x9ECF # <CJK> +0x9ED0 # <CJK> +0x9ED2 # <CJK> +0x9ED4 # <CJK> +0x9ED8 # <CJK> +0x9ED9 # <CJK> +0x9EDB # <CJK> +0x9EDC # <CJK> +0x9EDD # <CJK> +0x9EDE # <CJK> +0x9EE0 # <CJK> +0x9EE5 # <CJK> +0x9EE8 # <CJK> +0x9EEF # <CJK> +0x9EF4 # <CJK> +0x9EF6 # <CJK> +0x9EF7 # <CJK> +0x9EF9 # <CJK> +0x9EFB # <CJK> +0x9EFC # <CJK> +0x9EFD # <CJK> +0x9F07 # <CJK> +0x9F08 # <CJK> +0x9F0E # <CJK> +0x9F13 # <CJK> +0x9F15 # <CJK> +0x9F20 # <CJK> +0x9F21 # <CJK> +0x9F2C # <CJK> +0x9F3B # <CJK> +0x9F3E # <CJK> +0x9F4A # <CJK> +0x9F4B # <CJK> +0x9F4E # <CJK> +0x9F4F # <CJK> +0x9F52 # <CJK> +0x9F54 # <CJK> +0x9F5F # <CJK> +0x9F60 # <CJK> +0x9F61 # <CJK> +0x9F62 # <CJK> +0x9F63 # <CJK> +0x9F66 # <CJK> +0x9F67 # <CJK> +0x9F6A # <CJK> +0x9F6C # <CJK> +0x9F72 # <CJK> +0x9F76 # <CJK> +0x9F77 # <CJK> +0x9F8D # <CJK> +0x9F95 # <CJK> +0x9F9C # <CJK> +0x9F9D # <CJK> +0x9FA0 # <CJK> +#0xFFE5 # FULLWIDTH YEN SIGN diff --git a/fontconfig/fc-lang/jv.orth b/fontconfig/fc-lang/jv.orth new file mode 100644 index 000000000..0a8610bcd --- /dev/null +++ b/fontconfig/fc-lang/jv.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/jv.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Javanese (jv) +# +# Sources: +# http://www.omniglot.com/writing/javanese.htm +# http://en.wikipedia.org/wiki/Javanese_language +# +# The historical Javanese script is not the main script anymore. Latin has +# replaced it. +# +0041-005A +0061-007A +00C8-00C9 +00E8-00E9 diff --git a/fontconfig/fc-lang/ka.orth b/fontconfig/fc-lang/ka.orth new file mode 100644 index 000000000..dda35ade5 --- /dev/null +++ b/fontconfig/fc-lang/ka.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/ka.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Georgian (KA) +# 0589 # Armenian full stop (vertsaket) +#10a0-10c5 # capital letters, not used in normal writing +10d0-10f0 +#10f1-10f6 # Archaic letters not included in modern fonts +#10f7-10f8 # additional letters for Mingrelian and Svan +#10fb # Ancient Georgian paragraph separator +#2018 # single quote +#201a # single quote +#201c # double quote +#201e # double quote diff --git a/fontconfig/fc-lang/kaa.orth b/fontconfig/fc-lang/kaa.orth new file mode 100644 index 000000000..fe641a567 --- /dev/null +++ b/fontconfig/fc-lang/kaa.orth @@ -0,0 +1,110 @@ +# +# fontconfig/fc-lang/kaa.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Kara-Kalpak (Karakalpak) (KAA) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA (Historic cyrillic letter) +#0473 # CYRILLIC SMALL LETTER FITA (Historic cyrillic letter) +0492 +0493 +049a +049b +04a2 +04a3 +04ae +04af +04b2 +04b3 +04d8 +04d9 diff --git a/fontconfig/fc-lang/kab.orth b/fontconfig/fc-lang/kab.orth new file mode 100644 index 000000000..8513fd79b --- /dev/null +++ b/fontconfig/fc-lang/kab.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/kab.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kabyle (kab) +# +# Sources: +# http://www.omniglot.com/writing/kabyle.php +# http://www.geonames.de/alphkl.html +# +0041-005A +0061-007A +010C-010D +0190 +0194 +01E6-01E7 +025B +0263 +1E0C-1E0D +1E24-1E25 +1E62-1E63 +1E6C-1E6D +1E92-1E93 diff --git a/fontconfig/fc-lang/ki.orth b/fontconfig/fc-lang/ki.orth new file mode 100644 index 000000000..147ce8584 --- /dev/null +++ b/fontconfig/fc-lang/ki.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/ki.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kikuyu (KI) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a +0061-007a +0128 # LATIN CAPITAL LETTER I WITH TILDE +0129 # LATIN SMALL LETTER I WITH TILDE +0168 # LATIN CAPITAL LETTER U WITH TILDE +0169 # LATIN SMALL LETTER U WITH TILDE diff --git a/fontconfig/fc-lang/kj.orth b/fontconfig/fc-lang/kj.orth new file mode 100644 index 000000000..79edc316e --- /dev/null +++ b/fontconfig/fc-lang/kj.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/kj.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kuanyama/Kwanyama (kj) +# +# Sources: +# * http://www.omniglot.com/writing/oshiwambo.php +# * http://www.panafril10n.org/wikidoc/pmwiki.php/PanAfrLoc/Oshiwambo +# * http://wingolog.org/pub/hai-ti/hai-ti.pdf +# +# C, Q, and X are not used. +# +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/kk.orth b/fontconfig/fc-lang/kk.orth new file mode 100644 index 000000000..009a97ec8 --- /dev/null +++ b/fontconfig/fc-lang/kk.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/kk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kazakh (KK) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00ab +#00bb +#0401 +#0406 +0410-044f +#0451 +0456 +0492-0493 +049a-049b +04a2-04a3 +#04ae-04af +#04b0-04b1 +04ba-04bb +04d8-04d9 +04e8-04e9 +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/kl.orth b/fontconfig/fc-lang/kl.orth new file mode 100644 index 000000000..2763de26d --- /dev/null +++ b/fontconfig/fc-lang/kl.orth @@ -0,0 +1,63 @@ +# +# fontconfig/fc-lang/kl.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Greenlandic (KL) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00ab +#00bb +00c1 +00c2 +00c3 +00c5 +00c6 +#00c9 +00ca +00cd +00ce +00d4 +00d8 +00da +00db +00e1 +00e2 +00e3 +00e5 +00e6 +#00e9 +00ea +00ed +00ee +00f4 +00f8 +00fa +00fb +0128-0129 +0138 +0168-0169 +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/km.orth b/fontconfig/fc-lang/km.orth new file mode 100644 index 000000000..2bad0cfae --- /dev/null +++ b/fontconfig/fc-lang/km.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/km.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Central Khmer (km) +# +# Taken from the Unicode coverage of Khmer script and Unicode character +# notes +# +1780-179C +# 179D-179E # Pali/Sanskrit transliteration only +179F-17A2 +# 17A3-17A4 # Deprecated/Discouraged +17A5-17A7 +# 17A8 # Discouraged +17A9-17B3 +# 17B4-17B5 # Discouraged +17B6-17C5 + diff --git a/fontconfig/fc-lang/kn.orth b/fontconfig/fc-lang/kn.orth new file mode 100644 index 000000000..7b525304a --- /dev/null +++ b/fontconfig/fc-lang/kn.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/kn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kannada (kn) +# +# Taken from the Unicode coverage of this language +# +0c82-0c83 +0c85-0c8c +0c8e-0c90 +0c92-0ca8 +0caa-0cb3 +0cb5-0cb9 +0cbe-0cc4 +0cc6-0cc8 +0cca-0ccd +0cd5-0cd6 +0cde +0ce0-0ce1 +#0ce6-0cef # Digits diff --git a/fontconfig/fc-lang/ko.orth b/fontconfig/fc-lang/ko.orth new file mode 100644 index 000000000..1b02d9a8c --- /dev/null +++ b/fontconfig/fc-lang/ko.orth @@ -0,0 +1,2538 @@ +# +# fontconfig/fc-lang/ko.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Korean (KO) +# +# Coverage from KS X 1001 +# +# Does not include any Han characters as many Korean fonts +# don't cover them, and modern Korean usage is moving away from them +# +# Tor Andersson <tor.andersson@gmail.com> +# +#0x3000 # IDEOGRAPHIC SPACE +#0x3001 # IDEOGRAPHIC COMMA +#0x3002 # IDEOGRAPHIC FULL STOP +#0x327F # KOREAN STANDARD SYMBOL +#0xFFE6 # FULLWIDTH WON SIGN +0x3131 # HANGUL LETTER KIYEOK +0x3132 # HANGUL LETTER SSANGKIYEOK +0x3133 # HANGUL LETTER KIYEOK-SIOS +0x3134 # HANGUL LETTER NIEUN +0x3135 # HANGUL LETTER NIEUN-CIEUC +0x3136 # HANGUL LETTER NIEUN-HIEUH +0x3137 # HANGUL LETTER TIKEUT +0x3138 # HANGUL LETTER SSANGTIKEUT +0x3139 # HANGUL LETTER RIEUL +0x313A # HANGUL LETTER RIEUL-KIYEOK +0x313B # HANGUL LETTER RIEUL-MIEUM +0x313C # HANGUL LETTER RIEUL-PIEUP +0x313D # HANGUL LETTER RIEUL-SIOS +0x313E # HANGUL LETTER RIEUL-THIEUTH +0x313F # HANGUL LETTER RIEUL-PHIEUPH +0x3140 # HANGUL LETTER RIEUL-HIEUH +0x3141 # HANGUL LETTER MIEUM +0x3142 # HANGUL LETTER PIEUP +0x3143 # HANGUL LETTER SSANGPIEUP +0x3144 # HANGUL LETTER PIEUP-SIOS +0x3145 # HANGUL LETTER SIOS +0x3146 # HANGUL LETTER SSANGSIOS +0x3147 # HANGUL LETTER IEUNG +0x3148 # HANGUL LETTER CIEUC +0x3149 # HANGUL LETTER SSANGCIEUC +0x314A # HANGUL LETTER CHIEUCH +0x314B # HANGUL LETTER KHIEUKH +0x314C # HANGUL LETTER THIEUTH +0x314D # HANGUL LETTER PHIEUPH +0x314E # HANGUL LETTER HIEUH +0x314F # HANGUL LETTER A +0x3150 # HANGUL LETTER AE +0x3151 # HANGUL LETTER YA +0x3152 # HANGUL LETTER YAE +0x3153 # HANGUL LETTER EO +0x3154 # HANGUL LETTER E +0x3155 # HANGUL LETTER YEO +0x3156 # HANGUL LETTER YE +0x3157 # HANGUL LETTER O +0x3158 # HANGUL LETTER WA +0x3159 # HANGUL LETTER WAE +0x315A # HANGUL LETTER OE +0x315B # HANGUL LETTER YO +0x315C # HANGUL LETTER U +0x315D # HANGUL LETTER WEO +0x315E # HANGUL LETTER WE +0x315F # HANGUL LETTER WI +0x3160 # HANGUL LETTER YU +0x3161 # HANGUL LETTER EU +0x3162 # HANGUL LETTER YI +0x3163 # HANGUL LETTER I +0x3164 # HANGUL FILLER +0x3165 # HANGUL LETTER SSANGNIEUN +0x3166 # HANGUL LETTER NIEUN-TIKEUT +0x3167 # HANGUL LETTER NIEUN-SIOS +0x3168 # HANGUL LETTER NIEUN-PANSIOS +0x3169 # HANGUL LETTER RIEUL-KIYEOK-SIOS +0x316A # HANGUL LETTER RIEUL-TIKEUT +0x316B # HANGUL LETTER RIEUL-PIEUP-SIOS +0x316C # HANGUL LETTER RIEUL-PANSIOS +0x316D # HANGUL LETTER RIEUL-YEORINHIEUH +0x316E # HANGUL LETTER MIEUM-PIEUP +0x316F # HANGUL LETTER MIEUM-SIOS +0x3170 # HANGUL LETTER MIEUM-PANSIOS +0x3171 # HANGUL LETTER KAPYEOUNMIEUM +0x3172 # HANGUL LETTER PIEUP-KIYEOK +0x3173 # HANGUL LETTER PIEUP-TIKEUT +0x3174 # HANGUL LETTER PIEUP-SIOS-KIYEOK +0x3175 # HANGUL LETTER PIEUP-SIOS-TIKEUT +0x3176 # HANGUL LETTER PIEUP-CIEUC +0x3177 # HANGUL LETTER PIEUP-THIEUTH +0x3178 # HANGUL LETTER KAPYEOUNPIEUP +0x3179 # HANGUL LETTER KAPYEOUNSSANGPIEUP +0x317A # HANGUL LETTER SIOS-KIYEOK +0x317B # HANGUL LETTER SIOS-NIEUN +0x317C # HANGUL LETTER SIOS-TIKEUT +0x317D # HANGUL LETTER SIOS-PIEUP +0x317E # HANGUL LETTER SIOS-CIEUC +0x317F # HANGUL LETTER PANSIOS +0x3180 # HANGUL LETTER SSANGIEUNG +0x3181 # HANGUL LETTER YESIEUNG +0x3182 # HANGUL LETTER YESIEUNG-SIOS +0x3183 # HANGUL LETTER YESIEUNG-PANSIOS +0x3184 # HANGUL LETTER KAPYEOUNPHIEUPH +0x3185 # HANGUL LETTER SSANGHIEUH +0x3186 # HANGUL LETTER YEORINHIEUH +0x3187 # HANGUL LETTER YO-YA +0x3188 # HANGUL LETTER YO-YAE +0x3189 # HANGUL LETTER YO-I +0x318A # HANGUL LETTER YU-YEO +0x318B # HANGUL LETTER YU-YE +0x318C # HANGUL LETTER YU-I +0x318D # HANGUL LETTER ARAEA +0x318E # HANGUL LETTER ARAEAE +#0x3260 # CIRCLED HANGUL KIYEOK +#0x3261 # CIRCLED HANGUL NIEUN +#0x3262 # CIRCLED HANGUL TIKEUT +#0x3263 # CIRCLED HANGUL RIEUL +#0x3264 # CIRCLED HANGUL MIEUM +#0x3265 # CIRCLED HANGUL PIEUP +#0x3266 # CIRCLED HANGUL SIOS +#0x3267 # CIRCLED HANGUL IEUNG +#0x3268 # CIRCLED HANGUL CIEUC +#0x3269 # CIRCLED HANGUL CHIEUCH +#0x326A # CIRCLED HANGUL KHIEUKH +#0x326B # CIRCLED HANGUL THIEUTH +#0x326C # CIRCLED HANGUL PHIEUPH +#0x326D # CIRCLED HANGUL HIEUH +#0x326E # CIRCLED HANGUL KIYEOK A +#0x326F # CIRCLED HANGUL NIEUN A +#0x3270 # CIRCLED HANGUL TIKEUT A +#0x3271 # CIRCLED HANGUL RIEUL A +#0x3272 # CIRCLED HANGUL MIEUM A +#0x3273 # CIRCLED HANGUL PIEUP A +#0x3274 # CIRCLED HANGUL SIOS A +#0x3275 # CIRCLED HANGUL IEUNG A +#0x3276 # CIRCLED HANGUL CIEUC A +#0x3277 # CIRCLED HANGUL CHIEUCH A +#0x3278 # CIRCLED HANGUL KHIEUKH A +#0x3279 # CIRCLED HANGUL THIEUTH A +#0x327A # CIRCLED HANGUL PHIEUPH A +#0x327B # CIRCLED HANGUL HIEUH A +#0x3200 # PARENTHESIZED HANGUL KIYEOK +#0x3201 # PARENTHESIZED HANGUL NIEUN +#0x3202 # PARENTHESIZED HANGUL TIKEUT +#0x3203 # PARENTHESIZED HANGUL RIEUL +#0x3204 # PARENTHESIZED HANGUL MIEUM +#0x3205 # PARENTHESIZED HANGUL PIEUP +#0x3206 # PARENTHESIZED HANGUL SIOS +#0x3207 # PARENTHESIZED HANGUL IEUNG +#0x3208 # PARENTHESIZED HANGUL CIEUC +#0x3209 # PARENTHESIZED HANGUL CHIEUCH +#0x320A # PARENTHESIZED HANGUL KHIEUKH +#0x320B # PARENTHESIZED HANGUL THIEUTH +#0x320C # PARENTHESIZED HANGUL PHIEUPH +#0x320D # PARENTHESIZED HANGUL HIEUH +#0x320E # PARENTHESIZED HANGUL KIYEOK A +#0x320F # PARENTHESIZED HANGUL NIEUN A +#0x3210 # PARENTHESIZED HANGUL TIKEUT A +#0x3211 # PARENTHESIZED HANGUL RIEUL A +#0x3212 # PARENTHESIZED HANGUL MIEUM A +#0x3213 # PARENTHESIZED HANGUL PIEUP A +#0x3214 # PARENTHESIZED HANGUL SIOS A +#0x3215 # PARENTHESIZED HANGUL IEUNG A +#0x3216 # PARENTHESIZED HANGUL CIEUC A +#0x3217 # PARENTHESIZED HANGUL CHIEUCH A +#0x3218 # PARENTHESIZED HANGUL KHIEUKH A +#0x3219 # PARENTHESIZED HANGUL THIEUTH A +#0x321A # PARENTHESIZED HANGUL PHIEUPH A +#0x321B # PARENTHESIZED HANGUL HIEUH A +#0x321C # PARENTHESIZED HANGUL CIEUC U +0xAC00 # HANGUL SYLLABLE KIYEOK-A +0xAC01 # HANGUL SYLLABLE KIYEOK-A-KIYEOK +0xAC04 # HANGUL SYLLABLE KIYEOK-A-NIEUN +0xAC07 # HANGUL SYLLABLE KIYEOK-A-TIKEUT +0xAC08 # HANGUL SYLLABLE KIYEOK-A-RIEUL +0xAC09 # HANGUL SYLLABLE KIYEOK-A-RIEULKIYEOK +0xAC0A # HANGUL SYLLABLE KIYEOK-A-RIEULMIEUM +0xAC10 # HANGUL SYLLABLE KIYEOK-A-MIEUM +0xAC11 # HANGUL SYLLABLE KIYEOK-A-PIEUP +0xAC12 # HANGUL SYLLABLE KIYEOK-A-PIEUPSIOS +0xAC13 # HANGUL SYLLABLE KIYEOK-A-SIOS +0xAC14 # HANGUL SYLLABLE KIYEOK-A-SSANGSIOS +0xAC15 # HANGUL SYLLABLE KIYEOK-A-IEUNG +0xAC16 # HANGUL SYLLABLE KIYEOK-A-CIEUC +0xAC17 # HANGUL SYLLABLE KIYEOK-A-CHIEUCH +0xAC19 # HANGUL SYLLABLE KIYEOK-A-THIEUTH +0xAC1A # HANGUL SYLLABLE KIYEOK-A-PHIEUPH +0xAC1B # HANGUL SYLLABLE KIYEOK-A-HIEUH +0xAC1C # HANGUL SYLLABLE KIYEOK-AE +0xAC1D # HANGUL SYLLABLE KIYEOK-AE-KIYEOK +0xAC20 # HANGUL SYLLABLE KIYEOK-AE-NIEUN +0xAC24 # HANGUL SYLLABLE KIYEOK-AE-RIEUL +0xAC2C # HANGUL SYLLABLE KIYEOK-AE-MIEUM +0xAC2D # HANGUL SYLLABLE KIYEOK-AE-PIEUP +0xAC2F # HANGUL SYLLABLE KIYEOK-AE-SIOS +0xAC30 # HANGUL SYLLABLE KIYEOK-AE-SSANGSIOS +0xAC31 # HANGUL SYLLABLE KIYEOK-AE-IEUNG +0xAC38 # HANGUL SYLLABLE KIYEOK-YA +0xAC39 # HANGUL SYLLABLE KIYEOK-YA-KIYEOK +0xAC3C # HANGUL SYLLABLE KIYEOK-YA-NIEUN +0xAC40 # HANGUL SYLLABLE KIYEOK-YA-RIEUL +0xAC4B # HANGUL SYLLABLE KIYEOK-YA-SIOS +0xAC4D # HANGUL SYLLABLE KIYEOK-YA-IEUNG +0xAC54 # HANGUL SYLLABLE KIYEOK-YAE +0xAC58 # HANGUL SYLLABLE KIYEOK-YAE-NIEUN +0xAC5C # HANGUL SYLLABLE KIYEOK-YAE-RIEUL +0xAC70 # HANGUL SYLLABLE KIYEOK-EO +0xAC71 # HANGUL SYLLABLE KIYEOK-EO-KIYEOK +0xAC74 # HANGUL SYLLABLE KIYEOK-EO-NIEUN +0xAC77 # HANGUL SYLLABLE KIYEOK-EO-TIKEUT +0xAC78 # HANGUL SYLLABLE KIYEOK-EO-RIEUL +0xAC7A # HANGUL SYLLABLE KIYEOK-EO-RIEULMIEUM +0xAC80 # HANGUL SYLLABLE KIYEOK-EO-MIEUM +0xAC81 # HANGUL SYLLABLE KIYEOK-EO-PIEUP +0xAC83 # HANGUL SYLLABLE KIYEOK-EO-SIOS +0xAC84 # HANGUL SYLLABLE KIYEOK-EO-SSANGSIOS +0xAC85 # HANGUL SYLLABLE KIYEOK-EO-IEUNG +0xAC86 # HANGUL SYLLABLE KIYEOK-EO-CIEUC +0xAC89 # HANGUL SYLLABLE KIYEOK-EO-THIEUTH +0xAC8A # HANGUL SYLLABLE KIYEOK-EO-PHIEUPH +0xAC8B # HANGUL SYLLABLE KIYEOK-EO-HIEUH +0xAC8C # HANGUL SYLLABLE KIYEOK-E +0xAC90 # HANGUL SYLLABLE KIYEOK-E-NIEUN +0xAC94 # HANGUL SYLLABLE KIYEOK-E-RIEUL +0xAC9C # HANGUL SYLLABLE KIYEOK-E-MIEUM +0xAC9D # HANGUL SYLLABLE KIYEOK-E-PIEUP +0xAC9F # HANGUL SYLLABLE KIYEOK-E-SIOS +0xACA0 # HANGUL SYLLABLE KIYEOK-E-SSANGSIOS +0xACA1 # HANGUL SYLLABLE KIYEOK-E-IEUNG +0xACA8 # HANGUL SYLLABLE KIYEOK-YEO +0xACA9 # HANGUL SYLLABLE KIYEOK-YEO-KIYEOK +0xACAA # HANGUL SYLLABLE KIYEOK-YEO-SSANGKIYEOK +0xACAC # HANGUL SYLLABLE KIYEOK-YEO-NIEUN +0xACAF # HANGUL SYLLABLE KIYEOK-YEO-TIKEUT +0xACB0 # HANGUL SYLLABLE KIYEOK-YEO-RIEUL +0xACB8 # HANGUL SYLLABLE KIYEOK-YEO-MIEUM +0xACB9 # HANGUL SYLLABLE KIYEOK-YEO-PIEUP +0xACBB # HANGUL SYLLABLE KIYEOK-YEO-SIOS +0xACBC # HANGUL SYLLABLE KIYEOK-YEO-SSANGSIOS +0xACBD # HANGUL SYLLABLE KIYEOK-YEO-IEUNG +0xACC1 # HANGUL SYLLABLE KIYEOK-YEO-THIEUTH +0xACC4 # HANGUL SYLLABLE KIYEOK-YE +0xACC8 # HANGUL SYLLABLE KIYEOK-YE-NIEUN +0xACCC # HANGUL SYLLABLE KIYEOK-YE-RIEUL +0xACD5 # HANGUL SYLLABLE KIYEOK-YE-PIEUP +0xACD7 # HANGUL SYLLABLE KIYEOK-YE-SIOS +0xACE0 # HANGUL SYLLABLE KIYEOK-O +0xACE1 # HANGUL SYLLABLE KIYEOK-O-KIYEOK +0xACE4 # HANGUL SYLLABLE KIYEOK-O-NIEUN +0xACE7 # HANGUL SYLLABLE KIYEOK-O-TIKEUT +0xACE8 # HANGUL SYLLABLE KIYEOK-O-RIEUL +0xACEA # HANGUL SYLLABLE KIYEOK-O-RIEULMIEUM +0xACEC # HANGUL SYLLABLE KIYEOK-O-RIEULSIOS +0xACEF # HANGUL SYLLABLE KIYEOK-O-RIEULHIEUH +0xACF0 # HANGUL SYLLABLE KIYEOK-O-MIEUM +0xACF1 # HANGUL SYLLABLE KIYEOK-O-PIEUP +0xACF3 # HANGUL SYLLABLE KIYEOK-O-SIOS +0xACF5 # HANGUL SYLLABLE KIYEOK-O-IEUNG +0xACF6 # HANGUL SYLLABLE KIYEOK-O-CIEUC +0xACFC # HANGUL SYLLABLE KIYEOK-WA +0xACFD # HANGUL SYLLABLE KIYEOK-WA-KIYEOK +0xAD00 # HANGUL SYLLABLE KIYEOK-WA-NIEUN +0xAD04 # HANGUL SYLLABLE KIYEOK-WA-RIEUL +0xAD06 # HANGUL SYLLABLE KIYEOK-WA-RIEULMIEUM +0xAD0C # HANGUL SYLLABLE KIYEOK-WA-MIEUM +0xAD0D # HANGUL SYLLABLE KIYEOK-WA-PIEUP +0xAD0F # HANGUL SYLLABLE KIYEOK-WA-SIOS +0xAD11 # HANGUL SYLLABLE KIYEOK-WA-IEUNG +0xAD18 # HANGUL SYLLABLE KIYEOK-WAE +0xAD1C # HANGUL SYLLABLE KIYEOK-WAE-NIEUN +0xAD20 # HANGUL SYLLABLE KIYEOK-WAE-RIEUL +0xAD29 # HANGUL SYLLABLE KIYEOK-WAE-PIEUP +0xAD2C # HANGUL SYLLABLE KIYEOK-WAE-SSANGSIOS +0xAD2D # HANGUL SYLLABLE KIYEOK-WAE-IEUNG +0xAD34 # HANGUL SYLLABLE KIYEOK-OE +0xAD35 # HANGUL SYLLABLE KIYEOK-OE-KIYEOK +0xAD38 # HANGUL SYLLABLE KIYEOK-OE-NIEUN +0xAD3C # HANGUL SYLLABLE KIYEOK-OE-RIEUL +0xAD44 # HANGUL SYLLABLE KIYEOK-OE-MIEUM +0xAD45 # HANGUL SYLLABLE KIYEOK-OE-PIEUP +0xAD47 # HANGUL SYLLABLE KIYEOK-OE-SIOS +0xAD49 # HANGUL SYLLABLE KIYEOK-OE-IEUNG +0xAD50 # HANGUL SYLLABLE KIYEOK-YO +0xAD54 # HANGUL SYLLABLE KIYEOK-YO-NIEUN +0xAD58 # HANGUL SYLLABLE KIYEOK-YO-RIEUL +0xAD61 # HANGUL SYLLABLE KIYEOK-YO-PIEUP +0xAD63 # HANGUL SYLLABLE KIYEOK-YO-SIOS +0xAD6C # HANGUL SYLLABLE KIYEOK-U +0xAD6D # HANGUL SYLLABLE KIYEOK-U-KIYEOK +0xAD70 # HANGUL SYLLABLE KIYEOK-U-NIEUN +0xAD73 # HANGUL SYLLABLE KIYEOK-U-TIKEUT +0xAD74 # HANGUL SYLLABLE KIYEOK-U-RIEUL +0xAD75 # HANGUL SYLLABLE KIYEOK-U-RIEULKIYEOK +0xAD76 # HANGUL SYLLABLE KIYEOK-U-RIEULMIEUM +0xAD7B # HANGUL SYLLABLE KIYEOK-U-RIEULHIEUH +0xAD7C # HANGUL SYLLABLE KIYEOK-U-MIEUM +0xAD7D # HANGUL SYLLABLE KIYEOK-U-PIEUP +0xAD7F # HANGUL SYLLABLE KIYEOK-U-SIOS +0xAD81 # HANGUL SYLLABLE KIYEOK-U-IEUNG +0xAD82 # HANGUL SYLLABLE KIYEOK-U-CIEUC +0xAD88 # HANGUL SYLLABLE KIYEOK-WEO +0xAD89 # HANGUL SYLLABLE KIYEOK-WEO-KIYEOK +0xAD8C # HANGUL SYLLABLE KIYEOK-WEO-NIEUN +0xAD90 # HANGUL SYLLABLE KIYEOK-WEO-RIEUL +0xAD9C # HANGUL SYLLABLE KIYEOK-WEO-SSANGSIOS +0xAD9D # HANGUL SYLLABLE KIYEOK-WEO-IEUNG +0xADA4 # HANGUL SYLLABLE KIYEOK-WE +0xADB7 # HANGUL SYLLABLE KIYEOK-WE-SIOS +0xADC0 # HANGUL SYLLABLE KIYEOK-WI +0xADC1 # HANGUL SYLLABLE KIYEOK-WI-KIYEOK +0xADC4 # HANGUL SYLLABLE KIYEOK-WI-NIEUN +0xADC8 # HANGUL SYLLABLE KIYEOK-WI-RIEUL +0xADD0 # HANGUL SYLLABLE KIYEOK-WI-MIEUM +0xADD1 # HANGUL SYLLABLE KIYEOK-WI-PIEUP +0xADD3 # HANGUL SYLLABLE KIYEOK-WI-SIOS +0xADDC # HANGUL SYLLABLE KIYEOK-YU +0xADE0 # HANGUL SYLLABLE KIYEOK-YU-NIEUN +0xADE4 # HANGUL SYLLABLE KIYEOK-YU-RIEUL +0xADF8 # HANGUL SYLLABLE KIYEOK-EU +0xADF9 # HANGUL SYLLABLE KIYEOK-EU-KIYEOK +0xADFC # HANGUL SYLLABLE KIYEOK-EU-NIEUN +0xADFF # HANGUL SYLLABLE KIYEOK-EU-TIKEUT +0xAE00 # HANGUL SYLLABLE KIYEOK-EU-RIEUL +0xAE01 # HANGUL SYLLABLE KIYEOK-EU-RIEULKIYEOK +0xAE08 # HANGUL SYLLABLE KIYEOK-EU-MIEUM +0xAE09 # HANGUL SYLLABLE KIYEOK-EU-PIEUP +0xAE0B # HANGUL SYLLABLE KIYEOK-EU-SIOS +0xAE0D # HANGUL SYLLABLE KIYEOK-EU-IEUNG +0xAE14 # HANGUL SYLLABLE KIYEOK-YI +0xAE30 # HANGUL SYLLABLE KIYEOK-I +0xAE31 # HANGUL SYLLABLE KIYEOK-I-KIYEOK +0xAE34 # HANGUL SYLLABLE KIYEOK-I-NIEUN +0xAE37 # HANGUL SYLLABLE KIYEOK-I-TIKEUT +0xAE38 # HANGUL SYLLABLE KIYEOK-I-RIEUL +0xAE3A # HANGUL SYLLABLE KIYEOK-I-RIEULMIEUM +0xAE40 # HANGUL SYLLABLE KIYEOK-I-MIEUM +0xAE41 # HANGUL SYLLABLE KIYEOK-I-PIEUP +0xAE43 # HANGUL SYLLABLE KIYEOK-I-SIOS +0xAE45 # HANGUL SYLLABLE KIYEOK-I-IEUNG +0xAE46 # HANGUL SYLLABLE KIYEOK-I-CIEUC +0xAE4A # HANGUL SYLLABLE KIYEOK-I-PHIEUPH +0xAE4C # HANGUL SYLLABLE SSANGKIYEOK-A +0xAE4D # HANGUL SYLLABLE SSANGKIYEOK-A-KIYEOK +0xAE4E # HANGUL SYLLABLE SSANGKIYEOK-A-SSANGKIYEOK +0xAE50 # HANGUL SYLLABLE SSANGKIYEOK-A-NIEUN +0xAE54 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEUL +0xAE56 # HANGUL SYLLABLE SSANGKIYEOK-A-RIEULMIEUM +0xAE5C # HANGUL SYLLABLE SSANGKIYEOK-A-MIEUM +0xAE5D # HANGUL SYLLABLE SSANGKIYEOK-A-PIEUP +0xAE5F # HANGUL SYLLABLE SSANGKIYEOK-A-SIOS +0xAE60 # HANGUL SYLLABLE SSANGKIYEOK-A-SSANGSIOS +0xAE61 # HANGUL SYLLABLE SSANGKIYEOK-A-IEUNG +0xAE65 # HANGUL SYLLABLE SSANGKIYEOK-A-THIEUTH +0xAE68 # HANGUL SYLLABLE SSANGKIYEOK-AE +0xAE69 # HANGUL SYLLABLE SSANGKIYEOK-AE-KIYEOK +0xAE6C # HANGUL SYLLABLE SSANGKIYEOK-AE-NIEUN +0xAE70 # HANGUL SYLLABLE SSANGKIYEOK-AE-RIEUL +0xAE78 # HANGUL SYLLABLE SSANGKIYEOK-AE-MIEUM +0xAE79 # HANGUL SYLLABLE SSANGKIYEOK-AE-PIEUP +0xAE7B # HANGUL SYLLABLE SSANGKIYEOK-AE-SIOS +0xAE7C # HANGUL SYLLABLE SSANGKIYEOK-AE-SSANGSIOS +0xAE7D # HANGUL SYLLABLE SSANGKIYEOK-AE-IEUNG +0xAE84 # HANGUL SYLLABLE SSANGKIYEOK-YA +0xAE85 # HANGUL SYLLABLE SSANGKIYEOK-YA-KIYEOK +0xAE8C # HANGUL SYLLABLE SSANGKIYEOK-YA-RIEUL +0xAEBC # HANGUL SYLLABLE SSANGKIYEOK-EO +0xAEBD # HANGUL SYLLABLE SSANGKIYEOK-EO-KIYEOK +0xAEBE # HANGUL SYLLABLE SSANGKIYEOK-EO-SSANGKIYEOK +0xAEC0 # HANGUL SYLLABLE SSANGKIYEOK-EO-NIEUN +0xAEC4 # HANGUL SYLLABLE SSANGKIYEOK-EO-RIEUL +0xAECC # HANGUL SYLLABLE SSANGKIYEOK-EO-MIEUM +0xAECD # HANGUL SYLLABLE SSANGKIYEOK-EO-PIEUP +0xAECF # HANGUL SYLLABLE SSANGKIYEOK-EO-SIOS +0xAED0 # HANGUL SYLLABLE SSANGKIYEOK-EO-SSANGSIOS +0xAED1 # HANGUL SYLLABLE SSANGKIYEOK-EO-IEUNG +0xAED8 # HANGUL SYLLABLE SSANGKIYEOK-E +0xAED9 # HANGUL SYLLABLE SSANGKIYEOK-E-KIYEOK +0xAEDC # HANGUL SYLLABLE SSANGKIYEOK-E-NIEUN +0xAEE8 # HANGUL SYLLABLE SSANGKIYEOK-E-MIEUM +0xAEEB # HANGUL SYLLABLE SSANGKIYEOK-E-SIOS +0xAEED # HANGUL SYLLABLE SSANGKIYEOK-E-IEUNG +0xAEF4 # HANGUL SYLLABLE SSANGKIYEOK-YEO +0xAEF8 # HANGUL SYLLABLE SSANGKIYEOK-YEO-NIEUN +0xAEFC # HANGUL SYLLABLE SSANGKIYEOK-YEO-RIEUL +0xAF07 # HANGUL SYLLABLE SSANGKIYEOK-YEO-SIOS +0xAF08 # HANGUL SYLLABLE SSANGKIYEOK-YEO-SSANGSIOS +0xAF0D # HANGUL SYLLABLE SSANGKIYEOK-YEO-THIEUTH +0xAF10 # HANGUL SYLLABLE SSANGKIYEOK-YE +0xAF2C # HANGUL SYLLABLE SSANGKIYEOK-O +0xAF2D # HANGUL SYLLABLE SSANGKIYEOK-O-KIYEOK +0xAF30 # HANGUL SYLLABLE SSANGKIYEOK-O-NIEUN +0xAF32 # HANGUL SYLLABLE SSANGKIYEOK-O-NIEUNHIEUH +0xAF34 # HANGUL SYLLABLE SSANGKIYEOK-O-RIEUL +0xAF3C # HANGUL SYLLABLE SSANGKIYEOK-O-MIEUM +0xAF3D # HANGUL SYLLABLE SSANGKIYEOK-O-PIEUP +0xAF3F # HANGUL SYLLABLE SSANGKIYEOK-O-SIOS +0xAF41 # HANGUL SYLLABLE SSANGKIYEOK-O-IEUNG +0xAF42 # HANGUL SYLLABLE SSANGKIYEOK-O-CIEUC +0xAF43 # HANGUL SYLLABLE SSANGKIYEOK-O-CHIEUCH +0xAF48 # HANGUL SYLLABLE SSANGKIYEOK-WA +0xAF49 # HANGUL SYLLABLE SSANGKIYEOK-WA-KIYEOK +0xAF50 # HANGUL SYLLABLE SSANGKIYEOK-WA-RIEUL +0xAF5C # HANGUL SYLLABLE SSANGKIYEOK-WA-SSANGSIOS +0xAF5D # HANGUL SYLLABLE SSANGKIYEOK-WA-IEUNG +0xAF64 # HANGUL SYLLABLE SSANGKIYEOK-WAE +0xAF65 # HANGUL SYLLABLE SSANGKIYEOK-WAE-KIYEOK +0xAF79 # HANGUL SYLLABLE SSANGKIYEOK-WAE-IEUNG +0xAF80 # HANGUL SYLLABLE SSANGKIYEOK-OE +0xAF84 # HANGUL SYLLABLE SSANGKIYEOK-OE-NIEUN +0xAF88 # HANGUL SYLLABLE SSANGKIYEOK-OE-RIEUL +0xAF90 # HANGUL SYLLABLE SSANGKIYEOK-OE-MIEUM +0xAF91 # HANGUL SYLLABLE SSANGKIYEOK-OE-PIEUP +0xAF95 # HANGUL SYLLABLE SSANGKIYEOK-OE-IEUNG +0xAF9C # HANGUL SYLLABLE SSANGKIYEOK-YO +0xAFB8 # HANGUL SYLLABLE SSANGKIYEOK-U +0xAFB9 # HANGUL SYLLABLE SSANGKIYEOK-U-KIYEOK +0xAFBC # HANGUL SYLLABLE SSANGKIYEOK-U-NIEUN +0xAFC0 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEUL +0xAFC7 # HANGUL SYLLABLE SSANGKIYEOK-U-RIEULHIEUH +0xAFC8 # HANGUL SYLLABLE SSANGKIYEOK-U-MIEUM +0xAFC9 # HANGUL SYLLABLE SSANGKIYEOK-U-PIEUP +0xAFCB # HANGUL SYLLABLE SSANGKIYEOK-U-SIOS +0xAFCD # HANGUL SYLLABLE SSANGKIYEOK-U-IEUNG +0xAFCE # HANGUL SYLLABLE SSANGKIYEOK-U-CIEUC +0xAFD4 # HANGUL SYLLABLE SSANGKIYEOK-WEO +0xAFDC # HANGUL SYLLABLE SSANGKIYEOK-WEO-RIEUL +0xAFE8 # HANGUL SYLLABLE SSANGKIYEOK-WEO-SSANGSIOS +0xAFE9 # HANGUL SYLLABLE SSANGKIYEOK-WEO-IEUNG +0xAFF0 # HANGUL SYLLABLE SSANGKIYEOK-WE +0xAFF1 # HANGUL SYLLABLE SSANGKIYEOK-WE-KIYEOK +0xAFF4 # HANGUL SYLLABLE SSANGKIYEOK-WE-NIEUN +0xAFF8 # HANGUL SYLLABLE SSANGKIYEOK-WE-RIEUL +0xB000 # HANGUL SYLLABLE SSANGKIYEOK-WE-MIEUM +0xB001 # HANGUL SYLLABLE SSANGKIYEOK-WE-PIEUP +0xB004 # HANGUL SYLLABLE SSANGKIYEOK-WE-SSANGSIOS +0xB00C # HANGUL SYLLABLE SSANGKIYEOK-WI +0xB010 # HANGUL SYLLABLE SSANGKIYEOK-WI-NIEUN +0xB014 # HANGUL SYLLABLE SSANGKIYEOK-WI-RIEUL +0xB01C # HANGUL SYLLABLE SSANGKIYEOK-WI-MIEUM +0xB01D # HANGUL SYLLABLE SSANGKIYEOK-WI-PIEUP +0xB028 # HANGUL SYLLABLE SSANGKIYEOK-YU +0xB044 # HANGUL SYLLABLE SSANGKIYEOK-EU +0xB045 # HANGUL SYLLABLE SSANGKIYEOK-EU-KIYEOK +0xB048 # HANGUL SYLLABLE SSANGKIYEOK-EU-NIEUN +0xB04A # HANGUL SYLLABLE SSANGKIYEOK-EU-NIEUNHIEUH +0xB04C # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEUL +0xB04E # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULMIEUM +0xB053 # HANGUL SYLLABLE SSANGKIYEOK-EU-RIEULHIEUH +0xB054 # HANGUL SYLLABLE SSANGKIYEOK-EU-MIEUM +0xB055 # HANGUL SYLLABLE SSANGKIYEOK-EU-PIEUP +0xB057 # HANGUL SYLLABLE SSANGKIYEOK-EU-SIOS +0xB059 # HANGUL SYLLABLE SSANGKIYEOK-EU-IEUNG +0xB05D # HANGUL SYLLABLE SSANGKIYEOK-EU-THIEUTH +0xB07C # HANGUL SYLLABLE SSANGKIYEOK-I +0xB07D # HANGUL SYLLABLE SSANGKIYEOK-I-KIYEOK +0xB080 # HANGUL SYLLABLE SSANGKIYEOK-I-NIEUN +0xB084 # HANGUL SYLLABLE SSANGKIYEOK-I-RIEUL +0xB08C # HANGUL SYLLABLE SSANGKIYEOK-I-MIEUM +0xB08D # HANGUL SYLLABLE SSANGKIYEOK-I-PIEUP +0xB08F # HANGUL SYLLABLE SSANGKIYEOK-I-SIOS +0xB091 # HANGUL SYLLABLE SSANGKIYEOK-I-IEUNG +0xB098 # HANGUL SYLLABLE NIEUN-A +0xB099 # HANGUL SYLLABLE NIEUN-A-KIYEOK +0xB09A # HANGUL SYLLABLE NIEUN-A-SSANGKIYEOK +0xB09C # HANGUL SYLLABLE NIEUN-A-NIEUN +0xB09F # HANGUL SYLLABLE NIEUN-A-TIKEUT +0xB0A0 # HANGUL SYLLABLE NIEUN-A-RIEUL +0xB0A1 # HANGUL SYLLABLE NIEUN-A-RIEULKIYEOK +0xB0A2 # HANGUL SYLLABLE NIEUN-A-RIEULMIEUM +0xB0A8 # HANGUL SYLLABLE NIEUN-A-MIEUM +0xB0A9 # HANGUL SYLLABLE NIEUN-A-PIEUP +0xB0AB # HANGUL SYLLABLE NIEUN-A-SIOS +0xB0AC # HANGUL SYLLABLE NIEUN-A-SSANGSIOS +0xB0AD # HANGUL SYLLABLE NIEUN-A-IEUNG +0xB0AE # HANGUL SYLLABLE NIEUN-A-CIEUC +0xB0AF # HANGUL SYLLABLE NIEUN-A-CHIEUCH +0xB0B1 # HANGUL SYLLABLE NIEUN-A-THIEUTH +0xB0B3 # HANGUL SYLLABLE NIEUN-A-HIEUH +0xB0B4 # HANGUL SYLLABLE NIEUN-AE +0xB0B5 # HANGUL SYLLABLE NIEUN-AE-KIYEOK +0xB0B8 # HANGUL SYLLABLE NIEUN-AE-NIEUN +0xB0BC # HANGUL SYLLABLE NIEUN-AE-RIEUL +0xB0C4 # HANGUL SYLLABLE NIEUN-AE-MIEUM +0xB0C5 # HANGUL SYLLABLE NIEUN-AE-PIEUP +0xB0C7 # HANGUL SYLLABLE NIEUN-AE-SIOS +0xB0C8 # HANGUL SYLLABLE NIEUN-AE-SSANGSIOS +0xB0C9 # HANGUL SYLLABLE NIEUN-AE-IEUNG +0xB0D0 # HANGUL SYLLABLE NIEUN-YA +0xB0D1 # HANGUL SYLLABLE NIEUN-YA-KIYEOK +0xB0D4 # HANGUL SYLLABLE NIEUN-YA-NIEUN +0xB0D8 # HANGUL SYLLABLE NIEUN-YA-RIEUL +0xB0E0 # HANGUL SYLLABLE NIEUN-YA-MIEUM +0xB0E5 # HANGUL SYLLABLE NIEUN-YA-IEUNG +0xB108 # HANGUL SYLLABLE NIEUN-EO +0xB109 # HANGUL SYLLABLE NIEUN-EO-KIYEOK +0xB10B # HANGUL SYLLABLE NIEUN-EO-KIYEOKSIOS +0xB10C # HANGUL SYLLABLE NIEUN-EO-NIEUN +0xB110 # HANGUL SYLLABLE NIEUN-EO-RIEUL +0xB112 # HANGUL SYLLABLE NIEUN-EO-RIEULMIEUM +0xB113 # HANGUL SYLLABLE NIEUN-EO-RIEULPIEUP +0xB118 # HANGUL SYLLABLE NIEUN-EO-MIEUM +0xB119 # HANGUL SYLLABLE NIEUN-EO-PIEUP +0xB11B # HANGUL SYLLABLE NIEUN-EO-SIOS +0xB11C # HANGUL SYLLABLE NIEUN-EO-SSANGSIOS +0xB11D # HANGUL SYLLABLE NIEUN-EO-IEUNG +0xB123 # HANGUL SYLLABLE NIEUN-EO-HIEUH +0xB124 # HANGUL SYLLABLE NIEUN-E +0xB125 # HANGUL SYLLABLE NIEUN-E-KIYEOK +0xB128 # HANGUL SYLLABLE NIEUN-E-NIEUN +0xB12C # HANGUL SYLLABLE NIEUN-E-RIEUL +0xB134 # HANGUL SYLLABLE NIEUN-E-MIEUM +0xB135 # HANGUL SYLLABLE NIEUN-E-PIEUP +0xB137 # HANGUL SYLLABLE NIEUN-E-SIOS +0xB138 # HANGUL SYLLABLE NIEUN-E-SSANGSIOS +0xB139 # HANGUL SYLLABLE NIEUN-E-IEUNG +0xB140 # HANGUL SYLLABLE NIEUN-YEO +0xB141 # HANGUL SYLLABLE NIEUN-YEO-KIYEOK +0xB144 # HANGUL SYLLABLE NIEUN-YEO-NIEUN +0xB148 # HANGUL SYLLABLE NIEUN-YEO-RIEUL +0xB150 # HANGUL SYLLABLE NIEUN-YEO-MIEUM +0xB151 # HANGUL SYLLABLE NIEUN-YEO-PIEUP +0xB154 # HANGUL SYLLABLE NIEUN-YEO-SSANGSIOS +0xB155 # HANGUL SYLLABLE NIEUN-YEO-IEUNG +0xB158 # HANGUL SYLLABLE NIEUN-YEO-KHIEUKH +0xB15C # HANGUL SYLLABLE NIEUN-YE +0xB160 # HANGUL SYLLABLE NIEUN-YE-NIEUN +0xB178 # HANGUL SYLLABLE NIEUN-O +0xB179 # HANGUL SYLLABLE NIEUN-O-KIYEOK +0xB17C # HANGUL SYLLABLE NIEUN-O-NIEUN +0xB180 # HANGUL SYLLABLE NIEUN-O-RIEUL +0xB182 # HANGUL SYLLABLE NIEUN-O-RIEULMIEUM +0xB188 # HANGUL SYLLABLE NIEUN-O-MIEUM +0xB189 # HANGUL SYLLABLE NIEUN-O-PIEUP +0xB18B # HANGUL SYLLABLE NIEUN-O-SIOS +0xB18D # HANGUL SYLLABLE NIEUN-O-IEUNG +0xB192 # HANGUL SYLLABLE NIEUN-O-PHIEUPH +0xB193 # HANGUL SYLLABLE NIEUN-O-HIEUH +0xB194 # HANGUL SYLLABLE NIEUN-WA +0xB198 # HANGUL SYLLABLE NIEUN-WA-NIEUN +0xB19C # HANGUL SYLLABLE NIEUN-WA-RIEUL +0xB1A8 # HANGUL SYLLABLE NIEUN-WA-SSANGSIOS +0xB1CC # HANGUL SYLLABLE NIEUN-OE +0xB1D0 # HANGUL SYLLABLE NIEUN-OE-NIEUN +0xB1D4 # HANGUL SYLLABLE NIEUN-OE-RIEUL +0xB1DC # HANGUL SYLLABLE NIEUN-OE-MIEUM +0xB1DD # HANGUL SYLLABLE NIEUN-OE-PIEUP +0xB1DF # HANGUL SYLLABLE NIEUN-OE-SIOS +0xB1E8 # HANGUL SYLLABLE NIEUN-YO +0xB1E9 # HANGUL SYLLABLE NIEUN-YO-KIYEOK +0xB1EC # HANGUL SYLLABLE NIEUN-YO-NIEUN +0xB1F0 # HANGUL SYLLABLE NIEUN-YO-RIEUL +0xB1F9 # HANGUL SYLLABLE NIEUN-YO-PIEUP +0xB1FB # HANGUL SYLLABLE NIEUN-YO-SIOS +0xB1FD # HANGUL SYLLABLE NIEUN-YO-IEUNG +0xB204 # HANGUL SYLLABLE NIEUN-U +0xB205 # HANGUL SYLLABLE NIEUN-U-KIYEOK +0xB208 # HANGUL SYLLABLE NIEUN-U-NIEUN +0xB20B # HANGUL SYLLABLE NIEUN-U-TIKEUT +0xB20C # HANGUL SYLLABLE NIEUN-U-RIEUL +0xB214 # HANGUL SYLLABLE NIEUN-U-MIEUM +0xB215 # HANGUL SYLLABLE NIEUN-U-PIEUP +0xB217 # HANGUL SYLLABLE NIEUN-U-SIOS +0xB219 # HANGUL SYLLABLE NIEUN-U-IEUNG +0xB220 # HANGUL SYLLABLE NIEUN-WEO +0xB234 # HANGUL SYLLABLE NIEUN-WEO-SSANGSIOS +0xB23C # HANGUL SYLLABLE NIEUN-WE +0xB258 # HANGUL SYLLABLE NIEUN-WI +0xB25C # HANGUL SYLLABLE NIEUN-WI-NIEUN +0xB260 # HANGUL SYLLABLE NIEUN-WI-RIEUL +0xB268 # HANGUL SYLLABLE NIEUN-WI-MIEUM +0xB269 # HANGUL SYLLABLE NIEUN-WI-PIEUP +0xB274 # HANGUL SYLLABLE NIEUN-YU +0xB275 # HANGUL SYLLABLE NIEUN-YU-KIYEOK +0xB27C # HANGUL SYLLABLE NIEUN-YU-RIEUL +0xB284 # HANGUL SYLLABLE NIEUN-YU-MIEUM +0xB285 # HANGUL SYLLABLE NIEUN-YU-PIEUP +0xB289 # HANGUL SYLLABLE NIEUN-YU-IEUNG +0xB290 # HANGUL SYLLABLE NIEUN-EU +0xB291 # HANGUL SYLLABLE NIEUN-EU-KIYEOK +0xB294 # HANGUL SYLLABLE NIEUN-EU-NIEUN +0xB298 # HANGUL SYLLABLE NIEUN-EU-RIEUL +0xB299 # HANGUL SYLLABLE NIEUN-EU-RIEULKIYEOK +0xB29A # HANGUL SYLLABLE NIEUN-EU-RIEULMIEUM +0xB2A0 # HANGUL SYLLABLE NIEUN-EU-MIEUM +0xB2A1 # HANGUL SYLLABLE NIEUN-EU-PIEUP +0xB2A3 # HANGUL SYLLABLE NIEUN-EU-SIOS +0xB2A5 # HANGUL SYLLABLE NIEUN-EU-IEUNG +0xB2A6 # HANGUL SYLLABLE NIEUN-EU-CIEUC +0xB2AA # HANGUL SYLLABLE NIEUN-EU-PHIEUPH +0xB2AC # HANGUL SYLLABLE NIEUN-YI +0xB2B0 # HANGUL SYLLABLE NIEUN-YI-NIEUN +0xB2B4 # HANGUL SYLLABLE NIEUN-YI-RIEUL +0xB2C8 # HANGUL SYLLABLE NIEUN-I +0xB2C9 # HANGUL SYLLABLE NIEUN-I-KIYEOK +0xB2CC # HANGUL SYLLABLE NIEUN-I-NIEUN +0xB2D0 # HANGUL SYLLABLE NIEUN-I-RIEUL +0xB2D2 # HANGUL SYLLABLE NIEUN-I-RIEULMIEUM-<3/22/95> +0xB2D8 # HANGUL SYLLABLE NIEUN-I-MIEUM +0xB2D9 # HANGUL SYLLABLE NIEUN-I-PIEUP +0xB2DB # HANGUL SYLLABLE NIEUN-I-SIOS +0xB2DD # HANGUL SYLLABLE NIEUN-I-IEUNG +0xB2E2 # HANGUL SYLLABLE NIEUN-I-PHIEUPH +0xB2E4 # HANGUL SYLLABLE TIKEUT-A +0xB2E5 # HANGUL SYLLABLE TIKEUT-A-KIYEOK +0xB2E6 # HANGUL SYLLABLE TIKEUT-A-SSANGKIYEOK +0xB2E8 # HANGUL SYLLABLE TIKEUT-A-NIEUN +0xB2EB # HANGUL SYLLABLE TIKEUT-A-TIKEUT +0xB2EC # HANGUL SYLLABLE TIKEUT-A-RIEUL +0xB2ED # HANGUL SYLLABLE TIKEUT-A-RIEULKIYEOK +0xB2EE # HANGUL SYLLABLE TIKEUT-A-RIEULMIEUM +0xB2EF # HANGUL SYLLABLE TIKEUT-A-RIEULPIEUP +0xB2F3 # HANGUL SYLLABLE TIKEUT-A-RIEULHIEUH +0xB2F4 # HANGUL SYLLABLE TIKEUT-A-MIEUM +0xB2F5 # HANGUL SYLLABLE TIKEUT-A-PIEUP +0xB2F7 # HANGUL SYLLABLE TIKEUT-A-SIOS +0xB2F8 # HANGUL SYLLABLE TIKEUT-A-SSANGSIOS +0xB2F9 # HANGUL SYLLABLE TIKEUT-A-IEUNG +0xB2FA # HANGUL SYLLABLE TIKEUT-A-CIEUC +0xB2FB # HANGUL SYLLABLE TIKEUT-A-CHIEUCH +0xB2FF # HANGUL SYLLABLE TIKEUT-A-HIEUH +0xB300 # HANGUL SYLLABLE TIKEUT-AE +0xB301 # HANGUL SYLLABLE TIKEUT-AE-KIYEOK +0xB304 # HANGUL SYLLABLE TIKEUT-AE-NIEUN +0xB308 # HANGUL SYLLABLE TIKEUT-AE-RIEUL +0xB310 # HANGUL SYLLABLE TIKEUT-AE-MIEUM +0xB311 # HANGUL SYLLABLE TIKEUT-AE-PIEUP +0xB313 # HANGUL SYLLABLE TIKEUT-AE-SIOS +0xB314 # HANGUL SYLLABLE TIKEUT-AE-SSANGSIOS +0xB315 # HANGUL SYLLABLE TIKEUT-AE-IEUNG +0xB31C # HANGUL SYLLABLE TIKEUT-YA +0xB354 # HANGUL SYLLABLE TIKEUT-EO +0xB355 # HANGUL SYLLABLE TIKEUT-EO-KIYEOK +0xB356 # HANGUL SYLLABLE TIKEUT-EO-SSANGKIYEOK +0xB358 # HANGUL SYLLABLE TIKEUT-EO-NIEUN +0xB35B # HANGUL SYLLABLE TIKEUT-EO-TIKEUT +0xB35C # HANGUL SYLLABLE TIKEUT-EO-RIEUL +0xB35E # HANGUL SYLLABLE TIKEUT-EO-RIEULMIEUM +0xB35F # HANGUL SYLLABLE TIKEUT-EO-RIEULPIEUP +0xB364 # HANGUL SYLLABLE TIKEUT-EO-MIEUM +0xB365 # HANGUL SYLLABLE TIKEUT-EO-PIEUP +0xB367 # HANGUL SYLLABLE TIKEUT-EO-SIOS +0xB369 # HANGUL SYLLABLE TIKEUT-EO-IEUNG +0xB36B # HANGUL SYLLABLE TIKEUT-EO-CHIEUCH +0xB36E # HANGUL SYLLABLE TIKEUT-EO-PHIEUPH +0xB370 # HANGUL SYLLABLE TIKEUT-E +0xB371 # HANGUL SYLLABLE TIKEUT-E-KIYEOK +0xB374 # HANGUL SYLLABLE TIKEUT-E-NIEUN +0xB378 # HANGUL SYLLABLE TIKEUT-E-RIEUL +0xB380 # HANGUL SYLLABLE TIKEUT-E-MIEUM +0xB381 # HANGUL SYLLABLE TIKEUT-E-PIEUP +0xB383 # HANGUL SYLLABLE TIKEUT-E-SIOS +0xB384 # HANGUL SYLLABLE TIKEUT-E-SSANGSIOS +0xB385 # HANGUL SYLLABLE TIKEUT-E-IEUNG +0xB38C # HANGUL SYLLABLE TIKEUT-YEO +0xB390 # HANGUL SYLLABLE TIKEUT-YEO-NIEUN +0xB394 # HANGUL SYLLABLE TIKEUT-YEO-RIEUL +0xB3A0 # HANGUL SYLLABLE TIKEUT-YEO-SSANGSIOS +0xB3A1 # HANGUL SYLLABLE TIKEUT-YEO-IEUNG +0xB3A8 # HANGUL SYLLABLE TIKEUT-YE +0xB3AC # HANGUL SYLLABLE TIKEUT-YE-NIEUN +0xB3C4 # HANGUL SYLLABLE TIKEUT-O +0xB3C5 # HANGUL SYLLABLE TIKEUT-O-KIYEOK +0xB3C8 # HANGUL SYLLABLE TIKEUT-O-NIEUN +0xB3CB # HANGUL SYLLABLE TIKEUT-O-TIKEUT +0xB3CC # HANGUL SYLLABLE TIKEUT-O-RIEUL +0xB3CE # HANGUL SYLLABLE TIKEUT-O-RIEULMIEUM +0xB3D0 # HANGUL SYLLABLE TIKEUT-O-RIEULSIOS +0xB3D4 # HANGUL SYLLABLE TIKEUT-O-MIEUM +0xB3D5 # HANGUL SYLLABLE TIKEUT-O-PIEUP +0xB3D7 # HANGUL SYLLABLE TIKEUT-O-SIOS +0xB3D9 # HANGUL SYLLABLE TIKEUT-O-IEUNG +0xB3DB # HANGUL SYLLABLE TIKEUT-O-CHIEUCH +0xB3DD # HANGUL SYLLABLE TIKEUT-O-THIEUTH +0xB3E0 # HANGUL SYLLABLE TIKEUT-WA +0xB3E4 # HANGUL SYLLABLE TIKEUT-WA-NIEUN +0xB3E8 # HANGUL SYLLABLE TIKEUT-WA-RIEUL +0xB3FC # HANGUL SYLLABLE TIKEUT-WAE +0xB410 # HANGUL SYLLABLE TIKEUT-WAE-SSANGSIOS +0xB418 # HANGUL SYLLABLE TIKEUT-OE +0xB41C # HANGUL SYLLABLE TIKEUT-OE-NIEUN +0xB420 # HANGUL SYLLABLE TIKEUT-OE-RIEUL +0xB428 # HANGUL SYLLABLE TIKEUT-OE-MIEUM +0xB429 # HANGUL SYLLABLE TIKEUT-OE-PIEUP +0xB42B # HANGUL SYLLABLE TIKEUT-OE-SIOS +0xB434 # HANGUL SYLLABLE TIKEUT-YO +0xB450 # HANGUL SYLLABLE TIKEUT-U +0xB451 # HANGUL SYLLABLE TIKEUT-U-KIYEOK +0xB454 # HANGUL SYLLABLE TIKEUT-U-NIEUN +0xB458 # HANGUL SYLLABLE TIKEUT-U-RIEUL +0xB460 # HANGUL SYLLABLE TIKEUT-U-MIEUM +0xB461 # HANGUL SYLLABLE TIKEUT-U-PIEUP +0xB463 # HANGUL SYLLABLE TIKEUT-U-SIOS +0xB465 # HANGUL SYLLABLE TIKEUT-U-IEUNG +0xB46C # HANGUL SYLLABLE TIKEUT-WEO +0xB480 # HANGUL SYLLABLE TIKEUT-WEO-SSANGSIOS +0xB488 # HANGUL SYLLABLE TIKEUT-WE +0xB49D # HANGUL SYLLABLE TIKEUT-WE-IEUNG +0xB4A4 # HANGUL SYLLABLE TIKEUT-WI +0xB4A8 # HANGUL SYLLABLE TIKEUT-WI-NIEUN +0xB4AC # HANGUL SYLLABLE TIKEUT-WI-RIEUL +0xB4B5 # HANGUL SYLLABLE TIKEUT-WI-PIEUP +0xB4B7 # HANGUL SYLLABLE TIKEUT-WI-SIOS +0xB4B9 # HANGUL SYLLABLE TIKEUT-WI-IEUNG +0xB4C0 # HANGUL SYLLABLE TIKEUT-YU +0xB4C4 # HANGUL SYLLABLE TIKEUT-YU-NIEUN +0xB4C8 # HANGUL SYLLABLE TIKEUT-YU-RIEUL +0xB4D0 # HANGUL SYLLABLE TIKEUT-YU-MIEUM +0xB4D5 # HANGUL SYLLABLE TIKEUT-YU-IEUNG +0xB4DC # HANGUL SYLLABLE TIKEUT-EU +0xB4DD # HANGUL SYLLABLE TIKEUT-EU-KIYEOK +0xB4E0 # HANGUL SYLLABLE TIKEUT-EU-NIEUN +0xB4E3 # HANGUL SYLLABLE TIKEUT-EU-TIKEUT +0xB4E4 # HANGUL SYLLABLE TIKEUT-EU-RIEUL +0xB4E6 # HANGUL SYLLABLE TIKEUT-EU-RIEULMIEUM +0xB4EC # HANGUL SYLLABLE TIKEUT-EU-MIEUM +0xB4ED # HANGUL SYLLABLE TIKEUT-EU-PIEUP +0xB4EF # HANGUL SYLLABLE TIKEUT-EU-SIOS +0xB4F1 # HANGUL SYLLABLE TIKEUT-EU-IEUNG +0xB4F8 # HANGUL SYLLABLE TIKEUT-YI +0xB514 # HANGUL SYLLABLE TIKEUT-I +0xB515 # HANGUL SYLLABLE TIKEUT-I-KIYEOK +0xB518 # HANGUL SYLLABLE TIKEUT-I-NIEUN +0xB51B # HANGUL SYLLABLE TIKEUT-I-TIKEUT +0xB51C # HANGUL SYLLABLE TIKEUT-I-RIEUL +0xB524 # HANGUL SYLLABLE TIKEUT-I-MIEUM +0xB525 # HANGUL SYLLABLE TIKEUT-I-PIEUP +0xB527 # HANGUL SYLLABLE TIKEUT-I-SIOS +0xB528 # HANGUL SYLLABLE TIKEUT-I-SSANGSIOS +0xB529 # HANGUL SYLLABLE TIKEUT-I-IEUNG +0xB52A # HANGUL SYLLABLE TIKEUT-I-CIEUC +0xB530 # HANGUL SYLLABLE SSANGTIKEUT-A +0xB531 # HANGUL SYLLABLE SSANGTIKEUT-A-KIYEOK +0xB534 # HANGUL SYLLABLE SSANGTIKEUT-A-NIEUN +0xB538 # HANGUL SYLLABLE SSANGTIKEUT-A-RIEUL +0xB540 # HANGUL SYLLABLE SSANGTIKEUT-A-MIEUM +0xB541 # HANGUL SYLLABLE SSANGTIKEUT-A-PIEUP +0xB543 # HANGUL SYLLABLE SSANGTIKEUT-A-SIOS +0xB544 # HANGUL SYLLABLE SSANGTIKEUT-A-SSANGSIOS +0xB545 # HANGUL SYLLABLE SSANGTIKEUT-A-IEUNG +0xB54B # HANGUL SYLLABLE SSANGTIKEUT-A-HIEUH +0xB54C # HANGUL SYLLABLE SSANGTIKEUT-AE +0xB54D # HANGUL SYLLABLE SSANGTIKEUT-AE-KIYEOK +0xB550 # HANGUL SYLLABLE SSANGTIKEUT-AE-NIEUN +0xB554 # HANGUL SYLLABLE SSANGTIKEUT-AE-RIEUL +0xB55C # HANGUL SYLLABLE SSANGTIKEUT-AE-MIEUM +0xB55D # HANGUL SYLLABLE SSANGTIKEUT-AE-PIEUP +0xB55F # HANGUL SYLLABLE SSANGTIKEUT-AE-SIOS +0xB560 # HANGUL SYLLABLE SSANGTIKEUT-AE-SSANGSIOS +0xB561 # HANGUL SYLLABLE SSANGTIKEUT-AE-IEUNG +0xB5A0 # HANGUL SYLLABLE SSANGTIKEUT-EO +0xB5A1 # HANGUL SYLLABLE SSANGTIKEUT-EO-KIYEOK +0xB5A4 # HANGUL SYLLABLE SSANGTIKEUT-EO-NIEUN +0xB5A8 # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEUL +0xB5AA # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULMIEUM +0xB5AB # HANGUL SYLLABLE SSANGTIKEUT-EO-RIEULPIEUP +0xB5B0 # HANGUL SYLLABLE SSANGTIKEUT-EO-MIEUM +0xB5B1 # HANGUL SYLLABLE SSANGTIKEUT-EO-PIEUP +0xB5B3 # HANGUL SYLLABLE SSANGTIKEUT-EO-SIOS +0xB5B4 # HANGUL SYLLABLE SSANGTIKEUT-EO-SSANGSIOS +0xB5B5 # HANGUL SYLLABLE SSANGTIKEUT-EO-IEUNG +0xB5BB # HANGUL SYLLABLE SSANGTIKEUT-EO-HIEUH +0xB5BC # HANGUL SYLLABLE SSANGTIKEUT-E +0xB5BD # HANGUL SYLLABLE SSANGTIKEUT-E-KIYEOK +0xB5C0 # HANGUL SYLLABLE SSANGTIKEUT-E-NIEUN +0xB5C4 # HANGUL SYLLABLE SSANGTIKEUT-E-RIEUL +0xB5CC # HANGUL SYLLABLE SSANGTIKEUT-E-MIEUM +0xB5CD # HANGUL SYLLABLE SSANGTIKEUT-E-PIEUP +0xB5CF # HANGUL SYLLABLE SSANGTIKEUT-E-SIOS +0xB5D0 # HANGUL SYLLABLE SSANGTIKEUT-E-SSANGSIOS +0xB5D1 # HANGUL SYLLABLE SSANGTIKEUT-E-IEUNG +0xB5D8 # HANGUL SYLLABLE SSANGTIKEUT-YEO +0xB5EC # HANGUL SYLLABLE SSANGTIKEUT-YEO-SSANGSIOS +0xB610 # HANGUL SYLLABLE SSANGTIKEUT-O +0xB611 # HANGUL SYLLABLE SSANGTIKEUT-O-KIYEOK +0xB614 # HANGUL SYLLABLE SSANGTIKEUT-O-NIEUN +0xB618 # HANGUL SYLLABLE SSANGTIKEUT-O-RIEUL +0xB625 # HANGUL SYLLABLE SSANGTIKEUT-O-IEUNG +0xB62C # HANGUL SYLLABLE SSANGTIKEUT-WA +0xB634 # HANGUL SYLLABLE SSANGTIKEUT-WA-RIEUL +0xB648 # HANGUL SYLLABLE SSANGTIKEUT-WAE +0xB664 # HANGUL SYLLABLE SSANGTIKEUT-OE +0xB668 # HANGUL SYLLABLE SSANGTIKEUT-OE-NIEUN +0xB69C # HANGUL SYLLABLE SSANGTIKEUT-U +0xB69D # HANGUL SYLLABLE SSANGTIKEUT-U-KIYEOK +0xB6A0 # HANGUL SYLLABLE SSANGTIKEUT-U-NIEUN +0xB6A4 # HANGUL SYLLABLE SSANGTIKEUT-U-RIEUL +0xB6AB # HANGUL SYLLABLE SSANGTIKEUT-U-RIEULHIEUH +0xB6AC # HANGUL SYLLABLE SSANGTIKEUT-U-MIEUM +0xB6B1 # HANGUL SYLLABLE SSANGTIKEUT-U-IEUNG +0xB6D4 # HANGUL SYLLABLE SSANGTIKEUT-WE +0xB6F0 # HANGUL SYLLABLE SSANGTIKEUT-WI +0xB6F4 # HANGUL SYLLABLE SSANGTIKEUT-WI-NIEUN +0xB6F8 # HANGUL SYLLABLE SSANGTIKEUT-WI-RIEUL +0xB700 # HANGUL SYLLABLE SSANGTIKEUT-WI-MIEUM +0xB701 # HANGUL SYLLABLE SSANGTIKEUT-WI-PIEUP +0xB705 # HANGUL SYLLABLE SSANGTIKEUT-WI-IEUNG +0xB728 # HANGUL SYLLABLE SSANGTIKEUT-EU +0xB729 # HANGUL SYLLABLE SSANGTIKEUT-EU-KIYEOK +0xB72C # HANGUL SYLLABLE SSANGTIKEUT-EU-NIEUN +0xB72F # HANGUL SYLLABLE SSANGTIKEUT-EU-TIKEUT +0xB730 # HANGUL SYLLABLE SSANGTIKEUT-EU-RIEUL +0xB738 # HANGUL SYLLABLE SSANGTIKEUT-EU-MIEUM +0xB739 # HANGUL SYLLABLE SSANGTIKEUT-EU-PIEUP +0xB73B # HANGUL SYLLABLE SSANGTIKEUT-EU-SIOS +0xB744 # HANGUL SYLLABLE SSANGTIKEUT-YI +0xB748 # HANGUL SYLLABLE SSANGTIKEUT-YI-NIEUN +0xB74C # HANGUL SYLLABLE SSANGTIKEUT-YI-RIEUL +0xB754 # HANGUL SYLLABLE SSANGTIKEUT-YI-MIEUM +0xB755 # HANGUL SYLLABLE SSANGTIKEUT-YI-PIEUP +0xB760 # HANGUL SYLLABLE SSANGTIKEUT-I +0xB764 # HANGUL SYLLABLE SSANGTIKEUT-I-NIEUN +0xB768 # HANGUL SYLLABLE SSANGTIKEUT-I-RIEUL +0xB770 # HANGUL SYLLABLE SSANGTIKEUT-I-MIEUM +0xB771 # HANGUL SYLLABLE SSANGTIKEUT-I-PIEUP +0xB773 # HANGUL SYLLABLE SSANGTIKEUT-I-SIOS +0xB775 # HANGUL SYLLABLE SSANGTIKEUT-I-IEUNG +0xB77C # HANGUL SYLLABLE RIEUL-A +0xB77D # HANGUL SYLLABLE RIEUL-A-KIYEOK +0xB780 # HANGUL SYLLABLE RIEUL-A-NIEUN +0xB784 # HANGUL SYLLABLE RIEUL-A-RIEUL +0xB78C # HANGUL SYLLABLE RIEUL-A-MIEUM +0xB78D # HANGUL SYLLABLE RIEUL-A-PIEUP +0xB78F # HANGUL SYLLABLE RIEUL-A-SIOS +0xB790 # HANGUL SYLLABLE RIEUL-A-SSANGSIOS +0xB791 # HANGUL SYLLABLE RIEUL-A-IEUNG +0xB792 # HANGUL SYLLABLE RIEUL-A-CIEUC +0xB796 # HANGUL SYLLABLE RIEUL-A-PHIEUPH +0xB797 # HANGUL SYLLABLE RIEUL-A-HIEUH +0xB798 # HANGUL SYLLABLE RIEUL-AE +0xB799 # HANGUL SYLLABLE RIEUL-AE-KIYEOK +0xB79C # HANGUL SYLLABLE RIEUL-AE-NIEUN +0xB7A0 # HANGUL SYLLABLE RIEUL-AE-RIEUL +0xB7A8 # HANGUL SYLLABLE RIEUL-AE-MIEUM +0xB7A9 # HANGUL SYLLABLE RIEUL-AE-PIEUP +0xB7AB # HANGUL SYLLABLE RIEUL-AE-SIOS +0xB7AC # HANGUL SYLLABLE RIEUL-AE-SSANGSIOS +0xB7AD # HANGUL SYLLABLE RIEUL-AE-IEUNG +0xB7B4 # HANGUL SYLLABLE RIEUL-YA +0xB7B5 # HANGUL SYLLABLE RIEUL-YA-KIYEOK +0xB7B8 # HANGUL SYLLABLE RIEUL-YA-NIEUN +0xB7C7 # HANGUL SYLLABLE RIEUL-YA-SIOS +0xB7C9 # HANGUL SYLLABLE RIEUL-YA-IEUNG +0xB7EC # HANGUL SYLLABLE RIEUL-EO +0xB7ED # HANGUL SYLLABLE RIEUL-EO-KIYEOK +0xB7F0 # HANGUL SYLLABLE RIEUL-EO-NIEUN +0xB7F4 # HANGUL SYLLABLE RIEUL-EO-RIEUL +0xB7FC # HANGUL SYLLABLE RIEUL-EO-MIEUM +0xB7FD # HANGUL SYLLABLE RIEUL-EO-PIEUP +0xB7FF # HANGUL SYLLABLE RIEUL-EO-SIOS +0xB800 # HANGUL SYLLABLE RIEUL-EO-SSANGSIOS +0xB801 # HANGUL SYLLABLE RIEUL-EO-IEUNG +0xB807 # HANGUL SYLLABLE RIEUL-EO-HIEUH +0xB808 # HANGUL SYLLABLE RIEUL-E +0xB809 # HANGUL SYLLABLE RIEUL-E-KIYEOK +0xB80C # HANGUL SYLLABLE RIEUL-E-NIEUN +0xB810 # HANGUL SYLLABLE RIEUL-E-RIEUL +0xB818 # HANGUL SYLLABLE RIEUL-E-MIEUM +0xB819 # HANGUL SYLLABLE RIEUL-E-PIEUP +0xB81B # HANGUL SYLLABLE RIEUL-E-SIOS +0xB81D # HANGUL SYLLABLE RIEUL-E-IEUNG +0xB824 # HANGUL SYLLABLE RIEUL-YEO +0xB825 # HANGUL SYLLABLE RIEUL-YEO-KIYEOK +0xB828 # HANGUL SYLLABLE RIEUL-YEO-NIEUN +0xB82C # HANGUL SYLLABLE RIEUL-YEO-RIEUL +0xB834 # HANGUL SYLLABLE RIEUL-YEO-MIEUM +0xB835 # HANGUL SYLLABLE RIEUL-YEO-PIEUP +0xB837 # HANGUL SYLLABLE RIEUL-YEO-SIOS +0xB838 # HANGUL SYLLABLE RIEUL-YEO-SSANGSIOS +0xB839 # HANGUL SYLLABLE RIEUL-YEO-IEUNG +0xB840 # HANGUL SYLLABLE RIEUL-YE +0xB844 # HANGUL SYLLABLE RIEUL-YE-NIEUN +0xB851 # HANGUL SYLLABLE RIEUL-YE-PIEUP +0xB853 # HANGUL SYLLABLE RIEUL-YE-SIOS +0xB85C # HANGUL SYLLABLE RIEUL-O +0xB85D # HANGUL SYLLABLE RIEUL-O-KIYEOK +0xB860 # HANGUL SYLLABLE RIEUL-O-NIEUN +0xB864 # HANGUL SYLLABLE RIEUL-O-RIEUL +0xB86C # HANGUL SYLLABLE RIEUL-O-MIEUM +0xB86D # HANGUL SYLLABLE RIEUL-O-PIEUP +0xB86F # HANGUL SYLLABLE RIEUL-O-SIOS +0xB871 # HANGUL SYLLABLE RIEUL-O-IEUNG +0xB878 # HANGUL SYLLABLE RIEUL-WA +0xB87C # HANGUL SYLLABLE RIEUL-WA-NIEUN +0xB88D # HANGUL SYLLABLE RIEUL-WA-IEUNG +0xB8A8 # HANGUL SYLLABLE RIEUL-WAE-SSANGSIOS +0xB8B0 # HANGUL SYLLABLE RIEUL-OE +0xB8B4 # HANGUL SYLLABLE RIEUL-OE-NIEUN +0xB8B8 # HANGUL SYLLABLE RIEUL-OE-RIEUL +0xB8C0 # HANGUL SYLLABLE RIEUL-OE-MIEUM +0xB8C1 # HANGUL SYLLABLE RIEUL-OE-PIEUP +0xB8C3 # HANGUL SYLLABLE RIEUL-OE-SIOS +0xB8C5 # HANGUL SYLLABLE RIEUL-OE-IEUNG +0xB8CC # HANGUL SYLLABLE RIEUL-YO +0xB8D0 # HANGUL SYLLABLE RIEUL-YO-NIEUN +0xB8D4 # HANGUL SYLLABLE RIEUL-YO-RIEUL +0xB8DD # HANGUL SYLLABLE RIEUL-YO-PIEUP +0xB8DF # HANGUL SYLLABLE RIEUL-YO-SIOS +0xB8E1 # HANGUL SYLLABLE RIEUL-YO-IEUNG +0xB8E8 # HANGUL SYLLABLE RIEUL-U +0xB8E9 # HANGUL SYLLABLE RIEUL-U-KIYEOK +0xB8EC # HANGUL SYLLABLE RIEUL-U-NIEUN +0xB8F0 # HANGUL SYLLABLE RIEUL-U-RIEUL +0xB8F8 # HANGUL SYLLABLE RIEUL-U-MIEUM +0xB8F9 # HANGUL SYLLABLE RIEUL-U-PIEUP +0xB8FB # HANGUL SYLLABLE RIEUL-U-SIOS +0xB8FD # HANGUL SYLLABLE RIEUL-U-IEUNG +0xB904 # HANGUL SYLLABLE RIEUL-WEO +0xB918 # HANGUL SYLLABLE RIEUL-WEO-SSANGSIOS +0xB920 # HANGUL SYLLABLE RIEUL-WE +0xB93C # HANGUL SYLLABLE RIEUL-WI +0xB93D # HANGUL SYLLABLE RIEUL-WI-KIYEOK +0xB940 # HANGUL SYLLABLE RIEUL-WI-NIEUN +0xB944 # HANGUL SYLLABLE RIEUL-WI-RIEUL +0xB94C # HANGUL SYLLABLE RIEUL-WI-MIEUM +0xB94F # HANGUL SYLLABLE RIEUL-WI-SIOS +0xB951 # HANGUL SYLLABLE RIEUL-WI-IEUNG +0xB958 # HANGUL SYLLABLE RIEUL-YU +0xB959 # HANGUL SYLLABLE RIEUL-YU-KIYEOK +0xB95C # HANGUL SYLLABLE RIEUL-YU-NIEUN +0xB960 # HANGUL SYLLABLE RIEUL-YU-RIEUL +0xB968 # HANGUL SYLLABLE RIEUL-YU-MIEUM +0xB969 # HANGUL SYLLABLE RIEUL-YU-PIEUP +0xB96B # HANGUL SYLLABLE RIEUL-YU-SIOS +0xB96D # HANGUL SYLLABLE RIEUL-YU-IEUNG +0xB974 # HANGUL SYLLABLE RIEUL-EU +0xB975 # HANGUL SYLLABLE RIEUL-EU-KIYEOK +0xB978 # HANGUL SYLLABLE RIEUL-EU-NIEUN +0xB97C # HANGUL SYLLABLE RIEUL-EU-RIEUL +0xB984 # HANGUL SYLLABLE RIEUL-EU-MIEUM +0xB985 # HANGUL SYLLABLE RIEUL-EU-PIEUP +0xB987 # HANGUL SYLLABLE RIEUL-EU-SIOS +0xB989 # HANGUL SYLLABLE RIEUL-EU-IEUNG +0xB98A # HANGUL SYLLABLE RIEUL-EU-CIEUC +0xB98D # HANGUL SYLLABLE RIEUL-EU-THIEUTH +0xB98E # HANGUL SYLLABLE RIEUL-EU-PHIEUPH +0xB9AC # HANGUL SYLLABLE RIEUL-I +0xB9AD # HANGUL SYLLABLE RIEUL-I-KIYEOK +0xB9B0 # HANGUL SYLLABLE RIEUL-I-NIEUN +0xB9B4 # HANGUL SYLLABLE RIEUL-I-RIEUL +0xB9BC # HANGUL SYLLABLE RIEUL-I-MIEUM +0xB9BD # HANGUL SYLLABLE RIEUL-I-PIEUP +0xB9BF # HANGUL SYLLABLE RIEUL-I-SIOS +0xB9C1 # HANGUL SYLLABLE RIEUL-I-IEUNG +0xB9C8 # HANGUL SYLLABLE MIEUM-A +0xB9C9 # HANGUL SYLLABLE MIEUM-A-KIYEOK +0xB9CC # HANGUL SYLLABLE MIEUM-A-NIEUN +0xB9CE # HANGUL SYLLABLE MIEUM-A-NIEUNHIEUH +0xB9CF # HANGUL SYLLABLE MIEUM-A-TIKEUT +0xB9D0 # HANGUL SYLLABLE MIEUM-A-RIEUL +0xB9D1 # HANGUL SYLLABLE MIEUM-A-RIEULKIYEOK +0xB9D2 # HANGUL SYLLABLE MIEUM-A-RIEULMIEUM +0xB9D8 # HANGUL SYLLABLE MIEUM-A-MIEUM +0xB9D9 # HANGUL SYLLABLE MIEUM-A-PIEUP +0xB9DB # HANGUL SYLLABLE MIEUM-A-SIOS +0xB9DD # HANGUL SYLLABLE MIEUM-A-IEUNG +0xB9DE # HANGUL SYLLABLE MIEUM-A-CIEUC +0xB9E1 # HANGUL SYLLABLE MIEUM-A-THIEUTH +0xB9E3 # HANGUL SYLLABLE MIEUM-A-HIEUH +0xB9E4 # HANGUL SYLLABLE MIEUM-AE +0xB9E5 # HANGUL SYLLABLE MIEUM-AE-KIYEOK +0xB9E8 # HANGUL SYLLABLE MIEUM-AE-NIEUN +0xB9EC # HANGUL SYLLABLE MIEUM-AE-RIEUL +0xB9F4 # HANGUL SYLLABLE MIEUM-AE-MIEUM +0xB9F5 # HANGUL SYLLABLE MIEUM-AE-PIEUP +0xB9F7 # HANGUL SYLLABLE MIEUM-AE-SIOS +0xB9F8 # HANGUL SYLLABLE MIEUM-AE-SSANGSIOS +0xB9F9 # HANGUL SYLLABLE MIEUM-AE-IEUNG +0xB9FA # HANGUL SYLLABLE MIEUM-AE-CIEUC +0xBA00 # HANGUL SYLLABLE MIEUM-YA +0xBA01 # HANGUL SYLLABLE MIEUM-YA-KIYEOK +0xBA08 # HANGUL SYLLABLE MIEUM-YA-RIEUL +0xBA15 # HANGUL SYLLABLE MIEUM-YA-IEUNG +0xBA38 # HANGUL SYLLABLE MIEUM-EO +0xBA39 # HANGUL SYLLABLE MIEUM-EO-KIYEOK +0xBA3C # HANGUL SYLLABLE MIEUM-EO-NIEUN +0xBA40 # HANGUL SYLLABLE MIEUM-EO-RIEUL +0xBA42 # HANGUL SYLLABLE MIEUM-EO-RIEULMIEUM +0xBA48 # HANGUL SYLLABLE MIEUM-EO-MIEUM +0xBA49 # HANGUL SYLLABLE MIEUM-EO-PIEUP +0xBA4B # HANGUL SYLLABLE MIEUM-EO-SIOS +0xBA4D # HANGUL SYLLABLE MIEUM-EO-IEUNG +0xBA4E # HANGUL SYLLABLE MIEUM-EO-CIEUC +0xBA53 # HANGUL SYLLABLE MIEUM-EO-HIEUH +0xBA54 # HANGUL SYLLABLE MIEUM-E +0xBA55 # HANGUL SYLLABLE MIEUM-E-KIYEOK +0xBA58 # HANGUL SYLLABLE MIEUM-E-NIEUN +0xBA5C # HANGUL SYLLABLE MIEUM-E-RIEUL +0xBA64 # HANGUL SYLLABLE MIEUM-E-MIEUM +0xBA65 # HANGUL SYLLABLE MIEUM-E-PIEUP +0xBA67 # HANGUL SYLLABLE MIEUM-E-SIOS +0xBA68 # HANGUL SYLLABLE MIEUM-E-SSANGSIOS +0xBA69 # HANGUL SYLLABLE MIEUM-E-IEUNG +0xBA70 # HANGUL SYLLABLE MIEUM-YEO +0xBA71 # HANGUL SYLLABLE MIEUM-YEO-KIYEOK +0xBA74 # HANGUL SYLLABLE MIEUM-YEO-NIEUN +0xBA78 # HANGUL SYLLABLE MIEUM-YEO-RIEUL +0xBA83 # HANGUL SYLLABLE MIEUM-YEO-SIOS +0xBA84 # HANGUL SYLLABLE MIEUM-YEO-SSANGSIOS +0xBA85 # HANGUL SYLLABLE MIEUM-YEO-IEUNG +0xBA87 # HANGUL SYLLABLE MIEUM-YEO-CHIEUCH +0xBA8C # HANGUL SYLLABLE MIEUM-YE +0xBAA8 # HANGUL SYLLABLE MIEUM-O +0xBAA9 # HANGUL SYLLABLE MIEUM-O-KIYEOK +0xBAAB # HANGUL SYLLABLE MIEUM-O-KIYEOKSIOS +0xBAAC # HANGUL SYLLABLE MIEUM-O-NIEUN +0xBAB0 # HANGUL SYLLABLE MIEUM-O-RIEUL +0xBAB2 # HANGUL SYLLABLE MIEUM-O-RIEULMIEUM +0xBAB8 # HANGUL SYLLABLE MIEUM-O-MIEUM +0xBAB9 # HANGUL SYLLABLE MIEUM-O-PIEUP +0xBABB # HANGUL SYLLABLE MIEUM-O-SIOS +0xBABD # HANGUL SYLLABLE MIEUM-O-IEUNG +0xBAC4 # HANGUL SYLLABLE MIEUM-WA +0xBAC8 # HANGUL SYLLABLE MIEUM-WA-NIEUN +0xBAD8 # HANGUL SYLLABLE MIEUM-WA-SSANGSIOS +0xBAD9 # HANGUL SYLLABLE MIEUM-WA-IEUNG +0xBAFC # HANGUL SYLLABLE MIEUM-OE +0xBB00 # HANGUL SYLLABLE MIEUM-OE-NIEUN +0xBB04 # HANGUL SYLLABLE MIEUM-OE-RIEUL +0xBB0D # HANGUL SYLLABLE MIEUM-OE-PIEUP +0xBB0F # HANGUL SYLLABLE MIEUM-OE-SIOS +0xBB11 # HANGUL SYLLABLE MIEUM-OE-IEUNG +0xBB18 # HANGUL SYLLABLE MIEUM-YO +0xBB1C # HANGUL SYLLABLE MIEUM-YO-NIEUN +0xBB20 # HANGUL SYLLABLE MIEUM-YO-RIEUL +0xBB29 # HANGUL SYLLABLE MIEUM-YO-PIEUP +0xBB2B # HANGUL SYLLABLE MIEUM-YO-SIOS +0xBB34 # HANGUL SYLLABLE MIEUM-U +0xBB35 # HANGUL SYLLABLE MIEUM-U-KIYEOK +0xBB36 # HANGUL SYLLABLE MIEUM-U-SSANGKIYEOK +0xBB38 # HANGUL SYLLABLE MIEUM-U-NIEUN +0xBB3B # HANGUL SYLLABLE MIEUM-U-TIKEUT +0xBB3C # HANGUL SYLLABLE MIEUM-U-RIEUL +0xBB3D # HANGUL SYLLABLE MIEUM-U-RIEULKIYEOK +0xBB3E # HANGUL SYLLABLE MIEUM-U-RIEULMIEUM +0xBB44 # HANGUL SYLLABLE MIEUM-U-MIEUM +0xBB45 # HANGUL SYLLABLE MIEUM-U-PIEUP +0xBB47 # HANGUL SYLLABLE MIEUM-U-SIOS +0xBB49 # HANGUL SYLLABLE MIEUM-U-IEUNG +0xBB4D # HANGUL SYLLABLE MIEUM-U-THIEUTH +0xBB4F # HANGUL SYLLABLE MIEUM-U-HIEUH +0xBB50 # HANGUL SYLLABLE MIEUM-WEO +0xBB54 # HANGUL SYLLABLE MIEUM-WEO-NIEUN +0xBB58 # HANGUL SYLLABLE MIEUM-WEO-RIEUL +0xBB61 # HANGUL SYLLABLE MIEUM-WEO-PIEUP +0xBB63 # HANGUL SYLLABLE MIEUM-WEO-SIOS +0xBB6C # HANGUL SYLLABLE MIEUM-WE +0xBB88 # HANGUL SYLLABLE MIEUM-WI +0xBB8C # HANGUL SYLLABLE MIEUM-WI-NIEUN +0xBB90 # HANGUL SYLLABLE MIEUM-WI-RIEUL +0xBBA4 # HANGUL SYLLABLE MIEUM-YU +0xBBA8 # HANGUL SYLLABLE MIEUM-YU-NIEUN +0xBBAC # HANGUL SYLLABLE MIEUM-YU-RIEUL +0xBBB4 # HANGUL SYLLABLE MIEUM-YU-MIEUM +0xBBB7 # HANGUL SYLLABLE MIEUM-YU-SIOS +0xBBC0 # HANGUL SYLLABLE MIEUM-EU +0xBBC4 # HANGUL SYLLABLE MIEUM-EU-NIEUN +0xBBC8 # HANGUL SYLLABLE MIEUM-EU-RIEUL +0xBBD0 # HANGUL SYLLABLE MIEUM-EU-MIEUM +0xBBD3 # HANGUL SYLLABLE MIEUM-EU-SIOS +0xBBF8 # HANGUL SYLLABLE MIEUM-I +0xBBF9 # HANGUL SYLLABLE MIEUM-I-KIYEOK +0xBBFC # HANGUL SYLLABLE MIEUM-I-NIEUN +0xBBFF # HANGUL SYLLABLE MIEUM-I-TIKEUT +0xBC00 # HANGUL SYLLABLE MIEUM-I-RIEUL +0xBC02 # HANGUL SYLLABLE MIEUM-I-RIEULMIEUM +0xBC08 # HANGUL SYLLABLE MIEUM-I-MIEUM +0xBC09 # HANGUL SYLLABLE MIEUM-I-PIEUP +0xBC0B # HANGUL SYLLABLE MIEUM-I-SIOS +0xBC0C # HANGUL SYLLABLE MIEUM-I-SSANGSIOS +0xBC0D # HANGUL SYLLABLE MIEUM-I-IEUNG +0xBC0F # HANGUL SYLLABLE MIEUM-I-CHIEUCH +0xBC11 # HANGUL SYLLABLE MIEUM-I-THIEUTH +0xBC14 # HANGUL SYLLABLE PIEUP-A +0xBC15 # HANGUL SYLLABLE PIEUP-A-KIYEOK +0xBC16 # HANGUL SYLLABLE PIEUP-A-SSANGKIYEOK +0xBC17 # HANGUL SYLLABLE PIEUP-A-KIYEOKSIOS +0xBC18 # HANGUL SYLLABLE PIEUP-A-NIEUN +0xBC1B # HANGUL SYLLABLE PIEUP-A-TIKEUT +0xBC1C # HANGUL SYLLABLE PIEUP-A-RIEUL +0xBC1D # HANGUL SYLLABLE PIEUP-A-RIEULKIYEOK +0xBC1E # HANGUL SYLLABLE PIEUP-A-RIEULMIEUM +0xBC1F # HANGUL SYLLABLE PIEUP-A-RIEULPIEUP +0xBC24 # HANGUL SYLLABLE PIEUP-A-MIEUM +0xBC25 # HANGUL SYLLABLE PIEUP-A-PIEUP +0xBC27 # HANGUL SYLLABLE PIEUP-A-SIOS +0xBC29 # HANGUL SYLLABLE PIEUP-A-IEUNG +0xBC2D # HANGUL SYLLABLE PIEUP-A-THIEUTH +0xBC30 # HANGUL SYLLABLE PIEUP-AE +0xBC31 # HANGUL SYLLABLE PIEUP-AE-KIYEOK +0xBC34 # HANGUL SYLLABLE PIEUP-AE-NIEUN +0xBC38 # HANGUL SYLLABLE PIEUP-AE-RIEUL +0xBC40 # HANGUL SYLLABLE PIEUP-AE-MIEUM +0xBC41 # HANGUL SYLLABLE PIEUP-AE-PIEUP +0xBC43 # HANGUL SYLLABLE PIEUP-AE-SIOS +0xBC44 # HANGUL SYLLABLE PIEUP-AE-SSANGSIOS +0xBC45 # HANGUL SYLLABLE PIEUP-AE-IEUNG +0xBC49 # HANGUL SYLLABLE PIEUP-AE-THIEUTH +0xBC4C # HANGUL SYLLABLE PIEUP-YA +0xBC4D # HANGUL SYLLABLE PIEUP-YA-KIYEOK +0xBC50 # HANGUL SYLLABLE PIEUP-YA-NIEUN +0xBC5D # HANGUL SYLLABLE PIEUP-YA-PIEUP +0xBC84 # HANGUL SYLLABLE PIEUP-EO +0xBC85 # HANGUL SYLLABLE PIEUP-EO-KIYEOK +0xBC88 # HANGUL SYLLABLE PIEUP-EO-NIEUN +0xBC8B # HANGUL SYLLABLE PIEUP-EO-TIKEUT +0xBC8C # HANGUL SYLLABLE PIEUP-EO-RIEUL +0xBC8E # HANGUL SYLLABLE PIEUP-EO-RIEULMIEUM +0xBC94 # HANGUL SYLLABLE PIEUP-EO-MIEUM +0xBC95 # HANGUL SYLLABLE PIEUP-EO-PIEUP +0xBC97 # HANGUL SYLLABLE PIEUP-EO-SIOS +0xBC99 # HANGUL SYLLABLE PIEUP-EO-IEUNG +0xBC9A # HANGUL SYLLABLE PIEUP-EO-CIEUC +0xBCA0 # HANGUL SYLLABLE PIEUP-E +0xBCA1 # HANGUL SYLLABLE PIEUP-E-KIYEOK +0xBCA4 # HANGUL SYLLABLE PIEUP-E-NIEUN +0xBCA7 # HANGUL SYLLABLE PIEUP-E-TIKEUT +0xBCA8 # HANGUL SYLLABLE PIEUP-E-RIEUL +0xBCB0 # HANGUL SYLLABLE PIEUP-E-MIEUM +0xBCB1 # HANGUL SYLLABLE PIEUP-E-PIEUP +0xBCB3 # HANGUL SYLLABLE PIEUP-E-SIOS +0xBCB4 # HANGUL SYLLABLE PIEUP-E-SSANGSIOS +0xBCB5 # HANGUL SYLLABLE PIEUP-E-IEUNG +0xBCBC # HANGUL SYLLABLE PIEUP-YEO +0xBCBD # HANGUL SYLLABLE PIEUP-YEO-KIYEOK +0xBCC0 # HANGUL SYLLABLE PIEUP-YEO-NIEUN +0xBCC4 # HANGUL SYLLABLE PIEUP-YEO-RIEUL +0xBCCD # HANGUL SYLLABLE PIEUP-YEO-PIEUP +0xBCCF # HANGUL SYLLABLE PIEUP-YEO-SIOS +0xBCD0 # HANGUL SYLLABLE PIEUP-YEO-SSANGSIOS +0xBCD1 # HANGUL SYLLABLE PIEUP-YEO-IEUNG +0xBCD5 # HANGUL SYLLABLE PIEUP-YEO-THIEUTH +0xBCD8 # HANGUL SYLLABLE PIEUP-YE +0xBCDC # HANGUL SYLLABLE PIEUP-YE-NIEUN +0xBCF4 # HANGUL SYLLABLE PIEUP-O +0xBCF5 # HANGUL SYLLABLE PIEUP-O-KIYEOK +0xBCF6 # HANGUL SYLLABLE PIEUP-O-SSANGKIYEOK +0xBCF8 # HANGUL SYLLABLE PIEUP-O-NIEUN +0xBCFC # HANGUL SYLLABLE PIEUP-O-RIEUL +0xBD04 # HANGUL SYLLABLE PIEUP-O-MIEUM +0xBD05 # HANGUL SYLLABLE PIEUP-O-PIEUP +0xBD07 # HANGUL SYLLABLE PIEUP-O-SIOS +0xBD09 # HANGUL SYLLABLE PIEUP-O-IEUNG +0xBD10 # HANGUL SYLLABLE PIEUP-WA +0xBD14 # HANGUL SYLLABLE PIEUP-WA-NIEUN +0xBD24 # HANGUL SYLLABLE PIEUP-WA-SSANGSIOS +0xBD2C # HANGUL SYLLABLE PIEUP-WAE +0xBD40 # HANGUL SYLLABLE PIEUP-WAE-SSANGSIOS +0xBD48 # HANGUL SYLLABLE PIEUP-OE +0xBD49 # HANGUL SYLLABLE PIEUP-OE-KIYEOK +0xBD4C # HANGUL SYLLABLE PIEUP-OE-NIEUN +0xBD50 # HANGUL SYLLABLE PIEUP-OE-RIEUL +0xBD58 # HANGUL SYLLABLE PIEUP-OE-MIEUM +0xBD59 # HANGUL SYLLABLE PIEUP-OE-PIEUP +0xBD64 # HANGUL SYLLABLE PIEUP-YO +0xBD68 # HANGUL SYLLABLE PIEUP-YO-NIEUN +0xBD80 # HANGUL SYLLABLE PIEUP-U +0xBD81 # HANGUL SYLLABLE PIEUP-U-KIYEOK +0xBD84 # HANGUL SYLLABLE PIEUP-U-NIEUN +0xBD87 # HANGUL SYLLABLE PIEUP-U-TIKEUT +0xBD88 # HANGUL SYLLABLE PIEUP-U-RIEUL +0xBD89 # HANGUL SYLLABLE PIEUP-U-RIEULKIYEOK +0xBD8A # HANGUL SYLLABLE PIEUP-U-RIEULMIEUM +0xBD90 # HANGUL SYLLABLE PIEUP-U-MIEUM +0xBD91 # HANGUL SYLLABLE PIEUP-U-PIEUP +0xBD93 # HANGUL SYLLABLE PIEUP-U-SIOS +0xBD95 # HANGUL SYLLABLE PIEUP-U-IEUNG +0xBD99 # HANGUL SYLLABLE PIEUP-U-THIEUTH +0xBD9A # HANGUL SYLLABLE PIEUP-U-PHIEUPH +0xBD9C # HANGUL SYLLABLE PIEUP-WEO +0xBDA4 # HANGUL SYLLABLE PIEUP-WEO-RIEUL +0xBDB0 # HANGUL SYLLABLE PIEUP-WEO-SSANGSIOS +0xBDB8 # HANGUL SYLLABLE PIEUP-WE +0xBDD4 # HANGUL SYLLABLE PIEUP-WI +0xBDD5 # HANGUL SYLLABLE PIEUP-WI-KIYEOK +0xBDD8 # HANGUL SYLLABLE PIEUP-WI-NIEUN +0xBDDC # HANGUL SYLLABLE PIEUP-WI-RIEUL +0xBDE9 # HANGUL SYLLABLE PIEUP-WI-IEUNG +0xBDF0 # HANGUL SYLLABLE PIEUP-YU +0xBDF4 # HANGUL SYLLABLE PIEUP-YU-NIEUN +0xBDF8 # HANGUL SYLLABLE PIEUP-YU-RIEUL +0xBE00 # HANGUL SYLLABLE PIEUP-YU-MIEUM +0xBE03 # HANGUL SYLLABLE PIEUP-YU-SIOS +0xBE05 # HANGUL SYLLABLE PIEUP-YU-IEUNG +0xBE0C # HANGUL SYLLABLE PIEUP-EU +0xBE0D # HANGUL SYLLABLE PIEUP-EU-KIYEOK +0xBE10 # HANGUL SYLLABLE PIEUP-EU-NIEUN +0xBE14 # HANGUL SYLLABLE PIEUP-EU-RIEUL +0xBE1C # HANGUL SYLLABLE PIEUP-EU-MIEUM +0xBE1D # HANGUL SYLLABLE PIEUP-EU-PIEUP +0xBE1F # HANGUL SYLLABLE PIEUP-EU-SIOS +0xBE44 # HANGUL SYLLABLE PIEUP-I +0xBE45 # HANGUL SYLLABLE PIEUP-I-KIYEOK +0xBE48 # HANGUL SYLLABLE PIEUP-I-NIEUN +0xBE4C # HANGUL SYLLABLE PIEUP-I-RIEUL +0xBE4E # HANGUL SYLLABLE PIEUP-I-RIEULMIEUM +0xBE54 # HANGUL SYLLABLE PIEUP-I-MIEUM +0xBE55 # HANGUL SYLLABLE PIEUP-I-PIEUP +0xBE57 # HANGUL SYLLABLE PIEUP-I-SIOS +0xBE59 # HANGUL SYLLABLE PIEUP-I-IEUNG +0xBE5A # HANGUL SYLLABLE PIEUP-I-CIEUC +0xBE5B # HANGUL SYLLABLE PIEUP-I-CHIEUCH +0xBE60 # HANGUL SYLLABLE SSANGPIEUP-A +0xBE61 # HANGUL SYLLABLE SSANGPIEUP-A-KIYEOK +0xBE64 # HANGUL SYLLABLE SSANGPIEUP-A-NIEUN +0xBE68 # HANGUL SYLLABLE SSANGPIEUP-A-RIEUL +0xBE6A # HANGUL SYLLABLE SSANGPIEUP-A-RIEULMIEUM +0xBE70 # HANGUL SYLLABLE SSANGPIEUP-A-MIEUM +0xBE71 # HANGUL SYLLABLE SSANGPIEUP-A-PIEUP +0xBE73 # HANGUL SYLLABLE SSANGPIEUP-A-SIOS +0xBE74 # HANGUL SYLLABLE SSANGPIEUP-A-SSANGSIOS +0xBE75 # HANGUL SYLLABLE SSANGPIEUP-A-IEUNG +0xBE7B # HANGUL SYLLABLE SSANGPIEUP-A-HIEUH +0xBE7C # HANGUL SYLLABLE SSANGPIEUP-AE +0xBE7D # HANGUL SYLLABLE SSANGPIEUP-AE-KIYEOK +0xBE80 # HANGUL SYLLABLE SSANGPIEUP-AE-NIEUN +0xBE84 # HANGUL SYLLABLE SSANGPIEUP-AE-RIEUL +0xBE8C # HANGUL SYLLABLE SSANGPIEUP-AE-MIEUM +0xBE8D # HANGUL SYLLABLE SSANGPIEUP-AE-PIEUP +0xBE8F # HANGUL SYLLABLE SSANGPIEUP-AE-SIOS +0xBE90 # HANGUL SYLLABLE SSANGPIEUP-AE-SSANGSIOS +0xBE91 # HANGUL SYLLABLE SSANGPIEUP-AE-IEUNG +0xBE98 # HANGUL SYLLABLE SSANGPIEUP-YA +0xBE99 # HANGUL SYLLABLE SSANGPIEUP-YA-KIYEOK +0xBEA8 # HANGUL SYLLABLE SSANGPIEUP-YA-MIEUM +0xBED0 # HANGUL SYLLABLE SSANGPIEUP-EO +0xBED1 # HANGUL SYLLABLE SSANGPIEUP-EO-KIYEOK +0xBED4 # HANGUL SYLLABLE SSANGPIEUP-EO-NIEUN +0xBED7 # HANGUL SYLLABLE SSANGPIEUP-EO-TIKEUT +0xBED8 # HANGUL SYLLABLE SSANGPIEUP-EO-RIEUL +0xBEE0 # HANGUL SYLLABLE SSANGPIEUP-EO-MIEUM +0xBEE3 # HANGUL SYLLABLE SSANGPIEUP-EO-SIOS +0xBEE4 # HANGUL SYLLABLE SSANGPIEUP-EO-SSANGSIOS +0xBEE5 # HANGUL SYLLABLE SSANGPIEUP-EO-IEUNG +0xBEEC # HANGUL SYLLABLE SSANGPIEUP-E +0xBF01 # HANGUL SYLLABLE SSANGPIEUP-E-IEUNG +0xBF08 # HANGUL SYLLABLE SSANGPIEUP-YEO +0xBF09 # HANGUL SYLLABLE SSANGPIEUP-YEO-KIYEOK +0xBF18 # HANGUL SYLLABLE SSANGPIEUP-YEO-MIEUM +0xBF19 # HANGUL SYLLABLE SSANGPIEUP-YEO-PIEUP +0xBF1B # HANGUL SYLLABLE SSANGPIEUP-YEO-SIOS +0xBF1C # HANGUL SYLLABLE SSANGPIEUP-YEO-SSANGSIOS +0xBF1D # HANGUL SYLLABLE SSANGPIEUP-YEO-IEUNG +0xBF40 # HANGUL SYLLABLE SSANGPIEUP-O +0xBF41 # HANGUL SYLLABLE SSANGPIEUP-O-KIYEOK +0xBF44 # HANGUL SYLLABLE SSANGPIEUP-O-NIEUN +0xBF48 # HANGUL SYLLABLE SSANGPIEUP-O-RIEUL +0xBF50 # HANGUL SYLLABLE SSANGPIEUP-O-MIEUM +0xBF51 # HANGUL SYLLABLE SSANGPIEUP-O-PIEUP +0xBF55 # HANGUL SYLLABLE SSANGPIEUP-O-IEUNG +0xBF94 # HANGUL SYLLABLE SSANGPIEUP-OE +0xBFB0 # HANGUL SYLLABLE SSANGPIEUP-YO +0xBFC5 # HANGUL SYLLABLE SSANGPIEUP-YO-IEUNG +0xBFCC # HANGUL SYLLABLE SSANGPIEUP-U +0xBFCD # HANGUL SYLLABLE SSANGPIEUP-U-KIYEOK +0xBFD0 # HANGUL SYLLABLE SSANGPIEUP-U-NIEUN +0xBFD4 # HANGUL SYLLABLE SSANGPIEUP-U-RIEUL +0xBFDC # HANGUL SYLLABLE SSANGPIEUP-U-MIEUM +0xBFDF # HANGUL SYLLABLE SSANGPIEUP-U-SIOS +0xBFE1 # HANGUL SYLLABLE SSANGPIEUP-U-IEUNG +0xC03C # HANGUL SYLLABLE SSANGPIEUP-YU +0xC051 # HANGUL SYLLABLE SSANGPIEUP-YU-IEUNG +0xC058 # HANGUL SYLLABLE SSANGPIEUP-EU +0xC05C # HANGUL SYLLABLE SSANGPIEUP-EU-NIEUN +0xC060 # HANGUL SYLLABLE SSANGPIEUP-EU-RIEUL +0xC068 # HANGUL SYLLABLE SSANGPIEUP-EU-MIEUM +0xC069 # HANGUL SYLLABLE SSANGPIEUP-EU-PIEUP +0xC090 # HANGUL SYLLABLE SSANGPIEUP-I +0xC091 # HANGUL SYLLABLE SSANGPIEUP-I-KIYEOK +0xC094 # HANGUL SYLLABLE SSANGPIEUP-I-NIEUN +0xC098 # HANGUL SYLLABLE SSANGPIEUP-I-RIEUL +0xC0A0 # HANGUL SYLLABLE SSANGPIEUP-I-MIEUM +0xC0A1 # HANGUL SYLLABLE SSANGPIEUP-I-PIEUP +0xC0A3 # HANGUL SYLLABLE SSANGPIEUP-I-SIOS +0xC0A5 # HANGUL SYLLABLE SSANGPIEUP-I-IEUNG +0xC0AC # HANGUL SYLLABLE SIOS-A +0xC0AD # HANGUL SYLLABLE SIOS-A-KIYEOK +0xC0AF # HANGUL SYLLABLE SIOS-A-KIYEOKSIOS +0xC0B0 # HANGUL SYLLABLE SIOS-A-NIEUN +0xC0B3 # HANGUL SYLLABLE SIOS-A-TIKEUT +0xC0B4 # HANGUL SYLLABLE SIOS-A-RIEUL +0xC0B5 # HANGUL SYLLABLE SIOS-A-RIEULKIYEOK +0xC0B6 # HANGUL SYLLABLE SIOS-A-RIEULMIEUM +0xC0BC # HANGUL SYLLABLE SIOS-A-MIEUM +0xC0BD # HANGUL SYLLABLE SIOS-A-PIEUP +0xC0BF # HANGUL SYLLABLE SIOS-A-SIOS +0xC0C0 # HANGUL SYLLABLE SIOS-A-SSANGSIOS +0xC0C1 # HANGUL SYLLABLE SIOS-A-IEUNG +0xC0C5 # HANGUL SYLLABLE SIOS-A-THIEUTH +0xC0C8 # HANGUL SYLLABLE SIOS-AE +0xC0C9 # HANGUL SYLLABLE SIOS-AE-KIYEOK +0xC0CC # HANGUL SYLLABLE SIOS-AE-NIEUN +0xC0D0 # HANGUL SYLLABLE SIOS-AE-RIEUL +0xC0D8 # HANGUL SYLLABLE SIOS-AE-MIEUM +0xC0D9 # HANGUL SYLLABLE SIOS-AE-PIEUP +0xC0DB # HANGUL SYLLABLE SIOS-AE-SIOS +0xC0DC # HANGUL SYLLABLE SIOS-AE-SSANGSIOS +0xC0DD # HANGUL SYLLABLE SIOS-AE-IEUNG +0xC0E4 # HANGUL SYLLABLE SIOS-YA +0xC0E5 # HANGUL SYLLABLE SIOS-YA-KIYEOK +0xC0E8 # HANGUL SYLLABLE SIOS-YA-NIEUN +0xC0EC # HANGUL SYLLABLE SIOS-YA-RIEUL +0xC0F4 # HANGUL SYLLABLE SIOS-YA-MIEUM +0xC0F5 # HANGUL SYLLABLE SIOS-YA-PIEUP +0xC0F7 # HANGUL SYLLABLE SIOS-YA-SIOS +0xC0F9 # HANGUL SYLLABLE SIOS-YA-IEUNG +0xC100 # HANGUL SYLLABLE SIOS-YAE +0xC104 # HANGUL SYLLABLE SIOS-YAE-NIEUN +0xC108 # HANGUL SYLLABLE SIOS-YAE-RIEUL +0xC110 # HANGUL SYLLABLE SIOS-YAE-MIEUM +0xC115 # HANGUL SYLLABLE SIOS-YAE-IEUNG +0xC11C # HANGUL SYLLABLE SIOS-EO +0xC11D # HANGUL SYLLABLE SIOS-EO-KIYEOK +0xC11E # HANGUL SYLLABLE SIOS-EO-SSANGKIYEOK +0xC11F # HANGUL SYLLABLE SIOS-EO-KIYEOKSIOS +0xC120 # HANGUL SYLLABLE SIOS-EO-NIEUN +0xC123 # HANGUL SYLLABLE SIOS-EO-TIKEUT +0xC124 # HANGUL SYLLABLE SIOS-EO-RIEUL +0xC126 # HANGUL SYLLABLE SIOS-EO-RIEULMIEUM +0xC127 # HANGUL SYLLABLE SIOS-EO-RIEULPIEUP +0xC12C # HANGUL SYLLABLE SIOS-EO-MIEUM +0xC12D # HANGUL SYLLABLE SIOS-EO-PIEUP +0xC12F # HANGUL SYLLABLE SIOS-EO-SIOS +0xC130 # HANGUL SYLLABLE SIOS-EO-SSANGSIOS +0xC131 # HANGUL SYLLABLE SIOS-EO-IEUNG +0xC136 # HANGUL SYLLABLE SIOS-EO-PHIEUPH +0xC138 # HANGUL SYLLABLE SIOS-E +0xC139 # HANGUL SYLLABLE SIOS-E-KIYEOK +0xC13C # HANGUL SYLLABLE SIOS-E-NIEUN +0xC140 # HANGUL SYLLABLE SIOS-E-RIEUL +0xC148 # HANGUL SYLLABLE SIOS-E-MIEUM +0xC149 # HANGUL SYLLABLE SIOS-E-PIEUP +0xC14B # HANGUL SYLLABLE SIOS-E-SIOS +0xC14C # HANGUL SYLLABLE SIOS-E-SSANGSIOS +0xC14D # HANGUL SYLLABLE SIOS-E-IEUNG +0xC154 # HANGUL SYLLABLE SIOS-YEO +0xC155 # HANGUL SYLLABLE SIOS-YEO-KIYEOK +0xC158 # HANGUL SYLLABLE SIOS-YEO-NIEUN +0xC15C # HANGUL SYLLABLE SIOS-YEO-RIEUL +0xC164 # HANGUL SYLLABLE SIOS-YEO-MIEUM +0xC165 # HANGUL SYLLABLE SIOS-YEO-PIEUP +0xC167 # HANGUL SYLLABLE SIOS-YEO-SIOS +0xC168 # HANGUL SYLLABLE SIOS-YEO-SSANGSIOS +0xC169 # HANGUL SYLLABLE SIOS-YEO-IEUNG +0xC170 # HANGUL SYLLABLE SIOS-YE +0xC174 # HANGUL SYLLABLE SIOS-YE-NIEUN +0xC178 # HANGUL SYLLABLE SIOS-YE-RIEUL +0xC185 # HANGUL SYLLABLE SIOS-YE-IEUNG +0xC18C # HANGUL SYLLABLE SIOS-O +0xC18D # HANGUL SYLLABLE SIOS-O-KIYEOK +0xC18E # HANGUL SYLLABLE SIOS-O-SSANGKIYEOK +0xC190 # HANGUL SYLLABLE SIOS-O-NIEUN +0xC194 # HANGUL SYLLABLE SIOS-O-RIEUL +0xC196 # HANGUL SYLLABLE SIOS-O-RIEULMIEUM +0xC19C # HANGUL SYLLABLE SIOS-O-MIEUM +0xC19D # HANGUL SYLLABLE SIOS-O-PIEUP +0xC19F # HANGUL SYLLABLE SIOS-O-SIOS +0xC1A1 # HANGUL SYLLABLE SIOS-O-IEUNG +0xC1A5 # HANGUL SYLLABLE SIOS-O-THIEUTH +0xC1A8 # HANGUL SYLLABLE SIOS-WA +0xC1A9 # HANGUL SYLLABLE SIOS-WA-KIYEOK +0xC1AC # HANGUL SYLLABLE SIOS-WA-NIEUN +0xC1B0 # HANGUL SYLLABLE SIOS-WA-RIEUL +0xC1BD # HANGUL SYLLABLE SIOS-WA-IEUNG +0xC1C4 # HANGUL SYLLABLE SIOS-WAE +0xC1C8 # HANGUL SYLLABLE SIOS-WAE-NIEUN +0xC1CC # HANGUL SYLLABLE SIOS-WAE-RIEUL +0xC1D4 # HANGUL SYLLABLE SIOS-WAE-MIEUM +0xC1D7 # HANGUL SYLLABLE SIOS-WAE-SIOS +0xC1D8 # HANGUL SYLLABLE SIOS-WAE-SSANGSIOS +0xC1E0 # HANGUL SYLLABLE SIOS-OE +0xC1E4 # HANGUL SYLLABLE SIOS-OE-NIEUN +0xC1E8 # HANGUL SYLLABLE SIOS-OE-RIEUL +0xC1F0 # HANGUL SYLLABLE SIOS-OE-MIEUM +0xC1F1 # HANGUL SYLLABLE SIOS-OE-PIEUP +0xC1F3 # HANGUL SYLLABLE SIOS-OE-SIOS +0xC1FC # HANGUL SYLLABLE SIOS-YO +0xC1FD # HANGUL SYLLABLE SIOS-YO-KIYEOK +0xC200 # HANGUL SYLLABLE SIOS-YO-NIEUN +0xC204 # HANGUL SYLLABLE SIOS-YO-RIEUL +0xC20C # HANGUL SYLLABLE SIOS-YO-MIEUM +0xC20D # HANGUL SYLLABLE SIOS-YO-PIEUP +0xC20F # HANGUL SYLLABLE SIOS-YO-SIOS +0xC211 # HANGUL SYLLABLE SIOS-YO-IEUNG +0xC218 # HANGUL SYLLABLE SIOS-U +0xC219 # HANGUL SYLLABLE SIOS-U-KIYEOK +0xC21C # HANGUL SYLLABLE SIOS-U-NIEUN +0xC21F # HANGUL SYLLABLE SIOS-U-TIKEUT +0xC220 # HANGUL SYLLABLE SIOS-U-RIEUL +0xC228 # HANGUL SYLLABLE SIOS-U-MIEUM +0xC229 # HANGUL SYLLABLE SIOS-U-PIEUP +0xC22B # HANGUL SYLLABLE SIOS-U-SIOS +0xC22D # HANGUL SYLLABLE SIOS-U-IEUNG +0xC22F # HANGUL SYLLABLE SIOS-U-CHIEUCH +0xC231 # HANGUL SYLLABLE SIOS-U-THIEUTH +0xC232 # HANGUL SYLLABLE SIOS-U-PHIEUPH +0xC234 # HANGUL SYLLABLE SIOS-WEO +0xC248 # HANGUL SYLLABLE SIOS-WEO-SSANGSIOS +0xC250 # HANGUL SYLLABLE SIOS-WE +0xC251 # HANGUL SYLLABLE SIOS-WE-KIYEOK +0xC254 # HANGUL SYLLABLE SIOS-WE-NIEUN +0xC258 # HANGUL SYLLABLE SIOS-WE-RIEUL +0xC260 # HANGUL SYLLABLE SIOS-WE-MIEUM +0xC265 # HANGUL SYLLABLE SIOS-WE-IEUNG +0xC26C # HANGUL SYLLABLE SIOS-WI +0xC26D # HANGUL SYLLABLE SIOS-WI-KIYEOK +0xC270 # HANGUL SYLLABLE SIOS-WI-NIEUN +0xC274 # HANGUL SYLLABLE SIOS-WI-RIEUL +0xC27C # HANGUL SYLLABLE SIOS-WI-MIEUM +0xC27D # HANGUL SYLLABLE SIOS-WI-PIEUP +0xC27F # HANGUL SYLLABLE SIOS-WI-SIOS +0xC281 # HANGUL SYLLABLE SIOS-WI-IEUNG +0xC288 # HANGUL SYLLABLE SIOS-YU +0xC289 # HANGUL SYLLABLE SIOS-YU-KIYEOK +0xC290 # HANGUL SYLLABLE SIOS-YU-RIEUL +0xC298 # HANGUL SYLLABLE SIOS-YU-MIEUM +0xC29B # HANGUL SYLLABLE SIOS-YU-SIOS +0xC29D # HANGUL SYLLABLE SIOS-YU-IEUNG +0xC2A4 # HANGUL SYLLABLE SIOS-EU +0xC2A5 # HANGUL SYLLABLE SIOS-EU-KIYEOK +0xC2A8 # HANGUL SYLLABLE SIOS-EU-NIEUN +0xC2AC # HANGUL SYLLABLE SIOS-EU-RIEUL +0xC2AD # HANGUL SYLLABLE SIOS-EU-RIEULKIYEOK +0xC2B4 # HANGUL SYLLABLE SIOS-EU-MIEUM +0xC2B5 # HANGUL SYLLABLE SIOS-EU-PIEUP +0xC2B7 # HANGUL SYLLABLE SIOS-EU-SIOS +0xC2B9 # HANGUL SYLLABLE SIOS-EU-IEUNG +0xC2DC # HANGUL SYLLABLE SIOS-I +0xC2DD # HANGUL SYLLABLE SIOS-I-KIYEOK +0xC2E0 # HANGUL SYLLABLE SIOS-I-NIEUN +0xC2E3 # HANGUL SYLLABLE SIOS-I-TIKEUT +0xC2E4 # HANGUL SYLLABLE SIOS-I-RIEUL +0xC2EB # HANGUL SYLLABLE SIOS-I-RIEULHIEUH +0xC2EC # HANGUL SYLLABLE SIOS-I-MIEUM +0xC2ED # HANGUL SYLLABLE SIOS-I-PIEUP +0xC2EF # HANGUL SYLLABLE SIOS-I-SIOS +0xC2F1 # HANGUL SYLLABLE SIOS-I-IEUNG +0xC2F6 # HANGUL SYLLABLE SIOS-I-PHIEUPH +0xC2F8 # HANGUL SYLLABLE SSANGSIOS-A +0xC2F9 # HANGUL SYLLABLE SSANGSIOS-A-KIYEOK +0xC2FB # HANGUL SYLLABLE SSANGSIOS-A-KIYEOKSIOS +0xC2FC # HANGUL SYLLABLE SSANGSIOS-A-NIEUN +0xC300 # HANGUL SYLLABLE SSANGSIOS-A-RIEUL +0xC308 # HANGUL SYLLABLE SSANGSIOS-A-MIEUM +0xC309 # HANGUL SYLLABLE SSANGSIOS-A-PIEUP +0xC30C # HANGUL SYLLABLE SSANGSIOS-A-SSANGSIOS +0xC30D # HANGUL SYLLABLE SSANGSIOS-A-IEUNG +0xC313 # HANGUL SYLLABLE SSANGSIOS-A-HIEUH +0xC314 # HANGUL SYLLABLE SSANGSIOS-AE +0xC315 # HANGUL SYLLABLE SSANGSIOS-AE-KIYEOK +0xC318 # HANGUL SYLLABLE SSANGSIOS-AE-NIEUN +0xC31C # HANGUL SYLLABLE SSANGSIOS-AE-RIEUL +0xC324 # HANGUL SYLLABLE SSANGSIOS-AE-MIEUM +0xC325 # HANGUL SYLLABLE SSANGSIOS-AE-PIEUP +0xC328 # HANGUL SYLLABLE SSANGSIOS-AE-SSANGSIOS +0xC329 # HANGUL SYLLABLE SSANGSIOS-AE-IEUNG +0xC345 # HANGUL SYLLABLE SSANGSIOS-YA-IEUNG +0xC368 # HANGUL SYLLABLE SSANGSIOS-EO +0xC369 # HANGUL SYLLABLE SSANGSIOS-EO-KIYEOK +0xC36C # HANGUL SYLLABLE SSANGSIOS-EO-NIEUN +0xC370 # HANGUL SYLLABLE SSANGSIOS-EO-RIEUL +0xC372 # HANGUL SYLLABLE SSANGSIOS-EO-RIEULMIEUM +0xC378 # HANGUL SYLLABLE SSANGSIOS-EO-MIEUM +0xC379 # HANGUL SYLLABLE SSANGSIOS-EO-PIEUP +0xC37C # HANGUL SYLLABLE SSANGSIOS-EO-SSANGSIOS +0xC37D # HANGUL SYLLABLE SSANGSIOS-EO-IEUNG +0xC384 # HANGUL SYLLABLE SSANGSIOS-E +0xC388 # HANGUL SYLLABLE SSANGSIOS-E-NIEUN +0xC38C # HANGUL SYLLABLE SSANGSIOS-E-RIEUL +# 0xC3C0 # HANGUL SYLLABLE SSANGSIOS-YE-NIEUN # (dotum.ttf, hline.ttf) +0xC3D8 # HANGUL SYLLABLE SSANGSIOS-O +0xC3D9 # HANGUL SYLLABLE SSANGSIOS-O-KIYEOK +0xC3DC # HANGUL SYLLABLE SSANGSIOS-O-NIEUN +0xC3DF # HANGUL SYLLABLE SSANGSIOS-O-TIKEUT +0xC3E0 # HANGUL SYLLABLE SSANGSIOS-O-RIEUL +0xC3E2 # HANGUL SYLLABLE SSANGSIOS-O-RIEULMIEUM +0xC3E8 # HANGUL SYLLABLE SSANGSIOS-O-MIEUM +0xC3E9 # HANGUL SYLLABLE SSANGSIOS-O-PIEUP +0xC3ED # HANGUL SYLLABLE SSANGSIOS-O-IEUNG +0xC3F4 # HANGUL SYLLABLE SSANGSIOS-WA +0xC3F5 # HANGUL SYLLABLE SSANGSIOS-WA-KIYEOK +0xC3F8 # HANGUL SYLLABLE SSANGSIOS-WA-NIEUN +0xC408 # HANGUL SYLLABLE SSANGSIOS-WA-SSANGSIOS +0xC410 # HANGUL SYLLABLE SSANGSIOS-WAE +0xC424 # HANGUL SYLLABLE SSANGSIOS-WAE-SSANGSIOS +0xC42C # HANGUL SYLLABLE SSANGSIOS-OE +0xC430 # HANGUL SYLLABLE SSANGSIOS-OE-NIEUN +0xC434 # HANGUL SYLLABLE SSANGSIOS-OE-RIEUL +0xC43C # HANGUL SYLLABLE SSANGSIOS-OE-MIEUM +0xC43D # HANGUL SYLLABLE SSANGSIOS-OE-PIEUP +0xC448 # HANGUL SYLLABLE SSANGSIOS-YO +0xC464 # HANGUL SYLLABLE SSANGSIOS-U +0xC465 # HANGUL SYLLABLE SSANGSIOS-U-KIYEOK +0xC468 # HANGUL SYLLABLE SSANGSIOS-U-NIEUN +0xC46C # HANGUL SYLLABLE SSANGSIOS-U-RIEUL +0xC474 # HANGUL SYLLABLE SSANGSIOS-U-MIEUM +0xC475 # HANGUL SYLLABLE SSANGSIOS-U-PIEUP +0xC479 # HANGUL SYLLABLE SSANGSIOS-U-IEUNG +0xC480 # HANGUL SYLLABLE SSANGSIOS-WEO +0xC494 # HANGUL SYLLABLE SSANGSIOS-WEO-SSANGSIOS +0xC49C # HANGUL SYLLABLE SSANGSIOS-WE +0xC4B8 # HANGUL SYLLABLE SSANGSIOS-WI +0xC4BC # HANGUL SYLLABLE SSANGSIOS-WI-NIEUN +0xC4E9 # HANGUL SYLLABLE SSANGSIOS-YU-IEUNG +0xC4F0 # HANGUL SYLLABLE SSANGSIOS-EU +0xC4F1 # HANGUL SYLLABLE SSANGSIOS-EU-KIYEOK +0xC4F4 # HANGUL SYLLABLE SSANGSIOS-EU-NIEUN +0xC4F8 # HANGUL SYLLABLE SSANGSIOS-EU-RIEUL +0xC4FA # HANGUL SYLLABLE SSANGSIOS-EU-RIEULMIEUM +0xC4FF # HANGUL SYLLABLE SSANGSIOS-EU-RIEULHIEUH +0xC500 # HANGUL SYLLABLE SSANGSIOS-EU-MIEUM +0xC501 # HANGUL SYLLABLE SSANGSIOS-EU-PIEUP +0xC50C # HANGUL SYLLABLE SSANGSIOS-YI +0xC510 # HANGUL SYLLABLE SSANGSIOS-YI-NIEUN +0xC514 # HANGUL SYLLABLE SSANGSIOS-YI-RIEUL +0xC51C # HANGUL SYLLABLE SSANGSIOS-YI-MIEUM +0xC528 # HANGUL SYLLABLE SSANGSIOS-I +0xC529 # HANGUL SYLLABLE SSANGSIOS-I-KIYEOK +0xC52C # HANGUL SYLLABLE SSANGSIOS-I-NIEUN +0xC530 # HANGUL SYLLABLE SSANGSIOS-I-RIEUL +0xC538 # HANGUL SYLLABLE SSANGSIOS-I-MIEUM +0xC539 # HANGUL SYLLABLE SSANGSIOS-I-PIEUP +0xC53B # HANGUL SYLLABLE SSANGSIOS-I-SIOS +0xC53D # HANGUL SYLLABLE SSANGSIOS-I-IEUNG +0xC544 # HANGUL SYLLABLE IEUNG-A +0xC545 # HANGUL SYLLABLE IEUNG-A-KIYEOK +0xC548 # HANGUL SYLLABLE IEUNG-A-NIEUN +0xC549 # HANGUL SYLLABLE IEUNG-A-NIEUNCIEUC +0xC54A # HANGUL SYLLABLE IEUNG-A-NIEUNHIEUH +0xC54C # HANGUL SYLLABLE IEUNG-A-RIEUL +0xC54D # HANGUL SYLLABLE IEUNG-A-RIEULKIYEOK +0xC54E # HANGUL SYLLABLE IEUNG-A-RIEULMIEUM +0xC553 # HANGUL SYLLABLE IEUNG-A-RIEULHIEUH +0xC554 # HANGUL SYLLABLE IEUNG-A-MIEUM +0xC555 # HANGUL SYLLABLE IEUNG-A-PIEUP +0xC557 # HANGUL SYLLABLE IEUNG-A-SIOS +0xC558 # HANGUL SYLLABLE IEUNG-A-SSANGSIOS +0xC559 # HANGUL SYLLABLE IEUNG-A-IEUNG +0xC55D # HANGUL SYLLABLE IEUNG-A-THIEUTH +0xC55E # HANGUL SYLLABLE IEUNG-A-PHIEUPH +0xC560 # HANGUL SYLLABLE IEUNG-AE +0xC561 # HANGUL SYLLABLE IEUNG-AE-KIYEOK +0xC564 # HANGUL SYLLABLE IEUNG-AE-NIEUN +0xC568 # HANGUL SYLLABLE IEUNG-AE-RIEUL +0xC570 # HANGUL SYLLABLE IEUNG-AE-MIEUM +0xC571 # HANGUL SYLLABLE IEUNG-AE-PIEUP +0xC573 # HANGUL SYLLABLE IEUNG-AE-SIOS +0xC574 # HANGUL SYLLABLE IEUNG-AE-SSANGSIOS +0xC575 # HANGUL SYLLABLE IEUNG-AE-IEUNG +0xC57C # HANGUL SYLLABLE IEUNG-YA +0xC57D # HANGUL SYLLABLE IEUNG-YA-KIYEOK +0xC580 # HANGUL SYLLABLE IEUNG-YA-NIEUN +0xC584 # HANGUL SYLLABLE IEUNG-YA-RIEUL +0xC587 # HANGUL SYLLABLE IEUNG-YA-RIEULPIEUP +0xC58C # HANGUL SYLLABLE IEUNG-YA-MIEUM +0xC58D # HANGUL SYLLABLE IEUNG-YA-PIEUP +0xC58F # HANGUL SYLLABLE IEUNG-YA-SIOS +0xC591 # HANGUL SYLLABLE IEUNG-YA-IEUNG +0xC595 # HANGUL SYLLABLE IEUNG-YA-THIEUTH +0xC597 # HANGUL SYLLABLE IEUNG-YA-HIEUH +0xC598 # HANGUL SYLLABLE IEUNG-YAE +0xC59C # HANGUL SYLLABLE IEUNG-YAE-NIEUN +0xC5A0 # HANGUL SYLLABLE IEUNG-YAE-RIEUL +0xC5A9 # HANGUL SYLLABLE IEUNG-YAE-PIEUP +0xC5B4 # HANGUL SYLLABLE IEUNG-EO +0xC5B5 # HANGUL SYLLABLE IEUNG-EO-KIYEOK +0xC5B8 # HANGUL SYLLABLE IEUNG-EO-NIEUN +0xC5B9 # HANGUL SYLLABLE IEUNG-EO-NIEUNCIEUC +0xC5BB # HANGUL SYLLABLE IEUNG-EO-TIKEUT +0xC5BC # HANGUL SYLLABLE IEUNG-EO-RIEUL +0xC5BD # HANGUL SYLLABLE IEUNG-EO-RIEULKIYEOK +0xC5BE # HANGUL SYLLABLE IEUNG-EO-RIEULMIEUM +0xC5C4 # HANGUL SYLLABLE IEUNG-EO-MIEUM +0xC5C5 # HANGUL SYLLABLE IEUNG-EO-PIEUP +0xC5C6 # HANGUL SYLLABLE IEUNG-EO-PIEUPSIOS +0xC5C7 # HANGUL SYLLABLE IEUNG-EO-SIOS +0xC5C8 # HANGUL SYLLABLE IEUNG-EO-SSANGSIOS +0xC5C9 # HANGUL SYLLABLE IEUNG-EO-IEUNG +0xC5CA # HANGUL SYLLABLE IEUNG-EO-CIEUC +0xC5CC # HANGUL SYLLABLE IEUNG-EO-KHIEUKH +0xC5CE # HANGUL SYLLABLE IEUNG-EO-PHIEUPH +0xC5D0 # HANGUL SYLLABLE IEUNG-E +0xC5D1 # HANGUL SYLLABLE IEUNG-E-KIYEOK +0xC5D4 # HANGUL SYLLABLE IEUNG-E-NIEUN +0xC5D8 # HANGUL SYLLABLE IEUNG-E-RIEUL +0xC5E0 # HANGUL SYLLABLE IEUNG-E-MIEUM +0xC5E1 # HANGUL SYLLABLE IEUNG-E-PIEUP +0xC5E3 # HANGUL SYLLABLE IEUNG-E-SIOS +0xC5E5 # HANGUL SYLLABLE IEUNG-E-IEUNG +0xC5EC # HANGUL SYLLABLE IEUNG-YEO +0xC5ED # HANGUL SYLLABLE IEUNG-YEO-KIYEOK +0xC5EE # HANGUL SYLLABLE IEUNG-YEO-SSANGKIYEOK +0xC5F0 # HANGUL SYLLABLE IEUNG-YEO-NIEUN +0xC5F4 # HANGUL SYLLABLE IEUNG-YEO-RIEUL +0xC5F6 # HANGUL SYLLABLE IEUNG-YEO-RIEULMIEUM +0xC5F7 # HANGUL SYLLABLE IEUNG-YEO-RIEULPIEUP +0xC5FC # HANGUL SYLLABLE IEUNG-YEO-MIEUM +0xC5FD # HANGUL SYLLABLE IEUNG-YEO-PIEUP +0xC5FE # HANGUL SYLLABLE IEUNG-YEO-PIEUPSIOS +0xC5FF # HANGUL SYLLABLE IEUNG-YEO-SIOS +0xC600 # HANGUL SYLLABLE IEUNG-YEO-SSANGSIOS +0xC601 # HANGUL SYLLABLE IEUNG-YEO-IEUNG +0xC605 # HANGUL SYLLABLE IEUNG-YEO-THIEUTH +0xC606 # HANGUL SYLLABLE IEUNG-YEO-PHIEUPH +0xC607 # HANGUL SYLLABLE IEUNG-YEO-HIEUH +0xC608 # HANGUL SYLLABLE IEUNG-YE +0xC60C # HANGUL SYLLABLE IEUNG-YE-NIEUN +0xC610 # HANGUL SYLLABLE IEUNG-YE-RIEUL +0xC618 # HANGUL SYLLABLE IEUNG-YE-MIEUM +0xC619 # HANGUL SYLLABLE IEUNG-YE-PIEUP +0xC61B # HANGUL SYLLABLE IEUNG-YE-SIOS +0xC61C # HANGUL SYLLABLE IEUNG-YE-SSANGSIOS +0xC624 # HANGUL SYLLABLE IEUNG-O +0xC625 # HANGUL SYLLABLE IEUNG-O-KIYEOK +0xC628 # HANGUL SYLLABLE IEUNG-O-NIEUN +0xC62C # HANGUL SYLLABLE IEUNG-O-RIEUL +0xC62D # HANGUL SYLLABLE IEUNG-O-RIEULKIYEOK +0xC62E # HANGUL SYLLABLE IEUNG-O-RIEULMIEUM +0xC630 # HANGUL SYLLABLE IEUNG-O-RIEULSIOS +0xC633 # HANGUL SYLLABLE IEUNG-O-RIEULHIEUH +0xC634 # HANGUL SYLLABLE IEUNG-O-MIEUM +0xC635 # HANGUL SYLLABLE IEUNG-O-PIEUP +0xC637 # HANGUL SYLLABLE IEUNG-O-SIOS +0xC639 # HANGUL SYLLABLE IEUNG-O-IEUNG +0xC63B # HANGUL SYLLABLE IEUNG-O-CHIEUCH +0xC640 # HANGUL SYLLABLE IEUNG-WA +0xC641 # HANGUL SYLLABLE IEUNG-WA-KIYEOK +0xC644 # HANGUL SYLLABLE IEUNG-WA-NIEUN +0xC648 # HANGUL SYLLABLE IEUNG-WA-RIEUL +0xC650 # HANGUL SYLLABLE IEUNG-WA-MIEUM +0xC651 # HANGUL SYLLABLE IEUNG-WA-PIEUP +0xC653 # HANGUL SYLLABLE IEUNG-WA-SIOS +0xC654 # HANGUL SYLLABLE IEUNG-WA-SSANGSIOS +0xC655 # HANGUL SYLLABLE IEUNG-WA-IEUNG +0xC65C # HANGUL SYLLABLE IEUNG-WAE +0xC65D # HANGUL SYLLABLE IEUNG-WAE-KIYEOK +0xC660 # HANGUL SYLLABLE IEUNG-WAE-NIEUN +0xC66C # HANGUL SYLLABLE IEUNG-WAE-MIEUM +0xC66F # HANGUL SYLLABLE IEUNG-WAE-SIOS +0xC671 # HANGUL SYLLABLE IEUNG-WAE-IEUNG +0xC678 # HANGUL SYLLABLE IEUNG-OE +0xC679 # HANGUL SYLLABLE IEUNG-OE-KIYEOK +0xC67C # HANGUL SYLLABLE IEUNG-OE-NIEUN +0xC680 # HANGUL SYLLABLE IEUNG-OE-RIEUL +0xC688 # HANGUL SYLLABLE IEUNG-OE-MIEUM +0xC689 # HANGUL SYLLABLE IEUNG-OE-PIEUP +0xC68B # HANGUL SYLLABLE IEUNG-OE-SIOS +0xC68D # HANGUL SYLLABLE IEUNG-OE-IEUNG +0xC694 # HANGUL SYLLABLE IEUNG-YO +0xC695 # HANGUL SYLLABLE IEUNG-YO-KIYEOK +0xC698 # HANGUL SYLLABLE IEUNG-YO-NIEUN +0xC69C # HANGUL SYLLABLE IEUNG-YO-RIEUL +0xC6A4 # HANGUL SYLLABLE IEUNG-YO-MIEUM +0xC6A5 # HANGUL SYLLABLE IEUNG-YO-PIEUP +0xC6A7 # HANGUL SYLLABLE IEUNG-YO-SIOS +0xC6A9 # HANGUL SYLLABLE IEUNG-YO-IEUNG +0xC6B0 # HANGUL SYLLABLE IEUNG-U +0xC6B1 # HANGUL SYLLABLE IEUNG-U-KIYEOK +0xC6B4 # HANGUL SYLLABLE IEUNG-U-NIEUN +0xC6B8 # HANGUL SYLLABLE IEUNG-U-RIEUL +0xC6B9 # HANGUL SYLLABLE IEUNG-U-RIEULKIYEOK +0xC6BA # HANGUL SYLLABLE IEUNG-U-RIEULMIEUM +0xC6C0 # HANGUL SYLLABLE IEUNG-U-MIEUM +0xC6C1 # HANGUL SYLLABLE IEUNG-U-PIEUP +0xC6C3 # HANGUL SYLLABLE IEUNG-U-SIOS +0xC6C5 # HANGUL SYLLABLE IEUNG-U-IEUNG +0xC6CC # HANGUL SYLLABLE IEUNG-WEO +0xC6CD # HANGUL SYLLABLE IEUNG-WEO-KIYEOK +0xC6D0 # HANGUL SYLLABLE IEUNG-WEO-NIEUN +0xC6D4 # HANGUL SYLLABLE IEUNG-WEO-RIEUL +0xC6DC # HANGUL SYLLABLE IEUNG-WEO-MIEUM +0xC6DD # HANGUL SYLLABLE IEUNG-WEO-PIEUP +0xC6E0 # HANGUL SYLLABLE IEUNG-WEO-SSANGSIOS +0xC6E1 # HANGUL SYLLABLE IEUNG-WEO-IEUNG +0xC6E8 # HANGUL SYLLABLE IEUNG-WE +0xC6E9 # HANGUL SYLLABLE IEUNG-WE-KIYEOK +0xC6EC # HANGUL SYLLABLE IEUNG-WE-NIEUN +0xC6F0 # HANGUL SYLLABLE IEUNG-WE-RIEUL +0xC6F8 # HANGUL SYLLABLE IEUNG-WE-MIEUM +0xC6F9 # HANGUL SYLLABLE IEUNG-WE-PIEUP +0xC6FD # HANGUL SYLLABLE IEUNG-WE-IEUNG +0xC704 # HANGUL SYLLABLE IEUNG-WI +0xC705 # HANGUL SYLLABLE IEUNG-WI-KIYEOK +0xC708 # HANGUL SYLLABLE IEUNG-WI-NIEUN +0xC70C # HANGUL SYLLABLE IEUNG-WI-RIEUL +0xC714 # HANGUL SYLLABLE IEUNG-WI-MIEUM +0xC715 # HANGUL SYLLABLE IEUNG-WI-PIEUP +0xC717 # HANGUL SYLLABLE IEUNG-WI-SIOS +0xC719 # HANGUL SYLLABLE IEUNG-WI-IEUNG +0xC720 # HANGUL SYLLABLE IEUNG-YU +0xC721 # HANGUL SYLLABLE IEUNG-YU-KIYEOK +0xC724 # HANGUL SYLLABLE IEUNG-YU-NIEUN +0xC728 # HANGUL SYLLABLE IEUNG-YU-RIEUL +0xC730 # HANGUL SYLLABLE IEUNG-YU-MIEUM +0xC731 # HANGUL SYLLABLE IEUNG-YU-PIEUP +0xC733 # HANGUL SYLLABLE IEUNG-YU-SIOS +0xC735 # HANGUL SYLLABLE IEUNG-YU-IEUNG +0xC737 # HANGUL SYLLABLE IEUNG-YU-CHIEUCH +0xC73C # HANGUL SYLLABLE IEUNG-EU +0xC73D # HANGUL SYLLABLE IEUNG-EU-KIYEOK +0xC740 # HANGUL SYLLABLE IEUNG-EU-NIEUN +0xC744 # HANGUL SYLLABLE IEUNG-EU-RIEUL +0xC74A # HANGUL SYLLABLE IEUNG-EU-RIEULPHIEUPH +0xC74C # HANGUL SYLLABLE IEUNG-EU-MIEUM +0xC74D # HANGUL SYLLABLE IEUNG-EU-PIEUP +0xC74F # HANGUL SYLLABLE IEUNG-EU-SIOS +0xC751 # HANGUL SYLLABLE IEUNG-EU-IEUNG +0xC752 # HANGUL SYLLABLE IEUNG-EU-CIEUC +0xC753 # HANGUL SYLLABLE IEUNG-EU-CHIEUCH +0xC754 # HANGUL SYLLABLE IEUNG-EU-KHIEUKH +0xC755 # HANGUL SYLLABLE IEUNG-EU-THIEUTH +0xC756 # HANGUL SYLLABLE IEUNG-EU-PHIEUPH +0xC757 # HANGUL SYLLABLE IEUNG-EU-HIEUH +0xC758 # HANGUL SYLLABLE IEUNG-YI +0xC75C # HANGUL SYLLABLE IEUNG-YI-NIEUN +0xC760 # HANGUL SYLLABLE IEUNG-YI-RIEUL +0xC768 # HANGUL SYLLABLE IEUNG-YI-MIEUM +0xC76B # HANGUL SYLLABLE IEUNG-YI-SIOS +0xC774 # HANGUL SYLLABLE IEUNG-I +0xC775 # HANGUL SYLLABLE IEUNG-I-KIYEOK +0xC778 # HANGUL SYLLABLE IEUNG-I-NIEUN +0xC77C # HANGUL SYLLABLE IEUNG-I-RIEUL +0xC77D # HANGUL SYLLABLE IEUNG-I-RIEULKIYEOK +0xC77E # HANGUL SYLLABLE IEUNG-I-RIEULMIEUM +0xC783 # HANGUL SYLLABLE IEUNG-I-RIEULHIEUH +0xC784 # HANGUL SYLLABLE IEUNG-I-MIEUM +0xC785 # HANGUL SYLLABLE IEUNG-I-PIEUP +0xC787 # HANGUL SYLLABLE IEUNG-I-SIOS +0xC788 # HANGUL SYLLABLE IEUNG-I-SSANGSIOS +0xC789 # HANGUL SYLLABLE IEUNG-I-IEUNG +0xC78A # HANGUL SYLLABLE IEUNG-I-CIEUC +0xC78E # HANGUL SYLLABLE IEUNG-I-PHIEUPH +0xC790 # HANGUL SYLLABLE CIEUC-A +0xC791 # HANGUL SYLLABLE CIEUC-A-KIYEOK +0xC794 # HANGUL SYLLABLE CIEUC-A-NIEUN +0xC796 # HANGUL SYLLABLE CIEUC-A-NIEUNHIEUH +0xC797 # HANGUL SYLLABLE CIEUC-A-TIKEUT +0xC798 # HANGUL SYLLABLE CIEUC-A-RIEUL +0xC79A # HANGUL SYLLABLE CIEUC-A-RIEULMIEUM +0xC7A0 # HANGUL SYLLABLE CIEUC-A-MIEUM +0xC7A1 # HANGUL SYLLABLE CIEUC-A-PIEUP +0xC7A3 # HANGUL SYLLABLE CIEUC-A-SIOS +0xC7A4 # HANGUL SYLLABLE CIEUC-A-SSANGSIOS +0xC7A5 # HANGUL SYLLABLE CIEUC-A-IEUNG +0xC7A6 # HANGUL SYLLABLE CIEUC-A-CIEUC +0xC7AC # HANGUL SYLLABLE CIEUC-AE +0xC7AD # HANGUL SYLLABLE CIEUC-AE-KIYEOK +0xC7B0 # HANGUL SYLLABLE CIEUC-AE-NIEUN +0xC7B4 # HANGUL SYLLABLE CIEUC-AE-RIEUL +0xC7BC # HANGUL SYLLABLE CIEUC-AE-MIEUM +0xC7BD # HANGUL SYLLABLE CIEUC-AE-PIEUP +0xC7BF # HANGUL SYLLABLE CIEUC-AE-SIOS +0xC7C0 # HANGUL SYLLABLE CIEUC-AE-SSANGSIOS +0xC7C1 # HANGUL SYLLABLE CIEUC-AE-IEUNG +0xC7C8 # HANGUL SYLLABLE CIEUC-YA +0xC7C9 # HANGUL SYLLABLE CIEUC-YA-KIYEOK +0xC7CC # HANGUL SYLLABLE CIEUC-YA-NIEUN +0xC7CE # HANGUL SYLLABLE CIEUC-YA-NIEUNHIEUH +0xC7D0 # HANGUL SYLLABLE CIEUC-YA-RIEUL +0xC7D8 # HANGUL SYLLABLE CIEUC-YA-MIEUM +0xC7DD # HANGUL SYLLABLE CIEUC-YA-IEUNG +0xC7E4 # HANGUL SYLLABLE CIEUC-YAE +0xC7E8 # HANGUL SYLLABLE CIEUC-YAE-NIEUN +0xC7EC # HANGUL SYLLABLE CIEUC-YAE-RIEUL +0xC800 # HANGUL SYLLABLE CIEUC-EO +0xC801 # HANGUL SYLLABLE CIEUC-EO-KIYEOK +0xC804 # HANGUL SYLLABLE CIEUC-EO-NIEUN +0xC808 # HANGUL SYLLABLE CIEUC-EO-RIEUL +0xC80A # HANGUL SYLLABLE CIEUC-EO-RIEULMIEUM +0xC810 # HANGUL SYLLABLE CIEUC-EO-MIEUM +0xC811 # HANGUL SYLLABLE CIEUC-EO-PIEUP +0xC813 # HANGUL SYLLABLE CIEUC-EO-SIOS +0xC815 # HANGUL SYLLABLE CIEUC-EO-IEUNG +0xC816 # HANGUL SYLLABLE CIEUC-EO-CIEUC +0xC81C # HANGUL SYLLABLE CIEUC-E +0xC81D # HANGUL SYLLABLE CIEUC-E-KIYEOK +0xC820 # HANGUL SYLLABLE CIEUC-E-NIEUN +0xC824 # HANGUL SYLLABLE CIEUC-E-RIEUL +0xC82C # HANGUL SYLLABLE CIEUC-E-MIEUM +0xC82D # HANGUL SYLLABLE CIEUC-E-PIEUP +0xC82F # HANGUL SYLLABLE CIEUC-E-SIOS +0xC831 # HANGUL SYLLABLE CIEUC-E-IEUNG +0xC838 # HANGUL SYLLABLE CIEUC-YEO +0xC83C # HANGUL SYLLABLE CIEUC-YEO-NIEUN +0xC840 # HANGUL SYLLABLE CIEUC-YEO-RIEUL +0xC848 # HANGUL SYLLABLE CIEUC-YEO-MIEUM +0xC849 # HANGUL SYLLABLE CIEUC-YEO-PIEUP +0xC84C # HANGUL SYLLABLE CIEUC-YEO-SSANGSIOS +0xC84D # HANGUL SYLLABLE CIEUC-YEO-IEUNG +0xC854 # HANGUL SYLLABLE CIEUC-YE +0xC870 # HANGUL SYLLABLE CIEUC-O +0xC871 # HANGUL SYLLABLE CIEUC-O-KIYEOK +0xC874 # HANGUL SYLLABLE CIEUC-O-NIEUN +0xC878 # HANGUL SYLLABLE CIEUC-O-RIEUL +0xC87A # HANGUL SYLLABLE CIEUC-O-RIEULMIEUM +0xC880 # HANGUL SYLLABLE CIEUC-O-MIEUM +0xC881 # HANGUL SYLLABLE CIEUC-O-PIEUP +0xC883 # HANGUL SYLLABLE CIEUC-O-SIOS +0xC885 # HANGUL SYLLABLE CIEUC-O-IEUNG +0xC886 # HANGUL SYLLABLE CIEUC-O-CIEUC +0xC887 # HANGUL SYLLABLE CIEUC-O-CHIEUCH +0xC88B # HANGUL SYLLABLE CIEUC-O-HIEUH +0xC88C # HANGUL SYLLABLE CIEUC-WA +0xC88D # HANGUL SYLLABLE CIEUC-WA-KIYEOK +0xC894 # HANGUL SYLLABLE CIEUC-WA-RIEUL +0xC89D # HANGUL SYLLABLE CIEUC-WA-PIEUP +0xC89F # HANGUL SYLLABLE CIEUC-WA-SIOS +0xC8A1 # HANGUL SYLLABLE CIEUC-WA-IEUNG +0xC8A8 # HANGUL SYLLABLE CIEUC-WAE +0xC8BC # HANGUL SYLLABLE CIEUC-WAE-SSANGSIOS +0xC8BD # HANGUL SYLLABLE CIEUC-WAE-IEUNG +0xC8C4 # HANGUL SYLLABLE CIEUC-OE +0xC8C8 # HANGUL SYLLABLE CIEUC-OE-NIEUN +0xC8CC # HANGUL SYLLABLE CIEUC-OE-RIEUL +0xC8D4 # HANGUL SYLLABLE CIEUC-OE-MIEUM +0xC8D5 # HANGUL SYLLABLE CIEUC-OE-PIEUP +0xC8D7 # HANGUL SYLLABLE CIEUC-OE-SIOS +0xC8D9 # HANGUL SYLLABLE CIEUC-OE-IEUNG +0xC8E0 # HANGUL SYLLABLE CIEUC-YO +0xC8E1 # HANGUL SYLLABLE CIEUC-YO-KIYEOK +0xC8E4 # HANGUL SYLLABLE CIEUC-YO-NIEUN +0xC8F5 # HANGUL SYLLABLE CIEUC-YO-IEUNG +0xC8FC # HANGUL SYLLABLE CIEUC-U +0xC8FD # HANGUL SYLLABLE CIEUC-U-KIYEOK +0xC900 # HANGUL SYLLABLE CIEUC-U-NIEUN +0xC904 # HANGUL SYLLABLE CIEUC-U-RIEUL +0xC905 # HANGUL SYLLABLE CIEUC-U-RIEULKIYEOK +0xC906 # HANGUL SYLLABLE CIEUC-U-RIEULMIEUM +0xC90C # HANGUL SYLLABLE CIEUC-U-MIEUM +0xC90D # HANGUL SYLLABLE CIEUC-U-PIEUP +0xC90F # HANGUL SYLLABLE CIEUC-U-SIOS +0xC911 # HANGUL SYLLABLE CIEUC-U-IEUNG +0xC918 # HANGUL SYLLABLE CIEUC-WEO +0xC92C # HANGUL SYLLABLE CIEUC-WEO-SSANGSIOS +0xC934 # HANGUL SYLLABLE CIEUC-WE +0xC950 # HANGUL SYLLABLE CIEUC-WI +0xC951 # HANGUL SYLLABLE CIEUC-WI-KIYEOK +0xC954 # HANGUL SYLLABLE CIEUC-WI-NIEUN +0xC958 # HANGUL SYLLABLE CIEUC-WI-RIEUL +0xC960 # HANGUL SYLLABLE CIEUC-WI-MIEUM +0xC961 # HANGUL SYLLABLE CIEUC-WI-PIEUP +0xC963 # HANGUL SYLLABLE CIEUC-WI-SIOS +0xC96C # HANGUL SYLLABLE CIEUC-YU +0xC970 # HANGUL SYLLABLE CIEUC-YU-NIEUN +0xC974 # HANGUL SYLLABLE CIEUC-YU-RIEUL +0xC97C # HANGUL SYLLABLE CIEUC-YU-MIEUM +0xC988 # HANGUL SYLLABLE CIEUC-EU +0xC989 # HANGUL SYLLABLE CIEUC-EU-KIYEOK +0xC98C # HANGUL SYLLABLE CIEUC-EU-NIEUN +0xC990 # HANGUL SYLLABLE CIEUC-EU-RIEUL +0xC998 # HANGUL SYLLABLE CIEUC-EU-MIEUM +0xC999 # HANGUL SYLLABLE CIEUC-EU-PIEUP +0xC99B # HANGUL SYLLABLE CIEUC-EU-SIOS +0xC99D # HANGUL SYLLABLE CIEUC-EU-IEUNG +0xC9C0 # HANGUL SYLLABLE CIEUC-I +0xC9C1 # HANGUL SYLLABLE CIEUC-I-KIYEOK +0xC9C4 # HANGUL SYLLABLE CIEUC-I-NIEUN +0xC9C7 # HANGUL SYLLABLE CIEUC-I-TIKEUT +0xC9C8 # HANGUL SYLLABLE CIEUC-I-RIEUL +0xC9CA # HANGUL SYLLABLE CIEUC-I-RIEULMIEUM +0xC9D0 # HANGUL SYLLABLE CIEUC-I-MIEUM +0xC9D1 # HANGUL SYLLABLE CIEUC-I-PIEUP +0xC9D3 # HANGUL SYLLABLE CIEUC-I-SIOS +0xC9D5 # HANGUL SYLLABLE CIEUC-I-IEUNG +0xC9D6 # HANGUL SYLLABLE CIEUC-I-CIEUC +0xC9D9 # HANGUL SYLLABLE CIEUC-I-THIEUTH +0xC9DA # HANGUL SYLLABLE CIEUC-I-PHIEUPH +0xC9DC # HANGUL SYLLABLE SSANGCIEUC-A +0xC9DD # HANGUL SYLLABLE SSANGCIEUC-A-KIYEOK +0xC9E0 # HANGUL SYLLABLE SSANGCIEUC-A-NIEUN +0xC9E2 # HANGUL SYLLABLE SSANGCIEUC-A-NIEUNHIEUH +0xC9E4 # HANGUL SYLLABLE SSANGCIEUC-A-RIEUL +0xC9E7 # HANGUL SYLLABLE SSANGCIEUC-A-RIEULPIEUP +0xC9EC # HANGUL SYLLABLE SSANGCIEUC-A-MIEUM +0xC9ED # HANGUL SYLLABLE SSANGCIEUC-A-PIEUP +0xC9EF # HANGUL SYLLABLE SSANGCIEUC-A-SIOS +0xC9F0 # HANGUL SYLLABLE SSANGCIEUC-A-SSANGSIOS +0xC9F1 # HANGUL SYLLABLE SSANGCIEUC-A-IEUNG +0xC9F8 # HANGUL SYLLABLE SSANGCIEUC-AE +0xC9F9 # HANGUL SYLLABLE SSANGCIEUC-AE-KIYEOK +0xC9FC # HANGUL SYLLABLE SSANGCIEUC-AE-NIEUN +0xCA00 # HANGUL SYLLABLE SSANGCIEUC-AE-RIEUL +0xCA08 # HANGUL SYLLABLE SSANGCIEUC-AE-MIEUM +0xCA09 # HANGUL SYLLABLE SSANGCIEUC-AE-PIEUP +0xCA0B # HANGUL SYLLABLE SSANGCIEUC-AE-SIOS +0xCA0C # HANGUL SYLLABLE SSANGCIEUC-AE-SSANGSIOS +0xCA0D # HANGUL SYLLABLE SSANGCIEUC-AE-IEUNG +0xCA14 # HANGUL SYLLABLE SSANGCIEUC-YA +0xCA18 # HANGUL SYLLABLE SSANGCIEUC-YA-NIEUN +0xCA29 # HANGUL SYLLABLE SSANGCIEUC-YA-IEUNG +0xCA4C # HANGUL SYLLABLE SSANGCIEUC-EO +0xCA4D # HANGUL SYLLABLE SSANGCIEUC-EO-KIYEOK +0xCA50 # HANGUL SYLLABLE SSANGCIEUC-EO-NIEUN +0xCA54 # HANGUL SYLLABLE SSANGCIEUC-EO-RIEUL +0xCA5C # HANGUL SYLLABLE SSANGCIEUC-EO-MIEUM +0xCA5D # HANGUL SYLLABLE SSANGCIEUC-EO-PIEUP +0xCA5F # HANGUL SYLLABLE SSANGCIEUC-EO-SIOS +0xCA60 # HANGUL SYLLABLE SSANGCIEUC-EO-SSANGSIOS +0xCA61 # HANGUL SYLLABLE SSANGCIEUC-EO-IEUNG +0xCA68 # HANGUL SYLLABLE SSANGCIEUC-E +0xCA7D # HANGUL SYLLABLE SSANGCIEUC-E-IEUNG +0xCA84 # HANGUL SYLLABLE SSANGCIEUC-YEO +0xCA98 # HANGUL SYLLABLE SSANGCIEUC-YEO-SSANGSIOS +0xCABC # HANGUL SYLLABLE SSANGCIEUC-O +0xCABD # HANGUL SYLLABLE SSANGCIEUC-O-KIYEOK +0xCAC0 # HANGUL SYLLABLE SSANGCIEUC-O-NIEUN +0xCAC4 # HANGUL SYLLABLE SSANGCIEUC-O-RIEUL +0xCACC # HANGUL SYLLABLE SSANGCIEUC-O-MIEUM +0xCACD # HANGUL SYLLABLE SSANGCIEUC-O-PIEUP +0xCACF # HANGUL SYLLABLE SSANGCIEUC-O-SIOS +0xCAD1 # HANGUL SYLLABLE SSANGCIEUC-O-IEUNG +0xCAD3 # HANGUL SYLLABLE SSANGCIEUC-O-CHIEUCH +0xCAD8 # HANGUL SYLLABLE SSANGCIEUC-WA +0xCAD9 # HANGUL SYLLABLE SSANGCIEUC-WA-KIYEOK +0xCAE0 # HANGUL SYLLABLE SSANGCIEUC-WA-RIEUL +0xCAEC # HANGUL SYLLABLE SSANGCIEUC-WA-SSANGSIOS +0xCAF4 # HANGUL SYLLABLE SSANGCIEUC-WAE +0xCB08 # HANGUL SYLLABLE SSANGCIEUC-WAE-SSANGSIOS +0xCB10 # HANGUL SYLLABLE SSANGCIEUC-OE +0xCB14 # HANGUL SYLLABLE SSANGCIEUC-OE-NIEUN +0xCB18 # HANGUL SYLLABLE SSANGCIEUC-OE-RIEUL +0xCB20 # HANGUL SYLLABLE SSANGCIEUC-OE-MIEUM +0xCB21 # HANGUL SYLLABLE SSANGCIEUC-OE-PIEUP +0xCB41 # HANGUL SYLLABLE SSANGCIEUC-YO-IEUNG +0xCB48 # HANGUL SYLLABLE SSANGCIEUC-U +0xCB49 # HANGUL SYLLABLE SSANGCIEUC-U-KIYEOK +0xCB4C # HANGUL SYLLABLE SSANGCIEUC-U-NIEUN +0xCB50 # HANGUL SYLLABLE SSANGCIEUC-U-RIEUL +0xCB58 # HANGUL SYLLABLE SSANGCIEUC-U-MIEUM +0xCB59 # HANGUL SYLLABLE SSANGCIEUC-U-PIEUP +0xCB5D # HANGUL SYLLABLE SSANGCIEUC-U-IEUNG +0xCB64 # HANGUL SYLLABLE SSANGCIEUC-WEO +0xCB78 # HANGUL SYLLABLE SSANGCIEUC-WEO-SSANGSIOS +0xCB79 # HANGUL SYLLABLE SSANGCIEUC-WEO-IEUNG +0xCB9C # HANGUL SYLLABLE SSANGCIEUC-WI +0xCBB8 # HANGUL SYLLABLE SSANGCIEUC-YU +0xCBD4 # HANGUL SYLLABLE SSANGCIEUC-EU +0xCBE4 # HANGUL SYLLABLE SSANGCIEUC-EU-MIEUM +0xCBE7 # HANGUL SYLLABLE SSANGCIEUC-EU-SIOS +0xCBE9 # HANGUL SYLLABLE SSANGCIEUC-EU-IEUNG +0xCC0C # HANGUL SYLLABLE SSANGCIEUC-I +0xCC0D # HANGUL SYLLABLE SSANGCIEUC-I-KIYEOK +0xCC10 # HANGUL SYLLABLE SSANGCIEUC-I-NIEUN +0xCC14 # HANGUL SYLLABLE SSANGCIEUC-I-RIEUL +0xCC1C # HANGUL SYLLABLE SSANGCIEUC-I-MIEUM +0xCC1D # HANGUL SYLLABLE SSANGCIEUC-I-PIEUP +0xCC21 # HANGUL SYLLABLE SSANGCIEUC-I-IEUNG +0xCC22 # HANGUL SYLLABLE SSANGCIEUC-I-CIEUC +0xCC27 # HANGUL SYLLABLE SSANGCIEUC-I-HIEUH +0xCC28 # HANGUL SYLLABLE CHIEUCH-A +0xCC29 # HANGUL SYLLABLE CHIEUCH-A-KIYEOK +0xCC2C # HANGUL SYLLABLE CHIEUCH-A-NIEUN +0xCC2E # HANGUL SYLLABLE CHIEUCH-A-NIEUNHIEUH +0xCC30 # HANGUL SYLLABLE CHIEUCH-A-RIEUL +0xCC38 # HANGUL SYLLABLE CHIEUCH-A-MIEUM +0xCC39 # HANGUL SYLLABLE CHIEUCH-A-PIEUP +0xCC3B # HANGUL SYLLABLE CHIEUCH-A-SIOS +0xCC3C # HANGUL SYLLABLE CHIEUCH-A-SSANGSIOS +0xCC3D # HANGUL SYLLABLE CHIEUCH-A-IEUNG +0xCC3E # HANGUL SYLLABLE CHIEUCH-A-CIEUC +0xCC44 # HANGUL SYLLABLE CHIEUCH-AE +0xCC45 # HANGUL SYLLABLE CHIEUCH-AE-KIYEOK +0xCC48 # HANGUL SYLLABLE CHIEUCH-AE-NIEUN +0xCC4C # HANGUL SYLLABLE CHIEUCH-AE-RIEUL +0xCC54 # HANGUL SYLLABLE CHIEUCH-AE-MIEUM +0xCC55 # HANGUL SYLLABLE CHIEUCH-AE-PIEUP +0xCC57 # HANGUL SYLLABLE CHIEUCH-AE-SIOS +0xCC58 # HANGUL SYLLABLE CHIEUCH-AE-SSANGSIOS +0xCC59 # HANGUL SYLLABLE CHIEUCH-AE-IEUNG +0xCC60 # HANGUL SYLLABLE CHIEUCH-YA +0xCC64 # HANGUL SYLLABLE CHIEUCH-YA-NIEUN +0xCC66 # HANGUL SYLLABLE CHIEUCH-YA-NIEUNHIEUH +0xCC68 # HANGUL SYLLABLE CHIEUCH-YA-RIEUL +0xCC70 # HANGUL SYLLABLE CHIEUCH-YA-MIEUM +0xCC75 # HANGUL SYLLABLE CHIEUCH-YA-IEUNG +0xCC98 # HANGUL SYLLABLE CHIEUCH-EO +0xCC99 # HANGUL SYLLABLE CHIEUCH-EO-KIYEOK +0xCC9C # HANGUL SYLLABLE CHIEUCH-EO-NIEUN +0xCCA0 # HANGUL SYLLABLE CHIEUCH-EO-RIEUL +0xCCA8 # HANGUL SYLLABLE CHIEUCH-EO-MIEUM +0xCCA9 # HANGUL SYLLABLE CHIEUCH-EO-PIEUP +0xCCAB # HANGUL SYLLABLE CHIEUCH-EO-SIOS +0xCCAC # HANGUL SYLLABLE CHIEUCH-EO-SSANGSIOS +0xCCAD # HANGUL SYLLABLE CHIEUCH-EO-IEUNG +0xCCB4 # HANGUL SYLLABLE CHIEUCH-E +0xCCB5 # HANGUL SYLLABLE CHIEUCH-E-KIYEOK +0xCCB8 # HANGUL SYLLABLE CHIEUCH-E-NIEUN +0xCCBC # HANGUL SYLLABLE CHIEUCH-E-RIEUL +0xCCC4 # HANGUL SYLLABLE CHIEUCH-E-MIEUM +0xCCC5 # HANGUL SYLLABLE CHIEUCH-E-PIEUP +0xCCC7 # HANGUL SYLLABLE CHIEUCH-E-SIOS +0xCCC9 # HANGUL SYLLABLE CHIEUCH-E-IEUNG +0xCCD0 # HANGUL SYLLABLE CHIEUCH-YEO +0xCCD4 # HANGUL SYLLABLE CHIEUCH-YEO-NIEUN +0xCCE4 # HANGUL SYLLABLE CHIEUCH-YEO-SSANGSIOS +0xCCEC # HANGUL SYLLABLE CHIEUCH-YE +0xCCF0 # HANGUL SYLLABLE CHIEUCH-YE-NIEUN +0xCD01 # HANGUL SYLLABLE CHIEUCH-YE-IEUNG +0xCD08 # HANGUL SYLLABLE CHIEUCH-O +0xCD09 # HANGUL SYLLABLE CHIEUCH-O-KIYEOK +0xCD0C # HANGUL SYLLABLE CHIEUCH-O-NIEUN +0xCD10 # HANGUL SYLLABLE CHIEUCH-O-RIEUL +0xCD18 # HANGUL SYLLABLE CHIEUCH-O-MIEUM +0xCD19 # HANGUL SYLLABLE CHIEUCH-O-PIEUP +0xCD1B # HANGUL SYLLABLE CHIEUCH-O-SIOS +0xCD1D # HANGUL SYLLABLE CHIEUCH-O-IEUNG +0xCD24 # HANGUL SYLLABLE CHIEUCH-WA +0xCD28 # HANGUL SYLLABLE CHIEUCH-WA-NIEUN +0xCD2C # HANGUL SYLLABLE CHIEUCH-WA-RIEUL +0xCD39 # HANGUL SYLLABLE CHIEUCH-WA-IEUNG +0xCD5C # HANGUL SYLLABLE CHIEUCH-OE +0xCD60 # HANGUL SYLLABLE CHIEUCH-OE-NIEUN +0xCD64 # HANGUL SYLLABLE CHIEUCH-OE-RIEUL +0xCD6C # HANGUL SYLLABLE CHIEUCH-OE-MIEUM +0xCD6D # HANGUL SYLLABLE CHIEUCH-OE-PIEUP +0xCD6F # HANGUL SYLLABLE CHIEUCH-OE-SIOS +0xCD71 # HANGUL SYLLABLE CHIEUCH-OE-IEUNG +0xCD78 # HANGUL SYLLABLE CHIEUCH-YO +0xCD88 # HANGUL SYLLABLE CHIEUCH-YO-MIEUM +0xCD94 # HANGUL SYLLABLE CHIEUCH-U +0xCD95 # HANGUL SYLLABLE CHIEUCH-U-KIYEOK +0xCD98 # HANGUL SYLLABLE CHIEUCH-U-NIEUN +0xCD9C # HANGUL SYLLABLE CHIEUCH-U-RIEUL +0xCDA4 # HANGUL SYLLABLE CHIEUCH-U-MIEUM +0xCDA5 # HANGUL SYLLABLE CHIEUCH-U-PIEUP +0xCDA7 # HANGUL SYLLABLE CHIEUCH-U-SIOS +0xCDA9 # HANGUL SYLLABLE CHIEUCH-U-IEUNG +0xCDB0 # HANGUL SYLLABLE CHIEUCH-WEO +0xCDC4 # HANGUL SYLLABLE CHIEUCH-WEO-SSANGSIOS +0xCDCC # HANGUL SYLLABLE CHIEUCH-WE +0xCDD0 # HANGUL SYLLABLE CHIEUCH-WE-NIEUN +0xCDE8 # HANGUL SYLLABLE CHIEUCH-WI +0xCDEC # HANGUL SYLLABLE CHIEUCH-WI-NIEUN +0xCDF0 # HANGUL SYLLABLE CHIEUCH-WI-RIEUL +0xCDF8 # HANGUL SYLLABLE CHIEUCH-WI-MIEUM +0xCDF9 # HANGUL SYLLABLE CHIEUCH-WI-PIEUP +0xCDFB # HANGUL SYLLABLE CHIEUCH-WI-SIOS +0xCDFD # HANGUL SYLLABLE CHIEUCH-WI-IEUNG +0xCE04 # HANGUL SYLLABLE CHIEUCH-YU +0xCE08 # HANGUL SYLLABLE CHIEUCH-YU-NIEUN +0xCE0C # HANGUL SYLLABLE CHIEUCH-YU-RIEUL +0xCE14 # HANGUL SYLLABLE CHIEUCH-YU-MIEUM +0xCE19 # HANGUL SYLLABLE CHIEUCH-YU-IEUNG +0xCE20 # HANGUL SYLLABLE CHIEUCH-EU +0xCE21 # HANGUL SYLLABLE CHIEUCH-EU-KIYEOK +0xCE24 # HANGUL SYLLABLE CHIEUCH-EU-NIEUN +0xCE28 # HANGUL SYLLABLE CHIEUCH-EU-RIEUL +0xCE30 # HANGUL SYLLABLE CHIEUCH-EU-MIEUM +0xCE31 # HANGUL SYLLABLE CHIEUCH-EU-PIEUP +0xCE33 # HANGUL SYLLABLE CHIEUCH-EU-SIOS +0xCE35 # HANGUL SYLLABLE CHIEUCH-EU-IEUNG +0xCE58 # HANGUL SYLLABLE CHIEUCH-I +0xCE59 # HANGUL SYLLABLE CHIEUCH-I-KIYEOK +0xCE5C # HANGUL SYLLABLE CHIEUCH-I-NIEUN +0xCE5F # HANGUL SYLLABLE CHIEUCH-I-TIKEUT +0xCE60 # HANGUL SYLLABLE CHIEUCH-I-RIEUL +0xCE61 # HANGUL SYLLABLE CHIEUCH-I-RIEULKIYEOK +0xCE68 # HANGUL SYLLABLE CHIEUCH-I-MIEUM +0xCE69 # HANGUL SYLLABLE CHIEUCH-I-PIEUP +0xCE6B # HANGUL SYLLABLE CHIEUCH-I-SIOS +0xCE6D # HANGUL SYLLABLE CHIEUCH-I-IEUNG +0xCE74 # HANGUL SYLLABLE KHIEUKH-A +0xCE75 # HANGUL SYLLABLE KHIEUKH-A-KIYEOK +0xCE78 # HANGUL SYLLABLE KHIEUKH-A-NIEUN +0xCE7C # HANGUL SYLLABLE KHIEUKH-A-RIEUL +0xCE84 # HANGUL SYLLABLE KHIEUKH-A-MIEUM +0xCE85 # HANGUL SYLLABLE KHIEUKH-A-PIEUP +0xCE87 # HANGUL SYLLABLE KHIEUKH-A-SIOS +0xCE89 # HANGUL SYLLABLE KHIEUKH-A-IEUNG +0xCE90 # HANGUL SYLLABLE KHIEUKH-AE +0xCE91 # HANGUL SYLLABLE KHIEUKH-AE-KIYEOK +0xCE94 # HANGUL SYLLABLE KHIEUKH-AE-NIEUN +0xCE98 # HANGUL SYLLABLE KHIEUKH-AE-RIEUL +0xCEA0 # HANGUL SYLLABLE KHIEUKH-AE-MIEUM +0xCEA1 # HANGUL SYLLABLE KHIEUKH-AE-PIEUP +0xCEA3 # HANGUL SYLLABLE KHIEUKH-AE-SIOS +0xCEA4 # HANGUL SYLLABLE KHIEUKH-AE-SSANGSIOS +0xCEA5 # HANGUL SYLLABLE KHIEUKH-AE-IEUNG +0xCEAC # HANGUL SYLLABLE KHIEUKH-YA +0xCEAD # HANGUL SYLLABLE KHIEUKH-YA-KIYEOK +0xCEC1 # HANGUL SYLLABLE KHIEUKH-YA-IEUNG +0xCEE4 # HANGUL SYLLABLE KHIEUKH-EO +0xCEE5 # HANGUL SYLLABLE KHIEUKH-EO-KIYEOK +0xCEE8 # HANGUL SYLLABLE KHIEUKH-EO-NIEUN +0xCEEB # HANGUL SYLLABLE KHIEUKH-EO-TIKEUT +0xCEEC # HANGUL SYLLABLE KHIEUKH-EO-RIEUL +0xCEF4 # HANGUL SYLLABLE KHIEUKH-EO-MIEUM +0xCEF5 # HANGUL SYLLABLE KHIEUKH-EO-PIEUP +0xCEF7 # HANGUL SYLLABLE KHIEUKH-EO-SIOS +0xCEF8 # HANGUL SYLLABLE KHIEUKH-EO-SSANGSIOS +0xCEF9 # HANGUL SYLLABLE KHIEUKH-EO-IEUNG +0xCF00 # HANGUL SYLLABLE KHIEUKH-E +0xCF01 # HANGUL SYLLABLE KHIEUKH-E-KIYEOK +0xCF04 # HANGUL SYLLABLE KHIEUKH-E-NIEUN +0xCF08 # HANGUL SYLLABLE KHIEUKH-E-RIEUL +0xCF10 # HANGUL SYLLABLE KHIEUKH-E-MIEUM +0xCF11 # HANGUL SYLLABLE KHIEUKH-E-PIEUP +0xCF13 # HANGUL SYLLABLE KHIEUKH-E-SIOS +0xCF15 # HANGUL SYLLABLE KHIEUKH-E-IEUNG +0xCF1C # HANGUL SYLLABLE KHIEUKH-YEO +0xCF20 # HANGUL SYLLABLE KHIEUKH-YEO-NIEUN +0xCF24 # HANGUL SYLLABLE KHIEUKH-YEO-RIEUL +0xCF2C # HANGUL SYLLABLE KHIEUKH-YEO-MIEUM +0xCF2D # HANGUL SYLLABLE KHIEUKH-YEO-PIEUP +0xCF2F # HANGUL SYLLABLE KHIEUKH-YEO-SIOS +0xCF30 # HANGUL SYLLABLE KHIEUKH-YEO-SSANGSIOS +0xCF31 # HANGUL SYLLABLE KHIEUKH-YEO-IEUNG +0xCF38 # HANGUL SYLLABLE KHIEUKH-YE +0xCF54 # HANGUL SYLLABLE KHIEUKH-O +0xCF55 # HANGUL SYLLABLE KHIEUKH-O-KIYEOK +0xCF58 # HANGUL SYLLABLE KHIEUKH-O-NIEUN +0xCF5C # HANGUL SYLLABLE KHIEUKH-O-RIEUL +0xCF64 # HANGUL SYLLABLE KHIEUKH-O-MIEUM +0xCF65 # HANGUL SYLLABLE KHIEUKH-O-PIEUP +0xCF67 # HANGUL SYLLABLE KHIEUKH-O-SIOS +0xCF69 # HANGUL SYLLABLE KHIEUKH-O-IEUNG +0xCF70 # HANGUL SYLLABLE KHIEUKH-WA +0xCF71 # HANGUL SYLLABLE KHIEUKH-WA-KIYEOK +0xCF74 # HANGUL SYLLABLE KHIEUKH-WA-NIEUN +0xCF78 # HANGUL SYLLABLE KHIEUKH-WA-RIEUL +0xCF80 # HANGUL SYLLABLE KHIEUKH-WA-MIEUM +0xCF85 # HANGUL SYLLABLE KHIEUKH-WA-IEUNG +0xCF8C # HANGUL SYLLABLE KHIEUKH-WAE +0xCFA1 # HANGUL SYLLABLE KHIEUKH-WAE-IEUNG +0xCFA8 # HANGUL SYLLABLE KHIEUKH-OE +0xCFB0 # HANGUL SYLLABLE KHIEUKH-OE-RIEUL +0xCFC4 # HANGUL SYLLABLE KHIEUKH-YO +0xCFE0 # HANGUL SYLLABLE KHIEUKH-U +0xCFE1 # HANGUL SYLLABLE KHIEUKH-U-KIYEOK +0xCFE4 # HANGUL SYLLABLE KHIEUKH-U-NIEUN +0xCFE8 # HANGUL SYLLABLE KHIEUKH-U-RIEUL +0xCFF0 # HANGUL SYLLABLE KHIEUKH-U-MIEUM +0xCFF1 # HANGUL SYLLABLE KHIEUKH-U-PIEUP +0xCFF3 # HANGUL SYLLABLE KHIEUKH-U-SIOS +0xCFF5 # HANGUL SYLLABLE KHIEUKH-U-IEUNG +0xCFFC # HANGUL SYLLABLE KHIEUKH-WEO +0xD000 # HANGUL SYLLABLE KHIEUKH-WEO-NIEUN +0xD004 # HANGUL SYLLABLE KHIEUKH-WEO-RIEUL +0xD011 # HANGUL SYLLABLE KHIEUKH-WEO-IEUNG +0xD018 # HANGUL SYLLABLE KHIEUKH-WE +0xD02D # HANGUL SYLLABLE KHIEUKH-WE-IEUNG +0xD034 # HANGUL SYLLABLE KHIEUKH-WI +0xD035 # HANGUL SYLLABLE KHIEUKH-WI-KIYEOK +0xD038 # HANGUL SYLLABLE KHIEUKH-WI-NIEUN +0xD03C # HANGUL SYLLABLE KHIEUKH-WI-RIEUL +0xD044 # HANGUL SYLLABLE KHIEUKH-WI-MIEUM +0xD045 # HANGUL SYLLABLE KHIEUKH-WI-PIEUP +0xD047 # HANGUL SYLLABLE KHIEUKH-WI-SIOS +0xD049 # HANGUL SYLLABLE KHIEUKH-WI-IEUNG +0xD050 # HANGUL SYLLABLE KHIEUKH-YU +0xD054 # HANGUL SYLLABLE KHIEUKH-YU-NIEUN +0xD058 # HANGUL SYLLABLE KHIEUKH-YU-RIEUL +0xD060 # HANGUL SYLLABLE KHIEUKH-YU-MIEUM +0xD06C # HANGUL SYLLABLE KHIEUKH-EU +0xD06D # HANGUL SYLLABLE KHIEUKH-EU-KIYEOK +0xD070 # HANGUL SYLLABLE KHIEUKH-EU-NIEUN +0xD074 # HANGUL SYLLABLE KHIEUKH-EU-RIEUL +0xD07C # HANGUL SYLLABLE KHIEUKH-EU-MIEUM +0xD07D # HANGUL SYLLABLE KHIEUKH-EU-PIEUP +0xD081 # HANGUL SYLLABLE KHIEUKH-EU-IEUNG +0xD0A4 # HANGUL SYLLABLE KHIEUKH-I +0xD0A5 # HANGUL SYLLABLE KHIEUKH-I-KIYEOK +0xD0A8 # HANGUL SYLLABLE KHIEUKH-I-NIEUN +0xD0AC # HANGUL SYLLABLE KHIEUKH-I-RIEUL +0xD0B4 # HANGUL SYLLABLE KHIEUKH-I-MIEUM +0xD0B5 # HANGUL SYLLABLE KHIEUKH-I-PIEUP +0xD0B7 # HANGUL SYLLABLE KHIEUKH-I-SIOS +0xD0B9 # HANGUL SYLLABLE KHIEUKH-I-IEUNG +0xD0C0 # HANGUL SYLLABLE THIEUTH-A +0xD0C1 # HANGUL SYLLABLE THIEUTH-A-KIYEOK +0xD0C4 # HANGUL SYLLABLE THIEUTH-A-NIEUN +0xD0C8 # HANGUL SYLLABLE THIEUTH-A-RIEUL +0xD0C9 # HANGUL SYLLABLE THIEUTH-A-RIEULKIYEOK +0xD0D0 # HANGUL SYLLABLE THIEUTH-A-MIEUM +0xD0D1 # HANGUL SYLLABLE THIEUTH-A-PIEUP +0xD0D3 # HANGUL SYLLABLE THIEUTH-A-SIOS +0xD0D4 # HANGUL SYLLABLE THIEUTH-A-SSANGSIOS +0xD0D5 # HANGUL SYLLABLE THIEUTH-A-IEUNG +0xD0DC # HANGUL SYLLABLE THIEUTH-AE +0xD0DD # HANGUL SYLLABLE THIEUTH-AE-KIYEOK +0xD0E0 # HANGUL SYLLABLE THIEUTH-AE-NIEUN +0xD0E4 # HANGUL SYLLABLE THIEUTH-AE-RIEUL +0xD0EC # HANGUL SYLLABLE THIEUTH-AE-MIEUM +0xD0ED # HANGUL SYLLABLE THIEUTH-AE-PIEUP +0xD0EF # HANGUL SYLLABLE THIEUTH-AE-SIOS +0xD0F0 # HANGUL SYLLABLE THIEUTH-AE-SSANGSIOS +0xD0F1 # HANGUL SYLLABLE THIEUTH-AE-IEUNG +0xD0F8 # HANGUL SYLLABLE THIEUTH-YA +0xD10D # HANGUL SYLLABLE THIEUTH-YA-IEUNG +0xD130 # HANGUL SYLLABLE THIEUTH-EO +0xD131 # HANGUL SYLLABLE THIEUTH-EO-KIYEOK +0xD134 # HANGUL SYLLABLE THIEUTH-EO-NIEUN +0xD138 # HANGUL SYLLABLE THIEUTH-EO-RIEUL +0xD13A # HANGUL SYLLABLE THIEUTH-EO-RIEULMIEUM +0xD140 # HANGUL SYLLABLE THIEUTH-EO-MIEUM +0xD141 # HANGUL SYLLABLE THIEUTH-EO-PIEUP +0xD143 # HANGUL SYLLABLE THIEUTH-EO-SIOS +0xD144 # HANGUL SYLLABLE THIEUTH-EO-SSANGSIOS +0xD145 # HANGUL SYLLABLE THIEUTH-EO-IEUNG +0xD14C # HANGUL SYLLABLE THIEUTH-E +0xD14D # HANGUL SYLLABLE THIEUTH-E-KIYEOK +0xD150 # HANGUL SYLLABLE THIEUTH-E-NIEUN +0xD154 # HANGUL SYLLABLE THIEUTH-E-RIEUL +0xD15C # HANGUL SYLLABLE THIEUTH-E-MIEUM +0xD15D # HANGUL SYLLABLE THIEUTH-E-PIEUP +0xD15F # HANGUL SYLLABLE THIEUTH-E-SIOS +0xD161 # HANGUL SYLLABLE THIEUTH-E-IEUNG +0xD168 # HANGUL SYLLABLE THIEUTH-YEO +0xD16C # HANGUL SYLLABLE THIEUTH-YEO-NIEUN +0xD17C # HANGUL SYLLABLE THIEUTH-YEO-SSANGSIOS +0xD184 # HANGUL SYLLABLE THIEUTH-YE +0xD188 # HANGUL SYLLABLE THIEUTH-YE-NIEUN +0xD1A0 # HANGUL SYLLABLE THIEUTH-O +0xD1A1 # HANGUL SYLLABLE THIEUTH-O-KIYEOK +0xD1A4 # HANGUL SYLLABLE THIEUTH-O-NIEUN +0xD1A8 # HANGUL SYLLABLE THIEUTH-O-RIEUL +0xD1B0 # HANGUL SYLLABLE THIEUTH-O-MIEUM +0xD1B1 # HANGUL SYLLABLE THIEUTH-O-PIEUP +0xD1B3 # HANGUL SYLLABLE THIEUTH-O-SIOS +0xD1B5 # HANGUL SYLLABLE THIEUTH-O-IEUNG +0xD1BA # HANGUL SYLLABLE THIEUTH-O-PHIEUPH +0xD1BC # HANGUL SYLLABLE THIEUTH-WA +0xD1C0 # HANGUL SYLLABLE THIEUTH-WA-NIEUN +0xD1D8 # HANGUL SYLLABLE THIEUTH-WAE +0xD1F4 # HANGUL SYLLABLE THIEUTH-OE +0xD1F8 # HANGUL SYLLABLE THIEUTH-OE-NIEUN +0xD207 # HANGUL SYLLABLE THIEUTH-OE-SIOS +0xD209 # HANGUL SYLLABLE THIEUTH-OE-IEUNG +0xD210 # HANGUL SYLLABLE THIEUTH-YO +0xD22C # HANGUL SYLLABLE THIEUTH-U +0xD22D # HANGUL SYLLABLE THIEUTH-U-KIYEOK +0xD230 # HANGUL SYLLABLE THIEUTH-U-NIEUN +0xD234 # HANGUL SYLLABLE THIEUTH-U-RIEUL +0xD23C # HANGUL SYLLABLE THIEUTH-U-MIEUM +0xD23D # HANGUL SYLLABLE THIEUTH-U-PIEUP +0xD23F # HANGUL SYLLABLE THIEUTH-U-SIOS +0xD241 # HANGUL SYLLABLE THIEUTH-U-IEUNG +0xD248 # HANGUL SYLLABLE THIEUTH-WEO +0xD25C # HANGUL SYLLABLE THIEUTH-WEO-SSANGSIOS +0xD264 # HANGUL SYLLABLE THIEUTH-WE +0xD280 # HANGUL SYLLABLE THIEUTH-WI +0xD281 # HANGUL SYLLABLE THIEUTH-WI-KIYEOK +0xD284 # HANGUL SYLLABLE THIEUTH-WI-NIEUN +0xD288 # HANGUL SYLLABLE THIEUTH-WI-RIEUL +0xD290 # HANGUL SYLLABLE THIEUTH-WI-MIEUM +0xD291 # HANGUL SYLLABLE THIEUTH-WI-PIEUP +0xD295 # HANGUL SYLLABLE THIEUTH-WI-IEUNG +0xD29C # HANGUL SYLLABLE THIEUTH-YU +0xD2A0 # HANGUL SYLLABLE THIEUTH-YU-NIEUN +0xD2A4 # HANGUL SYLLABLE THIEUTH-YU-RIEUL +0xD2AC # HANGUL SYLLABLE THIEUTH-YU-MIEUM +0xD2B1 # HANGUL SYLLABLE THIEUTH-YU-IEUNG +0xD2B8 # HANGUL SYLLABLE THIEUTH-EU +0xD2B9 # HANGUL SYLLABLE THIEUTH-EU-KIYEOK +0xD2BC # HANGUL SYLLABLE THIEUTH-EU-NIEUN +0xD2BF # HANGUL SYLLABLE THIEUTH-EU-TIKEUT +0xD2C0 # HANGUL SYLLABLE THIEUTH-EU-RIEUL +0xD2C2 # HANGUL SYLLABLE THIEUTH-EU-RIEULMIEUM +0xD2C8 # HANGUL SYLLABLE THIEUTH-EU-MIEUM +0xD2C9 # HANGUL SYLLABLE THIEUTH-EU-PIEUP +0xD2CB # HANGUL SYLLABLE THIEUTH-EU-SIOS +0xD2D4 # HANGUL SYLLABLE THIEUTH-YI +0xD2D8 # HANGUL SYLLABLE THIEUTH-YI-NIEUN +0xD2DC # HANGUL SYLLABLE THIEUTH-YI-RIEUL +0xD2E4 # HANGUL SYLLABLE THIEUTH-YI-MIEUM +0xD2E5 # HANGUL SYLLABLE THIEUTH-YI-PIEUP +0xD2F0 # HANGUL SYLLABLE THIEUTH-I +0xD2F1 # HANGUL SYLLABLE THIEUTH-I-KIYEOK +0xD2F4 # HANGUL SYLLABLE THIEUTH-I-NIEUN +0xD2F8 # HANGUL SYLLABLE THIEUTH-I-RIEUL +0xD300 # HANGUL SYLLABLE THIEUTH-I-MIEUM +0xD301 # HANGUL SYLLABLE THIEUTH-I-PIEUP +0xD303 # HANGUL SYLLABLE THIEUTH-I-SIOS +0xD305 # HANGUL SYLLABLE THIEUTH-I-IEUNG +0xD30C # HANGUL SYLLABLE PHIEUPH-A +0xD30D # HANGUL SYLLABLE PHIEUPH-A-KIYEOK +0xD30E # HANGUL SYLLABLE PHIEUPH-A-SSANGKIYEOK +0xD310 # HANGUL SYLLABLE PHIEUPH-A-NIEUN +0xD314 # HANGUL SYLLABLE PHIEUPH-A-RIEUL +0xD316 # HANGUL SYLLABLE PHIEUPH-A-RIEULMIEUM +0xD31C # HANGUL SYLLABLE PHIEUPH-A-MIEUM +0xD31D # HANGUL SYLLABLE PHIEUPH-A-PIEUP +0xD31F # HANGUL SYLLABLE PHIEUPH-A-SIOS +0xD320 # HANGUL SYLLABLE PHIEUPH-A-SSANGSIOS +0xD321 # HANGUL SYLLABLE PHIEUPH-A-IEUNG +0xD325 # HANGUL SYLLABLE PHIEUPH-A-THIEUTH +0xD328 # HANGUL SYLLABLE PHIEUPH-AE +0xD329 # HANGUL SYLLABLE PHIEUPH-AE-KIYEOK +0xD32C # HANGUL SYLLABLE PHIEUPH-AE-NIEUN +0xD330 # HANGUL SYLLABLE PHIEUPH-AE-RIEUL +0xD338 # HANGUL SYLLABLE PHIEUPH-AE-MIEUM +0xD339 # HANGUL SYLLABLE PHIEUPH-AE-PIEUP +0xD33B # HANGUL SYLLABLE PHIEUPH-AE-SIOS +0xD33C # HANGUL SYLLABLE PHIEUPH-AE-SSANGSIOS +0xD33D # HANGUL SYLLABLE PHIEUPH-AE-IEUNG +0xD344 # HANGUL SYLLABLE PHIEUPH-YA +0xD345 # HANGUL SYLLABLE PHIEUPH-YA-KIYEOK +0xD37C # HANGUL SYLLABLE PHIEUPH-EO +0xD37D # HANGUL SYLLABLE PHIEUPH-EO-KIYEOK +0xD380 # HANGUL SYLLABLE PHIEUPH-EO-NIEUN +0xD384 # HANGUL SYLLABLE PHIEUPH-EO-RIEUL +0xD38C # HANGUL SYLLABLE PHIEUPH-EO-MIEUM +0xD38D # HANGUL SYLLABLE PHIEUPH-EO-PIEUP +0xD38F # HANGUL SYLLABLE PHIEUPH-EO-SIOS +0xD390 # HANGUL SYLLABLE PHIEUPH-EO-SSANGSIOS +0xD391 # HANGUL SYLLABLE PHIEUPH-EO-IEUNG +0xD398 # HANGUL SYLLABLE PHIEUPH-E +0xD399 # HANGUL SYLLABLE PHIEUPH-E-KIYEOK +0xD39C # HANGUL SYLLABLE PHIEUPH-E-NIEUN +0xD3A0 # HANGUL SYLLABLE PHIEUPH-E-RIEUL +0xD3A8 # HANGUL SYLLABLE PHIEUPH-E-MIEUM +0xD3A9 # HANGUL SYLLABLE PHIEUPH-E-PIEUP +0xD3AB # HANGUL SYLLABLE PHIEUPH-E-SIOS +0xD3AD # HANGUL SYLLABLE PHIEUPH-E-IEUNG +0xD3B4 # HANGUL SYLLABLE PHIEUPH-YEO +0xD3B8 # HANGUL SYLLABLE PHIEUPH-YEO-NIEUN +0xD3BC # HANGUL SYLLABLE PHIEUPH-YEO-RIEUL +0xD3C4 # HANGUL SYLLABLE PHIEUPH-YEO-MIEUM +0xD3C5 # HANGUL SYLLABLE PHIEUPH-YEO-PIEUP +0xD3C8 # HANGUL SYLLABLE PHIEUPH-YEO-SSANGSIOS +0xD3C9 # HANGUL SYLLABLE PHIEUPH-YEO-IEUNG +0xD3D0 # HANGUL SYLLABLE PHIEUPH-YE +0xD3D8 # HANGUL SYLLABLE PHIEUPH-YE-RIEUL +0xD3E1 # HANGUL SYLLABLE PHIEUPH-YE-PIEUP +0xD3E3 # HANGUL SYLLABLE PHIEUPH-YE-SIOS +0xD3EC # HANGUL SYLLABLE PHIEUPH-O +0xD3ED # HANGUL SYLLABLE PHIEUPH-O-KIYEOK +0xD3F0 # HANGUL SYLLABLE PHIEUPH-O-NIEUN +0xD3F4 # HANGUL SYLLABLE PHIEUPH-O-RIEUL +0xD3FC # HANGUL SYLLABLE PHIEUPH-O-MIEUM +0xD3FD # HANGUL SYLLABLE PHIEUPH-O-PIEUP +0xD3FF # HANGUL SYLLABLE PHIEUPH-O-SIOS +0xD401 # HANGUL SYLLABLE PHIEUPH-O-IEUNG +0xD408 # HANGUL SYLLABLE PHIEUPH-WA +0xD41D # HANGUL SYLLABLE PHIEUPH-WA-IEUNG +0xD440 # HANGUL SYLLABLE PHIEUPH-OE +0xD444 # HANGUL SYLLABLE PHIEUPH-OE-NIEUN +0xD45C # HANGUL SYLLABLE PHIEUPH-YO +0xD460 # HANGUL SYLLABLE PHIEUPH-YO-NIEUN +0xD464 # HANGUL SYLLABLE PHIEUPH-YO-RIEUL +0xD46D # HANGUL SYLLABLE PHIEUPH-YO-PIEUP +0xD46F # HANGUL SYLLABLE PHIEUPH-YO-SIOS +0xD478 # HANGUL SYLLABLE PHIEUPH-U +0xD479 # HANGUL SYLLABLE PHIEUPH-U-KIYEOK +0xD47C # HANGUL SYLLABLE PHIEUPH-U-NIEUN +0xD47F # HANGUL SYLLABLE PHIEUPH-U-TIKEUT +0xD480 # HANGUL SYLLABLE PHIEUPH-U-RIEUL +0xD482 # HANGUL SYLLABLE PHIEUPH-U-RIEULMIEUM +0xD488 # HANGUL SYLLABLE PHIEUPH-U-MIEUM +0xD489 # HANGUL SYLLABLE PHIEUPH-U-PIEUP +0xD48B # HANGUL SYLLABLE PHIEUPH-U-SIOS +0xD48D # HANGUL SYLLABLE PHIEUPH-U-IEUNG +0xD494 # HANGUL SYLLABLE PHIEUPH-WEO +0xD4A9 # HANGUL SYLLABLE PHIEUPH-WEO-IEUNG +0xD4CC # HANGUL SYLLABLE PHIEUPH-WI +0xD4D0 # HANGUL SYLLABLE PHIEUPH-WI-NIEUN +0xD4D4 # HANGUL SYLLABLE PHIEUPH-WI-RIEUL +0xD4DC # HANGUL SYLLABLE PHIEUPH-WI-MIEUM +0xD4DF # HANGUL SYLLABLE PHIEUPH-WI-SIOS +0xD4E8 # HANGUL SYLLABLE PHIEUPH-YU +0xD4EC # HANGUL SYLLABLE PHIEUPH-YU-NIEUN +0xD4F0 # HANGUL SYLLABLE PHIEUPH-YU-RIEUL +0xD4F8 # HANGUL SYLLABLE PHIEUPH-YU-MIEUM +0xD4FB # HANGUL SYLLABLE PHIEUPH-YU-SIOS +0xD4FD # HANGUL SYLLABLE PHIEUPH-YU-IEUNG +0xD504 # HANGUL SYLLABLE PHIEUPH-EU +0xD508 # HANGUL SYLLABLE PHIEUPH-EU-NIEUN +0xD50C # HANGUL SYLLABLE PHIEUPH-EU-RIEUL +0xD514 # HANGUL SYLLABLE PHIEUPH-EU-MIEUM +0xD515 # HANGUL SYLLABLE PHIEUPH-EU-PIEUP +0xD517 # HANGUL SYLLABLE PHIEUPH-EU-SIOS +0xD53C # HANGUL SYLLABLE PHIEUPH-I +0xD53D # HANGUL SYLLABLE PHIEUPH-I-KIYEOK +0xD540 # HANGUL SYLLABLE PHIEUPH-I-NIEUN +0xD544 # HANGUL SYLLABLE PHIEUPH-I-RIEUL +0xD54C # HANGUL SYLLABLE PHIEUPH-I-MIEUM +0xD54D # HANGUL SYLLABLE PHIEUPH-I-PIEUP +0xD54F # HANGUL SYLLABLE PHIEUPH-I-SIOS +0xD551 # HANGUL SYLLABLE PHIEUPH-I-IEUNG +0xD558 # HANGUL SYLLABLE HIEUH-A +0xD559 # HANGUL SYLLABLE HIEUH-A-KIYEOK +0xD55C # HANGUL SYLLABLE HIEUH-A-NIEUN +0xD560 # HANGUL SYLLABLE HIEUH-A-RIEUL +0xD565 # HANGUL SYLLABLE HIEUH-A-RIEULTHIEUTH +0xD568 # HANGUL SYLLABLE HIEUH-A-MIEUM +0xD569 # HANGUL SYLLABLE HIEUH-A-PIEUP +0xD56B # HANGUL SYLLABLE HIEUH-A-SIOS +0xD56D # HANGUL SYLLABLE HIEUH-A-IEUNG +0xD574 # HANGUL SYLLABLE HIEUH-AE +0xD575 # HANGUL SYLLABLE HIEUH-AE-KIYEOK +0xD578 # HANGUL SYLLABLE HIEUH-AE-NIEUN +0xD57C # HANGUL SYLLABLE HIEUH-AE-RIEUL +0xD584 # HANGUL SYLLABLE HIEUH-AE-MIEUM +0xD585 # HANGUL SYLLABLE HIEUH-AE-PIEUP +0xD587 # HANGUL SYLLABLE HIEUH-AE-SIOS +0xD588 # HANGUL SYLLABLE HIEUH-AE-SSANGSIOS +0xD589 # HANGUL SYLLABLE HIEUH-AE-IEUNG +0xD590 # HANGUL SYLLABLE HIEUH-YA +0xD5A5 # HANGUL SYLLABLE HIEUH-YA-IEUNG +0xD5C8 # HANGUL SYLLABLE HIEUH-EO +0xD5C9 # HANGUL SYLLABLE HIEUH-EO-KIYEOK +0xD5CC # HANGUL SYLLABLE HIEUH-EO-NIEUN +0xD5D0 # HANGUL SYLLABLE HIEUH-EO-RIEUL +0xD5D2 # HANGUL SYLLABLE HIEUH-EO-RIEULMIEUM +0xD5D8 # HANGUL SYLLABLE HIEUH-EO-MIEUM +0xD5D9 # HANGUL SYLLABLE HIEUH-EO-PIEUP +0xD5DB # HANGUL SYLLABLE HIEUH-EO-SIOS +0xD5DD # HANGUL SYLLABLE HIEUH-EO-IEUNG +0xD5E4 # HANGUL SYLLABLE HIEUH-E +0xD5E5 # HANGUL SYLLABLE HIEUH-E-KIYEOK +0xD5E8 # HANGUL SYLLABLE HIEUH-E-NIEUN +0xD5EC # HANGUL SYLLABLE HIEUH-E-RIEUL +0xD5F4 # HANGUL SYLLABLE HIEUH-E-MIEUM +0xD5F5 # HANGUL SYLLABLE HIEUH-E-PIEUP +0xD5F7 # HANGUL SYLLABLE HIEUH-E-SIOS +0xD5F9 # HANGUL SYLLABLE HIEUH-E-IEUNG +0xD600 # HANGUL SYLLABLE HIEUH-YEO +0xD601 # HANGUL SYLLABLE HIEUH-YEO-KIYEOK +0xD604 # HANGUL SYLLABLE HIEUH-YEO-NIEUN +0xD608 # HANGUL SYLLABLE HIEUH-YEO-RIEUL +0xD610 # HANGUL SYLLABLE HIEUH-YEO-MIEUM +0xD611 # HANGUL SYLLABLE HIEUH-YEO-PIEUP +0xD613 # HANGUL SYLLABLE HIEUH-YEO-SIOS +0xD614 # HANGUL SYLLABLE HIEUH-YEO-SSANGSIOS +0xD615 # HANGUL SYLLABLE HIEUH-YEO-IEUNG +0xD61C # HANGUL SYLLABLE HIEUH-YE +0xD620 # HANGUL SYLLABLE HIEUH-YE-NIEUN +0xD624 # HANGUL SYLLABLE HIEUH-YE-RIEUL +0xD62D # HANGUL SYLLABLE HIEUH-YE-PIEUP +0xD638 # HANGUL SYLLABLE HIEUH-O +0xD639 # HANGUL SYLLABLE HIEUH-O-KIYEOK +0xD63C # HANGUL SYLLABLE HIEUH-O-NIEUN +0xD640 # HANGUL SYLLABLE HIEUH-O-RIEUL +0xD645 # HANGUL SYLLABLE HIEUH-O-RIEULTHIEUTH +0xD648 # HANGUL SYLLABLE HIEUH-O-MIEUM +0xD649 # HANGUL SYLLABLE HIEUH-O-PIEUP +0xD64B # HANGUL SYLLABLE HIEUH-O-SIOS +0xD64D # HANGUL SYLLABLE HIEUH-O-IEUNG +0xD651 # HANGUL SYLLABLE HIEUH-O-THIEUTH +0xD654 # HANGUL SYLLABLE HIEUH-WA +0xD655 # HANGUL SYLLABLE HIEUH-WA-KIYEOK +0xD658 # HANGUL SYLLABLE HIEUH-WA-NIEUN +0xD65C # HANGUL SYLLABLE HIEUH-WA-RIEUL +0xD667 # HANGUL SYLLABLE HIEUH-WA-SIOS +0xD669 # HANGUL SYLLABLE HIEUH-WA-IEUNG +0xD670 # HANGUL SYLLABLE HIEUH-WAE +0xD671 # HANGUL SYLLABLE HIEUH-WAE-KIYEOK +0xD674 # HANGUL SYLLABLE HIEUH-WAE-NIEUN +0xD683 # HANGUL SYLLABLE HIEUH-WAE-SIOS +0xD685 # HANGUL SYLLABLE HIEUH-WAE-IEUNG +0xD68C # HANGUL SYLLABLE HIEUH-OE +0xD68D # HANGUL SYLLABLE HIEUH-OE-KIYEOK +0xD690 # HANGUL SYLLABLE HIEUH-OE-NIEUN +0xD694 # HANGUL SYLLABLE HIEUH-OE-RIEUL +0xD69D # HANGUL SYLLABLE HIEUH-OE-PIEUP +0xD69F # HANGUL SYLLABLE HIEUH-OE-SIOS +0xD6A1 # HANGUL SYLLABLE HIEUH-OE-IEUNG +0xD6A8 # HANGUL SYLLABLE HIEUH-YO +0xD6AC # HANGUL SYLLABLE HIEUH-YO-NIEUN +0xD6B0 # HANGUL SYLLABLE HIEUH-YO-RIEUL +0xD6B9 # HANGUL SYLLABLE HIEUH-YO-PIEUP +0xD6BB # HANGUL SYLLABLE HIEUH-YO-SIOS +0xD6C4 # HANGUL SYLLABLE HIEUH-U +0xD6C5 # HANGUL SYLLABLE HIEUH-U-KIYEOK +0xD6C8 # HANGUL SYLLABLE HIEUH-U-NIEUN +0xD6CC # HANGUL SYLLABLE HIEUH-U-RIEUL +0xD6D1 # HANGUL SYLLABLE HIEUH-U-RIEULTHIEUTH +0xD6D4 # HANGUL SYLLABLE HIEUH-U-MIEUM +0xD6D7 # HANGUL SYLLABLE HIEUH-U-SIOS +0xD6D9 # HANGUL SYLLABLE HIEUH-U-IEUNG +0xD6E0 # HANGUL SYLLABLE HIEUH-WEO +0xD6E4 # HANGUL SYLLABLE HIEUH-WEO-NIEUN +0xD6E8 # HANGUL SYLLABLE HIEUH-WEO-RIEUL +0xD6F0 # HANGUL SYLLABLE HIEUH-WEO-MIEUM +0xD6F5 # HANGUL SYLLABLE HIEUH-WEO-IEUNG +0xD6FC # HANGUL SYLLABLE HIEUH-WE +0xD6FD # HANGUL SYLLABLE HIEUH-WE-KIYEOK +0xD700 # HANGUL SYLLABLE HIEUH-WE-NIEUN +0xD704 # HANGUL SYLLABLE HIEUH-WE-RIEUL +0xD711 # HANGUL SYLLABLE HIEUH-WE-IEUNG +0xD718 # HANGUL SYLLABLE HIEUH-WI +0xD719 # HANGUL SYLLABLE HIEUH-WI-KIYEOK +0xD71C # HANGUL SYLLABLE HIEUH-WI-NIEUN +0xD720 # HANGUL SYLLABLE HIEUH-WI-RIEUL +0xD728 # HANGUL SYLLABLE HIEUH-WI-MIEUM +0xD729 # HANGUL SYLLABLE HIEUH-WI-PIEUP +0xD72B # HANGUL SYLLABLE HIEUH-WI-SIOS +0xD72D # HANGUL SYLLABLE HIEUH-WI-IEUNG +0xD734 # HANGUL SYLLABLE HIEUH-YU +0xD735 # HANGUL SYLLABLE HIEUH-YU-KIYEOK +0xD738 # HANGUL SYLLABLE HIEUH-YU-NIEUN +0xD73C # HANGUL SYLLABLE HIEUH-YU-RIEUL +0xD744 # HANGUL SYLLABLE HIEUH-YU-MIEUM +0xD747 # HANGUL SYLLABLE HIEUH-YU-SIOS +0xD749 # HANGUL SYLLABLE HIEUH-YU-IEUNG +0xD750 # HANGUL SYLLABLE HIEUH-EU +0xD751 # HANGUL SYLLABLE HIEUH-EU-KIYEOK +0xD754 # HANGUL SYLLABLE HIEUH-EU-NIEUN +0xD756 # HANGUL SYLLABLE HIEUH-EU-NIEUNHIEUH +0xD757 # HANGUL SYLLABLE HIEUH-EU-TIKEUT +0xD758 # HANGUL SYLLABLE HIEUH-EU-RIEUL +0xD759 # HANGUL SYLLABLE HIEUH-EU-RIEULKIYEOK +0xD760 # HANGUL SYLLABLE HIEUH-EU-MIEUM +0xD761 # HANGUL SYLLABLE HIEUH-EU-PIEUP +0xD763 # HANGUL SYLLABLE HIEUH-EU-SIOS +0xD765 # HANGUL SYLLABLE HIEUH-EU-IEUNG +0xD769 # HANGUL SYLLABLE HIEUH-EU-THIEUTH +0xD76C # HANGUL SYLLABLE HIEUH-YI +0xD770 # HANGUL SYLLABLE HIEUH-YI-NIEUN +0xD774 # HANGUL SYLLABLE HIEUH-YI-RIEUL +0xD77C # HANGUL SYLLABLE HIEUH-YI-MIEUM +0xD77D # HANGUL SYLLABLE HIEUH-YI-PIEUP +0xD781 # HANGUL SYLLABLE HIEUH-YI-IEUNG +0xD788 # HANGUL SYLLABLE HIEUH-I +0xD789 # HANGUL SYLLABLE HIEUH-I-KIYEOK +0xD78C # HANGUL SYLLABLE HIEUH-I-NIEUN +0xD790 # HANGUL SYLLABLE HIEUH-I-RIEUL +0xD798 # HANGUL SYLLABLE HIEUH-I-MIEUM +0xD799 # HANGUL SYLLABLE HIEUH-I-PIEUP +0xD79B # HANGUL SYLLABLE HIEUH-I-SIOS +0xD79D # HANGUL SYLLABLE HIEUH-I-IEUNG diff --git a/fontconfig/fc-lang/kok.orth b/fontconfig/fc-lang/kok.orth new file mode 100644 index 000000000..e77de6627 --- /dev/null +++ b/fontconfig/fc-lang/kok.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/kok.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kokani (Devanagari script) (KOK) +include hi.orth diff --git a/fontconfig/fc-lang/kr.orth b/fontconfig/fc-lang/kr.orth new file mode 100644 index 000000000..301da7f64 --- /dev/null +++ b/fontconfig/fc-lang/kr.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/kr.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kanuri (kr) +# +# Sources: +# * http://www.panafril10n.org/wikidoc/pmwiki.php/PanAfrLoc/Kanuri +# * http://www.sciences.univ-nantes.fr/info/perso/permanents/enguehard/recherche/Afrique/alphabet_kanuri.htm +# * http://sumale.vjf.cnrs.fr/phono/AfficheTableauOrtho2N.php?choixLangue=kanuri +# * http://www.rosettaproject.org/archive/kby/ortho-1 +# * http://std.dkuug.dk/jtc1/sc2/wg2/docs/n2906.pdf +# +# This is for Kanuri as written in the Latin script. An Arabic script +# orthography is also used (called Ajami), but I could not find much +# information about it. +# +# Q, V, and X are not used. +# +0041-005A +0061-007A +018E +01DD +024C-024D diff --git a/fontconfig/fc-lang/ks.orth b/fontconfig/fc-lang/ks.orth new file mode 100644 index 000000000..e86ba0df0 --- /dev/null +++ b/fontconfig/fc-lang/ks.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/ks.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kashmiri (ks) +# +# Kashmiri is written in Arabic in both India and Pakistan. The problem is, +# Unicode 5.1 does not contain all the letters required in the orthography, +# including Wavy Hamza Below and the Alef Maksura With Ring Below. We'll +# just include Urdu for now. +include ur.orth diff --git a/fontconfig/fc-lang/ku_am.orth b/fontconfig/fc-lang/ku_am.orth new file mode 100644 index 000000000..80e434079 --- /dev/null +++ b/fontconfig/fc-lang/ku_am.orth @@ -0,0 +1,91 @@ +# +# fontconfig/fc-lang/ku_am.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Kurdish in Armenia (ku-AM) +# +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0427 +0428 +0429 +042a +042d +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0447 +0448 +0449 +044a +044d +04ba +04bb +04d8 +04d9 +04e6 +04e7 +051a-051d diff --git a/fontconfig/fc-lang/ku_iq.orth b/fontconfig/fc-lang/ku_iq.orth new file mode 100644 index 000000000..d2a065505 --- /dev/null +++ b/fontconfig/fc-lang/ku_iq.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/ku_iq.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kurdish in Iraq (ku-IQ) +# +# Assuming Iraqi Kurdish uses the same orthography as Iranian Kurdish +include ku_ir.orth diff --git a/fontconfig/fc-lang/ku_ir.orth b/fontconfig/fc-lang/ku_ir.orth new file mode 100644 index 000000000..6ca2e70f2 --- /dev/null +++ b/fontconfig/fc-lang/ku_ir.orth @@ -0,0 +1,49 @@ +# +# fontconfig/fc-lang/ku_ir.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kurdish in Iran (KU-IR) +# +# Data from Roozbeh Pournader <roozbeh@sharif.edu> +# +# Since the Unicode Presentation Forms don't contain some of the Kurdish +# letters, we are going with the general forms instead of the Presentation +# forms, unlike Arabic, Persian, or Urdu. +# +0626-0628 +062a +062c-062f +0631-0634 +0639-063a +0641-0642 +0644-0648 +067e +0686 +0692 +0698 +06a4 +06a9 +06af +06b5 +06c6 +06cc +06ce diff --git a/fontconfig/fc-lang/ku_tr.orth b/fontconfig/fc-lang/ku_tr.orth new file mode 100644 index 000000000..1c0b33492 --- /dev/null +++ b/fontconfig/fc-lang/ku_tr.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/ku_tr.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kurdish in Turkey (ku-TR) +# +# This is based on the commonly used "Hawar" alphabet +# +# Sources: +# * http://www.omniglot.com/writing/kurdish.htm +# * http://www.kurdishacademy.org/?q=node/145 +# +0041-005A +0061-007A +00C7 +00CA +00CE +00DB +00E7 +00EA +00EE +00FB +015E-015F diff --git a/fontconfig/fc-lang/kum.orth b/fontconfig/fc-lang/kum.orth new file mode 100644 index 000000000..0107bfebd --- /dev/null +++ b/fontconfig/fc-lang/kum.orth @@ -0,0 +1,96 @@ +# +# fontconfig/fc-lang/kum.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Kumyk (KUM) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/kv.orth b/fontconfig/fc-lang/kv.orth new file mode 100644 index 000000000..87d4d93c2 --- /dev/null +++ b/fontconfig/fc-lang/kv.orth @@ -0,0 +1,101 @@ +# +# fontconfig/fc-lang/kv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Komi (Komi-Permyak/Komi-Siryan) (KV) +# +# I've taken Komi-Permyak as it contains two extra codepoints +0401 +0406 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +0456 +04e6 +04e7 diff --git a/fontconfig/fc-lang/kw.orth b/fontconfig/fc-lang/kw.orth new file mode 100644 index 000000000..11824b799 --- /dev/null +++ b/fontconfig/fc-lang/kw.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/kw.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Cornish (KW) +# +# Orthography from http://www.evertype.com/alphabets/cornish.pdf +# +0041-005a +0061-007a +0100-0101 +0112-0113 +012a-012b +014c-014d +016a-016b +0232-0233 diff --git a/fontconfig/fc-lang/kwm.orth b/fontconfig/fc-lang/kwm.orth new file mode 100644 index 000000000..34cd40584 --- /dev/null +++ b/fontconfig/fc-lang/kwm.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/kwm.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kwambi (kwm) +# +# Considered a sister language/dialect to Kuanyama (kj) and Ndonga (ng). +# We'll include Kuanyama. +# +include kj.orth diff --git a/fontconfig/fc-lang/ky.orth b/fontconfig/fc-lang/ky.orth new file mode 100644 index 000000000..ba8425027 --- /dev/null +++ b/fontconfig/fc-lang/ky.orth @@ -0,0 +1,102 @@ +# +# fontconfig/fc-lang/ky.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Kirgiz (KY) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA (Historic cyrillic letter) +#0473 # CYRILLIC SMALL LETTER FITA (Historic cyrillic letter) +04a2 +04a3 +04ae +04af diff --git a/fontconfig/fc-lang/la.orth b/fontconfig/fc-lang/la.orth new file mode 100644 index 000000000..b28cbcce7 --- /dev/null +++ b/fontconfig/fc-lang/la.orth @@ -0,0 +1,31 @@ +# +# fontconfig/fc-lang/la.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Latin (LA) +0041-005a +0061-007a +0100-0101 +0112-0113 +012a-012d +014c-014f +016a-016d diff --git a/fontconfig/fc-lang/lah.orth b/fontconfig/fc-lang/lah.orth new file mode 100644 index 000000000..c0321b67c --- /dev/null +++ b/fontconfig/fc-lang/lah.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/lah.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Lahnda (lah) +# +# This is basically Western Panjabi/Punjabi, or Panjabi for Pakistan. It is +# written in the Arabic script, also known as Shahmukhi. According to +# ISO 639-3, the 'pa/pan' language code does not include Pakistani Panjabi, +# but 'lah' does: +# http://www.sil.org/iso639-3/documentation.asp?id=lah +# http://www.sil.org/iso639-3/documentation.asp?id=pan +# +# The letter list appears to be identical to Urdu. More research may be +# needed for rare letters. +include ur.orth diff --git a/fontconfig/fc-lang/lb.orth b/fontconfig/fc-lang/lb.orth new file mode 100644 index 000000000..6f7b2c299 --- /dev/null +++ b/fontconfig/fc-lang/lb.orth @@ -0,0 +1,62 @@ +# +# fontconfig/fc-lang/lb.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Luxembourgish (Letzeburgesch) (LB) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +# +# Required characters +# +00c4 +00e4 +00c9 +00e9 +00cb +00eb +00d6 +00f6 +00dc +00fc +# +# Important characters +# +00c2 +00e2 +00c8 +00e8 +00ca +00ea +00ce +00ee +#e006 # LATIN CAPITAL LETTER M WITH CIRCUMFLEX (no UCS) +#e007 # LATIN SMALL LETTER M WITH CIRCUMFLEX (no UCS) +#e008 # LATIN CAPITAL LETTER N WITH CIRCUMFLEX (no UCS) +#e009 # LATIN SMALL LETTER N WITH CIRCUMFLEX (no UCS) +00d4 +00f4 +00db +00fb +00df diff --git a/fontconfig/fc-lang/lez.orth b/fontconfig/fc-lang/lez.orth new file mode 100644 index 000000000..3fe9ac2eb --- /dev/null +++ b/fontconfig/fc-lang/lez.orth @@ -0,0 +1,97 @@ +# +# fontconfig/fc-lang/lez.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Lezghian (Lezgian) (LEZ) +# +0401 +0406 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/lg.orth b/fontconfig/fc-lang/lg.orth new file mode 100644 index 000000000..423cfe396 --- /dev/null +++ b/fontconfig/fc-lang/lg.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/lg.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ganda (lg) +# +# Sources: +# * http://www.buganda.com/luganda.htm +# * http://www.omniglot.com/writing/ganda.php +# * http://sumale.vjf.cnrs.fr/phono/AfficheTableauOrtho2N.php?choixLangue=luganda +# +0041-005A +0061-007A +014A-014B diff --git a/fontconfig/fc-lang/li.orth b/fontconfig/fc-lang/li.orth new file mode 100644 index 000000000..1b305386a --- /dev/null +++ b/fontconfig/fc-lang/li.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/li.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Limburgan/Limburger/Limburgish (li) +# +# Sources: +# * http://www.limburgsedialecten.nl/pdf/Spellingbook-def.pdf +# * http://li.wikipedia.org/wiki/Wikipedia:Sjpellingssjpiekpagina +# +# There's also an apostrophe-like character that needs more research. U+02BB? +# +0041-005A +0061-007A +00C4 +00C8 +00CB +00D3 +00D6 +00E4 +00E8 +00EB +00F3 +00F6 diff --git a/fontconfig/fc-lang/ln.orth b/fontconfig/fc-lang/ln.orth new file mode 100644 index 000000000..c32d66d74 --- /dev/null +++ b/fontconfig/fc-lang/ln.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/ln.orth +# +# Copyright © 2006 Danis Jacquerye +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Lingala (LN) +0041-005a # r used in borrowed words, x and q unused. +0061-007a +00c1-00c2 # tonal orthography +00c9-00ca +00cd-00ce +00d3-00d4 +00da-00db +00e1-00e2 +00e9-00ea +00ed-00ee +00f3-00f4 +00fa-00fb +011a-011b +0186 +0190 +0254 +025b +0301-0302 # combining diacritics for accented 0186, 0190, 0254, 025b +030c diff --git a/fontconfig/fc-lang/lo.orth b/fontconfig/fc-lang/lo.orth new file mode 100644 index 000000000..7c2dd0320 --- /dev/null +++ b/fontconfig/fc-lang/lo.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/lo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Lao (lo) +# +# Taken from the Unicode coverage of this language +# +0e81-0e82 +0e84 +0e87-0e88 +0e8a +0e8d +0e94-0e97 +0e99-0e9f +0ea1-0ea3 +0ea5 +0ea7 +0eaa-0eab +0ead-0eb9 +0ebb-0ebd +0ec0-0ec4 +0ec6 +0ec8-0ecd +#0ed0-0ed9 # Digits +0edc-0edd diff --git a/fontconfig/fc-lang/lt.orth b/fontconfig/fc-lang/lt.orth new file mode 100644 index 000000000..4bdfe7633 --- /dev/null +++ b/fontconfig/fc-lang/lt.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/lt.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Lithuanian (LT) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +0104-0105 +010c-010d +#0106-0109 +0116-0117 +0118-0119 +012e-012f +0160-0161 +016a-016b +0172-0173 +017d-017e +#2019-201a # single quotes +#201d-201e # double quotes diff --git a/fontconfig/fc-lang/lv.orth b/fontconfig/fc-lang/lv.orth new file mode 100644 index 000000000..fad04257e --- /dev/null +++ b/fontconfig/fc-lang/lv.orth @@ -0,0 +1,44 @@ +# +# fontconfig/fc-lang/lv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Latvian (LV) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +0100-0101 +010c-010d +0112-0113 +0122-0123 +012a-012b +0136-0137 +013b-013c +0145-0146 +014c-014d +0156-0157 +0160-0161 +016a-016b +017d-017e diff --git a/fontconfig/fc-lang/mai.orth b/fontconfig/fc-lang/mai.orth new file mode 100644 index 000000000..fd3971c01 --- /dev/null +++ b/fontconfig/fc-lang/mai.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/mai.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Maithili (Devanagari script) (MAI) +include hi.orth diff --git a/fontconfig/fc-lang/mg.orth b/fontconfig/fc-lang/mg.orth new file mode 100644 index 000000000..3482c8f52 --- /dev/null +++ b/fontconfig/fc-lang/mg.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/mg.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Malagasy (MG) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00e1 +#e010 # LATIN CAPITAL LETTER N WITH DIAERESIS +#e011 # LATIN SMALL LETTER N WITH DIAERESIS +00d4 +00f4 diff --git a/fontconfig/fc-lang/mh.orth b/fontconfig/fc-lang/mh.orth new file mode 100644 index 000000000..cdd6fb46d --- /dev/null +++ b/fontconfig/fc-lang/mh.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/mh.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Marshallese (MH) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0100 +0101 +013b +013c +#e00a # LATIN CAPITAL LETTER M WITH CEDILLA (no UCS) +#e00b # LATIN SMALL LETTER M WITH CEDILLA (no UCS) +#e00c # LATIN CAPITAL LETTER N WITH MACRON (no UCS) +#e00d # LATIN SMALL LETTER N WITH MACRON (no UCS) +0145 +0146 +014c +014d +#e00e # LATIN CAPITAL LETTER O WITH CEDILLA (no UCS) +#e00f # LATIN SMALL LETTER O WITH CEDILLA (no UCS) +016a +016b diff --git a/fontconfig/fc-lang/mi.orth b/fontconfig/fc-lang/mi.orth new file mode 100644 index 000000000..1bc6832f7 --- /dev/null +++ b/fontconfig/fc-lang/mi.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/mi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Maori (MI) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0100-0101 +0112-0113 +012a-012b +014c-014d +016a-016b +1e34-1e35 # Ngai Tahu specific diff --git a/fontconfig/fc-lang/mk.orth b/fontconfig/fc-lang/mk.orth new file mode 100644 index 000000000..0dac53489 --- /dev/null +++ b/fontconfig/fc-lang/mk.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/mk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Macedonian (MK) +0400 # CYRILLIC CAPITAL LETTER IE WITH GRAVE +0403 +0405 +0408-040a +040c +040d # CYRILLIC CAPITAL LETTER I WITH GRAVE +040f +0410-0418 +041a-0428 +0450 # CYRILLIC SMALL LETTER IE WITH GRAVE +0453 +0455 +0458-045a +045c +045d # CYRILLIC SMALL LETTER I WITH GRAVE +045f diff --git a/fontconfig/fc-lang/ml.orth b/fontconfig/fc-lang/ml.orth new file mode 100644 index 000000000..744eb7ce9 --- /dev/null +++ b/fontconfig/fc-lang/ml.orth @@ -0,0 +1,38 @@ +# +# fontconfig/fc-lang/ml.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Malayalam (ml) +# +# Taken from the Unicode coverage of this language +# +0d02-0d03 +0d05-0d0c +0d0e-0d10 +0d12-0d28 +0d2a-0d39 +0d3e-0d43 +0d46-0d48 +0d4a-0d4d +0d57 +0d60-0d61 +#0d66-0d6f # Digits diff --git a/fontconfig/fc-lang/mn_cn.orth b/fontconfig/fc-lang/mn_cn.orth new file mode 100644 index 000000000..c20497917 --- /dev/null +++ b/fontconfig/fc-lang/mn_cn.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/mn_cn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Mongolian in China (mn-CN) +# +# Taken from the Unicode coverage of this language +# +# Basic letters +1820-1842 +# Todo letters +1843-185c +# Sibe letters +185d-1872 +# Manchu letters +1873-1877 +# Extensions for Sanskrit and Tibetan +1880-18a9 diff --git a/fontconfig/fc-lang/mn_mn.orth b/fontconfig/fc-lang/mn_mn.orth new file mode 100644 index 000000000..af5d60213 --- /dev/null +++ b/fontconfig/fc-lang/mn_mn.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/mn_mn.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Mongolian in Mongolia (mn-MN) +# +# Sources: +# http://www.omniglot.com/writing/mongolian.htm +# http://www.viahistoria.com/SilverHorde/main.html?research/MongolScripts.html +# http://unicode.org/cldr/data/common/main/mn.xml +# +0401 +0410-044F +0451 +04AE-04AF +04E8-04E9 diff --git a/fontconfig/fc-lang/mo.orth b/fontconfig/fc-lang/mo.orth new file mode 100644 index 000000000..5b4263385 --- /dev/null +++ b/fontconfig/fc-lang/mo.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/mo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Moldavian (MO) +0041-005a +0061-007a +00c2 +00ce +00e2 +00ee +0102-0103 +0218-021b # Comma below forms (preferred over cedilla) +0401 +0410-044f +0451 +#2019-201a # single quotes +#201d-201e # double quotes diff --git a/fontconfig/fc-lang/mr.orth b/fontconfig/fc-lang/mr.orth new file mode 100644 index 000000000..029d51e4d --- /dev/null +++ b/fontconfig/fc-lang/mr.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/mr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Marathi (Devanagari script) (MR) +include hi.orth diff --git a/fontconfig/fc-lang/ms.orth b/fontconfig/fc-lang/ms.orth new file mode 100644 index 000000000..e6b03bd12 --- /dev/null +++ b/fontconfig/fc-lang/ms.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/ms.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Malay (ms) +# +# Sources: +# http://www.omniglot.com/writing/malay.htm +# * CLDR exemplar set for Malay: +# http://unicode.org/cldr/data/common/main/ms.xml +# +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/mt.orth b/fontconfig/fc-lang/mt.orth new file mode 100644 index 000000000..51edc4efb --- /dev/null +++ b/fontconfig/fc-lang/mt.orth @@ -0,0 +1,67 @@ +# +# fontconfig/fc-lang/mt.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Maltese (MT) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +#00c1 +#00c2 +00c8 +#00c9 +#00ca +00cc +#00cd +00ce +00d2 +#00d3 +#00d4 +00d9 +#00da +#00db +00e0 +#00e1 +#00e2 +00e8 +#00e9 +#00ea +00ec +#00ed +00ee +00f2 +#00f3 +#00f4 +00f9 +#00fa +#00fb +010a-010b +0120-0121 +0126-0127 +017b-017c +#02bc +# diff --git a/fontconfig/fc-lang/my.orth b/fontconfig/fc-lang/my.orth new file mode 100644 index 000000000..9046d26e5 --- /dev/null +++ b/fontconfig/fc-lang/my.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/my.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Burmese (Myanmar) (MY) +# +# Orthography from Unicode range (U+1000-U+1059) +# +# Consonants +1000-1020 +# Independent vowels +1021 +1023-1027 +1029-102a +# Dependent vowel signs +102c-1032 +# Pali and Sanskrit extensions +#1050-1059 diff --git a/fontconfig/fc-lang/na.orth b/fontconfig/fc-lang/na.orth new file mode 100644 index 000000000..9a829138a --- /dev/null +++ b/fontconfig/fc-lang/na.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/na.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Nauru (na) +# +# Sources: +# * http://en.wikipedia.org/wiki/Nauruan_language +# * http://www.geonames.de/alphmq.html +# +# V and X are not used. +# +0041-005A +0061-007A +00C3 +00D1 +00D5 +00E3 +00F1 +00F5 +0168-0169 diff --git a/fontconfig/fc-lang/nb.orth b/fontconfig/fc-lang/nb.orth new file mode 100644 index 000000000..ff8417687 --- /dev/null +++ b/fontconfig/fc-lang/nb.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/nb.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Norwegian Bokmål (nb) +include no.orth diff --git a/fontconfig/fc-lang/nds.orth b/fontconfig/fc-lang/nds.orth new file mode 100644 index 000000000..3b2db30ce --- /dev/null +++ b/fontconfig/fc-lang/nds.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/nds.orth +# +# Copyright © 2004 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Low Saxon (NDS) +# +# Sources: +# Kenneth Rohde Christiansen <kenneth@gnu.org> +# ANS - +# Algemeyne Neddersassische Schryvwys' (DE) +# Algemeyne Nedersaksische Schryvwyse (NL) +# +0041-005a # LATIN CAPITAL LETTER A through Z +0061-007a # LATIN SMALL LETTER A through Z +00C4 # LATIN CAPITAL LETTER A WITH DIAERESIS +00D6 # LATIN CAPITAL LETTER O WITH DIAERESIS +00DC # LATIN CAPITAL LETTER U WITH DIAERESIS +00DF # LATIN SMALL LETTER SHARP S (German) +00E4 # LATIN SMALL LETTER A WITH DIAERESIS +00F6 # LATIN SMALL LETTER O WITH DIAERESIS +00FC # LATIN SMALL LETTER U WITH DIAERESIS diff --git a/fontconfig/fc-lang/ne.orth b/fontconfig/fc-lang/ne.orth new file mode 100644 index 000000000..18cf01119 --- /dev/null +++ b/fontconfig/fc-lang/ne.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/ne.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Nepali (Devanagari script) (NE) +include hi.orth diff --git a/fontconfig/fc-lang/ng.orth b/fontconfig/fc-lang/ng.orth new file mode 100644 index 000000000..9c62bc65c --- /dev/null +++ b/fontconfig/fc-lang/ng.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ng.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ndonga (ng) +# +# Considered a sister language/dialect to Kuanyama (kj) and Kwambi (kwm). +# We'll include Kuanyama. +# +include kj.orth diff --git a/fontconfig/fc-lang/nl.orth b/fontconfig/fc-lang/nl.orth new file mode 100644 index 000000000..6f6315fd7 --- /dev/null +++ b/fontconfig/fc-lang/nl.orth @@ -0,0 +1,63 @@ +# +# fontconfig/fc-lang/nl.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Dutch (NL) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00c2 +00c4 +00c8 +00c9 +00ca +00cb +00cd +00cf +00d3 +00d4 +00d6 +00da +00db +00dc +00e1 +00e2 +00e4 +00e8 +00e9 +00ea +00eb +00ed +00ef +00f3 +00f4 +00f6 +00fa +00fb +00fc +#0132-0133 # IJ and ij ligatures + diff --git a/fontconfig/fc-lang/nn.orth b/fontconfig/fc-lang/nn.orth new file mode 100644 index 000000000..b21e90f66 --- /dev/null +++ b/fontconfig/fc-lang/nn.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/nn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Norwegian Nynorsk (NN) +0041-005a +0061-007a +#00ab # double angle quotes +#00bb # double angle quotes +00c0 +00c4-00c6 +00c9-00ca +00d2-00d4 +00d6 +00d8 +00dc +00e0 +00e4-00e6 +00e9-00ea +00f2-00f4 +00f6 +00f8 +00fc +#2039-203a # single quotes diff --git a/fontconfig/fc-lang/no.orth b/fontconfig/fc-lang/no.orth new file mode 100644 index 000000000..305c361cd --- /dev/null +++ b/fontconfig/fc-lang/no.orth @@ -0,0 +1,68 @@ +# +# fontconfig/fc-lang/no.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Norwegian (Bokmål) (NO) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00ab +#00bb +00c0 +#00c1 +#00c2 +#00c4 +00c5 +00c6 +#00c7 +#00c8 +00c9 +00ca +#00cb +00d2 +00d3 +00d4 +#00d6 +00d8 +#00dc +00e0 +#00e1 +#00e2 +#00e4 +00e5 +00e6 +#00e7 +#00e8 +00e9 +00ea +#00eb +00f2 +00f3 +00f4 +#00f6 +00f8 +#00fc +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/nr.orth b/fontconfig/fc-lang/nr.orth new file mode 100644 index 000000000..0532cc112 --- /dev/null +++ b/fontconfig/fc-lang/nr.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/nr.orth +# +# Copyright © 2007 Dwayne Bailey and Translate.org.za +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Dwayne Bailey or Translate.org.za not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Dwayne Bailey and Translate.org.za makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# DWAYNE BAILEY AND TRANSLATE.ORG.ZA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL DWAYNE BAILEY OR TRANSLATE.ORG.ZA BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ndebele, South (NR) +# +# Orthography taken from http://www.inference.phy.cam.ac.uk/dasher/download/alphabets/alphabet.Ndebele.xml +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/nso.orth b/fontconfig/fc-lang/nso.orth new file mode 100644 index 000000000..046fc8a1e --- /dev/null +++ b/fontconfig/fc-lang/nso.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/nso.orth +# +# Copyright © 2007 Dwayne Bailey and Translate.org.za +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Dwayne Bailey or Translate.org.za not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Dwayne Bailey and Translate.org.za makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# DWAYNE BAILEY AND TRANSLATE.ORG.ZA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL DWAYNE BAILEY OR TRANSLATE.ORG.ZA BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Northern Sotho (NSO) +# +# Orthography from http://www.inference.phy.cam.ac.uk/dasher/download/alphabets/alphabet.Tswana.xml +# +0041-005a +0061-007a +00ca +00ea +00d4 +00f4 +0160-0161 diff --git a/fontconfig/fc-lang/nv.orth b/fontconfig/fc-lang/nv.orth new file mode 100644 index 000000000..a64224ba9 --- /dev/null +++ b/fontconfig/fc-lang/nv.orth @@ -0,0 +1,48 @@ +# +# fontconfig/fc-lang/nv.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Navajo/Navaho (nv) +# +# Sources: +# * http://en.wikipedia.org/wiki/Navajo_language +# * http://www.omniglot.com/writing/navajo.htm +# +# F, P, Q, R, U, and V are not used. A vertical glottal stop may be used. +# +0041-005A +0061-007A +00C1 +00C9 +00CD +00D3 +00E1 +00E9 +00ED +00F3 +0104-0105 +0118-0119 +012E-012F +0141-0142 +01EA-01EB +02BC # modifier letter apostrophe +0301 # combining acute accent, to be used with ogonek-ed forms of vowels diff --git a/fontconfig/fc-lang/ny.orth b/fontconfig/fc-lang/ny.orth new file mode 100644 index 000000000..b846647e9 --- /dev/null +++ b/fontconfig/fc-lang/ny.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/ny.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chichewa (NY) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0174-0175 diff --git a/fontconfig/fc-lang/oc.orth b/fontconfig/fc-lang/oc.orth new file mode 100644 index 000000000..55b237e6c --- /dev/null +++ b/fontconfig/fc-lang/oc.orth @@ -0,0 +1,53 @@ +# +# fontconfig/fc-lang/oc.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Occitan (OC) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +00c1 +00c7 +00c8 +00c9 +#00cb +00cd +#00cf +00d2 +00d3 +00da +00e0 +00e1 +00e7 +00e8 +00e9 +#00eb +00ed +#00ef +00f2 +00f3 +00fa diff --git a/fontconfig/fc-lang/om.orth b/fontconfig/fc-lang/om.orth new file mode 100644 index 000000000..7f28d39bd --- /dev/null +++ b/fontconfig/fc-lang/om.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/om.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Oromo or Galla (OM) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a # Oromo doesn't use v or z +0061-007a diff --git a/fontconfig/fc-lang/or.orth b/fontconfig/fc-lang/or.orth new file mode 100644 index 000000000..3c54fe397 --- /dev/null +++ b/fontconfig/fc-lang/or.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/or.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Oriya (or) +# +# Taken from the Unicode coverage of this language +# +0b01-0b03 +0b05-0b0c +0b0f-0b10 +0b13-0b28 +0b2a-0b30 +0b32-0b33 +0b36-0b39 +0b3c-0b43 +0b47-0b48 +0b4b-0b4d +0b56-0b57 +0b5c-0b5d +0b5f-0b61 +#0b66-0b6f # Digits +#0b70 # Symbol diff --git a/fontconfig/fc-lang/os.orth b/fontconfig/fc-lang/os.orth new file mode 100644 index 000000000..a5929df3e --- /dev/null +++ b/fontconfig/fc-lang/os.orth @@ -0,0 +1,96 @@ +# +# fontconfig/fc-lang/os.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Ossetic (OS) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/ota.orth b/fontconfig/fc-lang/ota.orth new file mode 100644 index 000000000..77d75e590 --- /dev/null +++ b/fontconfig/fc-lang/ota.orth @@ -0,0 +1,41 @@ +# +# fontconfig/fc-lang/ota.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ottoman Turkish (ota) +# +# Sources: +# * Daniels and Bright, “The World’s Writing Systems”, pp. 756–759. +# * Library of Congress ALA-LC Romanization Tables: +# http://www.loc.gov/catdir/cpso/romanization/ottoman.pdf +# +# General forms, since presentation forms for one letter is not in Unicode. +# +0621-0622 +0626-063A +0641-0648 +067E +0686 +0698 +06AD +06AF +06CC diff --git a/fontconfig/fc-lang/pa.orth b/fontconfig/fc-lang/pa.orth new file mode 100644 index 000000000..12588509c --- /dev/null +++ b/fontconfig/fc-lang/pa.orth @@ -0,0 +1,53 @@ +# +# fontconfig/fc-lang/pa.orth +# +# Copyright © 2004 Red Hat, Inc. +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Panjabi/Punjabi (pa) +# +# According to ISO 639-3, 'pa/pan' only applies to Panjabi as used in India: +# http://www.sil.org/iso639-3/documentation.asp?id=pan +# +# For Panjabi as used in Pakistan, use 'lah' or 'pa-PK': +# http://www.sil.org/iso639-3/documentation.asp?id=lah +# +# From Unicode coverage for Gurmukhi, with modifications based on +# the 'Lohit Punjabi' font +# +# 0A01-0A03 # Various signs +0A05-0A0A # Independent vowels +0A0F-0A10 +0A13-0A14 +0A15-0A28 # Consonants +0A2A-0A30 +0A32-0A33 +0A35-0A36 +0A38-0A39 +0A3C # Nukta +0A3E-0A42 # Dependent vowel signs +0A47-0A48 +0A4B-0A4C +0A4D # Virama +0A59-0A5C # Additional consonants +# 0A5E # GURMUKHI LETTER FA +# 0A66-0A6F # Digits +0A70-0A74 # Gurmukhi-specific additions diff --git a/fontconfig/fc-lang/pa_pk.orth b/fontconfig/fc-lang/pa_pk.orth new file mode 100644 index 000000000..fba09e3d6 --- /dev/null +++ b/fontconfig/fc-lang/pa_pk.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/pa_pk.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Panjabi/Punjabi in Pakistan (pa-PK) +# +# This file is kept for compatiblity for glibc: According to ISO 639-3, the +# proper code for Pakistani Panjabi is 'lah'. See the file 'lah.orth' for +# more information. +include lah.orth diff --git a/fontconfig/fc-lang/pap_an.orth b/fontconfig/fc-lang/pap_an.orth new file mode 100644 index 000000000..fa4b8a9ae --- /dev/null +++ b/fontconfig/fc-lang/pap_an.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/pap_an.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Papiamento in Netherlands Antilles (pap-AN) +# +# This is based on Curaçao orthography, also called "Papiamentu". +# +# Sources: +# * http://papiamentu.pbwiki.com/Pronunciation +# * http://en.wikipedia.org/wiki/Papiamento +# * http://papiamentu.donamaro.nl/ +# +0041-005A +0061-007A +00C1 +00C8-00C9 +00CD +00D1-00D3 +00D9-00DA +00DC +00E1 +00E8-00E9 +00ED +00F1-00F3 +00F9-00FA +00FC diff --git a/fontconfig/fc-lang/pap_aw.orth b/fontconfig/fc-lang/pap_aw.orth new file mode 100644 index 000000000..b3af6949d --- /dev/null +++ b/fontconfig/fc-lang/pap_aw.orth @@ -0,0 +1,31 @@ +# +# fontconfig/fc-lang/pap_aw.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Papiamento in Aruba (pap-AW) +# +# Sources: studying online newspapers, random wikipedia pages +# +0041-005A +0061-007A +00D1 +00F1 diff --git a/fontconfig/fc-lang/pes.orth b/fontconfig/fc-lang/pes.orth new file mode 100644 index 000000000..81b39107f --- /dev/null +++ b/fontconfig/fc-lang/pes.orth @@ -0,0 +1,26 @@ +# +# fontconfig/fc-lang/pes.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Western Farsi (pes) +# +include fa.orth diff --git a/fontconfig/fc-lang/pl.orth b/fontconfig/fc-lang/pl.orth new file mode 100644 index 000000000..e2d494e3f --- /dev/null +++ b/fontconfig/fc-lang/pl.orth @@ -0,0 +1,41 @@ +# +# fontconfig/fc-lang/pl.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Polish (PL) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00d3 +00f3 +0104-0105 +0106-0107 +0118-0119 +0141-0142 +0143-0144 +015a-015b +0179-017a +017b-017c diff --git a/fontconfig/fc-lang/prs.orth b/fontconfig/fc-lang/prs.orth new file mode 100644 index 000000000..98cf654bc --- /dev/null +++ b/fontconfig/fc-lang/prs.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/prs.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Dari/Eastern Farsi (prs) +# +# We assume that Afghan Persian uses the same orthography as Iranian +# Persian, although the actual orthography is probably less strict than that +# of the Iranian Academy of Persian Language and Literature. +include fa.orth diff --git a/fontconfig/fc-lang/ps_af.orth b/fontconfig/fc-lang/ps_af.orth new file mode 100644 index 000000000..5cae9eda9 --- /dev/null +++ b/fontconfig/fc-lang/ps_af.orth @@ -0,0 +1,52 @@ +# +# fontconfig/fc-lang/ps_af.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Pashto in Afghanistan (PS-AF) +# +# Data from Roozbeh Pournader <roozbeh@sharif.edu> +# +# Since the Unicode Presentation Forms don't contain any of the +# Pashto-specific letters (that is Pashto letters not in Persian), we are +# going with the general forms instead of the Presentation forms, unlike +# Arabic, Persian, or Urdu. +# +0621-0624 +0626-063a +0641-0642 +0644-0648 +064a +067c +067e +0681 +0685-0686 +0689 +0693 +0696 +0698 +069a +06a9 +06ab +06bc +06cc +06cd +06d0 diff --git a/fontconfig/fc-lang/ps_pk.orth b/fontconfig/fc-lang/ps_pk.orth new file mode 100644 index 000000000..1ce76d5ad --- /dev/null +++ b/fontconfig/fc-lang/ps_pk.orth @@ -0,0 +1,52 @@ +# +# fontconfig/fc-lang/ps_pk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Pashto in Pakistan (PS-PK) +# +# Data from Roozbeh Pournader <roozbeh@sharif.edu> +# +# Since the Unicode Presentation Forms don't contain any of the +# Pashto-specific letters (that is Pashto letters not in Persian), we are +# going with the general forms instead of the Presentation forms, unlike +# Arabic, Persian, or Urdu. +# +0621-0624 +0626-063a +0641-0642 +0644-0648 +064a +067c +067e +0681 +0685-0686 +0689 +0693 +0696 +0698 +069a +06a9 +06ab +06bc +06cd +06d0 +06d2 diff --git a/fontconfig/fc-lang/pt.orth b/fontconfig/fc-lang/pt.orth new file mode 100644 index 000000000..77e97bfdd --- /dev/null +++ b/fontconfig/fc-lang/pt.orth @@ -0,0 +1,64 @@ +# +# fontconfig/fc-lang/pt.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Portuguese (PT) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +#00bb +00c0 +00c1 +00c2 +00c3 +00c7 +00c8 +00c9 +00ca +00cd +00d2 +00d3 +00d4 +00d5 +00da +00dc +00e0 +00e1 +00e2 +00e3 +00e7 +00e8 +00e9 +00ea +00ed +00f2 +00f3 +00f4 +00f5 +00fa +00fc +##203a # angle quote +# diff --git a/fontconfig/fc-lang/qu.orth b/fontconfig/fc-lang/qu.orth new file mode 100644 index 000000000..118b65037 --- /dev/null +++ b/fontconfig/fc-lang/qu.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/qu.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Quechua (qu) +# +# Sources: +# * http://en.wikipedia.org/wiki/Quechua_alphabet +# * http://www.omniglot.com/writing/quechua.htm +# +# Some basic Latin letters are not used, based on dialect +# +0041-005A +0061-007A +00D1 +00F1 +02C8 diff --git a/fontconfig/fc-lang/rm.orth b/fontconfig/fc-lang/rm.orth new file mode 100644 index 000000000..4c62810ed --- /dev/null +++ b/fontconfig/fc-lang/rm.orth @@ -0,0 +1,45 @@ +# +# fontconfig/fc-lang/rm.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Rhaeto-Romance (Romansch) (RM) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +00c8 +00c9 +00cc +00ce +00d2 +00d9 +00e0 +00e8 +00e9 +00ec +00ee +00f2 +00f9 diff --git a/fontconfig/fc-lang/rn.orth b/fontconfig/fc-lang/rn.orth new file mode 100644 index 000000000..3caf84b39 --- /dev/null +++ b/fontconfig/fc-lang/rn.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/rn.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Rundi (rn) +# +# Sources: +# http://www.omniglot.com/writing/kirundi.php +# +# Q and X are not used. An apostrophe-like letter also exists. +# +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/ro.orth b/fontconfig/fc-lang/ro.orth new file mode 100644 index 000000000..8c97d4d27 --- /dev/null +++ b/fontconfig/fc-lang/ro.orth @@ -0,0 +1,38 @@ +# +# fontconfig/fc-lang/ro.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Romanian (RO) +# +# Sources: +# www.eki.ee/letter +# +0041-005a +0061-007a +00c2 +00ce +00e2 +00ee +0102-0103 +0218-021b # comma-below forms (preferred over cedilla) +#2019-201a # single quotes +#201d-201e # double quotes diff --git a/fontconfig/fc-lang/ru.orth b/fontconfig/fc-lang/ru.orth new file mode 100644 index 000000000..b8cb2ee99 --- /dev/null +++ b/fontconfig/fc-lang/ru.orth @@ -0,0 +1,38 @@ +# +# fontconfig/fc-lang/ru.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Russian (RU) +#00ab +#00bb +0401 +#0406 # eliminated in 1918 in favor of 418 +0410-044f +0451 +#0456 # eliminated in 1918 in favor of 438 +#0462 # CYRILLIC CAPITAL LETTER YAT +#0463 # CYRILLIC SMALL LETTER YAT +#0472 # CYRILLIC CAPITAL LETTER FITA +#0473 # CYRILLIC SMALL LETTER FITA +#0474 # CYRILLIC CAPITAL LETTER IZHITSA +#0475 # CYRILLIC SMALL LETTER IZHITSA +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/rw.orth b/fontconfig/fc-lang/rw.orth new file mode 100644 index 000000000..954c3335f --- /dev/null +++ b/fontconfig/fc-lang/rw.orth @@ -0,0 +1,31 @@ +# +# fontconfig/fc-lang/rw.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Kinyarwanda (rw) +# +# Sources: +# http://www.omniglot.com/writing/kinyarwanda.htm +# +# Q and X are not used +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/sa.orth b/fontconfig/fc-lang/sa.orth new file mode 100644 index 000000000..c7b08e16c --- /dev/null +++ b/fontconfig/fc-lang/sa.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/sa.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sanskrit (Devanagari script) (SA) +include hi.orth diff --git a/fontconfig/fc-lang/sah.orth b/fontconfig/fc-lang/sah.orth new file mode 100644 index 000000000..b4f25d97e --- /dev/null +++ b/fontconfig/fc-lang/sah.orth @@ -0,0 +1,108 @@ +# +# fontconfig/fc-lang/sah.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Yakut (SAH) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA +#0473 # CYRILLIC SMALL LETTER FITA +0494 +0495 +04a4 +04a5 +04ae +04af +04ba +04bb +04d8 +04d9 diff --git a/fontconfig/fc-lang/sc.orth b/fontconfig/fc-lang/sc.orth new file mode 100644 index 000000000..c30ec1df2 --- /dev/null +++ b/fontconfig/fc-lang/sc.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/sc.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sardinian (sc) +# +# Sources: +# * http://www.omniglot.com/writing/sardinian.htm +# * http://www.limbasarda.it/lingui/ling_alfa.html +# +# K, W, X, and Y are not used. +0041-005A +0061-007A +00C0 +00C8 +00CC +00D2 +00D9 +00E0 +00E8 +00EC +00F2 +00F9 diff --git a/fontconfig/fc-lang/sco.orth b/fontconfig/fc-lang/sco.orth new file mode 100644 index 000000000..26bf0d60c --- /dev/null +++ b/fontconfig/fc-lang/sco.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/sco.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Scots (CU) +# +# Orthography from http://www.evertype.com/alphabets/scots.pdf +# +0041-005a +0061-007a +01b7 +021c-021d +0292 diff --git a/fontconfig/fc-lang/sd.orth b/fontconfig/fc-lang/sd.orth new file mode 100644 index 000000000..3fab4216e --- /dev/null +++ b/fontconfig/fc-lang/sd.orth @@ -0,0 +1,58 @@ +# +# fontconfig/fc-lang/sd.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sindhi (sd) +# +# Sindhi is mostly written in the Arabic script in both Pakistan and India. +# +# Sources: +# * http://www.user.uni-hannover.de/nhtcapri/sindhi-alphabet.html +# * http://www.omniglot.com/writing/sindhi.htm +# * http://tdil.mit.gov.in/sindhidesignguideoct02.pdf +# +# Some of the Sindhi letters are not available as presentation forms in +# Unicode, so we go with general-purpose Arabic letters. +# +0621-0622 +0624 +0626-0628 +062A-063A +0641-0642 +0644-0648 +064A +067A-067B +067D-0680 +0683-0684 +0686-0687 +068A +068C-068D +068F +0699 +06A6 +06A9-06AA +06AF +06B1 +06B3 +06BB +06BE +#06FD-06FD # signs are usually not included in orthographies diff --git a/fontconfig/fc-lang/se.orth b/fontconfig/fc-lang/se.orth new file mode 100644 index 000000000..e08733b8a --- /dev/null +++ b/fontconfig/fc-lang/se.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/se.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# North Sámi (SE) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00e1 +010c-010d +0110-0111 +014a-014b +0160-0161 +0166-0167 +017d-017e diff --git a/fontconfig/fc-lang/sel.orth b/fontconfig/fc-lang/sel.orth new file mode 100644 index 000000000..d76466a80 --- /dev/null +++ b/fontconfig/fc-lang/sel.orth @@ -0,0 +1,96 @@ +# +# fontconfig/fc-lang/sel.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Selkup (Ostyak-Samoyed) (SEL) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 diff --git a/fontconfig/fc-lang/sg.orth b/fontconfig/fc-lang/sg.orth new file mode 100644 index 000000000..aa9c0d179 --- /dev/null +++ b/fontconfig/fc-lang/sg.orth @@ -0,0 +1,47 @@ +# +# fontconfig/fc-lang/sg.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sango (sg) +# +# Sources: +# * http://en.wikipedia.org/wiki/Sango_language +# * http://www.omniglot.com/writing/sango.php +# +# C, Q, and X are not used. +# +0041-005A +0061-007A +00C2 +00C4 +00CA-00CB +00CE-00CF +00D4 +00D6 +00DB-00DC +00E2 +00E4 +00EA-00EB +00EE-00EF +00F4 +00F6 +00FB-00FC diff --git a/fontconfig/fc-lang/sh.orth b/fontconfig/fc-lang/sh.orth new file mode 100644 index 000000000..80dae3ebd --- /dev/null +++ b/fontconfig/fc-lang/sh.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/sh.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Serbo-Croatian (sh) +# +# This tag is deprecated since 2000 in ISO 639-1 and BCP 47. It is kept here +# for backward compatibility. Since ISO 639-3 defines this as a +# macrolanguage consisting of Bosnian, Croatian, and Serbian, we union +# those three. +include ba.orth +include hr.orth +include sr.orth diff --git a/fontconfig/fc-lang/shs.orth b/fontconfig/fc-lang/shs.orth new file mode 100644 index 000000000..ca509b357 --- /dev/null +++ b/fontconfig/fc-lang/shs.orth @@ -0,0 +1,48 @@ +# +# fontconfig/fc-lang/shs.orth +# +# Copyright © 2008 Neskie Manuel +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Neskie Manuel not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Neskie Manuel makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# NESKIE MANUEL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL NESKIE MANUEL BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Secwepemctsin (shs) +# +# Orthography from A Shuswap Course and +# http://www.languagegeek.com/salishan/secwepemctsin.html + +0037 +0041 +0043 +0045 +0047-0049 +004B-0055 +0057-0059 +0061 +0063 +0065 +0067-0069 +006B-0075 +0077-0079 +00C1 +00C9 +00CD +00E1 +00E9 +00ED +0313 diff --git a/fontconfig/fc-lang/si.orth b/fontconfig/fc-lang/si.orth new file mode 100644 index 000000000..8f8f15d33 --- /dev/null +++ b/fontconfig/fc-lang/si.orth @@ -0,0 +1,75 @@ +# +# fontconfig/fc-lang/si.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sinhala/Sinhalese (si) +# +# The document SINHALA CHARACTER CODE FOR INFORMATION INTERCHANGE, PART 2: +# REQUIREMENTS AND METHODS OF TEST (SLS 1134:PART2:2007 UDC 003.035:003.336) +# describes three (3) levels of compliance for Unicode Sinhala fonts. The +# first level describes the minimum requirements for SLS certification. The +# third level includes the first and second level requirements and additional +# requirements. +# +# To get a copy of this document contact the Sri Lanka Standards Institution +# (http://www.slsi.lk/). +# +# The Unicode document: http://unicode.org/charts/PDF/U0D80.PDF +# describes the base for level 3 compliance. +# +# Level 1 compliance can be described as level 3 with the exclusion of: +# U+0D8F ILUYANNA (Independent Vowel) +# U+0D90 ILUUYANNA (Independent Vowel) +# U+0DDF GAYANUKITTA (Dependent Vowel) +# U+0DF3 DIGA GAYANUKITTA (Dependent Vowel) +# U+0DF4 KUNDDALIYA (Punctuation) +# +# Sinhala and SLS1134 experts can be contacted at: +# sinhala-technical at lists.sourceforge.net +# ltrl at ucsc.cmb.ac.lk +# +# Semi Consonants +0d82-0d83 +# Independent Vowels +0d85-0d8d +# 0d8e IRUUYANNA (Level 1, but not in modern use) +# 0d8f ILUYANNA (Level 3) +# 0d90 ILUUYANNA (Level 3) +0d91-0d96 +# Consonants +0d9a-0da5 +#0da6 SANYAKA JAYANNA (Level 1, but not in modern use) +0da7-0db1 +0db3-0dbb +0dbd +0dc0-0dc6 +# Dependent Vowels +0dca +0dcf-0dd4 +0dd6 +0dd8-0dde +# 0ddf GAYANUKITTA (Level 3) +0df2 +# 0df3 DIGA GAYANUKITTA (Level 3) +# Punctuation +# 0df4 KUNDDALIYA (Level 3) diff --git a/fontconfig/fc-lang/sid.orth b/fontconfig/fc-lang/sid.orth new file mode 100644 index 000000000..179080b82 --- /dev/null +++ b/fontconfig/fc-lang/sid.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/sid.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sidamo (sid) +# +# Copying Tigrinya of Ethiopia, as does glibc +include ti_et.orth diff --git a/fontconfig/fc-lang/sk.orth b/fontconfig/fc-lang/sk.orth new file mode 100644 index 000000000..c7c870d87 --- /dev/null +++ b/fontconfig/fc-lang/sk.orth @@ -0,0 +1,63 @@ +# +# fontconfig/fc-lang/sk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Slovak (SK) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00c4 +00c9 +00cd +00d3 +00d4 +#00d6 # evertype.com +00da +#00dc # evertype.com +00dd +00e1 +00e4 +00e9 +00ed +00f3 +00f4 +#00f6 # evertype.com +00fa +#00fc # evertype.com +00fd +010c-010d +010e-010f +0139-013a +013d-013e +0147-0148 +#0150-0151 # evertype.com +0154-0155 +0160-0161 +0164-0165 +#0170-0171 # evertype.com +017d-017e +# diff --git a/fontconfig/fc-lang/sl.orth b/fontconfig/fc-lang/sl.orth new file mode 100644 index 000000000..f37147587 --- /dev/null +++ b/fontconfig/fc-lang/sl.orth @@ -0,0 +1,88 @@ +# +# fontconfig/fc-lang/sl.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Slovenian (SL) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +# +# Included in eki.ee +# +#00C4 LATIN CAPITAL LETTER A WITH DIAERESIS +#00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +#00DC LATIN CAPITAL LETTER U WITH DIAERESIS +#00E4 LATIN SMALL LETTER A WITH DIAERESIS +#00F6 LATIN SMALL LETTER O WITH DIAERESIS +#00FC LATIN SMALL LETTER U WITH DIAERESIS +0106 LATIN CAPITAL LETTER C WITH ACUTE +0107 LATIN SMALL LETTER C WITH ACUTE +010C LATIN CAPITAL LETTER C WITH CARON +010D LATIN SMALL LETTER C WITH CARON +0110 LATIN CAPITAL LETTER D WITH STROKE +0111 LATIN SMALL LETTER D WITH STROKE +0160 LATIN CAPITAL LETTER S WITH CARON +0161 LATIN SMALL LETTER S WITH CARON +017D LATIN CAPITAL LETTER Z WITH CARON +017E LATIN SMALL LETTER Z WITH CARON +# +# According to evertype.com: +# +# In slovenian, these letters are often used to transliterate +# Serbian and Macedonian letters +# +#01C5 LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON +#01C6 LATIN SMALL LETTER DZ WITH CARON +#01C8 LATIN CAPITAL LETTER L WITH SMALL LETTER J +#01C9 LATIN SMALL LETTER LJ +#01CB LATIN CAPITAL LETTER N WITH SMALL LETTER J +#01CC LATIN SMALL LETTER NJ +#01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z +#01F3 LATIN SMALL LETTER DZ +#01F4 LATIN CAPITAL LETTER G WITH ACUTE +#01F5 LATIN SMALL LETTER G WITH ACUTE +#1E30 LATIN CAPITAL LETTER K WITH ACUTE +#1E31 LATIN SMALL LETTER K WITH ACUTE +# +# These are the transliteration target letters which are +# not used in Slovenian at all +# +#0402 CYRILLIC CAPITAL LETTER DJE (Serbocroatian) +#0403 CYRILLIC CAPITAL LETTER GJE +#0405 CYRILLIC CAPITAL LETTER DZE +#0409 CYRILLIC CAPITAL LETTER LJE +#040A CYRILLIC CAPITAL LETTER NJE +#040B CYRILLIC CAPITAL LETTER TSHE (Serbocroatian) +#040C CYRILLIC CAPITAL LETTER KJE +#040F CYRILLIC CAPITAL LETTER DZHE +#0452 CYRILLIC SMALL LETTER DJE (Serbocroatian) +#0453 CYRILLIC SMALL LETTER GJE +#0455 CYRILLIC SMALL LETTER DZE +#0459 CYRILLIC SMALL LETTER LJE +#045A CYRILLIC SMALL LETTER NJE +#045B CYRILLIC SMALL LETTER TSHE (Serbocroatian) +#045C CYRILLIC SMALL LETTER KJE +#045F CYRILLIC SMALL LETTER DZHE diff --git a/fontconfig/fc-lang/sm.orth b/fontconfig/fc-lang/sm.orth new file mode 100644 index 000000000..fba7d3dfb --- /dev/null +++ b/fontconfig/fc-lang/sm.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/sm.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Samoan (AF) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +02bb diff --git a/fontconfig/fc-lang/sma.orth b/fontconfig/fc-lang/sma.orth new file mode 100644 index 000000000..f6e65ecb5 --- /dev/null +++ b/fontconfig/fc-lang/sma.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/sma.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# South Sámi (SMA) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c4 +00e4 +00c5 +00e5 +00d6 +00f6 +00cf +00ef diff --git a/fontconfig/fc-lang/smj.orth b/fontconfig/fc-lang/smj.orth new file mode 100644 index 000000000..e708a907b --- /dev/null +++ b/fontconfig/fc-lang/smj.orth @@ -0,0 +1,37 @@ +# +# fontconfig/fc-lang/smj.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Lule Sámi (SMJ) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00e1 +00c4 +00e4 +00c5 +00e5 +00d1 +00f1 diff --git a/fontconfig/fc-lang/smn.orth b/fontconfig/fc-lang/smn.orth new file mode 100644 index 000000000..4c2e2d6db --- /dev/null +++ b/fontconfig/fc-lang/smn.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/smn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Inari Sámi (SMN) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c1 +00e1 +00c2 +00e2 +00c4 +00e4 +010c-010d +0110-0111 +014a-014b +0160-0161 +017d-017e diff --git a/fontconfig/fc-lang/sms.orth b/fontconfig/fc-lang/sms.orth new file mode 100644 index 000000000..04d1de366 --- /dev/null +++ b/fontconfig/fc-lang/sms.orth @@ -0,0 +1,48 @@ +# +# fontconfig/fc-lang/sms.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Skolt Sámi (SMJ) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c2 +00e2 +00c4 +00e4 +00c5 +00e5 +010c-010d +0110-0111 +01b7 +0292 +01ee-01ef +01e6-01e7 +01e4-01e5 +01e8-01e9 +014a-014b +00d5 +00f5 +0160-0161 +017d-017e diff --git a/fontconfig/fc-lang/sn.orth b/fontconfig/fc-lang/sn.orth new file mode 100644 index 000000000..52839ee7b --- /dev/null +++ b/fontconfig/fc-lang/sn.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/sn.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Shona (sn) +# +# Sources: +# * http://en.wikipedia.org/wiki/Shona_language +# * http://www.dokpro.uio.no/allex/gsd/fm/7-Mabhii.htm +# * http://www.omniglot.com/writing/shona.php +# +# Q and X are not used. An apostrophe-like modifier exists, +# that is used after N. More research is needed. +# +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/so.orth b/fontconfig/fc-lang/so.orth new file mode 100644 index 000000000..243657802 --- /dev/null +++ b/fontconfig/fc-lang/so.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/so.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Somali (SO) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a # Somali doesn't use p, v or z +0061-007a diff --git a/fontconfig/fc-lang/sq.orth b/fontconfig/fc-lang/sq.orth new file mode 100644 index 000000000..252230202 --- /dev/null +++ b/fontconfig/fc-lang/sq.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/sq.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Albanian (SQ) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00c7 +00cb +00e7 +00eb diff --git a/fontconfig/fc-lang/sr.orth b/fontconfig/fc-lang/sr.orth new file mode 100644 index 000000000..5439d6334 --- /dev/null +++ b/fontconfig/fc-lang/sr.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/sr.orth +# +# Copyright © 2008 Danilo Šegan +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Serbian (SR) +# +0402 +0408-040b +040f +0410-0418 +041a-0428 +0430-0438 +043a-0448 +0452 +0458-045b +045f diff --git a/fontconfig/fc-lang/ss.orth b/fontconfig/fc-lang/ss.orth new file mode 100644 index 000000000..98d79e597 --- /dev/null +++ b/fontconfig/fc-lang/ss.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ss.orth +# +# Copyright © 2007 Dwayne Bailey and Translate.org.za +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Dwayne Bailey or Translate.org.za not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Dwayne Bailey and Translate.org.za makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# DWAYNE BAILEY AND TRANSLATE.ORG.ZA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL DWAYNE BAILEY OR TRANSLATE.ORG.ZA BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Swati (SS) +# +# Orthography taken from http://www.inference.phy.cam.ac.uk/dasher/download/alphabets/alphabet.Swati.xml +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/st.orth b/fontconfig/fc-lang/st.orth new file mode 100644 index 000000000..7db6bff43 --- /dev/null +++ b/fontconfig/fc-lang/st.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/st.orth +# +# Copyright © 2007 Dwayne Bailey and Translate.org.za +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Dwayne Bailey or Translate.org.za not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Dwayne Bailey and Translate.org.za makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# DWAYNE BAILEY AND TRANSLATE.ORG.ZA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL DWAYNE BAILEY OR TRANSLATE.ORG.ZA BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sotho, Southern (ST) +# +# Orthography taken from http://www.inference.phy.cam.ac.uk/dasher/download/alphabets/alphabet.Sesotho.xml +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/su.orth b/fontconfig/fc-lang/su.orth new file mode 100644 index 000000000..5646fe281 --- /dev/null +++ b/fontconfig/fc-lang/su.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/su.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sundanese (su) +# +# Sources: +# * http://en.wikipedia.org/wiki/Sundanese_language +# * http://www.omniglot.com/writing/sundanese.php +# +0041-005A +0061-007A +00C9 +00E9 diff --git a/fontconfig/fc-lang/sv.orth b/fontconfig/fc-lang/sv.orth new file mode 100644 index 000000000..ac627c81f --- /dev/null +++ b/fontconfig/fc-lang/sv.orth @@ -0,0 +1,100 @@ +# +# fontconfig/fc-lang/sv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Swedish (SV) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +# evertype.com includes a large number of additional precomposed letters +# not marked by eki.ee; I've left those commented out here +# +0041-005a +0061-007a +#00bb +00c0 +00c1 +#00c2 +#00c3 +00c4 +00c5 +#00c6 +#00c7 +#00c8 +00c9 +#00ca +00cb +#00cc +#00cd +#00ce +#00cf +#00d0 +#00d1 +#00d2 +#00d3 +#00d4 +00d6 +#00d7 +#00d8 +#00d9 +#00da +#00db +00dc +#00dd +00e0 +00e1 +#00e2 +#00e3 +00e4 +00e5 +#00e6 +#00e7 +#00e8 +00e9 +#00ea +00eb +#00ec +#00ed +#00ee +#00ef +#00f0 +#00f1 +#00f2 +#00f3 +#00f4 +00f6 +#00f8 +#00f9 +#00fa +#00fb +00fc +#00fd +#0106-0107 # C, c with acute +#010c-010d # C, c with caron +#0141-0144 # L, l with stroke N, n with acute +#0158-015b # R, r with caron S, s with acute +#0160-0161 # S, s with caron +#2019 # single quote +#201d # double quote +#203a # angle quote diff --git a/fontconfig/fc-lang/sw.orth b/fontconfig/fc-lang/sw.orth new file mode 100644 index 000000000..81975e9f3 --- /dev/null +++ b/fontconfig/fc-lang/sw.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/sw.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Swahili (SW) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a # Swahili doesn't use f, q or x and uses r only for loan words +0061-007a diff --git a/fontconfig/fc-lang/syr.orth b/fontconfig/fc-lang/syr.orth new file mode 100644 index 000000000..b1f4a8dfc --- /dev/null +++ b/fontconfig/fc-lang/syr.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/syr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Syriac (SYR) +# +# Coverage given by Emil Soleyman-Zomalan <emil@nishra.com> +# +0710-072c # Syriac letters +0730-073f # Syriac points (vowels) diff --git a/fontconfig/fc-lang/ta.orth b/fontconfig/fc-lang/ta.orth new file mode 100644 index 000000000..cb6b215cd --- /dev/null +++ b/fontconfig/fc-lang/ta.orth @@ -0,0 +1,46 @@ +# +# fontconfig/fc-lang/ta.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tamil (TA) +# +# Taken from the Unicode coverage of this language +# +# updates from Jungshik Shin <jshin@mailaps.org> +# +#0b82 # not present in many Tamil fonts +0b83 +0b85-0b8a +0b8e-0b90 +0b92-0b95 +0b99-0b9a +0b9c +0b9e-0b9f +0ba3-0ba4 +0ba8-0baa +0bae-0bb5 +0bb7-0bb9 +0bbe-0bc2 +0bc6-0bc8 +0bca-0bcd +0bd7 +#0be7-0bf2 # Tamil digits and numbers diff --git a/fontconfig/fc-lang/te.orth b/fontconfig/fc-lang/te.orth new file mode 100644 index 000000000..cb9989e9e --- /dev/null +++ b/fontconfig/fc-lang/te.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/te.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Telugu (te) +# +# Taken from the Unicode coverage of this language +# +0c01-0c03 +0c05-0c0c +0c0e-0c10 +0c12-0c28 +0c2a-0c33 +0c35-0c39 +0c3e-0c44 +0c46-0c48 +0c4a-0c4d +0c55-0c56 +0c60-0c61 +#0c66-0c6f # Digits diff --git a/fontconfig/fc-lang/tg.orth b/fontconfig/fc-lang/tg.orth new file mode 100644 index 000000000..f11e6af47 --- /dev/null +++ b/fontconfig/fc-lang/tg.orth @@ -0,0 +1,108 @@ +# +# fontconfig/fc-lang/tg.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Tajik (TG) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +0492 +0493 +049a +049b +04b2 +04b3 +04b6 +04b7 +04e2 +04e3 +04ee +04ef diff --git a/fontconfig/fc-lang/th.orth b/fontconfig/fc-lang/th.orth new file mode 100644 index 000000000..47396bf30 --- /dev/null +++ b/fontconfig/fc-lang/th.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/th.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Thai (th) +# +0e01-0e3a +0e3f-0e4e +#0e4f # Punctuation +#0e50-0e59 # Digits +#0e5a-0e5b # Punctuation diff --git a/fontconfig/fc-lang/ti_er.orth b/fontconfig/fc-lang/ti_er.orth new file mode 100644 index 000000000..b1f7dc634 --- /dev/null +++ b/fontconfig/fc-lang/ti_er.orth @@ -0,0 +1,56 @@ +# +# fontconfig/fc-lang/ti_er.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Eritrean Tigrinya (TI-ER) Ethiopic Convention +# +# Taken from Unicode coverage (1200-137f) +# +# Sylables +1200-1206 # he-ho +1208-1216 # le-Ho, skip HWa +1218-121f # me-mWa +1228-1230 # re-sWa +1238-1246 # re-qo +1248 # qWe +124a-124d # qWi-qW +1250-1256 # Qe-Qo +1258 # QWe +125a-125d # QWi-QW +1260-126e # be-vo +1270-127f # te-cWa +1290-12a7 # ne-o +12a8-12ae # ke-ko +12b0 # kWe +12b2-12b5 # kWi-kW +12c8-12ce # Ke-Ko +12c0 # KWe +12c2-12c5 # KWi-KW +12c8-12ce # we-wo +12d0-12d6 # `e-`o +12d8-12ee # ze-yo +12f0-12f7 # de-dWa +1300-130e # je-go +1310 # gWe +1312-1315 # gWi-gW +1320-133f # Te-SWa +1348-1356 # fe-po, skip pWa, rYa, mYa, fYa diff --git a/fontconfig/fc-lang/ti_et.orth b/fontconfig/fc-lang/ti_et.orth new file mode 100644 index 000000000..37ee0f7f7 --- /dev/null +++ b/fontconfig/fc-lang/ti_et.orth @@ -0,0 +1,33 @@ +# +# fontconfig/fc-lang/ti_et.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ethiopian Tigrinya (TI-ET) Ethiopic Convention +# +# The same as Ethiopic +# +include ti_er.orth +1220-1226 # `se-`so +1280-1286 # `he-`ho +1288 # hWe +128a-128d # hWi-hW +1340-1346 # `Se-`So diff --git a/fontconfig/fc-lang/tig.orth b/fontconfig/fc-lang/tig.orth new file mode 100644 index 000000000..c5b9c0633 --- /dev/null +++ b/fontconfig/fc-lang/tig.orth @@ -0,0 +1,52 @@ +# +# fontconfig/fc-lang/tig.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tigre (TIG) Ethiopic Convention +# +# Taken from Unicode coverage (1200-137f) +# +# Sylables +1200-1206 # he-ho +1208-1216 # le-Ho, skip HWa +1218-121f # me-mWa +1228-1230 # re-sWa +1238-1246 # re-qo +1248 # qWe +124a-124d # qWi-qW +1260-126e # be-vo +1270-127f # te-cWa +1290-1297 # ne-nWa +12a0-12a6 # a-o +12a8-12ae # ke-ko +12b0 # kWe +12b2-12b5 # kWi-kW +12c8-12ce # we-wo +12d0-12d6 # `e-`o +12d8-12df # ze-zWa +12e8-12ee # ye-yo +12f0-12f7 # de-dWa +1300-130e # je-go +1310 # gWe +1312-1315 # gWi-gW +1320-133f # Te-SWa +1348-1356 # fe-po, skip pWa, rYa, mYa, fYa diff --git a/fontconfig/fc-lang/tk.orth b/fontconfig/fc-lang/tk.orth new file mode 100644 index 000000000..7a8a985a4 --- /dev/null +++ b/fontconfig/fc-lang/tk.orth @@ -0,0 +1,44 @@ +# +# fontconfig/fc-lang/tk.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Turkmen (tk) +# +# Sources: +# http://www.omniglot.com/writing/turkmen.htm +# http://www.itscj.ipsj.or.jp/ISO-IR/230.pdf +# http://www.eki.ee/wgrs/rom2_tk.htm +# +# C, Q, V, and X are not used +0041-005A +0061-007A +00C4 +00C7 +00D6 +00DC-00DD +00E4 +00E7 +00F6 +00FC-00FD +0147-0148 +015E-015F +017D-017E diff --git a/fontconfig/fc-lang/tl.orth b/fontconfig/fc-lang/tl.orth new file mode 100644 index 000000000..6ab5c2dac --- /dev/null +++ b/fontconfig/fc-lang/tl.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/tl.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tagalog (tl) +# +# Since Filipino is standardized Tagalog, we just include that +include fil.orth diff --git a/fontconfig/fc-lang/tn.orth b/fontconfig/fc-lang/tn.orth new file mode 100644 index 000000000..342281e03 --- /dev/null +++ b/fontconfig/fc-lang/tn.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/tn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tswana (TN) +# +# Orthography from http://www.eki.ee/letter +# and http://www.inference.phy.cam.ac.uk/dasher/download/alphabets/alphabet.Tswana.xml +# +0041-005a +0061-007a +00ca +00ea +00d4 +00f4 +0160-0161 diff --git a/fontconfig/fc-lang/to.orth b/fontconfig/fc-lang/to.orth new file mode 100644 index 000000000..3b85a1e8d --- /dev/null +++ b/fontconfig/fc-lang/to.orth @@ -0,0 +1,30 @@ +# +# fontconfig/fc-lang/to.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tonga (TO) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +02bb diff --git a/fontconfig/fc-lang/tr.orth b/fontconfig/fc-lang/tr.orth new file mode 100644 index 000000000..155a69d37 --- /dev/null +++ b/fontconfig/fc-lang/tr.orth @@ -0,0 +1,49 @@ +# +# fontconfig/fc-lang/tr.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Turkish (TR) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +0041-005a +0061-007a +00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +00C7 LATIN CAPITAL LETTER C WITH CEDILLA +00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX +00D6 LATIN CAPITAL LETTER O WITH DIAERESIS +00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX +00DC LATIN CAPITAL LETTER U WITH DIAERESIS +00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX +00E7 LATIN SMALL LETTER C WITH CEDILLA +00EE LATIN SMALL LETTER I WITH CIRCUMFLEX +00F6 LATIN SMALL LETTER O WITH DIAERESIS +00FB LATIN SMALL LETTER U WITH CIRCUMFLEX +00FC LATIN SMALL LETTER U WITH DIAERESIS +011E LATIN CAPITAL LETTER G WITH BREVE +011F LATIN SMALL LETTER G WITH BREVE +0130 LATIN CAPITAL LETTER I WITH DOT ABOVE +0131 LATIN SMALL LETTER DOTLESS I +015E LATIN CAPITAL LETTER S WITH CEDILLA * +015F LATIN SMALL LETTER S WITH CEDILLA * diff --git a/fontconfig/fc-lang/ts.orth b/fontconfig/fc-lang/ts.orth new file mode 100644 index 000000000..ffc180797 --- /dev/null +++ b/fontconfig/fc-lang/ts.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ts.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tsonga (TS) +# +# Orthography taken from http://www.eki.ee/letter +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/tt.orth b/fontconfig/fc-lang/tt.orth new file mode 100644 index 000000000..a91d7c4fc --- /dev/null +++ b/fontconfig/fc-lang/tt.orth @@ -0,0 +1,108 @@ +# +# fontconfig/fc-lang/tt.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Tatar (TT) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA +#0473 # CYRILLIC SMALL LETTER FITA +0496 +0497 +04a2 +04a3 +04ae +04af +04ba +04bb +04d8 +04d9 diff --git a/fontconfig/fc-lang/tw.orth b/fontconfig/fc-lang/tw.orth new file mode 100644 index 000000000..b6e654638 --- /dev/null +++ b/fontconfig/fc-lang/tw.orth @@ -0,0 +1,50 @@ +# +# fontconfig/fc-lang/tw.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Twi (tw) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a +0061-007a +00C3 # LATIN CAPITAL LETTER A WITH TILDE +00E3 # LATIN SMALL LETTER A WITH TILDE +00D1 # LATIN CAPITAL LETTER N WITH TILDE +00D5 # LATIN CAPITAL LETTER O WITH TILDE +00F1 # LATIN SMALL LETTER N WITH TILDE +00F5 # LATIN SMALL LETTER O WITH TILDE +0128 # LATIN CAPITAL LETTER I WITH TILDE +0129 # LATIN SMALL LETTER I WITH TILDE +0168 # LATIN CAPITAL LETTER U WITH TILDE +0169 # LATIN SMALL LETTER U WITH TILDE +0186 # LATIN CAPITAL LETTER OPEN O +0254 # LATIN SMALL LETTER OPEN O +0190 # LATIN CAPITAL LETTER OPEN E +025B # LATIN SMALL LETTER OPEN E +0303 # COMBINING TILDE +0306 # COMBINING BREVE (Vrachy) +0329 # COMBINING VERTICAL LINE BELOW +1EBC # LATIN CAPITAL LETTER E WITH TILDE +1EBD # LATIN SMALL LETTER E WITH TILDE +1EF8 # LATIN CAPITAL LETTER Y WITH TILDE +1EF9 # LATIN SMALL LETTER Y WITH TILDE diff --git a/fontconfig/fc-lang/ty.orth b/fontconfig/fc-lang/ty.orth new file mode 100644 index 000000000..fe4f24568 --- /dev/null +++ b/fontconfig/fc-lang/ty.orth @@ -0,0 +1,41 @@ +# +# fontconfig/fc-lang/ty.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Tahitian (ty) +# +# Sources: +# * http://www.omniglot.com/writing/tahitian.htm +# * http://en.wikipedia.org/wiki/Tahitian_language +# +# B, C, D, G, J, K, L, Q, S, W, X, Y and Z are not used. +# +0041-005A +0061-007A +00CF # used in one word only? +00EF # used in one word only? +0100-0101 +0112-0113 +012A-012B +014C-014D +016A-016B +02BC # or possibly 02BB diff --git a/fontconfig/fc-lang/tyv.orth b/fontconfig/fc-lang/tyv.orth new file mode 100644 index 000000000..9d5bd742e --- /dev/null +++ b/fontconfig/fc-lang/tyv.orth @@ -0,0 +1,102 @@ +# +# fontconfig/fc-lang/tyv.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Coverage taken from TITUS (Thesaurus Indogermanischer Text und +# Sprachmaterialien) +# +# http://titus.uni-frankfurt.de/unicode/alphabet/nslatest.htm +# +# Tuvinian (TYV) +# +0401 +0410 +0411 +0412 +0413 +0414 +0415 +0416 +0417 +0418 +0419 +041a +041b +041c +041d +041e +041f +0420 +0421 +0422 +0423 +0424 +0425 +0426 +0427 +0428 +0429 +042a +042b +042c +042d +042e +042f +0430 +0431 +0432 +0433 +0434 +0435 +0436 +0437 +0438 +0439 +043a +043b +043c +043d +043e +043f +0440 +0441 +0442 +0443 +0444 +0445 +0446 +0447 +0448 +0449 +044a +044b +044c +044d +044e +044f +0451 +#0472 # CYRILLIC CAPITAL LETTER FITA +#0473 # CYRILLIC SMALL LETTER FITA +04a2 +04a3 +04ae +04af diff --git a/fontconfig/fc-lang/ug.orth b/fontconfig/fc-lang/ug.orth new file mode 100644 index 000000000..bf8e67450 --- /dev/null +++ b/fontconfig/fc-lang/ug.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/ug.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Uighur (UG) +# +# Uighur is written in a varient of Perso-Arabic, but I haven't found +# any references which define the variations. So, for now we'll use Arabic +# fonts +include ar.orth diff --git a/fontconfig/fc-lang/uk.orth b/fontconfig/fc-lang/uk.orth new file mode 100644 index 000000000..593fc5c4c --- /dev/null +++ b/fontconfig/fc-lang/uk.orth @@ -0,0 +1,43 @@ +# +# fontconfig/fc-lang/uk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Ukrainian (UK) +# +# Sources: +# www.evertype.com +# www.eki.ee/letter +# +#00ab +#00bb +#0401 # evertype.com +0404 +0406 +0407 +0410-044f +#0451 # evertype.com +0454 +0456 +0457 +0490 +0491 +#2039-203a # angle quotes diff --git a/fontconfig/fc-lang/ur.orth b/fontconfig/fc-lang/ur.orth new file mode 100644 index 000000000..d9b944acc --- /dev/null +++ b/fontconfig/fc-lang/ur.orth @@ -0,0 +1,65 @@ +# +# fontconfig/fc-lang/ur.orth +# +# Copyright © 2002 Keith Packard +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Urdu (ur) +# +# We are assuming that: +# * Most fonts that claim to support an Arabic letter actually do so; +# * Most modern text rendering software use OpenType tables, instead of +# directly using presentation forms. +# * Some good Arabic fonts do not support codepoints for Arabic presentation +# forms. +# Thus, we are switching to general forms of Arabic letters. +# +# General forms: +0621-0624 +0626-063a +0641-0642 +0644-0648 +0679 +067e +0686 +0688 +0691 +0698 +06a9 +06af +06ba +06be +06cc +06d2 +# Presentations forms: +#fb56-fb59 +#fb66-fb69 +#fb7a-fb7d +#fb88-fb8d +#fb8e-fb95 +#fb9e-fb9f +#fbfc-fbff +#fbaa-fbaf +#fe80-fe86 +#fe89-fed8 +#fedd-feee +##fef5-fef8 # These four happen very rarely +#fefb-fefc diff --git a/fontconfig/fc-lang/uz.orth b/fontconfig/fc-lang/uz.orth new file mode 100644 index 000000000..a85670a4f --- /dev/null +++ b/fontconfig/fc-lang/uz.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/uz.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Uzbek (uz) +# +# Sources: +# * http://ru.wikipedia.org/wiki/Узбекская_письменность +# * http://unicode.org/cldr/data/common/main/uz_Latn.xml +# * http://www.oxuscom.com/New_Uzbek_Latin_Alphabet.pdf +# +0041-005A +0061-007A +# There are one to three modifier letters too, that are important for the +# orthography. But it's impossible to locate them in Unicode with the +# information available online. Possible candidates: +# U+02BB, U+02BC, U+02BF, U+02C8. diff --git a/fontconfig/fc-lang/ve.orth b/fontconfig/fc-lang/ve.orth new file mode 100644 index 000000000..a7c91dba6 --- /dev/null +++ b/fontconfig/fc-lang/ve.orth @@ -0,0 +1,34 @@ +# +# fontconfig/fc-lang/ve.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Venda (ve) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +1e12-1e13 +1e3c-1e3d +1e44-1e45 +1e4a-1e4b +1e70-1e71 diff --git a/fontconfig/fc-lang/vi.orth b/fontconfig/fc-lang/vi.orth new file mode 100644 index 000000000..7915cab2b --- /dev/null +++ b/fontconfig/fc-lang/vi.orth @@ -0,0 +1,58 @@ +# +# fontconfig/fc-lang/vi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Vietnamese (VI) +# +# Information extracted from email sent by Markus Kuhn about the +# standard Vietnamese character set (TCVN 6909:2001) +# +0041-005a +0061-007a +00c0-00c3 +00c8-00ca +00cc-00cd +00d2-00d5 +00d9-00da +00dd +00e0-00e3 +00e8-00ea +00ec-00ed +00f2-00f5 +00f9-00fa +00fd +0102-0103 +0110-0111 +0128-0129 +0168-0169 +01a0-01a1 +01af-01b0 +# diacritical marks +0300-0303 +0306 +0309 +031b +0323 +# more precomposed latin +1ea0-1ef9 +# double quote marks +#201c-201d diff --git a/fontconfig/fc-lang/vo.orth b/fontconfig/fc-lang/vo.orth new file mode 100644 index 000000000..8b334698e --- /dev/null +++ b/fontconfig/fc-lang/vo.orth @@ -0,0 +1,36 @@ +# +# fontconfig/fc-lang/vo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Volapük (VO) +0041-0050 +0052-0056 +0058-005a +0061-0070 +0072-0076 +0078-007a +00c4 +00d6 +00dc +00e4 +00f6 +00fc diff --git a/fontconfig/fc-lang/vot.orth b/fontconfig/fc-lang/vot.orth new file mode 100644 index 000000000..006b3e33c --- /dev/null +++ b/fontconfig/fc-lang/vot.orth @@ -0,0 +1,40 @@ +# +# fontconfig/fc-lang/vot.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Orthography from http://www.everytype.com/alphabets/votic.pdf +# +# Votic (VOT) +# +# Sources: +# www.evertype.com +# +0041-005a +0061-007a +00c4 +00d6 +00dc +00e4 +00f6 +00fc +0160-0161 +017d-017e diff --git a/fontconfig/fc-lang/wa.orth b/fontconfig/fc-lang/wa.orth new file mode 100644 index 000000000..6b575271a --- /dev/null +++ b/fontconfig/fc-lang/wa.orth @@ -0,0 +1,47 @@ +# +# fontconfig/fc-lang/wa.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Walloon (WA) +# +# Data from private communication with Pablo Saratxaga <pablo@mandrakesoft.com> +# +0041-005a +0061-007a +00c2 # A circumflex +00c5 # A ring +00c7 # C cedilla +00c8 # E grave +00c9 # E acute +00ca # E circumflex +00ce # I circumflex +00d4 # O circumflex +00db # U circumflex +00e2 # a circumflex +00e5 # a ring +00e7 # c cedilla +00e8 # e grave +00e9 # e acute +00ea # e circumflex +00ee # i circumflex +00f4 # o circumflex +00fb # u circumflex diff --git a/fontconfig/fc-lang/wal.orth b/fontconfig/fc-lang/wal.orth new file mode 100644 index 000000000..450e21a94 --- /dev/null +++ b/fontconfig/fc-lang/wal.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/wal.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Wolaitta/Wolaytta (wal) +# +# Copying Tigrinya of Ethiopia, as does glibc +include ti_et.orth diff --git a/fontconfig/fc-lang/wen.orth b/fontconfig/fc-lang/wen.orth new file mode 100644 index 000000000..13d1714f3 --- /dev/null +++ b/fontconfig/fc-lang/wen.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/wen.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Sorbian languages (lower and upper) (WEN) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +0106-0107 +010c-010d +011a-011b +0141-0142 +0143-0144 +00d3 +00f3 +0154-0155 +0158-0159 +015a-015b +0160-0161 +0179-017a +017d-017e diff --git a/fontconfig/fc-lang/wo.orth b/fontconfig/fc-lang/wo.orth new file mode 100644 index 000000000..3e3fc3d73 --- /dev/null +++ b/fontconfig/fc-lang/wo.orth @@ -0,0 +1,42 @@ +# +# fontconfig/fc-lang/wo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Wolof (WO) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +00e0 +00c3 +00e3 +00c9 +00e9 +00cb +00eb +00d1 +00f1 +014a-014b +00d3 +00f3 diff --git a/fontconfig/fc-lang/xh.orth b/fontconfig/fc-lang/xh.orth new file mode 100644 index 000000000..a068709da --- /dev/null +++ b/fontconfig/fc-lang/xh.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/xh.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Xhosa (XH) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a +0061-007a diff --git a/fontconfig/fc-lang/yap.orth b/fontconfig/fc-lang/yap.orth new file mode 100644 index 000000000..6678b879f --- /dev/null +++ b/fontconfig/fc-lang/yap.orth @@ -0,0 +1,35 @@ +# +# fontconfig/fc-lang/yap.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Yapese (YAP) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c4 +00e4 +00cb +00eb +00d6 +00f6 diff --git a/fontconfig/fc-lang/yi.orth b/fontconfig/fc-lang/yi.orth new file mode 100644 index 000000000..954b025d6 --- /dev/null +++ b/fontconfig/fc-lang/yi.orth @@ -0,0 +1,25 @@ +# +# fontconfig/fc-lang/yi.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Yiddish (YI) +include he.orth diff --git a/fontconfig/fc-lang/yo.orth b/fontconfig/fc-lang/yo.orth new file mode 100644 index 000000000..7e38d8a6d --- /dev/null +++ b/fontconfig/fc-lang/yo.orth @@ -0,0 +1,86 @@ +# +# fontconfig/fc-lang/yo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Yoruba (YO) +# +# Orthography from http://www.eki.ee/letter +# +0041-005a +0061-007a +00c0 +00c1 +00c2 +00c3 +00c8 +00c9 +00ca +00cc +00cd +00ce +00d2 +00d3 +00d4 +00d5 +00d9 +00da +00db +00e0 +00e1 +00e2 +00e3 +00e8 +00e9 +00ea +00ec +00ed +00ee +00f2 +00f3 +00f4 +00f5 +00f9 +00fa +00fb +011a-011b +0128-0129 +0143-0144 +0168-0169 +01cd-01ce +01cf-01d0 +01d1-01d2 +01d3-01d4 +01f8-01f9 # LATIN LETTER N WITH GRAVE +0300 +0301 +0302 +0303 +030c +1e3e-1e3f +1e62-1e63 +1eb8-1eb9 +1ebc-1ebd +1ecc-1ecd +# LATIN CAPTIAL LETTER M WITH MACRON (no UCS code) +# LATIN CAPTIAL LETTER N WITH MACRON (no UCS code) +# LATIN SMALL LETTER M WITH MACRON (no UCS code) +# LATIN SMALL LETTER N WITH MACRON (no UCS code) diff --git a/fontconfig/fc-lang/za.orth b/fontconfig/fc-lang/za.orth new file mode 100644 index 000000000..22deabe4a --- /dev/null +++ b/fontconfig/fc-lang/za.orth @@ -0,0 +1,39 @@ +# +# fontconfig/fc-lang/za.orth +# +# Copyright © 2009 Roozbeh Pournader +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of the author(s) not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. The author(s) make(s) no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIM(S) ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Zhuang/Chuang (za) +# +# Sources: +# * http://www.omniglot.com/writing/zhuang.htm +# * http://www006.upp.so-net.ne.jp/FFS/zhuangyu_ch01.htm +# * http://en.wikipedia.org/wiki/Zhuang_language +# +# There is an older orthography with several uncommon letters that was +# reformed in 1986. In the 1986 orthography, just basic Latin letters are +# used. +# +# Some letters are not used. Apostrophe is used, but usage is comparable to +# usage in English. +# +0041-005A +0061-007A diff --git a/fontconfig/fc-lang/zh_cn.orth b/fontconfig/fc-lang/zh_cn.orth new file mode 100644 index 000000000..6438869ae --- /dev/null +++ b/fontconfig/fc-lang/zh_cn.orth @@ -0,0 +1,6792 @@ +# +# fontconfig/fc-lang/zh_cn.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chinese (simplified) (ZH-CN) +# +# Coverage computed from GB2312 +# +0x02C7 # CARON (Mandarin Chinese third tone) +0x02C9 # MODIFIER LETTER MACRON (Mandarin Chinese first tone) +0x4E00 # <CJK> +0x4E01 # <CJK> +0x4E03 # <CJK> +0x4E07 # <CJK> +0x4E08 # <CJK> +0x4E09 # <CJK> +0x4E0A # <CJK> +0x4E0B # <CJK> +0x4E0C # <CJK> +0x4E0D # <CJK> +0x4E0E # <CJK> +0x4E10 # <CJK> +0x4E11 # <CJK> +0x4E13 # <CJK> +0x4E14 # <CJK> +0x4E15 # <CJK> +0x4E16 # <CJK> +0x4E18 # <CJK> +0x4E19 # <CJK> +0x4E1A # <CJK> +0x4E1B # <CJK> +0x4E1C # <CJK> +0x4E1D # <CJK> +0x4E1E # <CJK> +0x4E22 # <CJK> +0x4E24 # <CJK> +0x4E25 # <CJK> +0x4E27 # <CJK> +0x4E28 # <CJK> +0x4E2A # <CJK> +0x4E2B # <CJK> +0x4E2C # <CJK> +0x4E2D # <CJK> +0x4E30 # <CJK> +0x4E32 # <CJK> +0x4E34 # <CJK> +0x4E36 # <CJK> +0x4E38 # <CJK> +0x4E39 # <CJK> +0x4E3A # <CJK> +0x4E3B # <CJK> +0x4E3D # <CJK> +0x4E3E # <CJK> +0x4E3F # <CJK> +0x4E43 # <CJK> +0x4E45 # <CJK> +0x4E47 # <CJK> +0x4E48 # <CJK> +0x4E49 # <CJK> +0x4E4B # <CJK> +0x4E4C # <CJK> +0x4E4D # <CJK> +0x4E4E # <CJK> +0x4E4F # <CJK> +0x4E50 # <CJK> +0x4E52 # <CJK> +0x4E53 # <CJK> +0x4E54 # <CJK> +0x4E56 # <CJK> +0x4E58 # <CJK> +0x4E59 # <CJK> +0x4E5C # <CJK> +0x4E5D # <CJK> +0x4E5E # <CJK> +0x4E5F # <CJK> +0x4E60 # <CJK> +0x4E61 # <CJK> +0x4E66 # <CJK> +0x4E69 # <CJK> +0x4E70 # <CJK> +0x4E71 # <CJK> +0x4E73 # <CJK> +0x4E7E # <CJK> +0x4E86 # <CJK> +0x4E88 # <CJK> +0x4E89 # <CJK> +0x4E8B # <CJK> +0x4E8C # <CJK> +0x4E8D # <CJK> +0x4E8E # <CJK> +0x4E8F # <CJK> +0x4E91 # <CJK> +0x4E92 # <CJK> +0x4E93 # <CJK> +0x4E94 # <CJK> +0x4E95 # <CJK> +0x4E98 # <CJK> +0x4E9A # <CJK> +0x4E9B # <CJK> +0x4E9F # <CJK> +0x4EA0 # <CJK> +0x4EA1 # <CJK> +0x4EA2 # <CJK> +0x4EA4 # <CJK> +0x4EA5 # <CJK> +0x4EA6 # <CJK> +0x4EA7 # <CJK> +0x4EA8 # <CJK> +0x4EA9 # <CJK> +0x4EAB # <CJK> +0x4EAC # <CJK> +0x4EAD # <CJK> +0x4EAE # <CJK> +0x4EB2 # <CJK> +0x4EB3 # <CJK> +0x4EB5 # <CJK> +0x4EBA # <CJK> +0x4EBB # <CJK> +0x4EBF # <CJK> +0x4EC0 # <CJK> +0x4EC1 # <CJK> +0x4EC2 # <CJK> +0x4EC3 # <CJK> +0x4EC4 # <CJK> +0x4EC5 # <CJK> +0x4EC6 # <CJK> +0x4EC7 # <CJK> +0x4EC9 # <CJK> +0x4ECA # <CJK> +0x4ECB # <CJK> +0x4ECD # <CJK> +0x4ECE # <CJK> +0x4ED1 # <CJK> +0x4ED3 # <CJK> +0x4ED4 # <CJK> +0x4ED5 # <CJK> +0x4ED6 # <CJK> +0x4ED7 # <CJK> +0x4ED8 # <CJK> +0x4ED9 # <CJK> +0x4EDD # <CJK> +0x4EDE # <CJK> +0x4EDF # <CJK> +0x4EE1 # <CJK> +0x4EE3 # <CJK> +0x4EE4 # <CJK> +0x4EE5 # <CJK> +0x4EE8 # <CJK> +0x4EEA # <CJK> +0x4EEB # <CJK> +0x4EEC # <CJK> +0x4EF0 # <CJK> +0x4EF2 # <CJK> +0x4EF3 # <CJK> +0x4EF5 # <CJK> +0x4EF6 # <CJK> +0x4EF7 # <CJK> +0x4EFB # <CJK> +0x4EFD # <CJK> +0x4EFF # <CJK> +0x4F01 # <CJK> +0x4F09 # <CJK> +0x4F0A # <CJK> +0x4F0D # <CJK> +0x4F0E # <CJK> +0x4F0F # <CJK> +0x4F10 # <CJK> +0x4F11 # <CJK> +0x4F17 # <CJK> +0x4F18 # <CJK> +0x4F19 # <CJK> +0x4F1A # <CJK> +0x4F1B # <CJK> +0x4F1E # <CJK> +0x4F1F # <CJK> +0x4F20 # <CJK> +0x4F22 # <CJK> +0x4F24 # <CJK> +0x4F25 # <CJK> +0x4F26 # <CJK> +0x4F27 # <CJK> +0x4F2A # <CJK> +0x4F2B # <CJK> +0x4F2F # <CJK> +0x4F30 # <CJK> +0x4F32 # <CJK> +0x4F34 # <CJK> +0x4F36 # <CJK> +0x4F38 # <CJK> +0x4F3A # <CJK> +0x4F3C # <CJK> +0x4F3D # <CJK> +0x4F43 # <CJK> +0x4F46 # <CJK> +0x4F4D # <CJK> +0x4F4E # <CJK> +0x4F4F # <CJK> +0x4F50 # <CJK> +0x4F51 # <CJK> +0x4F53 # <CJK> +0x4F55 # <CJK> +0x4F57 # <CJK> +0x4F58 # <CJK> +0x4F59 # <CJK> +0x4F5A # <CJK> +0x4F5B # <CJK> +0x4F5C # <CJK> +0x4F5D # <CJK> +0x4F5E # <CJK> +0x4F5F # <CJK> +0x4F60 # <CJK> +0x4F63 # <CJK> +0x4F64 # <CJK> +0x4F65 # <CJK> +0x4F67 # <CJK> +0x4F69 # <CJK> +0x4F6C # <CJK> +0x4F6F # <CJK> +0x4F70 # <CJK> +0x4F73 # <CJK> +0x4F74 # <CJK> +0x4F76 # <CJK> +0x4F7B # <CJK> +0x4F7C # <CJK> +0x4F7E # <CJK> +0x4F7F # <CJK> +0x4F83 # <CJK> +0x4F84 # <CJK> +0x4F88 # <CJK> +0x4F89 # <CJK> +0x4F8B # <CJK> +0x4F8D # <CJK> +0x4F8F # <CJK> +0x4F91 # <CJK> +0x4F94 # <CJK> +0x4F97 # <CJK> +0x4F9B # <CJK> +0x4F9D # <CJK> +0x4FA0 # <CJK> +0x4FA3 # <CJK> +0x4FA5 # <CJK> +0x4FA6 # <CJK> +0x4FA7 # <CJK> +0x4FA8 # <CJK> +0x4FA9 # <CJK> +0x4FAA # <CJK> +0x4FAC # <CJK> +0x4FAE # <CJK> +0x4FAF # <CJK> +0x4FB5 # <CJK> +0x4FBF # <CJK> +0x4FC3 # <CJK> +0x4FC4 # <CJK> +0x4FC5 # <CJK> +0x4FCA # <CJK> +0x4FCE # <CJK> +0x4FCF # <CJK> +0x4FD0 # <CJK> +0x4FD1 # <CJK> +0x4FD7 # <CJK> +0x4FD8 # <CJK> +0x4FDA # <CJK> +0x4FDC # <CJK> +0x4FDD # <CJK> +0x4FDE # <CJK> +0x4FDF # <CJK> +0x4FE1 # <CJK> +0x4FE3 # <CJK> +0x4FE6 # <CJK> +0x4FE8 # <CJK> +0x4FE9 # <CJK> +0x4FEA # <CJK> +0x4FED # <CJK> +0x4FEE # <CJK> +0x4FEF # <CJK> +0x4FF1 # <CJK> +0x4FF3 # <CJK> +0x4FF8 # <CJK> +0x4FFA # <CJK> +0x4FFE # <CJK> +0x500C # <CJK> +0x500D # <CJK> +0x500F # <CJK> +0x5012 # <CJK> +0x5014 # <CJK> +0x5018 # <CJK> +0x5019 # <CJK> +0x501A # <CJK> +0x501C # <CJK> +0x501F # <CJK> +0x5021 # <CJK> +0x5025 # <CJK> +0x5026 # <CJK> +0x5028 # <CJK> +0x5029 # <CJK> +0x502A # <CJK> +0x502C # <CJK> +0x502D # <CJK> +0x502E # <CJK> +0x503A # <CJK> +0x503C # <CJK> +0x503E # <CJK> +0x5043 # <CJK> +0x5047 # <CJK> +0x5048 # <CJK> +0x504C # <CJK> +0x504E # <CJK> +0x504F # <CJK> +0x5055 # <CJK> +0x505A # <CJK> +0x505C # <CJK> +0x5065 # <CJK> +0x506C # <CJK> +0x5076 # <CJK> +0x5077 # <CJK> +0x507B # <CJK> +0x507E # <CJK> +0x507F # <CJK> +0x5080 # <CJK> +0x5085 # <CJK> +0x5088 # <CJK> +0x508D # <CJK> +0x50A3 # <CJK> +0x50A5 # <CJK> +0x50A7 # <CJK> +0x50A8 # <CJK> +0x50A9 # <CJK> +0x50AC # <CJK> +0x50B2 # <CJK> +0x50BA # <CJK> +0x50BB # <CJK> +0x50CF # <CJK> +0x50D6 # <CJK> +0x50DA # <CJK> +0x50E6 # <CJK> +0x50E7 # <CJK> +0x50EC # <CJK> +0x50ED # <CJK> +0x50EE # <CJK> +0x50F3 # <CJK> +0x50F5 # <CJK> +0x50FB # <CJK> +0x5106 # <CJK> +0x5107 # <CJK> +0x510B # <CJK> +0x5112 # <CJK> +0x5121 # <CJK> +0x513F # <CJK> +0x5140 # <CJK> +0x5141 # <CJK> +0x5143 # <CJK> +0x5144 # <CJK> +0x5145 # <CJK> +0x5146 # <CJK> +0x5148 # <CJK> +0x5149 # <CJK> +0x514B # <CJK> +0x514D # <CJK> +0x5151 # <CJK> +0x5154 # <CJK> +0x5155 # <CJK> +0x5156 # <CJK> +0x515A # <CJK> +0x515C # <CJK> +0x5162 # <CJK> +0x5165 # <CJK> +0x5168 # <CJK> +0x516B # <CJK> +0x516C # <CJK> +0x516D # <CJK> +0x516E # <CJK> +0x5170 # <CJK> +0x5171 # <CJK> +0x5173 # <CJK> +0x5174 # <CJK> +0x5175 # <CJK> +0x5176 # <CJK> +0x5177 # <CJK> +0x5178 # <CJK> +0x5179 # <CJK> +0x517B # <CJK> +0x517C # <CJK> +0x517D # <CJK> +0x5180 # <CJK> +0x5181 # <CJK> +0x5182 # <CJK> +0x5185 # <CJK> +0x5188 # <CJK> +0x5189 # <CJK> +0x518C # <CJK> +0x518D # <CJK> +0x5192 # <CJK> +0x5195 # <CJK> +0x5196 # <CJK> +0x5197 # <CJK> +0x5199 # <CJK> +0x519B # <CJK> +0x519C # <CJK> +0x51A0 # <CJK> +0x51A2 # <CJK> +0x51A4 # <CJK> +0x51A5 # <CJK> +0x51AB # <CJK> +0x51AC # <CJK> +0x51AF # <CJK> +0x51B0 # <CJK> +0x51B1 # <CJK> +0x51B2 # <CJK> +0x51B3 # <CJK> +0x51B5 # <CJK> +0x51B6 # <CJK> +0x51B7 # <CJK> +0x51BB # <CJK> +0x51BC # <CJK> +0x51BD # <CJK> +0x51C0 # <CJK> +0x51C4 # <CJK> +0x51C6 # <CJK> +0x51C7 # <CJK> +0x51C9 # <CJK> +0x51CB # <CJK> +0x51CC # <CJK> +0x51CF # <CJK> +0x51D1 # <CJK> +0x51DB # <CJK> +0x51DD # <CJK> +0x51E0 # <CJK> +0x51E1 # <CJK> +0x51E4 # <CJK> +0x51EB # <CJK> +0x51ED # <CJK> +0x51EF # <CJK> +0x51F0 # <CJK> +0x51F3 # <CJK> +0x51F5 # <CJK> +0x51F6 # <CJK> +0x51F8 # <CJK> +0x51F9 # <CJK> +0x51FA # <CJK> +0x51FB # <CJK> +0x51FC # <CJK> +0x51FD # <CJK> +0x51FF # <CJK> +0x5200 # <CJK> +0x5201 # <CJK> +0x5202 # <CJK> +0x5203 # <CJK> +0x5206 # <CJK> +0x5207 # <CJK> +0x5208 # <CJK> +0x520A # <CJK> +0x520D # <CJK> +0x520E # <CJK> +0x5211 # <CJK> +0x5212 # <CJK> +0x5216 # <CJK> +0x5217 # <CJK> +0x5218 # <CJK> +0x5219 # <CJK> +0x521A # <CJK> +0x521B # <CJK> +0x521D # <CJK> +0x5220 # <CJK> +0x5224 # <CJK> +0x5228 # <CJK> +0x5229 # <CJK> +0x522B # <CJK> +0x522D # <CJK> +0x522E # <CJK> +0x5230 # <CJK> +0x5233 # <CJK> +0x5236 # <CJK> +0x5237 # <CJK> +0x5238 # <CJK> +0x5239 # <CJK> +0x523A # <CJK> +0x523B # <CJK> +0x523D # <CJK> +0x523F # <CJK> +0x5240 # <CJK> +0x5241 # <CJK> +0x5242 # <CJK> +0x5243 # <CJK> +0x524A # <CJK> +0x524C # <CJK> +0x524D # <CJK> +0x5250 # <CJK> +0x5251 # <CJK> +0x5254 # <CJK> +0x5256 # <CJK> +0x525C # <CJK> +0x525E # <CJK> +0x5261 # <CJK> +0x5265 # <CJK> +0x5267 # <CJK> +0x5269 # <CJK> +0x526A # <CJK> +0x526F # <CJK> +0x5272 # <CJK> +0x527D # <CJK> +0x527F # <CJK> +0x5281 # <CJK> +0x5282 # <CJK> +0x5288 # <CJK> +0x5290 # <CJK> +0x5293 # <CJK> +0x529B # <CJK> +0x529D # <CJK> +0x529E # <CJK> +0x529F # <CJK> +0x52A0 # <CJK> +0x52A1 # <CJK> +0x52A2 # <CJK> +0x52A3 # <CJK> +0x52A8 # <CJK> +0x52A9 # <CJK> +0x52AA # <CJK> +0x52AB # <CJK> +0x52AC # <CJK> +0x52AD # <CJK> +0x52B1 # <CJK> +0x52B2 # <CJK> +0x52B3 # <CJK> +0x52BE # <CJK> +0x52BF # <CJK> +0x52C3 # <CJK> +0x52C7 # <CJK> +0x52C9 # <CJK> +0x52CB # <CJK> +0x52D0 # <CJK> +0x52D2 # <CJK> +0x52D6 # <CJK> +0x52D8 # <CJK> +0x52DF # <CJK> +0x52E4 # <CJK> +0x52F0 # <CJK> +0x52F9 # <CJK> +0x52FA # <CJK> +0x52FE # <CJK> +0x52FF # <CJK> +0x5300 # <CJK> +0x5305 # <CJK> +0x5306 # <CJK> +0x5308 # <CJK> +0x530D # <CJK> +0x530F # <CJK> +0x5310 # <CJK> +0x5315 # <CJK> +0x5316 # <CJK> +0x5317 # <CJK> +0x5319 # <CJK> +0x531A # <CJK> +0x531D # <CJK> +0x5320 # <CJK> +0x5321 # <CJK> +0x5323 # <CJK> +0x5326 # <CJK> +0x532A # <CJK> +0x532E # <CJK> +0x5339 # <CJK> +0x533A # <CJK> +0x533B # <CJK> +0x533E # <CJK> +0x533F # <CJK> +0x5341 # <CJK> +0x5343 # <CJK> +0x5345 # <CJK> +0x5347 # <CJK> +0x5348 # <CJK> +0x5349 # <CJK> +0x534A # <CJK> +0x534E # <CJK> +0x534F # <CJK> +0x5351 # <CJK> +0x5352 # <CJK> +0x5353 # <CJK> +0x5355 # <CJK> +0x5356 # <CJK> +0x5357 # <CJK> +0x535A # <CJK> +0x535C # <CJK> +0x535E # <CJK> +0x535F # <CJK> +0x5360 # <CJK> +0x5361 # <CJK> +0x5362 # <CJK> +0x5363 # <CJK> +0x5364 # <CJK> +0x5366 # <CJK> +0x5367 # <CJK> +0x5369 # <CJK> +0x536B # <CJK> +0x536E # <CJK> +0x536F # <CJK> +0x5370 # <CJK> +0x5371 # <CJK> +0x5373 # <CJK> +0x5374 # <CJK> +0x5375 # <CJK> +0x5377 # <CJK> +0x5378 # <CJK> +0x537A # <CJK> +0x537F # <CJK> +0x5382 # <CJK> +0x5384 # <CJK> +0x5385 # <CJK> +0x5386 # <CJK> +0x5389 # <CJK> +0x538B # <CJK> +0x538C # <CJK> +0x538D # <CJK> +0x5395 # <CJK> +0x5398 # <CJK> +0x539A # <CJK> +0x539D # <CJK> +0x539F # <CJK> +0x53A2 # <CJK> +0x53A3 # <CJK> +0x53A5 # <CJK> +0x53A6 # <CJK> +0x53A8 # <CJK> +0x53A9 # <CJK> +0x53AE # <CJK> +0x53B6 # <CJK> +0x53BB # <CJK> +0x53BF # <CJK> +0x53C1 # <CJK> +0x53C2 # <CJK> +0x53C8 # <CJK> +0x53C9 # <CJK> +0x53CA # <CJK> +0x53CB # <CJK> +0x53CC # <CJK> +0x53CD # <CJK> +0x53D1 # <CJK> +0x53D4 # <CJK> +0x53D6 # <CJK> +0x53D7 # <CJK> +0x53D8 # <CJK> +0x53D9 # <CJK> +0x53DB # <CJK> +0x53DF # <CJK> +0x53E0 # <CJK> +0x53E3 # <CJK> +0x53E4 # <CJK> +0x53E5 # <CJK> +0x53E6 # <CJK> +0x53E8 # <CJK> +0x53E9 # <CJK> +0x53EA # <CJK> +0x53EB # <CJK> +0x53EC # <CJK> +0x53ED # <CJK> +0x53EE # <CJK> +0x53EF # <CJK> +0x53F0 # <CJK> +0x53F1 # <CJK> +0x53F2 # <CJK> +0x53F3 # <CJK> +0x53F5 # <CJK> +0x53F6 # <CJK> +0x53F7 # <CJK> +0x53F8 # <CJK> +0x53F9 # <CJK> +0x53FB # <CJK> +0x53FC # <CJK> +0x53FD # <CJK> +0x5401 # <CJK> +0x5403 # <CJK> +0x5404 # <CJK> +0x5406 # <CJK> +0x5408 # <CJK> +0x5409 # <CJK> +0x540A # <CJK> +0x540C # <CJK> +0x540D # <CJK> +0x540E # <CJK> +0x540F # <CJK> +0x5410 # <CJK> +0x5411 # <CJK> +0x5412 # <CJK> +0x5413 # <CJK> +0x5415 # <CJK> +0x5416 # <CJK> +0x5417 # <CJK> +0x541B # <CJK> +0x541D # <CJK> +0x541E # <CJK> +0x541F # <CJK> +0x5420 # <CJK> +0x5421 # <CJK> +0x5423 # <CJK> +0x5426 # <CJK> +0x5427 # <CJK> +0x5428 # <CJK> +0x5429 # <CJK> +0x542B # <CJK> +0x542C # <CJK> +0x542D # <CJK> +0x542E # <CJK> +0x542F # <CJK> +0x5431 # <CJK> +0x5432 # <CJK> +0x5434 # <CJK> +0x5435 # <CJK> +0x5438 # <CJK> +0x5439 # <CJK> +0x543B # <CJK> +0x543C # <CJK> +0x543E # <CJK> +0x5440 # <CJK> +0x5443 # <CJK> +0x5446 # <CJK> +0x5448 # <CJK> +0x544A # <CJK> +0x544B # <CJK> +0x5450 # <CJK> +0x5452 # <CJK> +0x5453 # <CJK> +0x5454 # <CJK> +0x5455 # <CJK> +0x5456 # <CJK> +0x5457 # <CJK> +0x5458 # <CJK> +0x5459 # <CJK> +0x545B # <CJK> +0x545C # <CJK> +0x5462 # <CJK> +0x5464 # <CJK> +0x5466 # <CJK> +0x5468 # <CJK> +0x5471 # <CJK> +0x5472 # <CJK> +0x5473 # <CJK> +0x5475 # <CJK> +0x5476 # <CJK> +0x5477 # <CJK> +0x5478 # <CJK> +0x547B # <CJK> +0x547C # <CJK> +0x547D # <CJK> +0x5480 # <CJK> +0x5482 # <CJK> +0x5484 # <CJK> +0x5486 # <CJK> +0x548B # <CJK> +0x548C # <CJK> +0x548E # <CJK> +0x548F # <CJK> +0x5490 # <CJK> +0x5492 # <CJK> +0x5494 # <CJK> +0x5495 # <CJK> +0x5496 # <CJK> +0x5499 # <CJK> +0x549A # <CJK> +0x549B # <CJK> +0x549D # <CJK> +0x54A3 # <CJK> +0x54A4 # <CJK> +0x54A6 # <CJK> +0x54A7 # <CJK> +0x54A8 # <CJK> +0x54A9 # <CJK> +0x54AA # <CJK> +0x54AB # <CJK> +0x54AC # <CJK> +0x54AD # <CJK> +0x54AF # <CJK> +0x54B1 # <CJK> +0x54B3 # <CJK> +0x54B4 # <CJK> +0x54B8 # <CJK> +0x54BB # <CJK> +0x54BD # <CJK> +0x54BF # <CJK> +0x54C0 # <CJK> +0x54C1 # <CJK> +0x54C2 # <CJK> +0x54C4 # <CJK> +0x54C6 # <CJK> +0x54C7 # <CJK> +0x54C8 # <CJK> +0x54C9 # <CJK> +0x54CC # <CJK> +0x54CD # <CJK> +0x54CE # <CJK> +0x54CF # <CJK> +0x54D0 # <CJK> +0x54D1 # <CJK> +0x54D2 # <CJK> +0x54D3 # <CJK> +0x54D4 # <CJK> +0x54D5 # <CJK> +0x54D7 # <CJK> +0x54D9 # <CJK> +0x54DA # <CJK> +0x54DC # <CJK> +0x54DD # <CJK> +0x54DE # <CJK> +0x54DF # <CJK> +0x54E5 # <CJK> +0x54E6 # <CJK> +0x54E7 # <CJK> +0x54E8 # <CJK> +0x54E9 # <CJK> +0x54EA # <CJK> +0x54ED # <CJK> +0x54EE # <CJK> +0x54F2 # <CJK> +0x54F3 # <CJK> +0x54FA # <CJK> +0x54FC # <CJK> +0x54FD # <CJK> +0x54FF # <CJK> +0x5501 # <CJK> +0x5506 # <CJK> +0x5507 # <CJK> +0x5509 # <CJK> +0x550F # <CJK> +0x5510 # <CJK> +0x5511 # <CJK> +0x5514 # <CJK> +0x551B # <CJK> +0x5520 # <CJK> +0x5522 # <CJK> +0x5523 # <CJK> +0x5524 # <CJK> +0x5527 # <CJK> +0x552A # <CJK> +0x552C # <CJK> +0x552E # <CJK> +0x552F # <CJK> +0x5530 # <CJK> +0x5531 # <CJK> +0x5533 # <CJK> +0x5537 # <CJK> +0x553C # <CJK> +0x553E # <CJK> +0x553F # <CJK> +0x5541 # <CJK> +0x5543 # <CJK> +0x5544 # <CJK> +0x5546 # <CJK> +0x5549 # <CJK> +0x554A # <CJK> +0x5550 # <CJK> +0x5555 # <CJK> +0x5556 # <CJK> +0x555C # <CJK> +0x5561 # <CJK> +0x5564 # <CJK> +0x5565 # <CJK> +0x5566 # <CJK> +0x5567 # <CJK> +0x556A # <CJK> +0x556C # <CJK> +0x556D # <CJK> +0x556E # <CJK> +0x5575 # <CJK> +0x5576 # <CJK> +0x5577 # <CJK> +0x5578 # <CJK> +0x557B # <CJK> +0x557C # <CJK> +0x557E # <CJK> +0x5580 # <CJK> +0x5581 # <CJK> +0x5582 # <CJK> +0x5583 # <CJK> +0x5584 # <CJK> +0x5587 # <CJK> +0x5588 # <CJK> +0x5589 # <CJK> +0x558A # <CJK> +0x558B # <CJK> +0x558F # <CJK> +0x5591 # <CJK> +0x5594 # <CJK> +0x5598 # <CJK> +0x5599 # <CJK> +0x559C # <CJK> +0x559D # <CJK> +0x559F # <CJK> +0x55A7 # <CJK> +0x55B1 # <CJK> +0x55B3 # <CJK> +0x55B5 # <CJK> +0x55B7 # <CJK> +0x55B9 # <CJK> +0x55BB # <CJK> +0x55BD # <CJK> +0x55BE # <CJK> +0x55C4 # <CJK> +0x55C5 # <CJK> +0x55C9 # <CJK> +0x55CC # <CJK> +0x55CD # <CJK> +0x55D1 # <CJK> +0x55D2 # <CJK> +0x55D3 # <CJK> +0x55D4 # <CJK> +0x55D6 # <CJK> +0x55DC # <CJK> +0x55DD # <CJK> +0x55DF # <CJK> +0x55E1 # <CJK> +0x55E3 # <CJK> +0x55E4 # <CJK> +0x55E5 # <CJK> +0x55E6 # <CJK> +0x55E8 # <CJK> +0x55EA # <CJK> +0x55EB # <CJK> +0x55EC # <CJK> +0x55EF # <CJK> +0x55F2 # <CJK> +0x55F3 # <CJK> +0x55F5 # <CJK> +0x55F7 # <CJK> +0x55FD # <CJK> +0x55FE # <CJK> +0x5600 # <CJK> +0x5601 # <CJK> +0x5608 # <CJK> +0x5609 # <CJK> +0x560C # <CJK> +0x560E # <CJK> +0x560F # <CJK> +0x5618 # <CJK> +0x561B # <CJK> +0x561E # <CJK> +0x561F # <CJK> +0x5623 # <CJK> +0x5624 # <CJK> +0x5627 # <CJK> +0x562C # <CJK> +0x562D # <CJK> +0x5631 # <CJK> +0x5632 # <CJK> +0x5634 # <CJK> +0x5636 # <CJK> +0x5639 # <CJK> +0x563B # <CJK> +0x563F # <CJK> +0x564C # <CJK> +0x564D # <CJK> +0x564E # <CJK> +0x5654 # <CJK> +0x5657 # <CJK> +0x5658 # <CJK> +0x5659 # <CJK> +0x565C # <CJK> +0x5662 # <CJK> +0x5664 # <CJK> +0x5668 # <CJK> +0x5669 # <CJK> +0x566A # <CJK> +0x566B # <CJK> +0x566C # <CJK> +0x5671 # <CJK> +0x5676 # <CJK> +0x567B # <CJK> +0x567C # <CJK> +0x5685 # <CJK> +0x5686 # <CJK> +0x568E # <CJK> +0x568F # <CJK> +0x5693 # <CJK> +0x56A3 # <CJK> +0x56AF # <CJK> +0x56B7 # <CJK> +0x56BC # <CJK> +0x56CA # <CJK> +0x56D4 # <CJK> +0x56D7 # <CJK> +0x56DA # <CJK> +0x56DB # <CJK> +0x56DD # <CJK> +0x56DE # <CJK> +0x56DF # <CJK> +0x56E0 # <CJK> +0x56E1 # <CJK> +0x56E2 # <CJK> +0x56E4 # <CJK> +0x56EB # <CJK> +0x56ED # <CJK> +0x56F0 # <CJK> +0x56F1 # <CJK> +0x56F4 # <CJK> +0x56F5 # <CJK> +0x56F9 # <CJK> +0x56FA # <CJK> +0x56FD # <CJK> +0x56FE # <CJK> +0x56FF # <CJK> +0x5703 # <CJK> +0x5704 # <CJK> +0x5706 # <CJK> +0x5708 # <CJK> +0x5709 # <CJK> +0x570A # <CJK> +0x571C # <CJK> +0x571F # <CJK> +0x5723 # <CJK> +0x5728 # <CJK> +0x5729 # <CJK> +0x572A # <CJK> +0x572C # <CJK> +0x572D # <CJK> +0x572E # <CJK> +0x572F # <CJK> +0x5730 # <CJK> +0x5733 # <CJK> +0x5739 # <CJK> +0x573A # <CJK> +0x573B # <CJK> +0x573E # <CJK> +0x5740 # <CJK> +0x5742 # <CJK> +0x5747 # <CJK> +0x574A # <CJK> +0x574C # <CJK> +0x574D # <CJK> +0x574E # <CJK> +0x574F # <CJK> +0x5750 # <CJK> +0x5751 # <CJK> +0x5757 # <CJK> +0x575A # <CJK> +0x575B # <CJK> +0x575C # <CJK> +0x575D # <CJK> +0x575E # <CJK> +0x575F # <CJK> +0x5760 # <CJK> +0x5761 # <CJK> +0x5764 # <CJK> +0x5766 # <CJK> +0x5768 # <CJK> +0x5769 # <CJK> +0x576A # <CJK> +0x576B # <CJK> +0x576D # <CJK> +0x576F # <CJK> +0x5773 # <CJK> +0x5776 # <CJK> +0x5777 # <CJK> +0x577B # <CJK> +0x577C # <CJK> +0x5782 # <CJK> +0x5783 # <CJK> +0x5784 # <CJK> +0x5785 # <CJK> +0x5786 # <CJK> +0x578B # <CJK> +0x578C # <CJK> +0x5792 # <CJK> +0x5793 # <CJK> +0x579B # <CJK> +0x57A0 # <CJK> +0x57A1 # <CJK> +0x57A2 # <CJK> +0x57A3 # <CJK> +0x57A4 # <CJK> +0x57A6 # <CJK> +0x57A7 # <CJK> +0x57A9 # <CJK> +0x57AB # <CJK> +0x57AD # <CJK> +0x57AE # <CJK> +0x57B2 # <CJK> +0x57B4 # <CJK> +0x57B8 # <CJK> +0x57C2 # <CJK> +0x57C3 # <CJK> +0x57CB # <CJK> +0x57CE # <CJK> +0x57CF # <CJK> +0x57D2 # <CJK> +0x57D4 # <CJK> +0x57D5 # <CJK> +0x57D8 # <CJK> +0x57D9 # <CJK> +0x57DA # <CJK> +0x57DD # <CJK> +0x57DF # <CJK> +0x57E0 # <CJK> +0x57E4 # <CJK> +0x57ED # <CJK> +0x57EF # <CJK> +0x57F4 # <CJK> +0x57F8 # <CJK> +0x57F9 # <CJK> +0x57FA # <CJK> +0x57FD # <CJK> +0x5800 # <CJK> +0x5802 # <CJK> +0x5806 # <CJK> +0x5807 # <CJK> +0x580B # <CJK> +0x580D # <CJK> +0x5811 # <CJK> +0x5815 # <CJK> +0x5819 # <CJK> +0x581E # <CJK> +0x5820 # <CJK> +0x5821 # <CJK> +0x5824 # <CJK> +0x582A # <CJK> +0x5830 # <CJK> +0x5835 # <CJK> +0x5844 # <CJK> +0x584C # <CJK> +0x584D # <CJK> +0x5851 # <CJK> +0x5854 # <CJK> +0x5858 # <CJK> +0x585E # <CJK> +0x5865 # <CJK> +0x586B # <CJK> +0x586C # <CJK> +0x587E # <CJK> +0x5880 # <CJK> +0x5881 # <CJK> +0x5883 # <CJK> +0x5885 # <CJK> +0x5889 # <CJK> +0x5892 # <CJK> +0x5893 # <CJK> +0x5899 # <CJK> +0x589A # <CJK> +0x589E # <CJK> +0x589F # <CJK> +0x58A8 # <CJK> +0x58A9 # <CJK> +0x58BC # <CJK> +0x58C1 # <CJK> +0x58C5 # <CJK> +0x58D1 # <CJK> +0x58D5 # <CJK> +0x58E4 # <CJK> +0x58EB # <CJK> +0x58EC # <CJK> +0x58EE # <CJK> +0x58F0 # <CJK> +0x58F3 # <CJK> +0x58F6 # <CJK> +0x58F9 # <CJK> +0x5902 # <CJK> +0x5904 # <CJK> +0x5907 # <CJK> +0x590D # <CJK> +0x590F # <CJK> +0x5914 # <CJK> +0x5915 # <CJK> +0x5916 # <CJK> +0x5919 # <CJK> +0x591A # <CJK> +0x591C # <CJK> +0x591F # <CJK> +0x5924 # <CJK> +0x5925 # <CJK> +0x5927 # <CJK> +0x5929 # <CJK> +0x592A # <CJK> +0x592B # <CJK> +0x592D # <CJK> +0x592E # <CJK> +0x592F # <CJK> +0x5931 # <CJK> +0x5934 # <CJK> +0x5937 # <CJK> +0x5938 # <CJK> +0x5939 # <CJK> +0x593A # <CJK> +0x593C # <CJK> +0x5941 # <CJK> +0x5942 # <CJK> +0x5944 # <CJK> +0x5947 # <CJK> +0x5948 # <CJK> +0x5949 # <CJK> +0x594B # <CJK> +0x594E # <CJK> +0x594F # <CJK> +0x5951 # <CJK> +0x5954 # <CJK> +0x5955 # <CJK> +0x5956 # <CJK> +0x5957 # <CJK> +0x5958 # <CJK> +0x595A # <CJK> +0x5960 # <CJK> +0x5962 # <CJK> +0x5965 # <CJK> +0x5973 # <CJK> +0x5974 # <CJK> +0x5976 # <CJK> +0x5978 # <CJK> +0x5979 # <CJK> +0x597D # <CJK> +0x5981 # <CJK> +0x5982 # <CJK> +0x5983 # <CJK> +0x5984 # <CJK> +0x5986 # <CJK> +0x5987 # <CJK> +0x5988 # <CJK> +0x598A # <CJK> +0x598D # <CJK> +0x5992 # <CJK> +0x5993 # <CJK> +0x5996 # <CJK> +0x5997 # <CJK> +0x5999 # <CJK> +0x599E # <CJK> +0x59A3 # <CJK> +0x59A4 # <CJK> +0x59A5 # <CJK> +0x59A8 # <CJK> +0x59A9 # <CJK> +0x59AA # <CJK> +0x59AB # <CJK> +0x59AE # <CJK> +0x59AF # <CJK> +0x59B2 # <CJK> +0x59B9 # <CJK> +0x59BB # <CJK> +0x59BE # <CJK> +0x59C6 # <CJK> +0x59CA # <CJK> +0x59CB # <CJK> +0x59D0 # <CJK> +0x59D1 # <CJK> +0x59D2 # <CJK> +0x59D3 # <CJK> +0x59D4 # <CJK> +0x59D7 # <CJK> +0x59D8 # <CJK> +0x59DA # <CJK> +0x59DC # <CJK> +0x59DD # <CJK> +0x59E3 # <CJK> +0x59E5 # <CJK> +0x59E8 # <CJK> +0x59EC # <CJK> +0x59F9 # <CJK> +0x59FB # <CJK> +0x59FF # <CJK> +0x5A01 # <CJK> +0x5A03 # <CJK> +0x5A04 # <CJK> +0x5A05 # <CJK> +0x5A06 # <CJK> +0x5A07 # <CJK> +0x5A08 # <CJK> +0x5A09 # <CJK> +0x5A0C # <CJK> +0x5A11 # <CJK> +0x5A13 # <CJK> +0x5A18 # <CJK> +0x5A1C # <CJK> +0x5A1F # <CJK> +0x5A20 # <CJK> +0x5A23 # <CJK> +0x5A25 # <CJK> +0x5A29 # <CJK> +0x5A31 # <CJK> +0x5A32 # <CJK> +0x5A34 # <CJK> +0x5A36 # <CJK> +0x5A3C # <CJK> +0x5A40 # <CJK> +0x5A46 # <CJK> +0x5A49 # <CJK> +0x5A4A # <CJK> +0x5A55 # <CJK> +0x5A5A # <CJK> +0x5A62 # <CJK> +0x5A67 # <CJK> +0x5A6A # <CJK> +0x5A74 # <CJK> +0x5A75 # <CJK> +0x5A76 # <CJK> +0x5A77 # <CJK> +0x5A7A # <CJK> +0x5A7F # <CJK> +0x5A92 # <CJK> +0x5A9A # <CJK> +0x5A9B # <CJK> +0x5AAA # <CJK> +0x5AB2 # <CJK> +0x5AB3 # <CJK> +0x5AB5 # <CJK> +0x5AB8 # <CJK> +0x5ABE # <CJK> +0x5AC1 # <CJK> +0x5AC2 # <CJK> +0x5AC9 # <CJK> +0x5ACC # <CJK> +0x5AD2 # <CJK> +0x5AD4 # <CJK> +0x5AD6 # <CJK> +0x5AD8 # <CJK> +0x5ADC # <CJK> +0x5AE0 # <CJK> +0x5AE1 # <CJK> +0x5AE3 # <CJK> +0x5AE6 # <CJK> +0x5AE9 # <CJK> +0x5AEB # <CJK> +0x5AF1 # <CJK> +0x5B09 # <CJK> +0x5B16 # <CJK> +0x5B17 # <CJK> +0x5B32 # <CJK> +0x5B34 # <CJK> +0x5B37 # <CJK> +0x5B40 # <CJK> +0x5B50 # <CJK> +0x5B51 # <CJK> +0x5B53 # <CJK> +0x5B54 # <CJK> +0x5B55 # <CJK> +0x5B57 # <CJK> +0x5B58 # <CJK> +0x5B59 # <CJK> +0x5B5A # <CJK> +0x5B5B # <CJK> +0x5B5C # <CJK> +0x5B5D # <CJK> +0x5B5F # <CJK> +0x5B62 # <CJK> +0x5B63 # <CJK> +0x5B64 # <CJK> +0x5B65 # <CJK> +0x5B66 # <CJK> +0x5B69 # <CJK> +0x5B6A # <CJK> +0x5B6C # <CJK> +0x5B70 # <CJK> +0x5B71 # <CJK> +0x5B73 # <CJK> +0x5B75 # <CJK> +0x5B7A # <CJK> +0x5B7D # <CJK> +0x5B80 # <CJK> +0x5B81 # <CJK> +0x5B83 # <CJK> +0x5B84 # <CJK> +0x5B85 # <CJK> +0x5B87 # <CJK> +0x5B88 # <CJK> +0x5B89 # <CJK> +0x5B8B # <CJK> +0x5B8C # <CJK> +0x5B8F # <CJK> +0x5B93 # <CJK> +0x5B95 # <CJK> +0x5B97 # <CJK> +0x5B98 # <CJK> +0x5B99 # <CJK> +0x5B9A # <CJK> +0x5B9B # <CJK> +0x5B9C # <CJK> +0x5B9D # <CJK> +0x5B9E # <CJK> +0x5BA0 # <CJK> +0x5BA1 # <CJK> +0x5BA2 # <CJK> +0x5BA3 # <CJK> +0x5BA4 # <CJK> +0x5BA5 # <CJK> +0x5BA6 # <CJK> +0x5BAA # <CJK> +0x5BAB # <CJK> +0x5BB0 # <CJK> +0x5BB3 # <CJK> +0x5BB4 # <CJK> +0x5BB5 # <CJK> +0x5BB6 # <CJK> +0x5BB8 # <CJK> +0x5BB9 # <CJK> +0x5BBD # <CJK> +0x5BBE # <CJK> +0x5BBF # <CJK> +0x5BC2 # <CJK> +0x5BC4 # <CJK> +0x5BC5 # <CJK> +0x5BC6 # <CJK> +0x5BC7 # <CJK> +0x5BCC # <CJK> +0x5BD0 # <CJK> +0x5BD2 # <CJK> +0x5BD3 # <CJK> +0x5BDD # <CJK> +0x5BDE # <CJK> +0x5BDF # <CJK> +0x5BE1 # <CJK> +0x5BE4 # <CJK> +0x5BE5 # <CJK> +0x5BE8 # <CJK> +0x5BEE # <CJK> +0x5BF0 # <CJK> +0x5BF8 # <CJK> +0x5BF9 # <CJK> +0x5BFA # <CJK> +0x5BFB # <CJK> +0x5BFC # <CJK> +0x5BFF # <CJK> +0x5C01 # <CJK> +0x5C04 # <CJK> +0x5C06 # <CJK> +0x5C09 # <CJK> +0x5C0A # <CJK> +0x5C0F # <CJK> +0x5C11 # <CJK> +0x5C14 # <CJK> +0x5C15 # <CJK> +0x5C16 # <CJK> +0x5C18 # <CJK> +0x5C1A # <CJK> +0x5C1C # <CJK> +0x5C1D # <CJK> +0x5C22 # <CJK> +0x5C24 # <CJK> +0x5C25 # <CJK> +0x5C27 # <CJK> +0x5C2C # <CJK> +0x5C31 # <CJK> +0x5C34 # <CJK> +0x5C38 # <CJK> +0x5C39 # <CJK> +0x5C3A # <CJK> +0x5C3B # <CJK> +0x5C3C # <CJK> +0x5C3D # <CJK> +0x5C3E # <CJK> +0x5C3F # <CJK> +0x5C40 # <CJK> +0x5C41 # <CJK> +0x5C42 # <CJK> +0x5C45 # <CJK> +0x5C48 # <CJK> +0x5C49 # <CJK> +0x5C4A # <CJK> +0x5C4B # <CJK> +0x5C4E # <CJK> +0x5C4F # <CJK> +0x5C50 # <CJK> +0x5C51 # <CJK> +0x5C55 # <CJK> +0x5C59 # <CJK> +0x5C5E # <CJK> +0x5C60 # <CJK> +0x5C61 # <CJK> +0x5C63 # <CJK> +0x5C65 # <CJK> +0x5C66 # <CJK> +0x5C6E # <CJK> +0x5C6F # <CJK> +0x5C71 # <CJK> +0x5C79 # <CJK> +0x5C7A # <CJK> +0x5C7F # <CJK> +0x5C81 # <CJK> +0x5C82 # <CJK> +0x5C88 # <CJK> +0x5C8C # <CJK> +0x5C8D # <CJK> +0x5C90 # <CJK> +0x5C91 # <CJK> +0x5C94 # <CJK> +0x5C96 # <CJK> +0x5C97 # <CJK> +0x5C98 # <CJK> +0x5C99 # <CJK> +0x5C9A # <CJK> +0x5C9B # <CJK> +0x5C9C # <CJK> +0x5CA2 # <CJK> +0x5CA3 # <CJK> +0x5CA9 # <CJK> +0x5CAB # <CJK> +0x5CAC # <CJK> +0x5CAD # <CJK> +0x5CB1 # <CJK> +0x5CB3 # <CJK> +0x5CB5 # <CJK> +0x5CB7 # <CJK> +0x5CB8 # <CJK> +0x5CBD # <CJK> +0x5CBF # <CJK> +0x5CC1 # <CJK> +0x5CC4 # <CJK> +0x5CCB # <CJK> +0x5CD2 # <CJK> +0x5CD9 # <CJK> +0x5CE1 # <CJK> +0x5CE4 # <CJK> +0x5CE5 # <CJK> +0x5CE6 # <CJK> +0x5CE8 # <CJK> +0x5CEA # <CJK> +0x5CED # <CJK> +0x5CF0 # <CJK> +0x5CFB # <CJK> +0x5D02 # <CJK> +0x5D03 # <CJK> +0x5D06 # <CJK> +0x5D07 # <CJK> +0x5D0E # <CJK> +0x5D14 # <CJK> +0x5D16 # <CJK> +0x5D1B # <CJK> +0x5D1E # <CJK> +0x5D24 # <CJK> +0x5D26 # <CJK> +0x5D27 # <CJK> +0x5D29 # <CJK> +0x5D2D # <CJK> +0x5D2E # <CJK> +0x5D34 # <CJK> +0x5D3D # <CJK> +0x5D3E # <CJK> +0x5D47 # <CJK> +0x5D4A # <CJK> +0x5D4B # <CJK> +0x5D4C # <CJK> +0x5D58 # <CJK> +0x5D5B # <CJK> +0x5D5D # <CJK> +0x5D69 # <CJK> +0x5D6B # <CJK> +0x5D6C # <CJK> +0x5D6F # <CJK> +0x5D74 # <CJK> +0x5D82 # <CJK> +0x5D99 # <CJK> +0x5D9D # <CJK> +0x5DB7 # <CJK> +0x5DC5 # <CJK> +0x5DCD # <CJK> +0x5DDB # <CJK> +0x5DDD # <CJK> +0x5DDE # <CJK> +0x5DE1 # <CJK> +0x5DE2 # <CJK> +0x5DE5 # <CJK> +0x5DE6 # <CJK> +0x5DE7 # <CJK> +0x5DE8 # <CJK> +0x5DE9 # <CJK> +0x5DEB # <CJK> +0x5DEE # <CJK> +0x5DEF # <CJK> +0x5DF1 # <CJK> +0x5DF2 # <CJK> +0x5DF3 # <CJK> +0x5DF4 # <CJK> +0x5DF7 # <CJK> +0x5DFD # <CJK> +0x5DFE # <CJK> +0x5E01 # <CJK> +0x5E02 # <CJK> +0x5E03 # <CJK> +0x5E05 # <CJK> +0x5E06 # <CJK> +0x5E08 # <CJK> +0x5E0C # <CJK> +0x5E0F # <CJK> +0x5E10 # <CJK> +0x5E11 # <CJK> +0x5E14 # <CJK> +0x5E15 # <CJK> +0x5E16 # <CJK> +0x5E18 # <CJK> +0x5E19 # <CJK> +0x5E1A # <CJK> +0x5E1B # <CJK> +0x5E1C # <CJK> +0x5E1D # <CJK> +0x5E26 # <CJK> +0x5E27 # <CJK> +0x5E2D # <CJK> +0x5E2E # <CJK> +0x5E31 # <CJK> +0x5E37 # <CJK> +0x5E38 # <CJK> +0x5E3B # <CJK> +0x5E3C # <CJK> +0x5E3D # <CJK> +0x5E42 # <CJK> +0x5E44 # <CJK> +0x5E45 # <CJK> +0x5E4C # <CJK> +0x5E54 # <CJK> +0x5E55 # <CJK> +0x5E5B # <CJK> +0x5E5E # <CJK> +0x5E61 # <CJK> +0x5E62 # <CJK> +0x5E72 # <CJK> +0x5E73 # <CJK> +0x5E74 # <CJK> +0x5E76 # <CJK> +0x5E78 # <CJK> +0x5E7A # <CJK> +0x5E7B # <CJK> +0x5E7C # <CJK> +0x5E7D # <CJK> +0x5E7F # <CJK> +0x5E80 # <CJK> +0x5E84 # <CJK> +0x5E86 # <CJK> +0x5E87 # <CJK> +0x5E8A # <CJK> +0x5E8B # <CJK> +0x5E8F # <CJK> +0x5E90 # <CJK> +0x5E91 # <CJK> +0x5E93 # <CJK> +0x5E94 # <CJK> +0x5E95 # <CJK> +0x5E96 # <CJK> +0x5E97 # <CJK> +0x5E99 # <CJK> +0x5E9A # <CJK> +0x5E9C # <CJK> +0x5E9E # <CJK> +0x5E9F # <CJK> +0x5EA0 # <CJK> +0x5EA5 # <CJK> +0x5EA6 # <CJK> +0x5EA7 # <CJK> +0x5EAD # <CJK> +0x5EB3 # <CJK> +0x5EB5 # <CJK> +0x5EB6 # <CJK> +0x5EB7 # <CJK> +0x5EB8 # <CJK> +0x5EB9 # <CJK> +0x5EBE # <CJK> +0x5EC9 # <CJK> +0x5ECA # <CJK> +0x5ED1 # <CJK> +0x5ED2 # <CJK> +0x5ED3 # <CJK> +0x5ED6 # <CJK> +0x5EDB # <CJK> +0x5EE8 # <CJK> +0x5EEA # <CJK> +0x5EF4 # <CJK> +0x5EF6 # <CJK> +0x5EF7 # <CJK> +0x5EFA # <CJK> +0x5EFE # <CJK> +0x5EFF # <CJK> +0x5F00 # <CJK> +0x5F01 # <CJK> +0x5F02 # <CJK> +0x5F03 # <CJK> +0x5F04 # <CJK> +0x5F08 # <CJK> +0x5F0A # <CJK> +0x5F0B # <CJK> +0x5F0F # <CJK> +0x5F11 # <CJK> +0x5F13 # <CJK> +0x5F15 # <CJK> +0x5F17 # <CJK> +0x5F18 # <CJK> +0x5F1B # <CJK> +0x5F1F # <CJK> +0x5F20 # <CJK> +0x5F25 # <CJK> +0x5F26 # <CJK> +0x5F27 # <CJK> +0x5F29 # <CJK> +0x5F2A # <CJK> +0x5F2D # <CJK> +0x5F2F # <CJK> +0x5F31 # <CJK> +0x5F39 # <CJK> +0x5F3A # <CJK> +0x5F3C # <CJK> +0x5F40 # <CJK> +0x5F50 # <CJK> +0x5F52 # <CJK> +0x5F53 # <CJK> +0x5F55 # <CJK> +0x5F56 # <CJK> +0x5F57 # <CJK> +0x5F58 # <CJK> +0x5F5D # <CJK> +0x5F61 # <CJK> +0x5F62 # <CJK> +0x5F64 # <CJK> +0x5F66 # <CJK> +0x5F69 # <CJK> +0x5F6A # <CJK> +0x5F6C # <CJK> +0x5F6D # <CJK> +0x5F70 # <CJK> +0x5F71 # <CJK> +0x5F73 # <CJK> +0x5F77 # <CJK> +0x5F79 # <CJK> +0x5F7B # <CJK> +0x5F7C # <CJK> +0x5F80 # <CJK> +0x5F81 # <CJK> +0x5F82 # <CJK> +0x5F84 # <CJK> +0x5F85 # <CJK> +0x5F87 # <CJK> +0x5F88 # <CJK> +0x5F89 # <CJK> +0x5F8A # <CJK> +0x5F8B # <CJK> +0x5F8C # <CJK> +0x5F90 # <CJK> +0x5F92 # <CJK> +0x5F95 # <CJK> +0x5F97 # <CJK> +0x5F98 # <CJK> +0x5F99 # <CJK> +0x5F9C # <CJK> +0x5FA1 # <CJK> +0x5FA8 # <CJK> +0x5FAA # <CJK> +0x5FAD # <CJK> +0x5FAE # <CJK> +0x5FB5 # <CJK> +0x5FB7 # <CJK> +0x5FBC # <CJK> +0x5FBD # <CJK> +0x5FC3 # <CJK> +0x5FC4 # <CJK> +0x5FC5 # <CJK> +0x5FC6 # <CJK> +0x5FC9 # <CJK> +0x5FCC # <CJK> +0x5FCD # <CJK> +0x5FCF # <CJK> +0x5FD0 # <CJK> +0x5FD1 # <CJK> +0x5FD2 # <CJK> +0x5FD6 # <CJK> +0x5FD7 # <CJK> +0x5FD8 # <CJK> +0x5FD9 # <CJK> +0x5FDD # <CJK> +0x5FE0 # <CJK> +0x5FE1 # <CJK> +0x5FE4 # <CJK> +0x5FE7 # <CJK> +0x5FEA # <CJK> +0x5FEB # <CJK> +0x5FED # <CJK> +0x5FEE # <CJK> +0x5FF1 # <CJK> +0x5FF5 # <CJK> +0x5FF8 # <CJK> +0x5FFB # <CJK> +0x5FFD # <CJK> +0x5FFE # <CJK> +0x5FFF # <CJK> +0x6000 # <CJK> +0x6001 # <CJK> +0x6002 # <CJK> +0x6003 # <CJK> +0x6004 # <CJK> +0x6005 # <CJK> +0x6006 # <CJK> +0x600A # <CJK> +0x600D # <CJK> +0x600E # <CJK> +0x600F # <CJK> +0x6012 # <CJK> +0x6014 # <CJK> +0x6015 # <CJK> +0x6016 # <CJK> +0x6019 # <CJK> +0x601B # <CJK> +0x601C # <CJK> +0x601D # <CJK> +0x6020 # <CJK> +0x6021 # <CJK> +0x6025 # <CJK> +0x6026 # <CJK> +0x6027 # <CJK> +0x6028 # <CJK> +0x6029 # <CJK> +0x602A # <CJK> +0x602B # <CJK> +0x602F # <CJK> +0x6035 # <CJK> +0x603B # <CJK> +0x603C # <CJK> +0x603F # <CJK> +0x6041 # <CJK> +0x6042 # <CJK> +0x6043 # <CJK> +0x604B # <CJK> +0x604D # <CJK> +0x6050 # <CJK> +0x6052 # <CJK> +0x6055 # <CJK> +0x6059 # <CJK> +0x605A # <CJK> +0x605D # <CJK> +0x6062 # <CJK> +0x6063 # <CJK> +0x6064 # <CJK> +0x6067 # <CJK> +0x6068 # <CJK> +0x6069 # <CJK> +0x606A # <CJK> +0x606B # <CJK> +0x606C # <CJK> +0x606D # <CJK> +0x606F # <CJK> +0x6070 # <CJK> +0x6073 # <CJK> +0x6076 # <CJK> +0x6078 # <CJK> +0x6079 # <CJK> +0x607A # <CJK> +0x607B # <CJK> +0x607C # <CJK> +0x607D # <CJK> +0x607F # <CJK> +0x6083 # <CJK> +0x6084 # <CJK> +0x6089 # <CJK> +0x608C # <CJK> +0x608D # <CJK> +0x6092 # <CJK> +0x6094 # <CJK> +0x6096 # <CJK> +0x609A # <CJK> +0x609B # <CJK> +0x609D # <CJK> +0x609F # <CJK> +0x60A0 # <CJK> +0x60A3 # <CJK> +0x60A6 # <CJK> +0x60A8 # <CJK> +0x60AB # <CJK> +0x60AC # <CJK> +0x60AD # <CJK> +0x60AF # <CJK> +0x60B1 # <CJK> +0x60B2 # <CJK> +0x60B4 # <CJK> +0x60B8 # <CJK> +0x60BB # <CJK> +0x60BC # <CJK> +0x60C5 # <CJK> +0x60C6 # <CJK> +0x60CA # <CJK> +0x60CB # <CJK> +0x60D1 # <CJK> +0x60D5 # <CJK> +0x60D8 # <CJK> +0x60DA # <CJK> +0x60DC # <CJK> +0x60DD # <CJK> +0x60DF # <CJK> +0x60E0 # <CJK> +0x60E6 # <CJK> +0x60E7 # <CJK> +0x60E8 # <CJK> +0x60E9 # <CJK> +0x60EB # <CJK> +0x60EC # <CJK> +0x60ED # <CJK> +0x60EE # <CJK> +0x60EF # <CJK> +0x60F0 # <CJK> +0x60F3 # <CJK> +0x60F4 # <CJK> +0x60F6 # <CJK> +0x60F9 # <CJK> +0x60FA # <CJK> +0x6100 # <CJK> +0x6101 # <CJK> +0x6106 # <CJK> +0x6108 # <CJK> +0x6109 # <CJK> +0x610D # <CJK> +0x610E # <CJK> +0x610F # <CJK> +0x6115 # <CJK> +0x611A # <CJK> +0x611F # <CJK> +0x6120 # <CJK> +0x6123 # <CJK> +0x6124 # <CJK> +0x6126 # <CJK> +0x6127 # <CJK> +0x612B # <CJK> +0x613F # <CJK> +0x6148 # <CJK> +0x614A # <CJK> +0x614C # <CJK> +0x614E # <CJK> +0x6151 # <CJK> +0x6155 # <CJK> +0x615D # <CJK> +0x6162 # <CJK> +0x6167 # <CJK> +0x6168 # <CJK> +0x6170 # <CJK> +0x6175 # <CJK> +0x6177 # <CJK> +0x618B # <CJK> +0x618E # <CJK> +0x6194 # <CJK> +0x619D # <CJK> +0x61A7 # <CJK> +0x61A8 # <CJK> +0x61A9 # <CJK> +0x61AC # <CJK> +0x61B7 # <CJK> +0x61BE # <CJK> +0x61C2 # <CJK> +0x61C8 # <CJK> +0x61CA # <CJK> +0x61CB # <CJK> +0x61D1 # <CJK> +0x61D2 # <CJK> +0x61D4 # <CJK> +0x61E6 # <CJK> +0x61F5 # <CJK> +0x61FF # <CJK> +0x6206 # <CJK> +0x6208 # <CJK> +0x620A # <CJK> +0x620B # <CJK> +0x620C # <CJK> +0x620D # <CJK> +0x620E # <CJK> +0x620F # <CJK> +0x6210 # <CJK> +0x6211 # <CJK> +0x6212 # <CJK> +0x6215 # <CJK> +0x6216 # <CJK> +0x6217 # <CJK> +0x6218 # <CJK> +0x621A # <CJK> +0x621B # <CJK> +0x621F # <CJK> +0x6221 # <CJK> +0x6222 # <CJK> +0x6224 # <CJK> +0x6225 # <CJK> +0x622A # <CJK> +0x622C # <CJK> +0x622E # <CJK> +0x6233 # <CJK> +0x6234 # <CJK> +0x6237 # <CJK> +0x623D # <CJK> +0x623E # <CJK> +0x623F # <CJK> +0x6240 # <CJK> +0x6241 # <CJK> +0x6243 # <CJK> +0x6247 # <CJK> +0x6248 # <CJK> +0x6249 # <CJK> +0x624B # <CJK> +0x624C # <CJK> +0x624D # <CJK> +0x624E # <CJK> +0x6251 # <CJK> +0x6252 # <CJK> +0x6253 # <CJK> +0x6254 # <CJK> +0x6258 # <CJK> +0x625B # <CJK> +0x6263 # <CJK> +0x6266 # <CJK> +0x6267 # <CJK> +0x6269 # <CJK> +0x626A # <CJK> +0x626B # <CJK> +0x626C # <CJK> +0x626D # <CJK> +0x626E # <CJK> +0x626F # <CJK> +0x6270 # <CJK> +0x6273 # <CJK> +0x6276 # <CJK> +0x6279 # <CJK> +0x627C # <CJK> +0x627E # <CJK> +0x627F # <CJK> +0x6280 # <CJK> +0x6284 # <CJK> +0x6289 # <CJK> +0x628A # <CJK> +0x6291 # <CJK> +0x6292 # <CJK> +0x6293 # <CJK> +0x6295 # <CJK> +0x6296 # <CJK> +0x6297 # <CJK> +0x6298 # <CJK> +0x629A # <CJK> +0x629B # <CJK> +0x629F # <CJK> +0x62A0 # <CJK> +0x62A1 # <CJK> +0x62A2 # <CJK> +0x62A4 # <CJK> +0x62A5 # <CJK> +0x62A8 # <CJK> +0x62AB # <CJK> +0x62AC # <CJK> +0x62B1 # <CJK> +0x62B5 # <CJK> +0x62B9 # <CJK> +0x62BB # <CJK> +0x62BC # <CJK> +0x62BD # <CJK> +0x62BF # <CJK> +0x62C2 # <CJK> +0x62C4 # <CJK> +0x62C5 # <CJK> +0x62C6 # <CJK> +0x62C7 # <CJK> +0x62C8 # <CJK> +0x62C9 # <CJK> +0x62CA # <CJK> +0x62CC # <CJK> +0x62CD # <CJK> +0x62CE # <CJK> +0x62D0 # <CJK> +0x62D2 # <CJK> +0x62D3 # <CJK> +0x62D4 # <CJK> +0x62D6 # <CJK> +0x62D7 # <CJK> +0x62D8 # <CJK> +0x62D9 # <CJK> +0x62DA # <CJK> +0x62DB # <CJK> +0x62DC # <CJK> +0x62DF # <CJK> +0x62E2 # <CJK> +0x62E3 # <CJK> +0x62E5 # <CJK> +0x62E6 # <CJK> +0x62E7 # <CJK> +0x62E8 # <CJK> +0x62E9 # <CJK> +0x62EC # <CJK> +0x62ED # <CJK> +0x62EE # <CJK> +0x62EF # <CJK> +0x62F1 # <CJK> +0x62F3 # <CJK> +0x62F4 # <CJK> +0x62F6 # <CJK> +0x62F7 # <CJK> +0x62FC # <CJK> +0x62FD # <CJK> +0x62FE # <CJK> +0x62FF # <CJK> +0x6301 # <CJK> +0x6302 # <CJK> +0x6307 # <CJK> +0x6308 # <CJK> +0x6309 # <CJK> +0x630E # <CJK> +0x6311 # <CJK> +0x6316 # <CJK> +0x631A # <CJK> +0x631B # <CJK> +0x631D # <CJK> +0x631E # <CJK> +0x631F # <CJK> +0x6320 # <CJK> +0x6321 # <CJK> +0x6322 # <CJK> +0x6323 # <CJK> +0x6324 # <CJK> +0x6325 # <CJK> +0x6328 # <CJK> +0x632A # <CJK> +0x632B # <CJK> +0x632F # <CJK> +0x6332 # <CJK> +0x6339 # <CJK> +0x633A # <CJK> +0x633D # <CJK> +0x6342 # <CJK> +0x6343 # <CJK> +0x6345 # <CJK> +0x6346 # <CJK> +0x6349 # <CJK> +0x634B # <CJK> +0x634C # <CJK> +0x634D # <CJK> +0x634E # <CJK> +0x634F # <CJK> +0x6350 # <CJK> +0x6355 # <CJK> +0x635E # <CJK> +0x635F # <CJK> +0x6361 # <CJK> +0x6362 # <CJK> +0x6363 # <CJK> +0x6367 # <CJK> +0x6369 # <CJK> +0x636D # <CJK> +0x636E # <CJK> +0x6371 # <CJK> +0x6376 # <CJK> +0x6377 # <CJK> +0x637A # <CJK> +0x637B # <CJK> +0x6380 # <CJK> +0x6382 # <CJK> +0x6387 # <CJK> +0x6388 # <CJK> +0x6389 # <CJK> +0x638A # <CJK> +0x638C # <CJK> +0x638E # <CJK> +0x638F # <CJK> +0x6390 # <CJK> +0x6392 # <CJK> +0x6396 # <CJK> +0x6398 # <CJK> +0x63A0 # <CJK> +0x63A2 # <CJK> +0x63A3 # <CJK> +0x63A5 # <CJK> +0x63A7 # <CJK> +0x63A8 # <CJK> +0x63A9 # <CJK> +0x63AA # <CJK> +0x63AC # <CJK> +0x63AD # <CJK> +0x63AE # <CJK> +0x63B0 # <CJK> +0x63B3 # <CJK> +0x63B4 # <CJK> +0x63B7 # <CJK> +0x63B8 # <CJK> +0x63BA # <CJK> +0x63BC # <CJK> +0x63BE # <CJK> +0x63C4 # <CJK> +0x63C6 # <CJK> +0x63C9 # <CJK> +0x63CD # <CJK> +0x63CE # <CJK> +0x63CF # <CJK> +0x63D0 # <CJK> +0x63D2 # <CJK> +0x63D6 # <CJK> +0x63DE # <CJK> +0x63E0 # <CJK> +0x63E1 # <CJK> +0x63E3 # <CJK> +0x63E9 # <CJK> +0x63EA # <CJK> +0x63ED # <CJK> +0x63F2 # <CJK> +0x63F4 # <CJK> +0x63F6 # <CJK> +0x63F8 # <CJK> +0x63FD # <CJK> +0x63FF # <CJK> +0x6400 # <CJK> +0x6401 # <CJK> +0x6402 # <CJK> +0x6405 # <CJK> +0x640B # <CJK> +0x640C # <CJK> +0x640F # <CJK> +0x6410 # <CJK> +0x6413 # <CJK> +0x6414 # <CJK> +0x641B # <CJK> +0x641C # <CJK> +0x641E # <CJK> +0x6420 # <CJK> +0x6421 # <CJK> +0x6426 # <CJK> +0x642A # <CJK> +0x642C # <CJK> +0x642D # <CJK> +0x6434 # <CJK> +0x643A # <CJK> +0x643D # <CJK> +0x643F # <CJK> +0x6441 # <CJK> +0x6444 # <CJK> +0x6445 # <CJK> +0x6446 # <CJK> +0x6447 # <CJK> +0x6448 # <CJK> +0x644A # <CJK> +0x6452 # <CJK> +0x6454 # <CJK> +0x6458 # <CJK> +0x645E # <CJK> +0x6467 # <CJK> +0x6469 # <CJK> +0x646D # <CJK> +0x6478 # <CJK> +0x6479 # <CJK> +0x647A # <CJK> +0x6482 # <CJK> +0x6484 # <CJK> +0x6485 # <CJK> +0x6487 # <CJK> +0x6491 # <CJK> +0x6492 # <CJK> +0x6495 # <CJK> +0x6496 # <CJK> +0x6499 # <CJK> +0x649E # <CJK> +0x64A4 # <CJK> +0x64A9 # <CJK> +0x64AC # <CJK> +0x64AD # <CJK> +0x64AE # <CJK> +0x64B0 # <CJK> +0x64B5 # <CJK> +0x64B7 # <CJK> +0x64B8 # <CJK> +0x64BA # <CJK> +0x64BC # <CJK> +0x64C0 # <CJK> +0x64C2 # <CJK> +0x64C5 # <CJK> +0x64CD # <CJK> +0x64CE # <CJK> +0x64D0 # <CJK> +0x64D2 # <CJK> +0x64D7 # <CJK> +0x64D8 # <CJK> +0x64DE # <CJK> +0x64E2 # <CJK> +0x64E4 # <CJK> +0x64E6 # <CJK> +0x6500 # <CJK> +0x6509 # <CJK> +0x6512 # <CJK> +0x6518 # <CJK> +0x6525 # <CJK> +0x652B # <CJK> +0x652E # <CJK> +0x652F # <CJK> +0x6534 # <CJK> +0x6535 # <CJK> +0x6536 # <CJK> +0x6538 # <CJK> +0x6539 # <CJK> +0x653B # <CJK> +0x653E # <CJK> +0x653F # <CJK> +0x6545 # <CJK> +0x6548 # <CJK> +0x6549 # <CJK> +0x654C # <CJK> +0x654F # <CJK> +0x6551 # <CJK> +0x6555 # <CJK> +0x6556 # <CJK> +0x6559 # <CJK> +0x655B # <CJK> +0x655D # <CJK> +0x655E # <CJK> +0x6562 # <CJK> +0x6563 # <CJK> +0x6566 # <CJK> +0x656B # <CJK> +0x656C # <CJK> +0x6570 # <CJK> +0x6572 # <CJK> +0x6574 # <CJK> +0x6577 # <CJK> +0x6587 # <CJK> +0x658B # <CJK> +0x658C # <CJK> +0x6590 # <CJK> +0x6591 # <CJK> +0x6593 # <CJK> +0x6597 # <CJK> +0x6599 # <CJK> +0x659B # <CJK> +0x659C # <CJK> +0x659F # <CJK> +0x65A1 # <CJK> +0x65A4 # <CJK> +0x65A5 # <CJK> +0x65A7 # <CJK> +0x65A9 # <CJK> +0x65AB # <CJK> +0x65AD # <CJK> +0x65AF # <CJK> +0x65B0 # <CJK> +0x65B9 # <CJK> +0x65BC # <CJK> +0x65BD # <CJK> +0x65C1 # <CJK> +0x65C3 # <CJK> +0x65C4 # <CJK> +0x65C5 # <CJK> +0x65C6 # <CJK> +0x65CB # <CJK> +0x65CC # <CJK> +0x65CE # <CJK> +0x65CF # <CJK> +0x65D2 # <CJK> +0x65D6 # <CJK> +0x65D7 # <CJK> +0x65E0 # <CJK> +0x65E2 # <CJK> +0x65E5 # <CJK> +0x65E6 # <CJK> +0x65E7 # <CJK> +0x65E8 # <CJK> +0x65E9 # <CJK> +0x65EC # <CJK> +0x65ED # <CJK> +0x65EE # <CJK> +0x65EF # <CJK> +0x65F0 # <CJK> +0x65F1 # <CJK> +0x65F6 # <CJK> +0x65F7 # <CJK> +0x65FA # <CJK> +0x6600 # <CJK> +0x6602 # <CJK> +0x6603 # <CJK> +0x6606 # <CJK> +0x660A # <CJK> +0x660C # <CJK> +0x660E # <CJK> +0x660F # <CJK> +0x6613 # <CJK> +0x6614 # <CJK> +0x6615 # <CJK> +0x6619 # <CJK> +0x661D # <CJK> +0x661F # <CJK> +0x6620 # <CJK> +0x6625 # <CJK> +0x6627 # <CJK> +0x6628 # <CJK> +0x662D # <CJK> +0x662F # <CJK> +0x6631 # <CJK> +0x6634 # <CJK> +0x6635 # <CJK> +0x6636 # <CJK> +0x663C # <CJK> +0x663E # <CJK> +0x6641 # <CJK> +0x6643 # <CJK> +0x664B # <CJK> +0x664C # <CJK> +0x664F # <CJK> +0x6652 # <CJK> +0x6653 # <CJK> +0x6654 # <CJK> +0x6655 # <CJK> +0x6656 # <CJK> +0x6657 # <CJK> +0x665A # <CJK> +0x665F # <CJK> +0x6661 # <CJK> +0x6664 # <CJK> +0x6666 # <CJK> +0x6668 # <CJK> +0x666E # <CJK> +0x666F # <CJK> +0x6670 # <CJK> +0x6674 # <CJK> +0x6676 # <CJK> +0x6677 # <CJK> +0x667A # <CJK> +0x667E # <CJK> +0x6682 # <CJK> +0x6684 # <CJK> +0x6687 # <CJK> +0x668C # <CJK> +0x6691 # <CJK> +0x6696 # <CJK> +0x6697 # <CJK> +0x669D # <CJK> +0x66A7 # <CJK> +0x66A8 # <CJK> +0x66AE # <CJK> +0x66B4 # <CJK> +0x66B9 # <CJK> +0x66BE # <CJK> +0x66D9 # <CJK> +0x66DB # <CJK> +0x66DC # <CJK> +0x66DD # <CJK> +0x66E6 # <CJK> +0x66E9 # <CJK> +0x66F0 # <CJK> +0x66F2 # <CJK> +0x66F3 # <CJK> +0x66F4 # <CJK> +0x66F7 # <CJK> +0x66F9 # <CJK> +0x66FC # <CJK> +0x66FE # <CJK> +0x66FF # <CJK> +0x6700 # <CJK> +0x6708 # <CJK> +0x6709 # <CJK> +0x670A # <CJK> +0x670B # <CJK> +0x670D # <CJK> +0x6710 # <CJK> +0x6714 # <CJK> +0x6715 # <CJK> +0x6717 # <CJK> +0x671B # <CJK> +0x671D # <CJK> +0x671F # <CJK> +0x6726 # <CJK> +0x6728 # <CJK> +0x672A # <CJK> +0x672B # <CJK> +0x672C # <CJK> +0x672D # <CJK> +0x672F # <CJK> +0x6731 # <CJK> +0x6734 # <CJK> +0x6735 # <CJK> +0x673A # <CJK> +0x673D # <CJK> +0x6740 # <CJK> +0x6742 # <CJK> +0x6743 # <CJK> +0x6746 # <CJK> +0x6748 # <CJK> +0x6749 # <CJK> +0x674C # <CJK> +0x674E # <CJK> +0x674F # <CJK> +0x6750 # <CJK> +0x6751 # <CJK> +0x6753 # <CJK> +0x6756 # <CJK> +0x675C # <CJK> +0x675E # <CJK> +0x675F # <CJK> +0x6760 # <CJK> +0x6761 # <CJK> +0x6765 # <CJK> +0x6768 # <CJK> +0x6769 # <CJK> +0x676A # <CJK> +0x676D # <CJK> +0x676F # <CJK> +0x6770 # <CJK> +0x6772 # <CJK> +0x6773 # <CJK> +0x6775 # <CJK> +0x6777 # <CJK> +0x677C # <CJK> +0x677E # <CJK> +0x677F # <CJK> +0x6781 # <CJK> +0x6784 # <CJK> +0x6787 # <CJK> +0x6789 # <CJK> +0x678B # <CJK> +0x6790 # <CJK> +0x6795 # <CJK> +0x6797 # <CJK> +0x6798 # <CJK> +0x679A # <CJK> +0x679C # <CJK> +0x679D # <CJK> +0x679E # <CJK> +0x67A2 # <CJK> +0x67A3 # <CJK> +0x67A5 # <CJK> +0x67A7 # <CJK> +0x67A8 # <CJK> +0x67AA # <CJK> +0x67AB # <CJK> +0x67AD # <CJK> +0x67AF # <CJK> +0x67B0 # <CJK> +0x67B3 # <CJK> +0x67B5 # <CJK> +0x67B6 # <CJK> +0x67B7 # <CJK> +0x67B8 # <CJK> +0x67C1 # <CJK> +0x67C3 # <CJK> +0x67C4 # <CJK> +0x67CF # <CJK> +0x67D0 # <CJK> +0x67D1 # <CJK> +0x67D2 # <CJK> +0x67D3 # <CJK> +0x67D4 # <CJK> +0x67D8 # <CJK> +0x67D9 # <CJK> +0x67DA # <CJK> +0x67DC # <CJK> +0x67DD # <CJK> +0x67DE # <CJK> +0x67E0 # <CJK> +0x67E2 # <CJK> +0x67E5 # <CJK> +0x67E9 # <CJK> +0x67EC # <CJK> +0x67EF # <CJK> +0x67F0 # <CJK> +0x67F1 # <CJK> +0x67F3 # <CJK> +0x67F4 # <CJK> +0x67FD # <CJK> +0x67FF # <CJK> +0x6800 # <CJK> +0x6805 # <CJK> +0x6807 # <CJK> +0x6808 # <CJK> +0x6809 # <CJK> +0x680A # <CJK> +0x680B # <CJK> +0x680C # <CJK> +0x680E # <CJK> +0x680F # <CJK> +0x6811 # <CJK> +0x6813 # <CJK> +0x6816 # <CJK> +0x6817 # <CJK> +0x681D # <CJK> +0x6821 # <CJK> +0x6829 # <CJK> +0x682A # <CJK> +0x6832 # <CJK> +0x6833 # <CJK> +0x6837 # <CJK> +0x6838 # <CJK> +0x6839 # <CJK> +0x683C # <CJK> +0x683D # <CJK> +0x683E # <CJK> +0x6840 # <CJK> +0x6841 # <CJK> +0x6842 # <CJK> +0x6843 # <CJK> +0x6844 # <CJK> +0x6845 # <CJK> +0x6846 # <CJK> +0x6848 # <CJK> +0x6849 # <CJK> +0x684A # <CJK> +0x684C # <CJK> +0x684E # <CJK> +0x6850 # <CJK> +0x6851 # <CJK> +0x6853 # <CJK> +0x6854 # <CJK> +0x6855 # <CJK> +0x6860 # <CJK> +0x6861 # <CJK> +0x6862 # <CJK> +0x6863 # <CJK> +0x6864 # <CJK> +0x6865 # <CJK> +0x6866 # <CJK> +0x6867 # <CJK> +0x6868 # <CJK> +0x6869 # <CJK> +0x686B # <CJK> +0x6874 # <CJK> +0x6876 # <CJK> +0x6877 # <CJK> +0x6881 # <CJK> +0x6883 # <CJK> +0x6885 # <CJK> +0x6886 # <CJK> +0x688F # <CJK> +0x6893 # <CJK> +0x6897 # <CJK> +0x68A2 # <CJK> +0x68A6 # <CJK> +0x68A7 # <CJK> +0x68A8 # <CJK> +0x68AD # <CJK> +0x68AF # <CJK> +0x68B0 # <CJK> +0x68B3 # <CJK> +0x68B5 # <CJK> +0x68C0 # <CJK> +0x68C2 # <CJK> +0x68C9 # <CJK> +0x68CB # <CJK> +0x68CD # <CJK> +0x68D2 # <CJK> +0x68D5 # <CJK> +0x68D8 # <CJK> +0x68DA # <CJK> +0x68E0 # <CJK> +0x68E3 # <CJK> +0x68EE # <CJK> +0x68F0 # <CJK> +0x68F1 # <CJK> +0x68F5 # <CJK> +0x68F9 # <CJK> +0x68FA # <CJK> +0x68FC # <CJK> +0x6901 # <CJK> +0x6905 # <CJK> +0x690B # <CJK> +0x690D # <CJK> +0x690E # <CJK> +0x6910 # <CJK> +0x6912 # <CJK> +0x691F # <CJK> +0x6920 # <CJK> +0x6924 # <CJK> +0x692D # <CJK> +0x6930 # <CJK> +0x6934 # <CJK> +0x6939 # <CJK> +0x693D # <CJK> +0x693F # <CJK> +0x6942 # <CJK> +0x6954 # <CJK> +0x6957 # <CJK> +0x695A # <CJK> +0x695D # <CJK> +0x695E # <CJK> +0x6960 # <CJK> +0x6963 # <CJK> +0x6966 # <CJK> +0x696B # <CJK> +0x696E # <CJK> +0x6971 # <CJK> +0x6977 # <CJK> +0x6978 # <CJK> +0x6979 # <CJK> +0x697C # <CJK> +0x6980 # <CJK> +0x6982 # <CJK> +0x6984 # <CJK> +0x6986 # <CJK> +0x6987 # <CJK> +0x6988 # <CJK> +0x6989 # <CJK> +0x698D # <CJK> +0x6994 # <CJK> +0x6995 # <CJK> +0x6998 # <CJK> +0x699B # <CJK> +0x699C # <CJK> +0x69A7 # <CJK> +0x69A8 # <CJK> +0x69AB # <CJK> +0x69AD # <CJK> +0x69B1 # <CJK> +0x69B4 # <CJK> +0x69B7 # <CJK> +0x69BB # <CJK> +0x69C1 # <CJK> +0x69CA # <CJK> +0x69CC # <CJK> +0x69CE # <CJK> +0x69D0 # <CJK> +0x69D4 # <CJK> +0x69DB # <CJK> +0x69DF # <CJK> +0x69E0 # <CJK> +0x69ED # <CJK> +0x69F2 # <CJK> +0x69FD # <CJK> +0x69FF # <CJK> +0x6A0A # <CJK> +0x6A17 # <CJK> +0x6A18 # <CJK> +0x6A1F # <CJK> +0x6A21 # <CJK> +0x6A28 # <CJK> +0x6A2A # <CJK> +0x6A2F # <CJK> +0x6A31 # <CJK> +0x6A35 # <CJK> +0x6A3D # <CJK> +0x6A3E # <CJK> +0x6A44 # <CJK> +0x6A47 # <CJK> +0x6A50 # <CJK> +0x6A58 # <CJK> +0x6A59 # <CJK> +0x6A5B # <CJK> +0x6A61 # <CJK> +0x6A65 # <CJK> +0x6A71 # <CJK> +0x6A79 # <CJK> +0x6A7C # <CJK> +0x6A80 # <CJK> +0x6A84 # <CJK> +0x6A8E # <CJK> +0x6A90 # <CJK> +0x6A91 # <CJK> +0x6A97 # <CJK> +0x6AA0 # <CJK> +0x6AA9 # <CJK> +0x6AAB # <CJK> +0x6AAC # <CJK> +0x6B20 # <CJK> +0x6B21 # <CJK> +0x6B22 # <CJK> +0x6B23 # <CJK> +0x6B24 # <CJK> +0x6B27 # <CJK> +0x6B32 # <CJK> +0x6B37 # <CJK> +0x6B39 # <CJK> +0x6B3A # <CJK> +0x6B3E # <CJK> +0x6B43 # <CJK> +0x6B46 # <CJK> +0x6B47 # <CJK> +0x6B49 # <CJK> +0x6B4C # <CJK> +0x6B59 # <CJK> +0x6B62 # <CJK> +0x6B63 # <CJK> +0x6B64 # <CJK> +0x6B65 # <CJK> +0x6B66 # <CJK> +0x6B67 # <CJK> +0x6B6A # <CJK> +0x6B79 # <CJK> +0x6B7B # <CJK> +0x6B7C # <CJK> +0x6B81 # <CJK> +0x6B82 # <CJK> +0x6B83 # <CJK> +0x6B84 # <CJK> +0x6B86 # <CJK> +0x6B87 # <CJK> +0x6B89 # <CJK> +0x6B8A # <CJK> +0x6B8B # <CJK> +0x6B8D # <CJK> +0x6B92 # <CJK> +0x6B93 # <CJK> +0x6B96 # <CJK> +0x6B9A # <CJK> +0x6B9B # <CJK> +0x6BA1 # <CJK> +0x6BAA # <CJK> +0x6BB3 # <CJK> +0x6BB4 # <CJK> +0x6BB5 # <CJK> +0x6BB7 # <CJK> +0x6BBF # <CJK> +0x6BC1 # <CJK> +0x6BC2 # <CJK> +0x6BC5 # <CJK> +0x6BCB # <CJK> +0x6BCD # <CJK> +0x6BCF # <CJK> +0x6BD2 # <CJK> +0x6BD3 # <CJK> +0x6BD4 # <CJK> +0x6BD5 # <CJK> +0x6BD6 # <CJK> +0x6BD7 # <CJK> +0x6BD9 # <CJK> +0x6BDB # <CJK> +0x6BE1 # <CJK> +0x6BEA # <CJK> +0x6BEB # <CJK> +0x6BEF # <CJK> +0x6BF3 # <CJK> +0x6BF5 # <CJK> +0x6BF9 # <CJK> +0x6BFD # <CJK> +0x6C05 # <CJK> +0x6C06 # <CJK> +0x6C07 # <CJK> +0x6C0D # <CJK> +0x6C0F # <CJK> +0x6C10 # <CJK> +0x6C11 # <CJK> +0x6C13 # <CJK> +0x6C14 # <CJK> +0x6C15 # <CJK> +0x6C16 # <CJK> +0x6C18 # <CJK> +0x6C19 # <CJK> +0x6C1A # <CJK> +0x6C1B # <CJK> +0x6C1F # <CJK> +0x6C21 # <CJK> +0x6C22 # <CJK> +0x6C24 # <CJK> +0x6C26 # <CJK> +0x6C27 # <CJK> +0x6C28 # <CJK> +0x6C29 # <CJK> +0x6C2A # <CJK> +0x6C2E # <CJK> +0x6C2F # <CJK> +0x6C30 # <CJK> +0x6C32 # <CJK> +0x6C34 # <CJK> +0x6C35 # <CJK> +0x6C38 # <CJK> +0x6C3D # <CJK> +0x6C40 # <CJK> +0x6C41 # <CJK> +0x6C42 # <CJK> +0x6C46 # <CJK> +0x6C47 # <CJK> +0x6C49 # <CJK> +0x6C4A # <CJK> +0x6C50 # <CJK> +0x6C54 # <CJK> +0x6C55 # <CJK> +0x6C57 # <CJK> +0x6C5B # <CJK> +0x6C5C # <CJK> +0x6C5D # <CJK> +0x6C5E # <CJK> +0x6C5F # <CJK> +0x6C60 # <CJK> +0x6C61 # <CJK> +0x6C64 # <CJK> +0x6C68 # <CJK> +0x6C69 # <CJK> +0x6C6A # <CJK> +0x6C70 # <CJK> +0x6C72 # <CJK> +0x6C74 # <CJK> +0x6C76 # <CJK> +0x6C79 # <CJK> +0x6C7D # <CJK> +0x6C7E # <CJK> +0x6C81 # <CJK> +0x6C82 # <CJK> +0x6C83 # <CJK> +0x6C85 # <CJK> +0x6C86 # <CJK> +0x6C88 # <CJK> +0x6C89 # <CJK> +0x6C8C # <CJK> +0x6C8F # <CJK> +0x6C90 # <CJK> +0x6C93 # <CJK> +0x6C94 # <CJK> +0x6C99 # <CJK> +0x6C9B # <CJK> +0x6C9F # <CJK> +0x6CA1 # <CJK> +0x6CA3 # <CJK> +0x6CA4 # <CJK> +0x6CA5 # <CJK> +0x6CA6 # <CJK> +0x6CA7 # <CJK> +0x6CA9 # <CJK> +0x6CAA # <CJK> +0x6CAB # <CJK> +0x6CAD # <CJK> +0x6CAE # <CJK> +0x6CB1 # <CJK> +0x6CB2 # <CJK> +0x6CB3 # <CJK> +0x6CB8 # <CJK> +0x6CB9 # <CJK> +0x6CBB # <CJK> +0x6CBC # <CJK> +0x6CBD # <CJK> +0x6CBE # <CJK> +0x6CBF # <CJK> +0x6CC4 # <CJK> +0x6CC5 # <CJK> +0x6CC9 # <CJK> +0x6CCA # <CJK> +0x6CCC # <CJK> +0x6CD0 # <CJK> +0x6CD3 # <CJK> +0x6CD4 # <CJK> +0x6CD5 # <CJK> +0x6CD6 # <CJK> +0x6CD7 # <CJK> +0x6CDB # <CJK> +0x6CDE # <CJK> +0x6CE0 # <CJK> +0x6CE1 # <CJK> +0x6CE2 # <CJK> +0x6CE3 # <CJK> +0x6CE5 # <CJK> +0x6CE8 # <CJK> +0x6CEA # <CJK> +0x6CEB # <CJK> +0x6CEE # <CJK> +0x6CEF # <CJK> +0x6CF0 # <CJK> +0x6CF1 # <CJK> +0x6CF3 # <CJK> +0x6CF5 # <CJK> +0x6CF6 # <CJK> +0x6CF7 # <CJK> +0x6CF8 # <CJK> +0x6CFA # <CJK> +0x6CFB # <CJK> +0x6CFC # <CJK> +0x6CFD # <CJK> +0x6CFE # <CJK> +0x6D01 # <CJK> +0x6D04 # <CJK> +0x6D07 # <CJK> +0x6D0B # <CJK> +0x6D0C # <CJK> +0x6D0E # <CJK> +0x6D12 # <CJK> +0x6D17 # <CJK> +0x6D19 # <CJK> +0x6D1A # <CJK> +0x6D1B # <CJK> +0x6D1E # <CJK> +0x6D25 # <CJK> +0x6D27 # <CJK> +0x6D2A # <CJK> +0x6D2B # <CJK> +0x6D2E # <CJK> +0x6D31 # <CJK> +0x6D32 # <CJK> +0x6D33 # <CJK> +0x6D35 # <CJK> +0x6D39 # <CJK> +0x6D3B # <CJK> +0x6D3C # <CJK> +0x6D3D # <CJK> +0x6D3E # <CJK> +0x6D41 # <CJK> +0x6D43 # <CJK> +0x6D45 # <CJK> +0x6D46 # <CJK> +0x6D47 # <CJK> +0x6D48 # <CJK> +0x6D4A # <CJK> +0x6D4B # <CJK> +0x6D4D # <CJK> +0x6D4E # <CJK> +0x6D4F # <CJK> +0x6D51 # <CJK> +0x6D52 # <CJK> +0x6D53 # <CJK> +0x6D54 # <CJK> +0x6D59 # <CJK> +0x6D5A # <CJK> +0x6D5C # <CJK> +0x6D5E # <CJK> +0x6D60 # <CJK> +0x6D63 # <CJK> +0x6D66 # <CJK> +0x6D69 # <CJK> +0x6D6A # <CJK> +0x6D6E # <CJK> +0x6D6F # <CJK> +0x6D74 # <CJK> +0x6D77 # <CJK> +0x6D78 # <CJK> +0x6D7C # <CJK> +0x6D82 # <CJK> +0x6D85 # <CJK> +0x6D88 # <CJK> +0x6D89 # <CJK> +0x6D8C # <CJK> +0x6D8E # <CJK> +0x6D91 # <CJK> +0x6D93 # <CJK> +0x6D94 # <CJK> +0x6D95 # <CJK> +0x6D9B # <CJK> +0x6D9D # <CJK> +0x6D9E # <CJK> +0x6D9F # <CJK> +0x6DA0 # <CJK> +0x6DA1 # <CJK> +0x6DA3 # <CJK> +0x6DA4 # <CJK> +0x6DA6 # <CJK> +0x6DA7 # <CJK> +0x6DA8 # <CJK> +0x6DA9 # <CJK> +0x6DAA # <CJK> +0x6DAB # <CJK> +0x6DAE # <CJK> +0x6DAF # <CJK> +0x6DB2 # <CJK> +0x6DB5 # <CJK> +0x6DB8 # <CJK> +0x6DBF # <CJK> +0x6DC0 # <CJK> +0x6DC4 # <CJK> +0x6DC5 # <CJK> +0x6DC6 # <CJK> +0x6DC7 # <CJK> +0x6DCB # <CJK> +0x6DCC # <CJK> +0x6DD1 # <CJK> +0x6DD6 # <CJK> +0x6DD8 # <CJK> +0x6DD9 # <CJK> +0x6DDD # <CJK> +0x6DDE # <CJK> +0x6DE0 # <CJK> +0x6DE1 # <CJK> +0x6DE4 # <CJK> +0x6DE6 # <CJK> +0x6DEB # <CJK> +0x6DEC # <CJK> +0x6DEE # <CJK> +0x6DF1 # <CJK> +0x6DF3 # <CJK> +0x6DF7 # <CJK> +0x6DF9 # <CJK> +0x6DFB # <CJK> +0x6DFC # <CJK> +0x6E05 # <CJK> +0x6E0A # <CJK> +0x6E0C # <CJK> +0x6E0D # <CJK> +0x6E0E # <CJK> +0x6E10 # <CJK> +0x6E11 # <CJK> +0x6E14 # <CJK> +0x6E16 # <CJK> +0x6E17 # <CJK> +0x6E1A # <CJK> +0x6E1D # <CJK> +0x6E20 # <CJK> +0x6E21 # <CJK> +0x6E23 # <CJK> +0x6E24 # <CJK> +0x6E25 # <CJK> +0x6E29 # <CJK> +0x6E2B # <CJK> +0x6E2D # <CJK> +0x6E2F # <CJK> +0x6E32 # <CJK> +0x6E34 # <CJK> +0x6E38 # <CJK> +0x6E3A # <CJK> +0x6E43 # <CJK> +0x6E44 # <CJK> +0x6E4D # <CJK> +0x6E4E # <CJK> +0x6E53 # <CJK> +0x6E54 # <CJK> +0x6E56 # <CJK> +0x6E58 # <CJK> +0x6E5B # <CJK> +0x6E5F # <CJK> +0x6E6B # <CJK> +0x6E6E # <CJK> +0x6E7E # <CJK> +0x6E7F # <CJK> +0x6E83 # <CJK> +0x6E85 # <CJK> +0x6E86 # <CJK> +0x6E89 # <CJK> +0x6E8F # <CJK> +0x6E90 # <CJK> +0x6E98 # <CJK> +0x6E9C # <CJK> +0x6E9F # <CJK> +0x6EA2 # <CJK> +0x6EA5 # <CJK> +0x6EA7 # <CJK> +0x6EAA # <CJK> +0x6EAF # <CJK> +0x6EB1 # <CJK> +0x6EB2 # <CJK> +0x6EB4 # <CJK> +0x6EB6 # <CJK> +0x6EB7 # <CJK> +0x6EBA # <CJK> +0x6EBB # <CJK> +0x6EBD # <CJK> +0x6EC1 # <CJK> +0x6EC2 # <CJK> +0x6EC7 # <CJK> +0x6ECB # <CJK> +0x6ECF # <CJK> +0x6ED1 # <CJK> +0x6ED3 # <CJK> +0x6ED4 # <CJK> +0x6ED5 # <CJK> +0x6ED7 # <CJK> +0x6EDA # <CJK> +0x6EDE # <CJK> +0x6EDF # <CJK> +0x6EE0 # <CJK> +0x6EE1 # <CJK> +0x6EE2 # <CJK> +0x6EE4 # <CJK> +0x6EE5 # <CJK> +0x6EE6 # <CJK> +0x6EE8 # <CJK> +0x6EE9 # <CJK> +0x6EF4 # <CJK> +0x6EF9 # <CJK> +0x6F02 # <CJK> +0x6F06 # <CJK> +0x6F09 # <CJK> +0x6F0F # <CJK> +0x6F13 # <CJK> +0x6F14 # <CJK> +0x6F15 # <CJK> +0x6F20 # <CJK> +0x6F24 # <CJK> +0x6F29 # <CJK> +0x6F2A # <CJK> +0x6F2B # <CJK> +0x6F2D # <CJK> +0x6F2F # <CJK> +0x6F31 # <CJK> +0x6F33 # <CJK> +0x6F36 # <CJK> +0x6F3E # <CJK> +0x6F46 # <CJK> +0x6F47 # <CJK> +0x6F4B # <CJK> +0x6F4D # <CJK> +0x6F58 # <CJK> +0x6F5C # <CJK> +0x6F5E # <CJK> +0x6F62 # <CJK> +0x6F66 # <CJK> +0x6F6D # <CJK> +0x6F6E # <CJK> +0x6F72 # <CJK> +0x6F74 # <CJK> +0x6F78 # <CJK> +0x6F7A # <CJK> +0x6F7C # <CJK> +0x6F84 # <CJK> +0x6F88 # <CJK> +0x6F89 # <CJK> +0x6F8C # <CJK> +0x6F8D # <CJK> +0x6F8E # <CJK> +0x6F9C # <CJK> +0x6FA1 # <CJK> +0x6FA7 # <CJK> +0x6FB3 # <CJK> +0x6FB6 # <CJK> +0x6FB9 # <CJK> +0x6FC0 # <CJK> +0x6FC2 # <CJK> +0x6FC9 # <CJK> +0x6FD1 # <CJK> +0x6FD2 # <CJK> +0x6FDE # <CJK> +0x6FE0 # <CJK> +0x6FE1 # <CJK> +0x6FEE # <CJK> +0x6FEF # <CJK> +0x7011 # <CJK> +0x701A # <CJK> +0x701B # <CJK> +0x7023 # <CJK> +0x7035 # <CJK> +0x7039 # <CJK> +0x704C # <CJK> +0x704F # <CJK> +0x705E # <CJK> +0x706B # <CJK> +0x706C # <CJK> +0x706D # <CJK> +0x706F # <CJK> +0x7070 # <CJK> +0x7075 # <CJK> +0x7076 # <CJK> +0x7078 # <CJK> +0x707C # <CJK> +0x707E # <CJK> +0x707F # <CJK> +0x7080 # <CJK> +0x7085 # <CJK> +0x7089 # <CJK> +0x708A # <CJK> +0x708E # <CJK> +0x7092 # <CJK> +0x7094 # <CJK> +0x7095 # <CJK> +0x7096 # <CJK> +0x7099 # <CJK> +0x709C # <CJK> +0x709D # <CJK> +0x70AB # <CJK> +0x70AC # <CJK> +0x70AD # <CJK> +0x70AE # <CJK> +0x70AF # <CJK> +0x70B1 # <CJK> +0x70B3 # <CJK> +0x70B7 # <CJK> +0x70B8 # <CJK> +0x70B9 # <CJK> +0x70BB # <CJK> +0x70BC # <CJK> +0x70BD # <CJK> +0x70C0 # <CJK> +0x70C1 # <CJK> +0x70C2 # <CJK> +0x70C3 # <CJK> +0x70C8 # <CJK> +0x70CA # <CJK> +0x70D8 # <CJK> +0x70D9 # <CJK> +0x70DB # <CJK> +0x70DF # <CJK> +0x70E4 # <CJK> +0x70E6 # <CJK> +0x70E7 # <CJK> +0x70E8 # <CJK> +0x70E9 # <CJK> +0x70EB # <CJK> +0x70EC # <CJK> +0x70ED # <CJK> +0x70EF # <CJK> +0x70F7 # <CJK> +0x70F9 # <CJK> +0x70FD # <CJK> +0x7109 # <CJK> +0x710A # <CJK> +0x7110 # <CJK> +0x7113 # <CJK> +0x7115 # <CJK> +0x7116 # <CJK> +0x7118 # <CJK> +0x7119 # <CJK> +0x711A # <CJK> +0x7126 # <CJK> +0x712F # <CJK> +0x7130 # <CJK> +0x7131 # <CJK> +0x7136 # <CJK> +0x7145 # <CJK> +0x714A # <CJK> +0x714C # <CJK> +0x714E # <CJK> +0x715C # <CJK> +0x715E # <CJK> +0x7164 # <CJK> +0x7166 # <CJK> +0x7167 # <CJK> +0x7168 # <CJK> +0x716E # <CJK> +0x7172 # <CJK> +0x7173 # <CJK> +0x7178 # <CJK> +0x717A # <CJK> +0x717D # <CJK> +0x7184 # <CJK> +0x718A # <CJK> +0x718F # <CJK> +0x7194 # <CJK> +0x7198 # <CJK> +0x7199 # <CJK> +0x719F # <CJK> +0x71A0 # <CJK> +0x71A8 # <CJK> +0x71AC # <CJK> +0x71B3 # <CJK> +0x71B5 # <CJK> +0x71B9 # <CJK> +0x71C3 # <CJK> +0x71CE # <CJK> +0x71D4 # <CJK> +0x71D5 # <CJK> +0x71E0 # <CJK> +0x71E5 # <CJK> +0x71E7 # <CJK> +0x71EE # <CJK> +0x71F9 # <CJK> +0x7206 # <CJK> +0x721D # <CJK> +0x7228 # <CJK> +0x722A # <CJK> +0x722C # <CJK> +0x7230 # <CJK> +0x7231 # <CJK> +0x7235 # <CJK> +0x7236 # <CJK> +0x7237 # <CJK> +0x7238 # <CJK> +0x7239 # <CJK> +0x723B # <CJK> +0x723D # <CJK> +0x723F # <CJK> +0x7247 # <CJK> +0x7248 # <CJK> +0x724C # <CJK> +0x724D # <CJK> +0x7252 # <CJK> +0x7256 # <CJK> +0x7259 # <CJK> +0x725B # <CJK> +0x725D # <CJK> +0x725F # <CJK> +0x7261 # <CJK> +0x7262 # <CJK> +0x7266 # <CJK> +0x7267 # <CJK> +0x7269 # <CJK> +0x726E # <CJK> +0x726F # <CJK> +0x7272 # <CJK> +0x7275 # <CJK> +0x7279 # <CJK> +0x727A # <CJK> +0x727E # <CJK> +0x727F # <CJK> +0x7280 # <CJK> +0x7281 # <CJK> +0x7284 # <CJK> +0x728A # <CJK> +0x728B # <CJK> +0x728D # <CJK> +0x728F # <CJK> +0x7292 # <CJK> +0x729F # <CJK> +0x72AC # <CJK> +0x72AD # <CJK> +0x72AF # <CJK> +0x72B0 # <CJK> +0x72B4 # <CJK> +0x72B6 # <CJK> +0x72B7 # <CJK> +0x72B8 # <CJK> +0x72B9 # <CJK> +0x72C1 # <CJK> +0x72C2 # <CJK> +0x72C3 # <CJK> +0x72C4 # <CJK> +0x72C8 # <CJK> +0x72CD # <CJK> +0x72CE # <CJK> +0x72D0 # <CJK> +0x72D2 # <CJK> +0x72D7 # <CJK> +0x72D9 # <CJK> +0x72DE # <CJK> +0x72E0 # <CJK> +0x72E1 # <CJK> +0x72E8 # <CJK> +0x72E9 # <CJK> +0x72EC # <CJK> +0x72ED # <CJK> +0x72EE # <CJK> +0x72EF # <CJK> +0x72F0 # <CJK> +0x72F1 # <CJK> +0x72F2 # <CJK> +0x72F3 # <CJK> +0x72F4 # <CJK> +0x72F7 # <CJK> +0x72F8 # <CJK> +0x72FA # <CJK> +0x72FB # <CJK> +0x72FC # <CJK> +0x7301 # <CJK> +0x7303 # <CJK> +0x730A # <CJK> +0x730E # <CJK> +0x7313 # <CJK> +0x7315 # <CJK> +0x7316 # <CJK> +0x7317 # <CJK> +0x731B # <CJK> +0x731C # <CJK> +0x731D # <CJK> +0x731E # <CJK> +0x7321 # <CJK> +0x7322 # <CJK> +0x7325 # <CJK> +0x7329 # <CJK> +0x732A # <CJK> +0x732B # <CJK> +0x732C # <CJK> +0x732E # <CJK> +0x7331 # <CJK> +0x7334 # <CJK> +0x7337 # <CJK> +0x7338 # <CJK> +0x7339 # <CJK> +0x733E # <CJK> +0x733F # <CJK> +0x734D # <CJK> +0x7350 # <CJK> +0x7352 # <CJK> +0x7357 # <CJK> +0x7360 # <CJK> +0x736C # <CJK> +0x736D # <CJK> +0x736F # <CJK> +0x737E # <CJK> +0x7384 # <CJK> +0x7387 # <CJK> +0x7389 # <CJK> +0x738B # <CJK> +0x738E # <CJK> +0x7391 # <CJK> +0x7396 # <CJK> +0x739B # <CJK> +0x739F # <CJK> +0x73A2 # <CJK> +0x73A9 # <CJK> +0x73AB # <CJK> +0x73AE # <CJK> +0x73AF # <CJK> +0x73B0 # <CJK> +0x73B2 # <CJK> +0x73B3 # <CJK> +0x73B7 # <CJK> +0x73BA # <CJK> +0x73BB # <CJK> +0x73C0 # <CJK> +0x73C2 # <CJK> +0x73C8 # <CJK> +0x73C9 # <CJK> +0x73CA # <CJK> +0x73CD # <CJK> +0x73CF # <CJK> +0x73D0 # <CJK> +0x73D1 # <CJK> +0x73D9 # <CJK> +0x73DE # <CJK> +0x73E0 # <CJK> +0x73E5 # <CJK> +0x73E7 # <CJK> +0x73E9 # <CJK> +0x73ED # <CJK> +0x73F2 # <CJK> +0x7403 # <CJK> +0x7405 # <CJK> +0x7406 # <CJK> +0x7409 # <CJK> +0x740A # <CJK> +0x740F # <CJK> +0x7410 # <CJK> +0x741A # <CJK> +0x741B # <CJK> +0x7422 # <CJK> +0x7425 # <CJK> +0x7426 # <CJK> +0x7428 # <CJK> +0x742A # <CJK> +0x742C # <CJK> +0x742E # <CJK> +0x7430 # <CJK> +0x7433 # <CJK> +0x7434 # <CJK> +0x7435 # <CJK> +0x7436 # <CJK> +0x743C # <CJK> +0x7441 # <CJK> +0x7455 # <CJK> +0x7457 # <CJK> +0x7459 # <CJK> +0x745A # <CJK> +0x745B # <CJK> +0x745C # <CJK> +0x745E # <CJK> +0x745F # <CJK> +0x746D # <CJK> +0x7470 # <CJK> +0x7476 # <CJK> +0x7477 # <CJK> +0x747E # <CJK> +0x7480 # <CJK> +0x7481 # <CJK> +0x7483 # <CJK> +0x7487 # <CJK> +0x748B # <CJK> +0x748E # <CJK> +0x7490 # <CJK> +0x749C # <CJK> +0x749E # <CJK> +0x74A7 # <CJK> +0x74A8 # <CJK> +0x74A9 # <CJK> +0x74BA # <CJK> +0x74D2 # <CJK> +0x74DC # <CJK> +0x74DE # <CJK> +0x74E0 # <CJK> +0x74E2 # <CJK> +0x74E3 # <CJK> +0x74E4 # <CJK> +0x74E6 # <CJK> +0x74EE # <CJK> +0x74EF # <CJK> +0x74F4 # <CJK> +0x74F6 # <CJK> +0x74F7 # <CJK> +0x74FF # <CJK> +0x7504 # <CJK> +0x750D # <CJK> +0x750F # <CJK> +0x7511 # <CJK> +0x7513 # <CJK> +0x7518 # <CJK> +0x7519 # <CJK> +0x751A # <CJK> +0x751C # <CJK> +0x751F # <CJK> +0x7525 # <CJK> +0x7528 # <CJK> +0x7529 # <CJK> +0x752B # <CJK> +0x752C # <CJK> +0x752D # <CJK> +0x752F # <CJK> +0x7530 # <CJK> +0x7531 # <CJK> +0x7532 # <CJK> +0x7533 # <CJK> +0x7535 # <CJK> +0x7537 # <CJK> +0x7538 # <CJK> +0x753A # <CJK> +0x753B # <CJK> +0x753E # <CJK> +0x7540 # <CJK> +0x7545 # <CJK> +0x7548 # <CJK> +0x754B # <CJK> +0x754C # <CJK> +0x754E # <CJK> +0x754F # <CJK> +0x7554 # <CJK> +0x7559 # <CJK> +0x755A # <CJK> +0x755B # <CJK> +0x755C # <CJK> +0x7565 # <CJK> +0x7566 # <CJK> +0x756A # <CJK> +0x7572 # <CJK> +0x7574 # <CJK> +0x7578 # <CJK> +0x7579 # <CJK> +0x757F # <CJK> +0x7583 # <CJK> +0x7586 # <CJK> +0x758B # <CJK> +0x758F # <CJK> +0x7591 # <CJK> +0x7592 # <CJK> +0x7594 # <CJK> +0x7596 # <CJK> +0x7597 # <CJK> +0x7599 # <CJK> +0x759A # <CJK> +0x759D # <CJK> +0x759F # <CJK> +0x75A0 # <CJK> +0x75A1 # <CJK> +0x75A3 # <CJK> +0x75A4 # <CJK> +0x75A5 # <CJK> +0x75AB # <CJK> +0x75AC # <CJK> +0x75AE # <CJK> +0x75AF # <CJK> +0x75B0 # <CJK> +0x75B1 # <CJK> +0x75B2 # <CJK> +0x75B3 # <CJK> +0x75B4 # <CJK> +0x75B5 # <CJK> +0x75B8 # <CJK> +0x75B9 # <CJK> +0x75BC # <CJK> +0x75BD # <CJK> +0x75BE # <CJK> +0x75C2 # <CJK> +0x75C3 # <CJK> +0x75C4 # <CJK> +0x75C5 # <CJK> +0x75C7 # <CJK> +0x75C8 # <CJK> +0x75C9 # <CJK> +0x75CA # <CJK> +0x75CD # <CJK> +0x75D2 # <CJK> +0x75D4 # <CJK> +0x75D5 # <CJK> +0x75D6 # <CJK> +0x75D8 # <CJK> +0x75DB # <CJK> +0x75DE # <CJK> +0x75E2 # <CJK> +0x75E3 # <CJK> +0x75E4 # <CJK> +0x75E6 # <CJK> +0x75E7 # <CJK> +0x75E8 # <CJK> +0x75EA # <CJK> +0x75EB # <CJK> +0x75F0 # <CJK> +0x75F1 # <CJK> +0x75F4 # <CJK> +0x75F9 # <CJK> +0x75FC # <CJK> +0x75FF # <CJK> +0x7600 # <CJK> +0x7601 # <CJK> +0x7603 # <CJK> +0x7605 # <CJK> +0x760A # <CJK> +0x760C # <CJK> +0x7610 # <CJK> +0x7615 # <CJK> +0x7617 # <CJK> +0x7618 # <CJK> +0x7619 # <CJK> +0x761B # <CJK> +0x761F # <CJK> +0x7620 # <CJK> +0x7622 # <CJK> +0x7624 # <CJK> +0x7625 # <CJK> +0x7626 # <CJK> +0x7629 # <CJK> +0x762A # <CJK> +0x762B # <CJK> +0x762D # <CJK> +0x7630 # <CJK> +0x7633 # <CJK> +0x7634 # <CJK> +0x7635 # <CJK> +0x7638 # <CJK> +0x763C # <CJK> +0x763E # <CJK> +0x763F # <CJK> +0x7640 # <CJK> +0x7643 # <CJK> +0x764C # <CJK> +0x764D # <CJK> +0x7654 # <CJK> +0x7656 # <CJK> +0x765C # <CJK> +0x765E # <CJK> +0x7663 # <CJK> +0x766B # <CJK> +0x766F # <CJK> +0x7678 # <CJK> +0x767B # <CJK> +0x767D # <CJK> +0x767E # <CJK> +0x7682 # <CJK> +0x7684 # <CJK> +0x7686 # <CJK> +0x7687 # <CJK> +0x7688 # <CJK> +0x768B # <CJK> +0x768E # <CJK> +0x7691 # <CJK> +0x7693 # <CJK> +0x7696 # <CJK> +0x7699 # <CJK> +0x76A4 # <CJK> +0x76AE # <CJK> +0x76B1 # <CJK> +0x76B2 # <CJK> +0x76B4 # <CJK> +0x76BF # <CJK> +0x76C2 # <CJK> +0x76C5 # <CJK> +0x76C6 # <CJK> +0x76C8 # <CJK> +0x76CA # <CJK> +0x76CD # <CJK> +0x76CE # <CJK> +0x76CF # <CJK> +0x76D0 # <CJK> +0x76D1 # <CJK> +0x76D2 # <CJK> +0x76D4 # <CJK> +0x76D6 # <CJK> +0x76D7 # <CJK> +0x76D8 # <CJK> +0x76DB # <CJK> +0x76DF # <CJK> +0x76E5 # <CJK> +0x76EE # <CJK> +0x76EF # <CJK> +0x76F1 # <CJK> +0x76F2 # <CJK> +0x76F4 # <CJK> +0x76F8 # <CJK> +0x76F9 # <CJK> +0x76FC # <CJK> +0x76FE # <CJK> +0x7701 # <CJK> +0x7704 # <CJK> +0x7707 # <CJK> +0x7708 # <CJK> +0x7709 # <CJK> +0x770B # <CJK> +0x770D # <CJK> +0x7719 # <CJK> +0x771A # <CJK> +0x771F # <CJK> +0x7720 # <CJK> +0x7722 # <CJK> +0x7726 # <CJK> +0x7728 # <CJK> +0x7729 # <CJK> +0x772D # <CJK> +0x772F # <CJK> +0x7735 # <CJK> +0x7736 # <CJK> +0x7737 # <CJK> +0x7738 # <CJK> +0x773A # <CJK> +0x773C # <CJK> +0x7740 # <CJK> +0x7741 # <CJK> +0x7743 # <CJK> +0x7747 # <CJK> +0x7750 # <CJK> +0x7751 # <CJK> +0x775A # <CJK> +0x775B # <CJK> +0x7761 # <CJK> +0x7762 # <CJK> +0x7763 # <CJK> +0x7765 # <CJK> +0x7766 # <CJK> +0x7768 # <CJK> +0x776B # <CJK> +0x776C # <CJK> +0x7779 # <CJK> +0x777D # <CJK> +0x777E # <CJK> +0x777F # <CJK> +0x7780 # <CJK> +0x7784 # <CJK> +0x7785 # <CJK> +0x778C # <CJK> +0x778D # <CJK> +0x778E # <CJK> +0x7791 # <CJK> +0x7792 # <CJK> +0x779F # <CJK> +0x77A0 # <CJK> +0x77A2 # <CJK> +0x77A5 # <CJK> +0x77A7 # <CJK> +0x77A9 # <CJK> +0x77AA # <CJK> +0x77AC # <CJK> +0x77B0 # <CJK> +0x77B3 # <CJK> +0x77B5 # <CJK> +0x77BB # <CJK> +0x77BD # <CJK> +0x77BF # <CJK> +0x77CD # <CJK> +0x77D7 # <CJK> +0x77DB # <CJK> +0x77DC # <CJK> +0x77E2 # <CJK> +0x77E3 # <CJK> +0x77E5 # <CJK> +0x77E7 # <CJK> +0x77E9 # <CJK> +0x77EB # <CJK> +0x77EC # <CJK> +0x77ED # <CJK> +0x77EE # <CJK> +0x77F3 # <CJK> +0x77F6 # <CJK> +0x77F8 # <CJK> +0x77FD # <CJK> +0x77FE # <CJK> +0x77FF # <CJK> +0x7800 # <CJK> +0x7801 # <CJK> +0x7802 # <CJK> +0x7809 # <CJK> +0x780C # <CJK> +0x780D # <CJK> +0x7811 # <CJK> +0x7812 # <CJK> +0x7814 # <CJK> +0x7816 # <CJK> +0x7817 # <CJK> +0x7818 # <CJK> +0x781A # <CJK> +0x781C # <CJK> +0x781D # <CJK> +0x781F # <CJK> +0x7823 # <CJK> +0x7825 # <CJK> +0x7826 # <CJK> +0x7827 # <CJK> +0x7829 # <CJK> +0x782C # <CJK> +0x782D # <CJK> +0x7830 # <CJK> +0x7834 # <CJK> +0x7837 # <CJK> +0x7838 # <CJK> +0x7839 # <CJK> +0x783A # <CJK> +0x783B # <CJK> +0x783C # <CJK> +0x783E # <CJK> +0x7840 # <CJK> +0x7845 # <CJK> +0x7847 # <CJK> +0x784C # <CJK> +0x784E # <CJK> +0x7850 # <CJK> +0x7852 # <CJK> +0x7855 # <CJK> +0x7856 # <CJK> +0x7857 # <CJK> +0x785D # <CJK> +0x786A # <CJK> +0x786B # <CJK> +0x786C # <CJK> +0x786D # <CJK> +0x786E # <CJK> +0x7877 # <CJK> +0x787C # <CJK> +0x7887 # <CJK> +0x7889 # <CJK> +0x788C # <CJK> +0x788D # <CJK> +0x788E # <CJK> +0x7891 # <CJK> +0x7893 # <CJK> +0x7897 # <CJK> +0x7898 # <CJK> +0x789A # <CJK> +0x789B # <CJK> +0x789C # <CJK> +0x789F # <CJK> +0x78A1 # <CJK> +0x78A3 # <CJK> +0x78A5 # <CJK> +0x78A7 # <CJK> +0x78B0 # <CJK> +0x78B1 # <CJK> +0x78B2 # <CJK> +0x78B3 # <CJK> +0x78B4 # <CJK> +0x78B9 # <CJK> +0x78BE # <CJK> +0x78C1 # <CJK> +0x78C5 # <CJK> +0x78C9 # <CJK> +0x78CA # <CJK> +0x78CB # <CJK> +0x78D0 # <CJK> +0x78D4 # <CJK> +0x78D5 # <CJK> +0x78D9 # <CJK> +0x78E8 # <CJK> +0x78EC # <CJK> +0x78F2 # <CJK> +0x78F4 # <CJK> +0x78F7 # <CJK> +0x78FA # <CJK> +0x7901 # <CJK> +0x7905 # <CJK> +0x7913 # <CJK> +0x791E # <CJK> +0x7924 # <CJK> +0x7934 # <CJK> +0x793A # <CJK> +0x793B # <CJK> +0x793C # <CJK> +0x793E # <CJK> +0x7940 # <CJK> +0x7941 # <CJK> +0x7946 # <CJK> +0x7948 # <CJK> +0x7949 # <CJK> +0x7953 # <CJK> +0x7956 # <CJK> +0x7957 # <CJK> +0x795A # <CJK> +0x795B # <CJK> +0x795C # <CJK> +0x795D # <CJK> +0x795E # <CJK> +0x795F # <CJK> +0x7960 # <CJK> +0x7962 # <CJK> +0x7965 # <CJK> +0x7967 # <CJK> +0x7968 # <CJK> +0x796D # <CJK> +0x796F # <CJK> +0x7977 # <CJK> +0x7978 # <CJK> +0x797A # <CJK> +0x7980 # <CJK> +0x7981 # <CJK> +0x7984 # <CJK> +0x7985 # <CJK> +0x798A # <CJK> +0x798F # <CJK> +0x799A # <CJK> +0x79A7 # <CJK> +0x79B3 # <CJK> +0x79B9 # <CJK> +0x79BA # <CJK> +0x79BB # <CJK> +0x79BD # <CJK> +0x79BE # <CJK> +0x79C0 # <CJK> +0x79C1 # <CJK> +0x79C3 # <CJK> +0x79C6 # <CJK> +0x79C9 # <CJK> +0x79CB # <CJK> +0x79CD # <CJK> +0x79D1 # <CJK> +0x79D2 # <CJK> +0x79D5 # <CJK> +0x79D8 # <CJK> +0x79DF # <CJK> +0x79E3 # <CJK> +0x79E4 # <CJK> +0x79E6 # <CJK> +0x79E7 # <CJK> +0x79E9 # <CJK> +0x79EB # <CJK> +0x79ED # <CJK> +0x79EF # <CJK> +0x79F0 # <CJK> +0x79F8 # <CJK> +0x79FB # <CJK> +0x79FD # <CJK> +0x7A00 # <CJK> +0x7A02 # <CJK> +0x7A03 # <CJK> +0x7A06 # <CJK> +0x7A0B # <CJK> +0x7A0D # <CJK> +0x7A0E # <CJK> +0x7A14 # <CJK> +0x7A17 # <CJK> +0x7A1A # <CJK> +0x7A1E # <CJK> +0x7A20 # <CJK> +0x7A23 # <CJK> +0x7A33 # <CJK> +0x7A37 # <CJK> +0x7A39 # <CJK> +0x7A3B # <CJK> +0x7A3C # <CJK> +0x7A3D # <CJK> +0x7A3F # <CJK> +0x7A46 # <CJK> +0x7A51 # <CJK> +0x7A57 # <CJK> +0x7A70 # <CJK> +0x7A74 # <CJK> +0x7A76 # <CJK> +0x7A77 # <CJK> +0x7A78 # <CJK> +0x7A79 # <CJK> +0x7A7A # <CJK> +0x7A7F # <CJK> +0x7A80 # <CJK> +0x7A81 # <CJK> +0x7A83 # <CJK> +0x7A84 # <CJK> +0x7A86 # <CJK> +0x7A88 # <CJK> +0x7A8D # <CJK> +0x7A91 # <CJK> +0x7A92 # <CJK> +0x7A95 # <CJK> +0x7A96 # <CJK> +0x7A97 # <CJK> +0x7A98 # <CJK> +0x7A9C # <CJK> +0x7A9D # <CJK> +0x7A9F # <CJK> +0x7AA0 # <CJK> +0x7AA5 # <CJK> +0x7AA6 # <CJK> +0x7AA8 # <CJK> +0x7AAC # <CJK> +0x7AAD # <CJK> +0x7AB3 # <CJK> +0x7ABF # <CJK> +0x7ACB # <CJK> +0x7AD6 # <CJK> +0x7AD9 # <CJK> +0x7ADE # <CJK> +0x7ADF # <CJK> +0x7AE0 # <CJK> +0x7AE3 # <CJK> +0x7AE5 # <CJK> +0x7AE6 # <CJK> +0x7AED # <CJK> +0x7AEF # <CJK> +0x7AF9 # <CJK> +0x7AFA # <CJK> +0x7AFD # <CJK> +0x7AFF # <CJK> +0x7B03 # <CJK> +0x7B04 # <CJK> +0x7B06 # <CJK> +0x7B08 # <CJK> +0x7B0A # <CJK> +0x7B0B # <CJK> +0x7B0F # <CJK> +0x7B11 # <CJK> +0x7B14 # <CJK> +0x7B15 # <CJK> +0x7B19 # <CJK> +0x7B1B # <CJK> +0x7B1E # <CJK> +0x7B20 # <CJK> +0x7B24 # <CJK> +0x7B25 # <CJK> +0x7B26 # <CJK> +0x7B28 # <CJK> +0x7B2A # <CJK> +0x7B2B # <CJK> +0x7B2C # <CJK> +0x7B2E # <CJK> +0x7B31 # <CJK> +0x7B33 # <CJK> +0x7B38 # <CJK> +0x7B3A # <CJK> +0x7B3C # <CJK> +0x7B3E # <CJK> +0x7B45 # <CJK> +0x7B47 # <CJK> +0x7B49 # <CJK> +0x7B4B # <CJK> +0x7B4C # <CJK> +0x7B4F # <CJK> +0x7B50 # <CJK> +0x7B51 # <CJK> +0x7B52 # <CJK> +0x7B54 # <CJK> +0x7B56 # <CJK> +0x7B58 # <CJK> +0x7B5A # <CJK> +0x7B5B # <CJK> +0x7B5D # <CJK> +0x7B60 # <CJK> +0x7B62 # <CJK> +0x7B6E # <CJK> +0x7B71 # <CJK> +0x7B72 # <CJK> +0x7B75 # <CJK> +0x7B77 # <CJK> +0x7B79 # <CJK> +0x7B7B # <CJK> +0x7B7E # <CJK> +0x7B80 # <CJK> +0x7B85 # <CJK> +0x7B8D # <CJK> +0x7B90 # <CJK> +0x7B94 # <CJK> +0x7B95 # <CJK> +0x7B97 # <CJK> +0x7B9C # <CJK> +0x7B9D # <CJK> +0x7BA1 # <CJK> +0x7BA2 # <CJK> +0x7BA6 # <CJK> +0x7BA7 # <CJK> +0x7BA8 # <CJK> +0x7BA9 # <CJK> +0x7BAA # <CJK> +0x7BAB # <CJK> +0x7BAC # <CJK> +0x7BAD # <CJK> +0x7BB1 # <CJK> +0x7BB4 # <CJK> +0x7BB8 # <CJK> +0x7BC1 # <CJK> +0x7BC6 # <CJK> +0x7BC7 # <CJK> +0x7BCC # <CJK> +0x7BD1 # <CJK> +0x7BD3 # <CJK> +0x7BD9 # <CJK> +0x7BDA # <CJK> +0x7BDD # <CJK> +0x7BE1 # <CJK> +0x7BE5 # <CJK> +0x7BE6 # <CJK> +0x7BEA # <CJK> +0x7BEE # <CJK> +0x7BF1 # <CJK> +0x7BF7 # <CJK> +0x7BFC # <CJK> +0x7BFE # <CJK> +0x7C07 # <CJK> +0x7C0B # <CJK> +0x7C0C # <CJK> +0x7C0F # <CJK> +0x7C16 # <CJK> +0x7C1F # <CJK> +0x7C26 # <CJK> +0x7C27 # <CJK> +0x7C2A # <CJK> +0x7C38 # <CJK> +0x7C3F # <CJK> +0x7C40 # <CJK> +0x7C41 # <CJK> +0x7C4D # <CJK> +0x7C73 # <CJK> +0x7C74 # <CJK> +0x7C7B # <CJK> +0x7C7C # <CJK> +0x7C7D # <CJK> +0x7C89 # <CJK> +0x7C91 # <CJK> +0x7C92 # <CJK> +0x7C95 # <CJK> +0x7C97 # <CJK> +0x7C98 # <CJK> +0x7C9C # <CJK> +0x7C9D # <CJK> +0x7C9E # <CJK> +0x7C9F # <CJK> +0x7CA2 # <CJK> +0x7CA4 # <CJK> +0x7CA5 # <CJK> +0x7CAA # <CJK> +0x7CAE # <CJK> +0x7CB1 # <CJK> +0x7CB2 # <CJK> +0x7CB3 # <CJK> +0x7CB9 # <CJK> +0x7CBC # <CJK> +0x7CBD # <CJK> +0x7CBE # <CJK> +0x7CC1 # <CJK> +0x7CC5 # <CJK> +0x7CC7 # <CJK> +0x7CC8 # <CJK> +0x7CCA # <CJK> +0x7CCC # <CJK> +0x7CCD # <CJK> +0x7CD5 # <CJK> +0x7CD6 # <CJK> +0x7CD7 # <CJK> +0x7CD9 # <CJK> +0x7CDC # <CJK> +0x7CDF # <CJK> +0x7CE0 # <CJK> +0x7CE8 # <CJK> +0x7CEF # <CJK> +0x7CF8 # <CJK> +0x7CFB # <CJK> +0x7D0A # <CJK> +0x7D20 # <CJK> +0x7D22 # <CJK> +0x7D27 # <CJK> +0x7D2B # <CJK> +0x7D2F # <CJK> +0x7D6E # <CJK> +0x7D77 # <CJK> +0x7DA6 # <CJK> +0x7DAE # <CJK> +0x7E3B # <CJK> +0x7E41 # <CJK> +0x7E47 # <CJK> +0x7E82 # <CJK> +0x7E9B # <CJK> +0x7E9F # <CJK> +0x7EA0 # <CJK> +0x7EA1 # <CJK> +0x7EA2 # <CJK> +0x7EA3 # <CJK> +0x7EA4 # <CJK> +0x7EA5 # <CJK> +0x7EA6 # <CJK> +0x7EA7 # <CJK> +0x7EA8 # <CJK> +0x7EA9 # <CJK> +0x7EAA # <CJK> +0x7EAB # <CJK> +0x7EAC # <CJK> +0x7EAD # <CJK> +0x7EAF # <CJK> +0x7EB0 # <CJK> +0x7EB1 # <CJK> +0x7EB2 # <CJK> +0x7EB3 # <CJK> +0x7EB5 # <CJK> +0x7EB6 # <CJK> +0x7EB7 # <CJK> +0x7EB8 # <CJK> +0x7EB9 # <CJK> +0x7EBA # <CJK> +0x7EBD # <CJK> +0x7EBE # <CJK> +0x7EBF # <CJK> +0x7EC0 # <CJK> +0x7EC1 # <CJK> +0x7EC2 # <CJK> +0x7EC3 # <CJK> +0x7EC4 # <CJK> +0x7EC5 # <CJK> +0x7EC6 # <CJK> +0x7EC7 # <CJK> +0x7EC8 # <CJK> +0x7EC9 # <CJK> +0x7ECA # <CJK> +0x7ECB # <CJK> +0x7ECC # <CJK> +0x7ECD # <CJK> +0x7ECE # <CJK> +0x7ECF # <CJK> +0x7ED0 # <CJK> +0x7ED1 # <CJK> +0x7ED2 # <CJK> +0x7ED3 # <CJK> +0x7ED4 # <CJK> +0x7ED5 # <CJK> +0x7ED7 # <CJK> +0x7ED8 # <CJK> +0x7ED9 # <CJK> +0x7EDA # <CJK> +0x7EDB # <CJK> +0x7EDC # <CJK> +0x7EDD # <CJK> +0x7EDE # <CJK> +0x7EDF # <CJK> +0x7EE0 # <CJK> +0x7EE1 # <CJK> +0x7EE2 # <CJK> +0x7EE3 # <CJK> +0x7EE5 # <CJK> +0x7EE6 # <CJK> +0x7EE7 # <CJK> +0x7EE8 # <CJK> +0x7EE9 # <CJK> +0x7EEA # <CJK> +0x7EEB # <CJK> +0x7EED # <CJK> +0x7EEE # <CJK> +0x7EEF # <CJK> +0x7EF0 # <CJK> +0x7EF1 # <CJK> +0x7EF2 # <CJK> +0x7EF3 # <CJK> +0x7EF4 # <CJK> +0x7EF5 # <CJK> +0x7EF6 # <CJK> +0x7EF7 # <CJK> +0x7EF8 # <CJK> +0x7EFA # <CJK> +0x7EFB # <CJK> +0x7EFC # <CJK> +0x7EFD # <CJK> +0x7EFE # <CJK> +0x7EFF # <CJK> +0x7F00 # <CJK> +0x7F01 # <CJK> +0x7F02 # <CJK> +0x7F03 # <CJK> +0x7F04 # <CJK> +0x7F05 # <CJK> +0x7F06 # <CJK> +0x7F07 # <CJK> +0x7F08 # <CJK> +0x7F09 # <CJK> +0x7F0B # <CJK> +0x7F0C # <CJK> +0x7F0D # <CJK> +0x7F0E # <CJK> +0x7F0F # <CJK> +0x7F11 # <CJK> +0x7F12 # <CJK> +0x7F13 # <CJK> +0x7F14 # <CJK> +0x7F15 # <CJK> +0x7F16 # <CJK> +0x7F17 # <CJK> +0x7F18 # <CJK> +0x7F19 # <CJK> +0x7F1A # <CJK> +0x7F1B # <CJK> +0x7F1C # <CJK> +0x7F1D # <CJK> +0x7F1F # <CJK> +0x7F20 # <CJK> +0x7F21 # <CJK> +0x7F22 # <CJK> +0x7F23 # <CJK> +0x7F24 # <CJK> +0x7F25 # <CJK> +0x7F26 # <CJK> +0x7F27 # <CJK> +0x7F28 # <CJK> +0x7F29 # <CJK> +0x7F2A # <CJK> +0x7F2B # <CJK> +0x7F2C # <CJK> +0x7F2D # <CJK> +0x7F2E # <CJK> +0x7F2F # <CJK> +0x7F30 # <CJK> +0x7F31 # <CJK> +0x7F32 # <CJK> +0x7F33 # <CJK> +0x7F34 # <CJK> +0x7F35 # <CJK> +0x7F36 # <CJK> +0x7F38 # <CJK> +0x7F3A # <CJK> +0x7F42 # <CJK> +0x7F44 # <CJK> +0x7F45 # <CJK> +0x7F50 # <CJK> +0x7F51 # <CJK> +0x7F54 # <CJK> +0x7F55 # <CJK> +0x7F57 # <CJK> +0x7F58 # <CJK> +0x7F5A # <CJK> +0x7F5F # <CJK> +0x7F61 # <CJK> +0x7F62 # <CJK> +0x7F68 # <CJK> +0x7F69 # <CJK> +0x7F6A # <CJK> +0x7F6E # <CJK> +0x7F71 # <CJK> +0x7F72 # <CJK> +0x7F74 # <CJK> +0x7F79 # <CJK> +0x7F7E # <CJK> +0x7F81 # <CJK> +0x7F8A # <CJK> +0x7F8C # <CJK> +0x7F8E # <CJK> +0x7F94 # <CJK> +0x7F9A # <CJK> +0x7F9D # <CJK> +0x7F9E # <CJK> +0x7F9F # <CJK> +0x7FA1 # <CJK> +0x7FA4 # <CJK> +0x7FA7 # <CJK> +0x7FAF # <CJK> +0x7FB0 # <CJK> +0x7FB2 # <CJK> +0x7FB8 # <CJK> +0x7FB9 # <CJK> +0x7FBC # <CJK> +0x7FBD # <CJK> +0x7FBF # <CJK> +0x7FC1 # <CJK> +0x7FC5 # <CJK> +0x7FCA # <CJK> +0x7FCC # <CJK> +0x7FCE # <CJK> +0x7FD4 # <CJK> +0x7FD5 # <CJK> +0x7FD8 # <CJK> +0x7FDF # <CJK> +0x7FE0 # <CJK> +0x7FE1 # <CJK> +0x7FE5 # <CJK> +0x7FE6 # <CJK> +0x7FE9 # <CJK> +0x7FEE # <CJK> +0x7FF0 # <CJK> +0x7FF1 # <CJK> +0x7FF3 # <CJK> +0x7FFB # <CJK> +0x7FFC # <CJK> +0x8000 # <CJK> +0x8001 # <CJK> +0x8003 # <CJK> +0x8004 # <CJK> +0x8005 # <CJK> +0x8006 # <CJK> +0x800B # <CJK> +0x800C # <CJK> +0x800D # <CJK> +0x8010 # <CJK> +0x8012 # <CJK> +0x8014 # <CJK> +0x8015 # <CJK> +0x8016 # <CJK> +0x8017 # <CJK> +0x8018 # <CJK> +0x8019 # <CJK> +0x801C # <CJK> +0x8020 # <CJK> +0x8022 # <CJK> +0x8025 # <CJK> +0x8026 # <CJK> +0x8027 # <CJK> +0x8028 # <CJK> +0x8029 # <CJK> +0x802A # <CJK> +0x8031 # <CJK> +0x8033 # <CJK> +0x8035 # <CJK> +0x8036 # <CJK> +0x8037 # <CJK> +0x8038 # <CJK> +0x803B # <CJK> +0x803D # <CJK> +0x803F # <CJK> +0x8042 # <CJK> +0x8043 # <CJK> +0x8046 # <CJK> +0x804A # <CJK> +0x804B # <CJK> +0x804C # <CJK> +0x804D # <CJK> +0x8052 # <CJK> +0x8054 # <CJK> +0x8058 # <CJK> +0x805A # <CJK> +0x8069 # <CJK> +0x806A # <CJK> +0x8071 # <CJK> +0x807F # <CJK> +0x8080 # <CJK> +0x8083 # <CJK> +0x8084 # <CJK> +0x8086 # <CJK> +0x8087 # <CJK> +0x8089 # <CJK> +0x808B # <CJK> +0x808C # <CJK> +0x8093 # <CJK> +0x8096 # <CJK> +0x8098 # <CJK> +0x809A # <CJK> +0x809B # <CJK> +0x809C # <CJK> +0x809D # <CJK> +0x809F # <CJK> +0x80A0 # <CJK> +0x80A1 # <CJK> +0x80A2 # <CJK> +0x80A4 # <CJK> +0x80A5 # <CJK> +0x80A9 # <CJK> +0x80AA # <CJK> +0x80AB # <CJK> +0x80AD # <CJK> +0x80AE # <CJK> +0x80AF # <CJK> +0x80B1 # <CJK> +0x80B2 # <CJK> +0x80B4 # <CJK> +0x80B7 # <CJK> +0x80BA # <CJK> +0x80BC # <CJK> +0x80BD # <CJK> +0x80BE # <CJK> +0x80BF # <CJK> +0x80C0 # <CJK> +0x80C1 # <CJK> +0x80C2 # <CJK> +0x80C3 # <CJK> +0x80C4 # <CJK> +0x80C6 # <CJK> +0x80CC # <CJK> +0x80CD # <CJK> +0x80CE # <CJK> +0x80D6 # <CJK> +0x80D7 # <CJK> +0x80D9 # <CJK> +0x80DA # <CJK> +0x80DB # <CJK> +0x80DC # <CJK> +0x80DD # <CJK> +0x80DE # <CJK> +0x80E1 # <CJK> +0x80E4 # <CJK> +0x80E5 # <CJK> +0x80E7 # <CJK> +0x80E8 # <CJK> +0x80E9 # <CJK> +0x80EA # <CJK> +0x80EB # <CJK> +0x80EC # <CJK> +0x80ED # <CJK> +0x80EF # <CJK> +0x80F0 # <CJK> +0x80F1 # <CJK> +0x80F2 # <CJK> +0x80F3 # <CJK> +0x80F4 # <CJK> +0x80F6 # <CJK> +0x80F8 # <CJK> +0x80FA # <CJK> +0x80FC # <CJK> +0x80FD # <CJK> +0x8102 # <CJK> +0x8106 # <CJK> +0x8109 # <CJK> +0x810A # <CJK> +0x810D # <CJK> +0x810E # <CJK> +0x810F # <CJK> +0x8110 # <CJK> +0x8111 # <CJK> +0x8112 # <CJK> +0x8113 # <CJK> +0x8114 # <CJK> +0x8116 # <CJK> +0x8118 # <CJK> +0x811A # <CJK> +0x811E # <CJK> +0x812C # <CJK> +0x812F # <CJK> +0x8131 # <CJK> +0x8132 # <CJK> +0x8136 # <CJK> +0x8138 # <CJK> +0x813E # <CJK> +0x8146 # <CJK> +0x8148 # <CJK> +0x814A # <CJK> +0x814B # <CJK> +0x814C # <CJK> +0x8150 # <CJK> +0x8151 # <CJK> +0x8153 # <CJK> +0x8154 # <CJK> +0x8155 # <CJK> +0x8159 # <CJK> +0x815A # <CJK> +0x8160 # <CJK> +0x8165 # <CJK> +0x8167 # <CJK> +0x8169 # <CJK> +0x816D # <CJK> +0x816E # <CJK> +0x8170 # <CJK> +0x8171 # <CJK> +0x8174 # <CJK> +0x8179 # <CJK> +0x817A # <CJK> +0x817B # <CJK> +0x817C # <CJK> +0x817D # <CJK> +0x817E # <CJK> +0x817F # <CJK> +0x8180 # <CJK> +0x8182 # <CJK> +0x8188 # <CJK> +0x818A # <CJK> +0x818F # <CJK> +0x8191 # <CJK> +0x8198 # <CJK> +0x819B # <CJK> +0x819C # <CJK> +0x819D # <CJK> +0x81A3 # <CJK> +0x81A6 # <CJK> +0x81A8 # <CJK> +0x81AA # <CJK> +0x81B3 # <CJK> +0x81BA # <CJK> +0x81BB # <CJK> +0x81C0 # <CJK> +0x81C1 # <CJK> +0x81C2 # <CJK> +0x81C3 # <CJK> +0x81C6 # <CJK> +0x81CA # <CJK> +0x81CC # <CJK> +0x81E3 # <CJK> +0x81E7 # <CJK> +0x81EA # <CJK> +0x81EC # <CJK> +0x81ED # <CJK> +0x81F3 # <CJK> +0x81F4 # <CJK> +0x81FB # <CJK> +0x81FC # <CJK> +0x81FE # <CJK> +0x8200 # <CJK> +0x8201 # <CJK> +0x8202 # <CJK> +0x8204 # <CJK> +0x8205 # <CJK> +0x8206 # <CJK> +0x820C # <CJK> +0x820D # <CJK> +0x8210 # <CJK> +0x8212 # <CJK> +0x8214 # <CJK> +0x821B # <CJK> +0x821C # <CJK> +0x821E # <CJK> +0x821F # <CJK> +0x8221 # <CJK> +0x8222 # <CJK> +0x8223 # <CJK> +0x8228 # <CJK> +0x822A # <CJK> +0x822B # <CJK> +0x822C # <CJK> +0x822D # <CJK> +0x822F # <CJK> +0x8230 # <CJK> +0x8231 # <CJK> +0x8233 # <CJK> +0x8234 # <CJK> +0x8235 # <CJK> +0x8236 # <CJK> +0x8237 # <CJK> +0x8238 # <CJK> +0x8239 # <CJK> +0x823B # <CJK> +0x823E # <CJK> +0x8244 # <CJK> +0x8247 # <CJK> +0x8249 # <CJK> +0x824B # <CJK> +0x824F # <CJK> +0x8258 # <CJK> +0x825A # <CJK> +0x825F # <CJK> +0x8268 # <CJK> +0x826E # <CJK> +0x826F # <CJK> +0x8270 # <CJK> +0x8272 # <CJK> +0x8273 # <CJK> +0x8274 # <CJK> +0x8279 # <CJK> +0x827A # <CJK> +0x827D # <CJK> +0x827E # <CJK> +0x827F # <CJK> +0x8282 # <CJK> +0x8284 # <CJK> +0x8288 # <CJK> +0x828A # <CJK> +0x828B # <CJK> +0x828D # <CJK> +0x828E # <CJK> +0x828F # <CJK> +0x8291 # <CJK> +0x8292 # <CJK> +0x8297 # <CJK> +0x8298 # <CJK> +0x8299 # <CJK> +0x829C # <CJK> +0x829D # <CJK> +0x829F # <CJK> +0x82A1 # <CJK> +0x82A4 # <CJK> +0x82A5 # <CJK> +0x82A6 # <CJK> +0x82A8 # <CJK> +0x82A9 # <CJK> +0x82AA # <CJK> +0x82AB # <CJK> +0x82AC # <CJK> +0x82AD # <CJK> +0x82AE # <CJK> +0x82AF # <CJK> +0x82B0 # <CJK> +0x82B1 # <CJK> +0x82B3 # <CJK> +0x82B4 # <CJK> +0x82B7 # <CJK> +0x82B8 # <CJK> +0x82B9 # <CJK> +0x82BD # <CJK> +0x82BE # <CJK> +0x82C1 # <CJK> +0x82C4 # <CJK> +0x82C7 # <CJK> +0x82C8 # <CJK> +0x82CA # <CJK> +0x82CB # <CJK> +0x82CC # <CJK> +0x82CD # <CJK> +0x82CE # <CJK> +0x82CF # <CJK> +0x82D1 # <CJK> +0x82D2 # <CJK> +0x82D3 # <CJK> +0x82D4 # <CJK> +0x82D5 # <CJK> +0x82D7 # <CJK> +0x82D8 # <CJK> +0x82DB # <CJK> +0x82DC # <CJK> +0x82DE # <CJK> +0x82DF # <CJK> +0x82E0 # <CJK> +0x82E1 # <CJK> +0x82E3 # <CJK> +0x82E4 # <CJK> +0x82E5 # <CJK> +0x82E6 # <CJK> +0x82EB # <CJK> +0x82EF # <CJK> +0x82F1 # <CJK> +0x82F4 # <CJK> +0x82F7 # <CJK> +0x82F9 # <CJK> +0x82FB # <CJK> +0x8301 # <CJK> +0x8302 # <CJK> +0x8303 # <CJK> +0x8304 # <CJK> +0x8305 # <CJK> +0x8306 # <CJK> +0x8307 # <CJK> +0x8308 # <CJK> +0x8309 # <CJK> +0x830C # <CJK> +0x830E # <CJK> +0x830F # <CJK> +0x8311 # <CJK> +0x8314 # <CJK> +0x8315 # <CJK> +0x8317 # <CJK> +0x831A # <CJK> +0x831B # <CJK> +0x831C # <CJK> +0x8327 # <CJK> +0x8328 # <CJK> +0x832B # <CJK> +0x832C # <CJK> +0x832D # <CJK> +0x832F # <CJK> +0x8331 # <CJK> +0x8333 # <CJK> +0x8334 # <CJK> +0x8335 # <CJK> +0x8336 # <CJK> +0x8338 # <CJK> +0x8339 # <CJK> +0x833A # <CJK> +0x833C # <CJK> +0x8340 # <CJK> +0x8343 # <CJK> +0x8346 # <CJK> +0x8347 # <CJK> +0x8349 # <CJK> +0x834F # <CJK> +0x8350 # <CJK> +0x8351 # <CJK> +0x8352 # <CJK> +0x8354 # <CJK> +0x835A # <CJK> +0x835B # <CJK> +0x835C # <CJK> +0x835E # <CJK> +0x835F # <CJK> +0x8360 # <CJK> +0x8361 # <CJK> +0x8363 # <CJK> +0x8364 # <CJK> +0x8365 # <CJK> +0x8366 # <CJK> +0x8367 # <CJK> +0x8368 # <CJK> +0x8369 # <CJK> +0x836A # <CJK> +0x836B # <CJK> +0x836C # <CJK> +0x836D # <CJK> +0x836E # <CJK> +0x836F # <CJK> +0x8377 # <CJK> +0x8378 # <CJK> +0x837B # <CJK> +0x837C # <CJK> +0x837D # <CJK> +0x8385 # <CJK> +0x8386 # <CJK> +0x8389 # <CJK> +0x838E # <CJK> +0x8392 # <CJK> +0x8393 # <CJK> +0x8398 # <CJK> +0x839B # <CJK> +0x839C # <CJK> +0x839E # <CJK> +0x83A0 # <CJK> +0x83A8 # <CJK> +0x83A9 # <CJK> +0x83AA # <CJK> +0x83AB # <CJK> +0x83B0 # <CJK> +0x83B1 # <CJK> +0x83B2 # <CJK> +0x83B3 # <CJK> +0x83B4 # <CJK> +0x83B6 # <CJK> +0x83B7 # <CJK> +0x83B8 # <CJK> +0x83B9 # <CJK> +0x83BA # <CJK> +0x83BC # <CJK> +0x83BD # <CJK> +0x83C0 # <CJK> +0x83C1 # <CJK> +0x83C5 # <CJK> +0x83C7 # <CJK> +0x83CA # <CJK> +0x83CC # <CJK> +0x83CF # <CJK> +0x83D4 # <CJK> +0x83D6 # <CJK> +0x83D8 # <CJK> +0x83DC # <CJK> +0x83DD # <CJK> +0x83DF # <CJK> +0x83E0 # <CJK> +0x83E1 # <CJK> +0x83E5 # <CJK> +0x83E9 # <CJK> +0x83EA # <CJK> +0x83F0 # <CJK> +0x83F1 # <CJK> +0x83F2 # <CJK> +0x83F8 # <CJK> +0x83F9 # <CJK> +0x83FD # <CJK> +0x8401 # <CJK> +0x8403 # <CJK> +0x8404 # <CJK> +0x8406 # <CJK> +0x840B # <CJK> +0x840C # <CJK> +0x840D # <CJK> +0x840E # <CJK> +0x840F # <CJK> +0x8411 # <CJK> +0x8418 # <CJK> +0x841C # <CJK> +0x841D # <CJK> +0x8424 # <CJK> +0x8425 # <CJK> +0x8426 # <CJK> +0x8427 # <CJK> +0x8428 # <CJK> +0x8431 # <CJK> +0x8438 # <CJK> +0x843C # <CJK> +0x843D # <CJK> +0x8446 # <CJK> +0x8451 # <CJK> +0x8457 # <CJK> +0x8459 # <CJK> +0x845A # <CJK> +0x845B # <CJK> +0x845C # <CJK> +0x8461 # <CJK> +0x8463 # <CJK> +0x8469 # <CJK> +0x846B # <CJK> +0x846C # <CJK> +0x846D # <CJK> +0x8471 # <CJK> +0x8473 # <CJK> +0x8475 # <CJK> +0x8476 # <CJK> +0x8478 # <CJK> +0x847A # <CJK> +0x8482 # <CJK> +0x8487 # <CJK> +0x8488 # <CJK> +0x8489 # <CJK> +0x848B # <CJK> +0x848C # <CJK> +0x848E # <CJK> +0x8497 # <CJK> +0x8499 # <CJK> +0x849C # <CJK> +0x84A1 # <CJK> +0x84AF # <CJK> +0x84B2 # <CJK> +0x84B4 # <CJK> +0x84B8 # <CJK> +0x84B9 # <CJK> +0x84BA # <CJK> +0x84BD # <CJK> +0x84BF # <CJK> +0x84C1 # <CJK> +0x84C4 # <CJK> +0x84C9 # <CJK> +0x84CA # <CJK> +0x84CD # <CJK> +0x84D0 # <CJK> +0x84D1 # <CJK> +0x84D3 # <CJK> +0x84D6 # <CJK> +0x84DD # <CJK> +0x84DF # <CJK> +0x84E0 # <CJK> +0x84E3 # <CJK> +0x84E5 # <CJK> +0x84E6 # <CJK> +0x84EC # <CJK> +0x84F0 # <CJK> +0x84FC # <CJK> +0x84FF # <CJK> +0x850C # <CJK> +0x8511 # <CJK> +0x8513 # <CJK> +0x8517 # <CJK> +0x851A # <CJK> +0x851F # <CJK> +0x8521 # <CJK> +0x852B # <CJK> +0x852C # <CJK> +0x8537 # <CJK> +0x8538 # <CJK> +0x8539 # <CJK> +0x853A # <CJK> +0x853B # <CJK> +0x853C # <CJK> +0x853D # <CJK> +0x8543 # <CJK> +0x8548 # <CJK> +0x8549 # <CJK> +0x854A # <CJK> +0x8556 # <CJK> +0x8559 # <CJK> +0x855E # <CJK> +0x8564 # <CJK> +0x8568 # <CJK> +0x8572 # <CJK> +0x8574 # <CJK> +0x8579 # <CJK> +0x857A # <CJK> +0x857B # <CJK> +0x857E # <CJK> +0x8584 # <CJK> +0x8585 # <CJK> +0x8587 # <CJK> +0x858F # <CJK> +0x859B # <CJK> +0x859C # <CJK> +0x85A4 # <CJK> +0x85A8 # <CJK> +0x85AA # <CJK> +0x85AE # <CJK> +0x85AF # <CJK> +0x85B0 # <CJK> +0x85B7 # <CJK> +0x85B9 # <CJK> +0x85C1 # <CJK> +0x85C9 # <CJK> +0x85CF # <CJK> +0x85D0 # <CJK> +0x85D3 # <CJK> +0x85D5 # <CJK> +0x85DC # <CJK> +0x85E4 # <CJK> +0x85E9 # <CJK> +0x85FB # <CJK> +0x85FF # <CJK> +0x8605 # <CJK> +0x8611 # <CJK> +0x8616 # <CJK> +0x8627 # <CJK> +0x8629 # <CJK> +0x8638 # <CJK> +0x863C # <CJK> +0x864D # <CJK> +0x864E # <CJK> +0x864F # <CJK> +0x8650 # <CJK> +0x8651 # <CJK> +0x8654 # <CJK> +0x865A # <CJK> +0x865E # <CJK> +0x8662 # <CJK> +0x866B # <CJK> +0x866C # <CJK> +0x866E # <CJK> +0x8671 # <CJK> +0x8679 # <CJK> +0x867A # <CJK> +0x867B # <CJK> +0x867C # <CJK> +0x867D # <CJK> +0x867E # <CJK> +0x867F # <CJK> +0x8680 # <CJK> +0x8681 # <CJK> +0x8682 # <CJK> +0x868A # <CJK> +0x868B # <CJK> +0x868C # <CJK> +0x868D # <CJK> +0x8693 # <CJK> +0x8695 # <CJK> +0x869C # <CJK> +0x869D # <CJK> +0x86A3 # <CJK> +0x86A4 # <CJK> +0x86A7 # <CJK> +0x86A8 # <CJK> +0x86A9 # <CJK> +0x86AA # <CJK> +0x86AC # <CJK> +0x86AF # <CJK> +0x86B0 # <CJK> +0x86B1 # <CJK> +0x86B4 # <CJK> +0x86B5 # <CJK> +0x86B6 # <CJK> +0x86BA # <CJK> +0x86C0 # <CJK> +0x86C4 # <CJK> +0x86C6 # <CJK> +0x86C7 # <CJK> +0x86C9 # <CJK> +0x86CA # <CJK> +0x86CB # <CJK> +0x86CE # <CJK> +0x86CF # <CJK> +0x86D0 # <CJK> +0x86D1 # <CJK> +0x86D4 # <CJK> +0x86D8 # <CJK> +0x86D9 # <CJK> +0x86DB # <CJK> +0x86DE # <CJK> +0x86DF # <CJK> +0x86E4 # <CJK> +0x86E9 # <CJK> +0x86ED # <CJK> +0x86EE # <CJK> +0x86F0 # <CJK> +0x86F1 # <CJK> +0x86F2 # <CJK> +0x86F3 # <CJK> +0x86F4 # <CJK> +0x86F8 # <CJK> +0x86F9 # <CJK> +0x86FE # <CJK> +0x8700 # <CJK> +0x8702 # <CJK> +0x8703 # <CJK> +0x8707 # <CJK> +0x8708 # <CJK> +0x8709 # <CJK> +0x870A # <CJK> +0x870D # <CJK> +0x8712 # <CJK> +0x8713 # <CJK> +0x8715 # <CJK> +0x8717 # <CJK> +0x8718 # <CJK> +0x871A # <CJK> +0x871C # <CJK> +0x871E # <CJK> +0x8721 # <CJK> +0x8722 # <CJK> +0x8723 # <CJK> +0x8725 # <CJK> +0x8729 # <CJK> +0x872E # <CJK> +0x8731 # <CJK> +0x8734 # <CJK> +0x8737 # <CJK> +0x873B # <CJK> +0x873E # <CJK> +0x873F # <CJK> +0x8747 # <CJK> +0x8748 # <CJK> +0x8749 # <CJK> +0x874C # <CJK> +0x874E # <CJK> +0x8753 # <CJK> +0x8757 # <CJK> +0x8759 # <CJK> +0x8760 # <CJK> +0x8763 # <CJK> +0x8764 # <CJK> +0x8765 # <CJK> +0x876E # <CJK> +0x8770 # <CJK> +0x8774 # <CJK> +0x8776 # <CJK> +0x877B # <CJK> +0x877C # <CJK> +0x877D # <CJK> +0x877E # <CJK> +0x8782 # <CJK> +0x8783 # <CJK> +0x8785 # <CJK> +0x8788 # <CJK> +0x878B # <CJK> +0x878D # <CJK> +0x8793 # <CJK> +0x8797 # <CJK> +0x879F # <CJK> +0x87A8 # <CJK> +0x87AB # <CJK> +0x87AC # <CJK> +0x87AD # <CJK> +0x87AF # <CJK> +0x87B3 # <CJK> +0x87B5 # <CJK> +0x87BA # <CJK> +0x87BD # <CJK> +0x87C0 # <CJK> +0x87C6 # <CJK> +0x87CA # <CJK> +0x87CB # <CJK> +0x87D1 # <CJK> +0x87D2 # <CJK> +0x87D3 # <CJK> +0x87DB # <CJK> +0x87E0 # <CJK> +0x87E5 # <CJK> +0x87EA # <CJK> +0x87EE # <CJK> +0x87F9 # <CJK> +0x87FE # <CJK> +0x8803 # <CJK> +0x880A # <CJK> +0x8813 # <CJK> +0x8815 # <CJK> +0x8816 # <CJK> +0x881B # <CJK> +0x8821 # <CJK> +0x8822 # <CJK> +0x8832 # <CJK> +0x8839 # <CJK> +0x883C # <CJK> +0x8840 # <CJK> +0x8844 # <CJK> +0x8845 # <CJK> +0x884C # <CJK> +0x884D # <CJK> +0x8854 # <CJK> +0x8857 # <CJK> +0x8859 # <CJK> +0x8861 # <CJK> +0x8862 # <CJK> +0x8863 # <CJK> +0x8864 # <CJK> +0x8865 # <CJK> +0x8868 # <CJK> +0x8869 # <CJK> +0x886B # <CJK> +0x886C # <CJK> +0x886E # <CJK> +0x8870 # <CJK> +0x8872 # <CJK> +0x8877 # <CJK> +0x887D # <CJK> +0x887E # <CJK> +0x887F # <CJK> +0x8881 # <CJK> +0x8882 # <CJK> +0x8884 # <CJK> +0x8885 # <CJK> +0x8888 # <CJK> +0x888B # <CJK> +0x888D # <CJK> +0x8892 # <CJK> +0x8896 # <CJK> +0x889C # <CJK> +0x88A2 # <CJK> +0x88A4 # <CJK> +0x88AB # <CJK> +0x88AD # <CJK> +0x88B1 # <CJK> +0x88B7 # <CJK> +0x88BC # <CJK> +0x88C1 # <CJK> +0x88C2 # <CJK> +0x88C5 # <CJK> +0x88C6 # <CJK> +0x88C9 # <CJK> +0x88CE # <CJK> +0x88D2 # <CJK> +0x88D4 # <CJK> +0x88D5 # <CJK> +0x88D8 # <CJK> +0x88D9 # <CJK> +0x88DF # <CJK> +0x88E2 # <CJK> +0x88E3 # <CJK> +0x88E4 # <CJK> +0x88E5 # <CJK> +0x88E8 # <CJK> +0x88F0 # <CJK> +0x88F1 # <CJK> +0x88F3 # <CJK> +0x88F4 # <CJK> +0x88F8 # <CJK> +0x88F9 # <CJK> +0x88FC # <CJK> +0x88FE # <CJK> +0x8902 # <CJK> +0x890A # <CJK> +0x8910 # <CJK> +0x8912 # <CJK> +0x8913 # <CJK> +0x8919 # <CJK> +0x891A # <CJK> +0x891B # <CJK> +0x8921 # <CJK> +0x8925 # <CJK> +0x892A # <CJK> +0x892B # <CJK> +0x8930 # <CJK> +0x8934 # <CJK> +0x8936 # <CJK> +0x8941 # <CJK> +0x8944 # <CJK> +0x895E # <CJK> +0x895F # <CJK> +0x8966 # <CJK> +0x897B # <CJK> +0x897F # <CJK> +0x8981 # <CJK> +0x8983 # <CJK> +0x8986 # <CJK> +0x89C1 # <CJK> +0x89C2 # <CJK> +0x89C4 # <CJK> +0x89C5 # <CJK> +0x89C6 # <CJK> +0x89C7 # <CJK> +0x89C8 # <CJK> +0x89C9 # <CJK> +0x89CA # <CJK> +0x89CB # <CJK> +0x89CC # <CJK> +0x89CE # <CJK> +0x89CF # <CJK> +0x89D0 # <CJK> +0x89D1 # <CJK> +0x89D2 # <CJK> +0x89D6 # <CJK> +0x89DA # <CJK> +0x89DC # <CJK> +0x89DE # <CJK> +0x89E3 # <CJK> +0x89E5 # <CJK> +0x89E6 # <CJK> +0x89EB # <CJK> +0x89EF # <CJK> +0x89F3 # <CJK> +0x8A00 # <CJK> +0x8A07 # <CJK> +0x8A3E # <CJK> +0x8A48 # <CJK> +0x8A79 # <CJK> +0x8A89 # <CJK> +0x8A8A # <CJK> +0x8A93 # <CJK> +0x8B07 # <CJK> +0x8B26 # <CJK> +0x8B66 # <CJK> +0x8B6C # <CJK> +0x8BA0 # <CJK> +0x8BA1 # <CJK> +0x8BA2 # <CJK> +0x8BA3 # <CJK> +0x8BA4 # <CJK> +0x8BA5 # <CJK> +0x8BA6 # <CJK> +0x8BA7 # <CJK> +0x8BA8 # <CJK> +0x8BA9 # <CJK> +0x8BAA # <CJK> +0x8BAB # <CJK> +0x8BAD # <CJK> +0x8BAE # <CJK> +0x8BAF # <CJK> +0x8BB0 # <CJK> +0x8BB2 # <CJK> +0x8BB3 # <CJK> +0x8BB4 # <CJK> +0x8BB5 # <CJK> +0x8BB6 # <CJK> +0x8BB7 # <CJK> +0x8BB8 # <CJK> +0x8BB9 # <CJK> +0x8BBA # <CJK> +0x8BBC # <CJK> +0x8BBD # <CJK> +0x8BBE # <CJK> +0x8BBF # <CJK> +0x8BC0 # <CJK> +0x8BC1 # <CJK> +0x8BC2 # <CJK> +0x8BC3 # <CJK> +0x8BC4 # <CJK> +0x8BC5 # <CJK> +0x8BC6 # <CJK> +0x8BC8 # <CJK> +0x8BC9 # <CJK> +0x8BCA # <CJK> +0x8BCB # <CJK> +0x8BCC # <CJK> +0x8BCD # <CJK> +0x8BCE # <CJK> +0x8BCF # <CJK> +0x8BD1 # <CJK> +0x8BD2 # <CJK> +0x8BD3 # <CJK> +0x8BD4 # <CJK> +0x8BD5 # <CJK> +0x8BD6 # <CJK> +0x8BD7 # <CJK> +0x8BD8 # <CJK> +0x8BD9 # <CJK> +0x8BDA # <CJK> +0x8BDB # <CJK> +0x8BDC # <CJK> +0x8BDD # <CJK> +0x8BDE # <CJK> +0x8BDF # <CJK> +0x8BE0 # <CJK> +0x8BE1 # <CJK> +0x8BE2 # <CJK> +0x8BE3 # <CJK> +0x8BE4 # <CJK> +0x8BE5 # <CJK> +0x8BE6 # <CJK> +0x8BE7 # <CJK> +0x8BE8 # <CJK> +0x8BE9 # <CJK> +0x8BEB # <CJK> +0x8BEC # <CJK> +0x8BED # <CJK> +0x8BEE # <CJK> +0x8BEF # <CJK> +0x8BF0 # <CJK> +0x8BF1 # <CJK> +0x8BF2 # <CJK> +0x8BF3 # <CJK> +0x8BF4 # <CJK> +0x8BF5 # <CJK> +0x8BF6 # <CJK> +0x8BF7 # <CJK> +0x8BF8 # <CJK> +0x8BF9 # <CJK> +0x8BFA # <CJK> +0x8BFB # <CJK> +0x8BFC # <CJK> +0x8BFD # <CJK> +0x8BFE # <CJK> +0x8BFF # <CJK> +0x8C00 # <CJK> +0x8C01 # <CJK> +0x8C02 # <CJK> +0x8C03 # <CJK> +0x8C04 # <CJK> +0x8C05 # <CJK> +0x8C06 # <CJK> +0x8C07 # <CJK> +0x8C08 # <CJK> +0x8C0A # <CJK> +0x8C0B # <CJK> +0x8C0C # <CJK> +0x8C0D # <CJK> +0x8C0E # <CJK> +0x8C0F # <CJK> +0x8C10 # <CJK> +0x8C11 # <CJK> +0x8C12 # <CJK> +0x8C13 # <CJK> +0x8C14 # <CJK> +0x8C15 # <CJK> +0x8C16 # <CJK> +0x8C17 # <CJK> +0x8C18 # <CJK> +0x8C19 # <CJK> +0x8C1A # <CJK> +0x8C1B # <CJK> +0x8C1C # <CJK> +0x8C1D # <CJK> +0x8C1F # <CJK> +0x8C20 # <CJK> +0x8C21 # <CJK> +0x8C22 # <CJK> +0x8C23 # <CJK> +0x8C24 # <CJK> +0x8C25 # <CJK> +0x8C26 # <CJK> +0x8C27 # <CJK> +0x8C28 # <CJK> +0x8C29 # <CJK> +0x8C2A # <CJK> +0x8C2B # <CJK> +0x8C2C # <CJK> +0x8C2D # <CJK> +0x8C2E # <CJK> +0x8C2F # <CJK> +0x8C30 # <CJK> +0x8C31 # <CJK> +0x8C32 # <CJK> +0x8C33 # <CJK> +0x8C34 # <CJK> +0x8C35 # <CJK> +0x8C36 # <CJK> +0x8C37 # <CJK> +0x8C41 # <CJK> +0x8C46 # <CJK> +0x8C47 # <CJK> +0x8C49 # <CJK> +0x8C4C # <CJK> +0x8C55 # <CJK> +0x8C5A # <CJK> +0x8C61 # <CJK> +0x8C62 # <CJK> +0x8C6A # <CJK> +0x8C6B # <CJK> +0x8C73 # <CJK> +0x8C78 # <CJK> +0x8C79 # <CJK> +0x8C7A # <CJK> +0x8C82 # <CJK> +0x8C85 # <CJK> +0x8C89 # <CJK> +0x8C8A # <CJK> +0x8C8C # <CJK> +0x8C94 # <CJK> +0x8C98 # <CJK> +0x8D1D # <CJK> +0x8D1E # <CJK> +0x8D1F # <CJK> +0x8D21 # <CJK> +0x8D22 # <CJK> +0x8D23 # <CJK> +0x8D24 # <CJK> +0x8D25 # <CJK> +0x8D26 # <CJK> +0x8D27 # <CJK> +0x8D28 # <CJK> +0x8D29 # <CJK> +0x8D2A # <CJK> +0x8D2B # <CJK> +0x8D2C # <CJK> +0x8D2D # <CJK> +0x8D2E # <CJK> +0x8D2F # <CJK> +0x8D30 # <CJK> +0x8D31 # <CJK> +0x8D32 # <CJK> +0x8D33 # <CJK> +0x8D34 # <CJK> +0x8D35 # <CJK> +0x8D36 # <CJK> +0x8D37 # <CJK> +0x8D38 # <CJK> +0x8D39 # <CJK> +0x8D3A # <CJK> +0x8D3B # <CJK> +0x8D3C # <CJK> +0x8D3D # <CJK> +0x8D3E # <CJK> +0x8D3F # <CJK> +0x8D40 # <CJK> +0x8D41 # <CJK> +0x8D42 # <CJK> +0x8D43 # <CJK> +0x8D44 # <CJK> +0x8D45 # <CJK> +0x8D46 # <CJK> +0x8D47 # <CJK> +0x8D48 # <CJK> +0x8D49 # <CJK> +0x8D4A # <CJK> +0x8D4B # <CJK> +0x8D4C # <CJK> +0x8D4D # <CJK> +0x8D4E # <CJK> +0x8D4F # <CJK> +0x8D50 # <CJK> +0x8D53 # <CJK> +0x8D54 # <CJK> +0x8D55 # <CJK> +0x8D56 # <CJK> +0x8D58 # <CJK> +0x8D59 # <CJK> +0x8D5A # <CJK> +0x8D5B # <CJK> +0x8D5C # <CJK> +0x8D5D # <CJK> +0x8D5E # <CJK> +0x8D60 # <CJK> +0x8D61 # <CJK> +0x8D62 # <CJK> +0x8D63 # <CJK> +0x8D64 # <CJK> +0x8D66 # <CJK> +0x8D67 # <CJK> +0x8D6B # <CJK> +0x8D6D # <CJK> +0x8D70 # <CJK> +0x8D73 # <CJK> +0x8D74 # <CJK> +0x8D75 # <CJK> +0x8D76 # <CJK> +0x8D77 # <CJK> +0x8D81 # <CJK> +0x8D84 # <CJK> +0x8D85 # <CJK> +0x8D8A # <CJK> +0x8D8B # <CJK> +0x8D91 # <CJK> +0x8D94 # <CJK> +0x8D9F # <CJK> +0x8DA3 # <CJK> +0x8DB1 # <CJK> +0x8DB3 # <CJK> +0x8DB4 # <CJK> +0x8DB5 # <CJK> +0x8DB8 # <CJK> +0x8DBA # <CJK> +0x8DBC # <CJK> +0x8DBE # <CJK> +0x8DBF # <CJK> +0x8DC3 # <CJK> +0x8DC4 # <CJK> +0x8DC6 # <CJK> +0x8DCB # <CJK> +0x8DCC # <CJK> +0x8DCE # <CJK> +0x8DCF # <CJK> +0x8DD1 # <CJK> +0x8DD6 # <CJK> +0x8DD7 # <CJK> +0x8DDA # <CJK> +0x8DDB # <CJK> +0x8DDD # <CJK> +0x8DDE # <CJK> +0x8DDF # <CJK> +0x8DE3 # <CJK> +0x8DE4 # <CJK> +0x8DE8 # <CJK> +0x8DEA # <CJK> +0x8DEB # <CJK> +0x8DEC # <CJK> +0x8DEF # <CJK> +0x8DF3 # <CJK> +0x8DF5 # <CJK> +0x8DF7 # <CJK> +0x8DF8 # <CJK> +0x8DF9 # <CJK> +0x8DFA # <CJK> +0x8DFB # <CJK> +0x8DFD # <CJK> +0x8E05 # <CJK> +0x8E09 # <CJK> +0x8E0A # <CJK> +0x8E0C # <CJK> +0x8E0F # <CJK> +0x8E14 # <CJK> +0x8E1D # <CJK> +0x8E1E # <CJK> +0x8E1F # <CJK> +0x8E22 # <CJK> +0x8E23 # <CJK> +0x8E29 # <CJK> +0x8E2A # <CJK> +0x8E2C # <CJK> +0x8E2E # <CJK> +0x8E2F # <CJK> +0x8E31 # <CJK> +0x8E35 # <CJK> +0x8E39 # <CJK> +0x8E3A # <CJK> +0x8E3D # <CJK> +0x8E40 # <CJK> +0x8E41 # <CJK> +0x8E42 # <CJK> +0x8E44 # <CJK> +0x8E47 # <CJK> +0x8E48 # <CJK> +0x8E49 # <CJK> +0x8E4A # <CJK> +0x8E4B # <CJK> +0x8E51 # <CJK> +0x8E52 # <CJK> +0x8E59 # <CJK> +0x8E66 # <CJK> +0x8E69 # <CJK> +0x8E6C # <CJK> +0x8E6D # <CJK> +0x8E6F # <CJK> +0x8E70 # <CJK> +0x8E72 # <CJK> +0x8E74 # <CJK> +0x8E76 # <CJK> +0x8E7C # <CJK> +0x8E7F # <CJK> +0x8E81 # <CJK> +0x8E85 # <CJK> +0x8E87 # <CJK> +0x8E8F # <CJK> +0x8E90 # <CJK> +0x8E94 # <CJK> +0x8E9C # <CJK> +0x8E9E # <CJK> +0x8EAB # <CJK> +0x8EAC # <CJK> +0x8EAF # <CJK> +0x8EB2 # <CJK> +0x8EBA # <CJK> +0x8ECE # <CJK> +0x8F66 # <CJK> +0x8F67 # <CJK> +0x8F68 # <CJK> +0x8F69 # <CJK> +0x8F6B # <CJK> +0x8F6C # <CJK> +0x8F6D # <CJK> +0x8F6E # <CJK> +0x8F6F # <CJK> +0x8F70 # <CJK> +0x8F71 # <CJK> +0x8F72 # <CJK> +0x8F73 # <CJK> +0x8F74 # <CJK> +0x8F75 # <CJK> +0x8F76 # <CJK> +0x8F77 # <CJK> +0x8F78 # <CJK> +0x8F79 # <CJK> +0x8F7A # <CJK> +0x8F7B # <CJK> +0x8F7C # <CJK> +0x8F7D # <CJK> +0x8F7E # <CJK> +0x8F7F # <CJK> +0x8F81 # <CJK> +0x8F82 # <CJK> +0x8F83 # <CJK> +0x8F84 # <CJK> +0x8F85 # <CJK> +0x8F86 # <CJK> +0x8F87 # <CJK> +0x8F88 # <CJK> +0x8F89 # <CJK> +0x8F8A # <CJK> +0x8F8B # <CJK> +0x8F8D # <CJK> +0x8F8E # <CJK> +0x8F8F # <CJK> +0x8F90 # <CJK> +0x8F91 # <CJK> +0x8F93 # <CJK> +0x8F94 # <CJK> +0x8F95 # <CJK> +0x8F96 # <CJK> +0x8F97 # <CJK> +0x8F98 # <CJK> +0x8F99 # <CJK> +0x8F9A # <CJK> +0x8F9B # <CJK> +0x8F9C # <CJK> +0x8F9E # <CJK> +0x8F9F # <CJK> +0x8FA3 # <CJK> +0x8FA8 # <CJK> +0x8FA9 # <CJK> +0x8FAB # <CJK> +0x8FB0 # <CJK> +0x8FB1 # <CJK> +0x8FB6 # <CJK> +0x8FB9 # <CJK> +0x8FBD # <CJK> +0x8FBE # <CJK> +0x8FC1 # <CJK> +0x8FC2 # <CJK> +0x8FC4 # <CJK> +0x8FC5 # <CJK> +0x8FC7 # <CJK> +0x8FC8 # <CJK> +0x8FCE # <CJK> +0x8FD0 # <CJK> +0x8FD1 # <CJK> +0x8FD3 # <CJK> +0x8FD4 # <CJK> +0x8FD5 # <CJK> +0x8FD8 # <CJK> +0x8FD9 # <CJK> +0x8FDB # <CJK> +0x8FDC # <CJK> +0x8FDD # <CJK> +0x8FDE # <CJK> +0x8FDF # <CJK> +0x8FE2 # <CJK> +0x8FE4 # <CJK> +0x8FE5 # <CJK> +0x8FE6 # <CJK> +0x8FE8 # <CJK> +0x8FE9 # <CJK> +0x8FEA # <CJK> +0x8FEB # <CJK> +0x8FED # <CJK> +0x8FEE # <CJK> +0x8FF0 # <CJK> +0x8FF3 # <CJK> +0x8FF7 # <CJK> +0x8FF8 # <CJK> +0x8FF9 # <CJK> +0x8FFD # <CJK> +0x9000 # <CJK> +0x9001 # <CJK> +0x9002 # <CJK> +0x9003 # <CJK> +0x9004 # <CJK> +0x9005 # <CJK> +0x9006 # <CJK> +0x9009 # <CJK> +0x900A # <CJK> +0x900B # <CJK> +0x900D # <CJK> +0x900F # <CJK> +0x9010 # <CJK> +0x9011 # <CJK> +0x9012 # <CJK> +0x9014 # <CJK> +0x9016 # <CJK> +0x9017 # <CJK> +0x901A # <CJK> +0x901B # <CJK> +0x901D # <CJK> +0x901E # <CJK> +0x901F # <CJK> +0x9020 # <CJK> +0x9021 # <CJK> +0x9022 # <CJK> +0x9026 # <CJK> +0x902D # <CJK> +0x902E # <CJK> +0x902F # <CJK> +0x9035 # <CJK> +0x9036 # <CJK> +0x9038 # <CJK> +0x903B # <CJK> +0x903C # <CJK> +0x903E # <CJK> +0x9041 # <CJK> +0x9042 # <CJK> +0x9044 # <CJK> +0x9047 # <CJK> +0x904D # <CJK> +0x904F # <CJK> +0x9050 # <CJK> +0x9051 # <CJK> +0x9052 # <CJK> +0x9053 # <CJK> +0x9057 # <CJK> +0x9058 # <CJK> +0x905B # <CJK> +0x9062 # <CJK> +0x9063 # <CJK> +0x9065 # <CJK> +0x9068 # <CJK> +0x906D # <CJK> +0x906E # <CJK> +0x9074 # <CJK> +0x9075 # <CJK> +0x907D # <CJK> +0x907F # <CJK> +0x9080 # <CJK> +0x9082 # <CJK> +0x9083 # <CJK> +0x9088 # <CJK> +0x908B # <CJK> +0x9091 # <CJK> +0x9093 # <CJK> +0x9095 # <CJK> +0x9097 # <CJK> +0x9099 # <CJK> +0x909B # <CJK> +0x909D # <CJK> +0x90A1 # <CJK> +0x90A2 # <CJK> +0x90A3 # <CJK> +0x90A6 # <CJK> +0x90AA # <CJK> +0x90AC # <CJK> +0x90AE # <CJK> +0x90AF # <CJK> +0x90B0 # <CJK> +0x90B1 # <CJK> +0x90B3 # <CJK> +0x90B4 # <CJK> +0x90B5 # <CJK> +0x90B6 # <CJK> +0x90B8 # <CJK> +0x90B9 # <CJK> +0x90BA # <CJK> +0x90BB # <CJK> +0x90BE # <CJK> +0x90C1 # <CJK> +0x90C4 # <CJK> +0x90C5 # <CJK> +0x90C7 # <CJK> +0x90CA # <CJK> +0x90CE # <CJK> +0x90CF # <CJK> +0x90D0 # <CJK> +0x90D1 # <CJK> +0x90D3 # <CJK> +0x90D7 # <CJK> +0x90DB # <CJK> +0x90DC # <CJK> +0x90DD # <CJK> +0x90E1 # <CJK> +0x90E2 # <CJK> +0x90E6 # <CJK> +0x90E7 # <CJK> +0x90E8 # <CJK> +0x90EB # <CJK> +0x90ED # <CJK> +0x90EF # <CJK> +0x90F4 # <CJK> +0x90F8 # <CJK> +0x90FD # <CJK> +0x90FE # <CJK> +0x9102 # <CJK> +0x9104 # <CJK> +0x9119 # <CJK> +0x911E # <CJK> +0x9122 # <CJK> +0x9123 # <CJK> +0x912F # <CJK> +0x9131 # <CJK> +0x9139 # <CJK> +0x9143 # <CJK> +0x9146 # <CJK> +0x9149 # <CJK> +0x914A # <CJK> +0x914B # <CJK> +0x914C # <CJK> +0x914D # <CJK> +0x914E # <CJK> +0x914F # <CJK> +0x9150 # <CJK> +0x9152 # <CJK> +0x9157 # <CJK> +0x915A # <CJK> +0x915D # <CJK> +0x915E # <CJK> +0x9161 # <CJK> +0x9162 # <CJK> +0x9163 # <CJK> +0x9164 # <CJK> +0x9165 # <CJK> +0x9169 # <CJK> +0x916A # <CJK> +0x916C # <CJK> +0x916E # <CJK> +0x916F # <CJK> +0x9170 # <CJK> +0x9171 # <CJK> +0x9172 # <CJK> +0x9174 # <CJK> +0x9175 # <CJK> +0x9176 # <CJK> +0x9177 # <CJK> +0x9178 # <CJK> +0x9179 # <CJK> +0x917D # <CJK> +0x917E # <CJK> +0x917F # <CJK> +0x9185 # <CJK> +0x9187 # <CJK> +0x9189 # <CJK> +0x918B # <CJK> +0x918C # <CJK> +0x918D # <CJK> +0x9190 # <CJK> +0x9191 # <CJK> +0x9192 # <CJK> +0x919A # <CJK> +0x919B # <CJK> +0x91A2 # <CJK> +0x91A3 # <CJK> +0x91AA # <CJK> +0x91AD # <CJK> +0x91AE # <CJK> +0x91AF # <CJK> +0x91B4 # <CJK> +0x91B5 # <CJK> +0x91BA # <CJK> +0x91C7 # <CJK> +0x91C9 # <CJK> +0x91CA # <CJK> +0x91CC # <CJK> +0x91CD # <CJK> +0x91CE # <CJK> +0x91CF # <CJK> +0x91D1 # <CJK> +0x91DC # <CJK> +0x9274 # <CJK> +0x928E # <CJK> +0x92AE # <CJK> +0x92C8 # <CJK> +0x933E # <CJK> +0x936A # <CJK> +0x938F # <CJK> +0x93CA # <CJK> +0x93D6 # <CJK> +0x943E # <CJK> +0x946B # <CJK> +0x9485 # <CJK> +0x9486 # <CJK> +0x9487 # <CJK> +0x9488 # <CJK> +0x9489 # <CJK> +0x948A # <CJK> +0x948B # <CJK> +0x948C # <CJK> +0x948D # <CJK> +0x948E # <CJK> +0x948F # <CJK> +0x9490 # <CJK> +0x9492 # <CJK> +0x9493 # <CJK> +0x9494 # <CJK> +0x9495 # <CJK> +0x9497 # <CJK> +0x9499 # <CJK> +0x949A # <CJK> +0x949B # <CJK> +0x949C # <CJK> +0x949D # <CJK> +0x949E # <CJK> +0x949F # <CJK> +0x94A0 # <CJK> +0x94A1 # <CJK> +0x94A2 # <CJK> +0x94A3 # <CJK> +0x94A4 # <CJK> +0x94A5 # <CJK> +0x94A6 # <CJK> +0x94A7 # <CJK> +0x94A8 # <CJK> +0x94A9 # <CJK> +0x94AA # <CJK> +0x94AB # <CJK> +0x94AC # <CJK> +0x94AD # <CJK> +0x94AE # <CJK> +0x94AF # <CJK> +0x94B0 # <CJK> +0x94B1 # <CJK> +0x94B2 # <CJK> +0x94B3 # <CJK> +0x94B4 # <CJK> +0x94B5 # <CJK> +0x94B6 # <CJK> +0x94B7 # <CJK> +0x94B8 # <CJK> +0x94B9 # <CJK> +0x94BA # <CJK> +0x94BB # <CJK> +0x94BC # <CJK> +0x94BD # <CJK> +0x94BE # <CJK> +0x94BF # <CJK> +0x94C0 # <CJK> +0x94C1 # <CJK> +0x94C2 # <CJK> +0x94C3 # <CJK> +0x94C4 # <CJK> +0x94C5 # <CJK> +0x94C6 # <CJK> +0x94C8 # <CJK> +0x94C9 # <CJK> +0x94CA # <CJK> +0x94CB # <CJK> +0x94CC # <CJK> +0x94CD # <CJK> +0x94CE # <CJK> +0x94D0 # <CJK> +0x94D1 # <CJK> +0x94D2 # <CJK> +0x94D5 # <CJK> +0x94D6 # <CJK> +0x94D7 # <CJK> +0x94D8 # <CJK> +0x94D9 # <CJK> +0x94DB # <CJK> +0x94DC # <CJK> +0x94DD # <CJK> +0x94DE # <CJK> +0x94DF # <CJK> +0x94E0 # <CJK> +0x94E1 # <CJK> +0x94E2 # <CJK> +0x94E3 # <CJK> +0x94E4 # <CJK> +0x94E5 # <CJK> +0x94E7 # <CJK> +0x94E8 # <CJK> +0x94E9 # <CJK> +0x94EA # <CJK> +0x94EB # <CJK> +0x94EC # <CJK> +0x94ED # <CJK> +0x94EE # <CJK> +0x94EF # <CJK> +0x94F0 # <CJK> +0x94F1 # <CJK> +0x94F2 # <CJK> +0x94F3 # <CJK> +0x94F4 # <CJK> +0x94F5 # <CJK> +0x94F6 # <CJK> +0x94F7 # <CJK> +0x94F8 # <CJK> +0x94F9 # <CJK> +0x94FA # <CJK> +0x94FC # <CJK> +0x94FD # <CJK> +0x94FE # <CJK> +0x94FF # <CJK> +0x9500 # <CJK> +0x9501 # <CJK> +0x9502 # <CJK> +0x9503 # <CJK> +0x9504 # <CJK> +0x9505 # <CJK> +0x9506 # <CJK> +0x9507 # <CJK> +0x9508 # <CJK> +0x9509 # <CJK> +0x950A # <CJK> +0x950B # <CJK> +0x950C # <CJK> +0x950D # <CJK> +0x950E # <CJK> +0x950F # <CJK> +0x9510 # <CJK> +0x9511 # <CJK> +0x9512 # <CJK> +0x9513 # <CJK> +0x9514 # <CJK> +0x9515 # <CJK> +0x9516 # <CJK> +0x9517 # <CJK> +0x9518 # <CJK> +0x9519 # <CJK> +0x951A # <CJK> +0x951B # <CJK> +0x951D # <CJK> +0x951E # <CJK> +0x951F # <CJK> +0x9521 # <CJK> +0x9522 # <CJK> +0x9523 # <CJK> +0x9524 # <CJK> +0x9525 # <CJK> +0x9526 # <CJK> +0x9528 # <CJK> +0x9529 # <CJK> +0x952A # <CJK> +0x952B # <CJK> +0x952C # <CJK> +0x952D # <CJK> +0x952E # <CJK> +0x952F # <CJK> +0x9530 # <CJK> +0x9531 # <CJK> +0x9532 # <CJK> +0x9534 # <CJK> +0x9535 # <CJK> +0x9536 # <CJK> +0x9537 # <CJK> +0x9538 # <CJK> +0x9539 # <CJK> +0x953A # <CJK> +0x953B # <CJK> +0x953C # <CJK> +0x953E # <CJK> +0x953F # <CJK> +0x9540 # <CJK> +0x9541 # <CJK> +0x9542 # <CJK> +0x9544 # <CJK> +0x9545 # <CJK> +0x9546 # <CJK> +0x9547 # <CJK> +0x9549 # <CJK> +0x954A # <CJK> +0x954C # <CJK> +0x954D # <CJK> +0x954E # <CJK> +0x954F # <CJK> +0x9550 # <CJK> +0x9551 # <CJK> +0x9552 # <CJK> +0x9553 # <CJK> +0x9554 # <CJK> +0x9556 # <CJK> +0x9557 # <CJK> +0x9558 # <CJK> +0x9559 # <CJK> +0x955B # <CJK> +0x955C # <CJK> +0x955D # <CJK> +0x955E # <CJK> +0x955F # <CJK> +0x9561 # <CJK> +0x9562 # <CJK> +0x9563 # <CJK> +0x9564 # <CJK> +0x9565 # <CJK> +0x9566 # <CJK> +0x9567 # <CJK> +0x9568 # <CJK> +0x9569 # <CJK> +0x956A # <CJK> +0x956B # <CJK> +0x956C # <CJK> +0x956D # <CJK> +0x956F # <CJK> +0x9570 # <CJK> +0x9571 # <CJK> +0x9572 # <CJK> +0x9573 # <CJK> +0x9576 # <CJK> +0x957F # <CJK> +0x95E8 # <CJK> +0x95E9 # <CJK> +0x95EA # <CJK> +0x95EB # <CJK> +0x95ED # <CJK> +0x95EE # <CJK> +0x95EF # <CJK> +0x95F0 # <CJK> +0x95F1 # <CJK> +0x95F2 # <CJK> +0x95F3 # <CJK> +0x95F4 # <CJK> +0x95F5 # <CJK> +0x95F6 # <CJK> +0x95F7 # <CJK> +0x95F8 # <CJK> +0x95F9 # <CJK> +0x95FA # <CJK> +0x95FB # <CJK> +0x95FC # <CJK> +0x95FD # <CJK> +0x95FE # <CJK> +0x9600 # <CJK> +0x9601 # <CJK> +0x9602 # <CJK> +0x9603 # <CJK> +0x9604 # <CJK> +0x9605 # <CJK> +0x9606 # <CJK> +0x9608 # <CJK> +0x9609 # <CJK> +0x960A # <CJK> +0x960B # <CJK> +0x960C # <CJK> +0x960D # <CJK> +0x960E # <CJK> +0x960F # <CJK> +0x9610 # <CJK> +0x9611 # <CJK> +0x9612 # <CJK> +0x9614 # <CJK> +0x9615 # <CJK> +0x9616 # <CJK> +0x9617 # <CJK> +0x9619 # <CJK> +0x961A # <CJK> +0x961C # <CJK> +0x961D # <CJK> +0x961F # <CJK> +0x9621 # <CJK> +0x9622 # <CJK> +0x962A # <CJK> +0x962E # <CJK> +0x9631 # <CJK> +0x9632 # <CJK> +0x9633 # <CJK> +0x9634 # <CJK> +0x9635 # <CJK> +0x9636 # <CJK> +0x963B # <CJK> +0x963C # <CJK> +0x963D # <CJK> +0x963F # <CJK> +0x9640 # <CJK> +0x9642 # <CJK> +0x9644 # <CJK> +0x9645 # <CJK> +0x9646 # <CJK> +0x9647 # <CJK> +0x9648 # <CJK> +0x9649 # <CJK> +0x964B # <CJK> +0x964C # <CJK> +0x964D # <CJK> +0x9650 # <CJK> +0x9654 # <CJK> +0x9655 # <CJK> +0x965B # <CJK> +0x965F # <CJK> +0x9661 # <CJK> +0x9662 # <CJK> +0x9664 # <CJK> +0x9667 # <CJK> +0x9668 # <CJK> +0x9669 # <CJK> +0x966A # <CJK> +0x966C # <CJK> +0x9672 # <CJK> +0x9674 # <CJK> +0x9675 # <CJK> +0x9676 # <CJK> +0x9677 # <CJK> +0x9685 # <CJK> +0x9686 # <CJK> +0x9688 # <CJK> +0x968B # <CJK> +0x968D # <CJK> +0x968F # <CJK> +0x9690 # <CJK> +0x9694 # <CJK> +0x9697 # <CJK> +0x9698 # <CJK> +0x9699 # <CJK> +0x969C # <CJK> +0x96A7 # <CJK> +0x96B0 # <CJK> +0x96B3 # <CJK> +0x96B6 # <CJK> +0x96B9 # <CJK> +0x96BC # <CJK> +0x96BD # <CJK> +0x96BE # <CJK> +0x96C0 # <CJK> +0x96C1 # <CJK> +0x96C4 # <CJK> +0x96C5 # <CJK> +0x96C6 # <CJK> +0x96C7 # <CJK> +0x96C9 # <CJK> +0x96CC # <CJK> +0x96CD # <CJK> +0x96CE # <CJK> +0x96CF # <CJK> +0x96D2 # <CJK> +0x96D5 # <CJK> +0x96E0 # <CJK> +0x96E8 # <CJK> +0x96E9 # <CJK> +0x96EA # <CJK> +0x96EF # <CJK> +0x96F3 # <CJK> +0x96F6 # <CJK> +0x96F7 # <CJK> +0x96F9 # <CJK> +0x96FE # <CJK> +0x9700 # <CJK> +0x9701 # <CJK> +0x9704 # <CJK> +0x9706 # <CJK> +0x9707 # <CJK> +0x9708 # <CJK> +0x9709 # <CJK> +0x970D # <CJK> +0x970E # <CJK> +0x970F # <CJK> +0x9713 # <CJK> +0x9716 # <CJK> +0x971C # <CJK> +0x971E # <CJK> +0x972A # <CJK> +0x972D # <CJK> +0x9730 # <CJK> +0x9732 # <CJK> +0x9738 # <CJK> +0x9739 # <CJK> +0x973E # <CJK> +0x9752 # <CJK> +0x9753 # <CJK> +0x9756 # <CJK> +0x9759 # <CJK> +0x975B # <CJK> +0x975E # <CJK> +0x9760 # <CJK> +0x9761 # <CJK> +0x9762 # <CJK> +0x9765 # <CJK> +0x9769 # <CJK> +0x9773 # <CJK> +0x9774 # <CJK> +0x9776 # <CJK> +0x977C # <CJK> +0x9785 # <CJK> +0x978B # <CJK> +0x978D # <CJK> +0x9791 # <CJK> +0x9792 # <CJK> +0x9794 # <CJK> +0x9798 # <CJK> +0x97A0 # <CJK> +0x97A3 # <CJK> +0x97AB # <CJK> +0x97AD # <CJK> +0x97AF # <CJK> +0x97B2 # <CJK> +0x97B4 # <CJK> +0x97E6 # <CJK> +0x97E7 # <CJK> +0x97E9 # <CJK> +0x97EA # <CJK> +0x97EB # <CJK> +0x97EC # <CJK> +0x97ED # <CJK> +0x97F3 # <CJK> +0x97F5 # <CJK> +0x97F6 # <CJK> +0x9875 # <CJK> +0x9876 # <CJK> +0x9877 # <CJK> +0x9878 # <CJK> +0x9879 # <CJK> +0x987A # <CJK> +0x987B # <CJK> +0x987C # <CJK> +0x987D # <CJK> +0x987E # <CJK> +0x987F # <CJK> +0x9880 # <CJK> +0x9881 # <CJK> +0x9882 # <CJK> +0x9883 # <CJK> +0x9884 # <CJK> +0x9885 # <CJK> +0x9886 # <CJK> +0x9887 # <CJK> +0x9888 # <CJK> +0x9889 # <CJK> +0x988A # <CJK> +0x988C # <CJK> +0x988D # <CJK> +0x988F # <CJK> +0x9890 # <CJK> +0x9891 # <CJK> +0x9893 # <CJK> +0x9894 # <CJK> +0x9896 # <CJK> +0x9897 # <CJK> +0x9898 # <CJK> +0x989A # <CJK> +0x989B # <CJK> +0x989C # <CJK> +0x989D # <CJK> +0x989E # <CJK> +0x989F # <CJK> +0x98A0 # <CJK> +0x98A1 # <CJK> +0x98A2 # <CJK> +0x98A4 # <CJK> +0x98A5 # <CJK> +0x98A6 # <CJK> +0x98A7 # <CJK> +0x98CE # <CJK> +0x98D1 # <CJK> +0x98D2 # <CJK> +0x98D3 # <CJK> +0x98D5 # <CJK> +0x98D8 # <CJK> +0x98D9 # <CJK> +0x98DA # <CJK> +0x98DE # <CJK> +0x98DF # <CJK> +0x98E7 # <CJK> +0x98E8 # <CJK> +0x990D # <CJK> +0x9910 # <CJK> +0x992E # <CJK> +0x9954 # <CJK> +0x9955 # <CJK> +0x9963 # <CJK> +0x9965 # <CJK> +0x9967 # <CJK> +0x9968 # <CJK> +0x9969 # <CJK> +0x996A # <CJK> +0x996B # <CJK> +0x996C # <CJK> +0x996D # <CJK> +0x996E # <CJK> +0x996F # <CJK> +0x9970 # <CJK> +0x9971 # <CJK> +0x9972 # <CJK> +0x9974 # <CJK> +0x9975 # <CJK> +0x9976 # <CJK> +0x9977 # <CJK> +0x997A # <CJK> +0x997C # <CJK> +0x997D # <CJK> +0x997F # <CJK> +0x9980 # <CJK> +0x9981 # <CJK> +0x9984 # <CJK> +0x9985 # <CJK> +0x9986 # <CJK> +0x9987 # <CJK> +0x9988 # <CJK> +0x998A # <CJK> +0x998B # <CJK> +0x998D # <CJK> +0x998F # <CJK> +0x9990 # <CJK> +0x9991 # <CJK> +0x9992 # <CJK> +0x9993 # <CJK> +0x9994 # <CJK> +0x9995 # <CJK> +0x9996 # <CJK> +0x9997 # <CJK> +0x9998 # <CJK> +0x9999 # <CJK> +0x99A5 # <CJK> +0x99A8 # <CJK> +0x9A6C # <CJK> +0x9A6D # <CJK> +0x9A6E # <CJK> +0x9A6F # <CJK> +0x9A70 # <CJK> +0x9A71 # <CJK> +0x9A73 # <CJK> +0x9A74 # <CJK> +0x9A75 # <CJK> +0x9A76 # <CJK> +0x9A77 # <CJK> +0x9A78 # <CJK> +0x9A79 # <CJK> +0x9A7A # <CJK> +0x9A7B # <CJK> +0x9A7C # <CJK> +0x9A7D # <CJK> +0x9A7E # <CJK> +0x9A7F # <CJK> +0x9A80 # <CJK> +0x9A81 # <CJK> +0x9A82 # <CJK> +0x9A84 # <CJK> +0x9A85 # <CJK> +0x9A86 # <CJK> +0x9A87 # <CJK> +0x9A88 # <CJK> +0x9A8A # <CJK> +0x9A8B # <CJK> +0x9A8C # <CJK> +0x9A8F # <CJK> +0x9A90 # <CJK> +0x9A91 # <CJK> +0x9A92 # <CJK> +0x9A93 # <CJK> +0x9A96 # <CJK> +0x9A97 # <CJK> +0x9A98 # <CJK> +0x9A9A # <CJK> +0x9A9B # <CJK> +0x9A9C # <CJK> +0x9A9D # <CJK> +0x9A9E # <CJK> +0x9A9F # <CJK> +0x9AA0 # <CJK> +0x9AA1 # <CJK> +0x9AA2 # <CJK> +0x9AA3 # <CJK> +0x9AA4 # <CJK> +0x9AA5 # <CJK> +0x9AA7 # <CJK> +0x9AA8 # <CJK> +0x9AB0 # <CJK> +0x9AB1 # <CJK> +0x9AB6 # <CJK> +0x9AB7 # <CJK> +0x9AB8 # <CJK> +0x9ABA # <CJK> +0x9ABC # <CJK> +0x9AC0 # <CJK> +0x9AC1 # <CJK> +0x9AC2 # <CJK> +0x9AC5 # <CJK> +0x9ACB # <CJK> +0x9ACC # <CJK> +0x9AD1 # <CJK> +0x9AD3 # <CJK> +0x9AD8 # <CJK> +0x9ADF # <CJK> +0x9AE1 # <CJK> +0x9AE6 # <CJK> +0x9AEB # <CJK> +0x9AED # <CJK> +0x9AEF # <CJK> +0x9AF9 # <CJK> +0x9AFB # <CJK> +0x9B03 # <CJK> +0x9B08 # <CJK> +0x9B0F # <CJK> +0x9B13 # <CJK> +0x9B1F # <CJK> +0x9B23 # <CJK> +0x9B2F # <CJK> +0x9B32 # <CJK> +0x9B3B # <CJK> +0x9B3C # <CJK> +0x9B41 # <CJK> +0x9B42 # <CJK> +0x9B43 # <CJK> +0x9B44 # <CJK> +0x9B45 # <CJK> +0x9B47 # <CJK> +0x9B48 # <CJK> +0x9B49 # <CJK> +0x9B4D # <CJK> +0x9B4F # <CJK> +0x9B51 # <CJK> +0x9B54 # <CJK> +0x9C7C # <CJK> +0x9C7F # <CJK> +0x9C81 # <CJK> +0x9C82 # <CJK> +0x9C85 # <CJK> +0x9C86 # <CJK> +0x9C87 # <CJK> +0x9C88 # <CJK> +0x9C8B # <CJK> +0x9C8D # <CJK> +0x9C8E # <CJK> +0x9C90 # <CJK> +0x9C91 # <CJK> +0x9C92 # <CJK> +0x9C94 # <CJK> +0x9C95 # <CJK> +0x9C9A # <CJK> +0x9C9B # <CJK> +0x9C9C # <CJK> +0x9C9E # <CJK> +0x9C9F # <CJK> +0x9CA0 # <CJK> +0x9CA1 # <CJK> +0x9CA2 # <CJK> +0x9CA3 # <CJK> +0x9CA4 # <CJK> +0x9CA5 # <CJK> +0x9CA6 # <CJK> +0x9CA7 # <CJK> +0x9CA8 # <CJK> +0x9CA9 # <CJK> +0x9CAB # <CJK> +0x9CAD # <CJK> +0x9CAE # <CJK> +0x9CB0 # <CJK> +0x9CB1 # <CJK> +0x9CB2 # <CJK> +0x9CB3 # <CJK> +0x9CB4 # <CJK> +0x9CB5 # <CJK> +0x9CB6 # <CJK> +0x9CB7 # <CJK> +0x9CB8 # <CJK> +0x9CBA # <CJK> +0x9CBB # <CJK> +0x9CBC # <CJK> +0x9CBD # <CJK> +0x9CC3 # <CJK> +0x9CC4 # <CJK> +0x9CC5 # <CJK> +0x9CC6 # <CJK> +0x9CC7 # <CJK> +0x9CCA # <CJK> +0x9CCB # <CJK> +0x9CCC # <CJK> +0x9CCD # <CJK> +0x9CCE # <CJK> +0x9CCF # <CJK> +0x9CD0 # <CJK> +0x9CD3 # <CJK> +0x9CD4 # <CJK> +0x9CD5 # <CJK> +0x9CD6 # <CJK> +0x9CD7 # <CJK> +0x9CD8 # <CJK> +0x9CD9 # <CJK> +0x9CDC # <CJK> +0x9CDD # <CJK> +0x9CDE # <CJK> +0x9CDF # <CJK> +0x9CE2 # <CJK> +0x9E1F # <CJK> +0x9E20 # <CJK> +0x9E21 # <CJK> +0x9E22 # <CJK> +0x9E23 # <CJK> +0x9E25 # <CJK> +0x9E26 # <CJK> +0x9E28 # <CJK> +0x9E29 # <CJK> +0x9E2A # <CJK> +0x9E2B # <CJK> +0x9E2C # <CJK> +0x9E2D # <CJK> +0x9E2F # <CJK> +0x9E31 # <CJK> +0x9E32 # <CJK> +0x9E33 # <CJK> +0x9E35 # <CJK> +0x9E36 # <CJK> +0x9E37 # <CJK> +0x9E38 # <CJK> +0x9E39 # <CJK> +0x9E3A # <CJK> +0x9E3D # <CJK> +0x9E3E # <CJK> +0x9E3F # <CJK> +0x9E41 # <CJK> +0x9E42 # <CJK> +0x9E43 # <CJK> +0x9E44 # <CJK> +0x9E45 # <CJK> +0x9E46 # <CJK> +0x9E47 # <CJK> +0x9E48 # <CJK> +0x9E49 # <CJK> +0x9E4A # <CJK> +0x9E4B # <CJK> +0x9E4C # <CJK> +0x9E4E # <CJK> +0x9E4F # <CJK> +0x9E51 # <CJK> +0x9E55 # <CJK> +0x9E57 # <CJK> +0x9E58 # <CJK> +0x9E5A # <CJK> +0x9E5B # <CJK> +0x9E5C # <CJK> +0x9E5E # <CJK> +0x9E63 # <CJK> +0x9E64 # <CJK> +0x9E66 # <CJK> +0x9E67 # <CJK> +0x9E68 # <CJK> +0x9E69 # <CJK> +0x9E6A # <CJK> +0x9E6B # <CJK> +0x9E6C # <CJK> +0x9E6D # <CJK> +0x9E70 # <CJK> +0x9E71 # <CJK> +0x9E73 # <CJK> +0x9E7E # <CJK> +0x9E7F # <CJK> +0x9E82 # <CJK> +0x9E87 # <CJK> +0x9E88 # <CJK> +0x9E8B # <CJK> +0x9E92 # <CJK> +0x9E93 # <CJK> +0x9E9D # <CJK> +0x9E9F # <CJK> +0x9EA6 # <CJK> +0x9EB4 # <CJK> +0x9EB8 # <CJK> +0x9EBB # <CJK> +0x9EBD # <CJK> +0x9EBE # <CJK> +0x9EC4 # <CJK> +0x9EC9 # <CJK> +0x9ECD # <CJK> +0x9ECE # <CJK> +0x9ECF # <CJK> +0x9ED1 # <CJK> +0x9ED4 # <CJK> +0x9ED8 # <CJK> +0x9EDB # <CJK> +0x9EDC # <CJK> +0x9EDD # <CJK> +0x9EDF # <CJK> +0x9EE0 # <CJK> +0x9EE2 # <CJK> +0x9EE5 # <CJK> +0x9EE7 # <CJK> +0x9EE9 # <CJK> +0x9EEA # <CJK> +0x9EEF # <CJK> +0x9EF9 # <CJK> +0x9EFB # <CJK> +0x9EFC # <CJK> +0x9EFE # <CJK> +0x9F0B # <CJK> +0x9F0D # <CJK> +0x9F0E # <CJK> +0x9F10 # <CJK> +0x9F13 # <CJK> +0x9F17 # <CJK> +0x9F19 # <CJK> +0x9F20 # <CJK> +0x9F22 # <CJK> +0x9F2C # <CJK> +0x9F2F # <CJK> +0x9F37 # <CJK> +0x9F39 # <CJK> +0x9F3B # <CJK> +0x9F3D # <CJK> +0x9F3E # <CJK> +0x9F44 # <CJK> +0x9F50 # <CJK> +0x9F51 # <CJK> +0x9F7F # <CJK> +0x9F80 # <CJK> +0x9F83 # <CJK> +0x9F84 # <CJK> +0x9F85 # <CJK> +0x9F86 # <CJK> +0x9F87 # <CJK> +0x9F88 # <CJK> +0x9F89 # <CJK> +0x9F8A # <CJK> +0x9F8B # <CJK> +0x9F8C # <CJK> +0x9F99 # <CJK> +0x9F9A # <CJK> +0x9F9B # <CJK> +0x9F9F # <CJK> +0x9FA0 # <CJK> diff --git a/fontconfig/fc-lang/zh_hk.orth b/fontconfig/fc-lang/zh_hk.orth new file mode 100644 index 000000000..d280179bf --- /dev/null +++ b/fontconfig/fc-lang/zh_hk.orth @@ -0,0 +1,2240 @@ +# +# fontconfig/fc-lang/zh_hk.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chinese Hong Kong Supplementary Character Set (ZH-HK) +# +# Taken from the HKSCS-2001, including only the non-PUA BMP glyphs +# as encoded in ISO/IEC 10646-1:2000 +4E04 +4E1A +4E1C +4E21 +4E24 +4E28 +4E2A +4E2C +4E2F +4E36 +4E37 +4E3D +4E3F +4E49 +4E5A +4E5B +4E6A +4E78 +4E80 +4E81 +4E85 +4E87 +4E89 +4E98 +4E9A +4EA0 +4EA3 +4EB7 +4EBB +4EBC +4EBF +4ECE +4EEA +4EEB +4EEE +4EF8 +4F03 +4F17 +4F1A +4F28 +4F29 +4F32 +4F37 +4F39 +4F42 +4F45 +4F4B +4F72 +4F8A +4FA2 +4FA8 +4FAB +4FB0 +4FBD +4FC8 +4FCC +4FE4 +4FE5 +4FF0 +4FF2 +4FF9 +4FFD +5003 +5008 +502E +5034 +503B +5056 +5058 +5066 +506C +5081 +5088 +5090 +50A6 +50BC +50CD +50D0 +50D9 +50DF +50E1 +50F4 +50FC +5101 +510D +510E +512B +5156 +5160 +516A +5174 +5179 +5182 +5186 +5188 +5196 +519A +519C +51A7 +51A8 +51AB +51AE +51B2 +51B3 +51B4 +51B5 +51B8 +51C3 +51C7 +51C9 +51CF +51D1 +51D2 +51D3 +51DB +51DF +51E2 +51E4 +51ED +51F4 +51FC +51FE +5202 +5205 +520B +521F +5220 +5226 +5227 +5234 +523C +5257 +5259 +5260 +5268 +5273 +5279 +528F +5290 +5294 +529A +52A1 +52A4 +52A8 +52B5 +52B9 +52C5 +52CC +52D0 +52D1 +52E0 +52E1 +52F9 +5301 +5324 +5327 +532C +5332 +5333 +5338 +533B +5342 +534E +535D +535F +5364 +5367 +5369 +536D +5374 +537D +537E +5393 +53A0 +53A2 +53A6 +53A8 +53A9 +53AA +53AB +53AE +53B0 +53B6 +53C1 +53C2 +53C5 +53CC +53D0 +53D1 +53D2 +53D8 +53D9 +53DA +53E0 +53F6 +53F7 +53FE +5413 +5414 +5416 +541A +5421 +5423 +542F +5432 +5434 +544B +544D +5469 +546A +546D +5485 +548F +5493 +5494 +5497 +549C +549E +54A3 +54A4 +54B2 +54B4 +54B9 +54CB +54CC +54CD +54D0 +54DA +54E3 +54EF +5502 +550D +5513 +5518 +551E +5523 +5525 +5528 +552B +553F +5547 +5549 +5553 +555D +5569 +556B +5571 +5572 +5573 +5579 +5586 +5590 +55A9 +55B0 +55B4 +55B9 +55BA +55BC +55C1 +55D7 +55D8 +55DE +55EA +55EC +55F0 +55F1 +55F5 +55FB +5605 +5611 +561E +5620 +5621 +5622 +5623 +5625 +562D +5637 +5643 +564D +564F +5650 +5652 +5654 +565D +5661 +567A +567B +567C +5689 +568A +568B +5692 +569E +569F +56A1 +56A4 +56AF +56B1 +56B9 +56BF +56D6 +56E2 +56ED +56EF +56F1 +56FD +5700 +5715 +571D +5732 +573D +573F +5742 +5743 +5746 +5754 +5757 +575B +575F +5767 +577A +577E +577F +5788 +578A +578D +5790 +579C +57A1 +57A7 +57AA +57B4 +57BB +57BE +57C4 +57C8 +57D7 +57DD +57DE +57E6 +57EF +57FE +5803 +5812 +5822 +5826 +583A +5840 +5844 +5847 +585C +585F +5869 +586C +5872 +5873 +5892 +5899 +589A +58A7 +58AA +58B0 +58B5 +58B6 +58BB +58CB +58D0 +58DC +58E0 +58F0 +58F2 +58F3 +58FB +5902 +5904 +5905 +5907 +590A +5911 +591F +5932 +5934 +5965 +5975 +5989 +5994 +599A +599F +59AC +59B0 +59B7 +59B8 +59C4 +59C9 +59D9 +59EB +59EF +59F0 +59F8 +59F9 +5A02 +5A0B +5A0D +5A12 +5A1A +5A21 +5A24 +5A27 +5A2A +5A2B +5A2C +5A3D +5A45 +5A54 +5A59 +5A61 +5A63 +5A68 +5A6B +5A6E +5A71 +5A79 +5A7E +5A81 +5A82 +5A86 +5A88 +5A91 +5A96 +5A99 +5AA0 +5AA1 +5AAB +5AC3 +5ACE +5ACF +5AD3 +5AE4 +5AF0 +5AF2 +5AFA +5AFE +5B0D +5B11 +5B15 +5B1F +5B2B +5B41 +5B44 +5B46 +5B4A +5B4F +5B66 +5B68 +5B6D +5B74 +5B76 +5B7C +5B80 +5B82 +5B90 +5B96 +5B9D +5B9E +5B9F +5BAA +5BC3 +5BD5 +5BD7 +5BF3 +5BFF +5C05 +5C13 +5C14 +5C1C +5C1E +5C20 +5C23 +5C49 +5C4A +5C53 +5C5E +5C85 +5C99 +5C9A +5C9C +5C9E +5CBA +5CC1 +5CC2 +5CD1 +5CE5 +5CE9 +5CEF +5CF5 +5D10 +5D15 +5D18 +5D2C +5D2F +5D3E +5D46 +5D48 +5D56 +5D57 +5D5B +5D70 +5D74 +5D7B +5D85 +5D8B +5D8E +5DA4 +5DAB +5DB6 +5DB9 +5DC1 +5DD7 +5DDB +5DF5 +5E09 +5E0B +5E12 +5E2E +5E42 +5E48 +5E5E +5E7A +5E7F +5E83 +5E86 +5E92 +5E99 +5EBD +5ECD +5ED0 +5EF4 +5EF8 +5EF9 +5EFB +5EFC +5F0C +5F0D +5F0E +5F25 +5F3A +5F4D +5F50 +5F51 +5F5C +5F61 +5F63 +5F72 +5F7B +5F83 +5FA4 +5FA7 +5FB1 +5FBA +5FC2 +5FC4 +5FDB +5FDF +6023 +6031 +603B +604A +6052 +6075 +6077 +607E +609E +60A4 +60A7 +60B3 +60D7 +60DE +60E3 +60E7 +60E8 +60E9 +60FD +6107 +610C +6119 +6122 +6130 +613D +6142 +6150 +6159 +615C +6160 +6164 +616F +617D +6181 +6187 +6195 +6198 +6199 +619C +61B7 +61B9 +61C0 +61CF +61D0 +61D3 +61DA +61E2 +622C +6237 +6239 +624C +6268 +6282 +6285 +6290 +629D +62A4 +62A6 +62C3 +62C5 +62D5 +62DF +62E5 +6318 +632E +6331 +6335 +6337 +6364 +636C +6379 +637F +638B +63B9 +63C1 +63D1 +63DE +63E2 +63E6 +63F8 +63FB +63FC +63FE +6407 +6432 +6438 +643A +643B +645A +6471 +647C +648D +6491 +64AF +64B4 +64B6 +64C0 +64D3 +64DD +64E1 +64E5 +64E7 +64EA +650A +6511 +651E +651F +6530 +6534 +6535 +654D +655F +656B +656D +6585 +6586 +6588 +6589 +658B +65B5 +65BE +65D1 +65D4 +65E0 +65E3 +65FF +6618 +661E +6623 +6630 +6644 +6648 +664B +6653 +6657 +6663 +6667 +666B +6673 +667D +6685 +668E +6692 +669A +66A4 +66AD +66B3 +66B6 +66BF +66CD +66CE +66F1 +6702 +670C +670E +6716 +6719 +671E +6725 +6736 +6744 +6761 +6762 +6767 +676B +678F +67A0 +67A4 +67AC +67B1 +67BF +67D6 +67D7 +67F9 +67FE +6800 +6801 +6802 +6803 +6804 +680D +6810 +681B +681E +6822 +6836 +6837 +683E +6847 +684A +6855 +6856 +685D +6865 +6884 +6888 +6898 +68A6 +68B6 +68B9 +68BD +68C3 +68C5 +68CA +6900 +6901 +6902 +6903 +6909 +6918 +6919 +691A +691B +692C +6936 +693E +6943 +6946 +6955 +6961 +6964 +6967 +6972 +6973 +6980 +6985 +698A +6998 +699F +69A2 +69B2 +69C0 +69D1 +69D5 +69D6 +69E1 +69E9 +69F9 +69FA +6A03 +6A0B +6A0C +6A1A +6A1C +6A2B +6A2C +6A2D +6A33 +6A43 +6A45 +6A4C +6A52 +6A53 +6A57 +6A63 +6A65 +6A71 +6A74 +6A7A +6A82 +6A8A +6A8F +6A99 +6A9D +6AA7 +6AAB +6AB1 +6AB2 +6AB5 +6ABE +6AC8 +6AC9 +6ACA +6AD4 +6AD8 +6AF6 +6B05 +6B1D +6B35 +6B52 +6B57 +6B6F +6B74 +6B7A +6B81 +6BC1 +6BDC +6BE1 +6BEA +6BFA +6C1C +6C31 +6C35 +6C37 +6C39 +6C3A +6C3D +6C49 +6C58 +6C5A +6C6E +6C75 +6C79 +6C7F +6C9F +6CA2 +6CAA +6CAF +6CB2 +6CCB +6CCE +6CDF +6CEA +6CFF +6D02 +6D05 +6D06 +6D24 +6D26 +6D4E +6D57 +6D5B +6D5C +6D71 +6D72 +6D81 +6D8F +6D96 +6DA4 +6DA5 +6DB1 +6DB9 +6DFE +6E02 +6E04 +6E0A +6E0F +6E15 +6E18 +6E29 +6E2A +6E4F +6E50 +6E59 +6E76 +6E7C +6E86 +6E8B +6E9A +6EB5 +6EB8 +6EBB +6ED9 +6EDA +6EDB +6EDD +6EE2 +6EE8 +6EE9 +6EFA +6F04 +6F0B +6F0C +6F16 +6F17 +6F24 +6F34 +6F3D +6F44 +6F56 +6F5C +6F74 +6F79 +6F81 +6F8A +6F9D +6F9F +6FB5 +6FBB +6FBE +6FD3 +6FD9 +6FDA +6FF6 +6FF8 +7003 +701E +702C +704B +704D +7050 +7054 +705C +7067 +706C +706F +7075 +7077 +7079 +707E +707F +7081 +7089 +708B +708F +70A0 +70A3 +70A5 +70A6 +70A7 +70B9 +70BB +70BC +70BD +70C0 +70C4 +70CC +70D0 +70D5 +70D6 +70DF +70F1 +70F5 +70FE +7105 +711D +7129 +712B +712C +7133 +7134 +7135 +713B +713E +7140 +7145 +714A +714F +7151 +716B +7171 +7173 +7175 +7176 +7177 +717A +717C +717E +7188 +718C +718E +7191 +7196 +7198 +71A2 +71A3 +71AD +71B4 +71B7 +71BA +71D1 +71DD +71EB +71F5 +71F6 +7200 +7209 +720E +720F +7215 +7216 +7217 +7224 +722B +722E +7240 +7250 +7255 +7257 +725C +7266 +7282 +7287 +728F +7294 +729F +72AD +72B2 +72CD +72E2 +7302 +7304 +7310 +7328 +732A +732B +732C +732E +7338 +7339 +7341 +7348 +734F +7371 +7374 +738C +738F +7398 +739C +739E +73A7 +73AA +73BA +73C9 +73CE +73CF +73D0 +73D5 +73E1 +73E2 +73E4 +73E6 +73EF +73F3 +73F7 +73F9 +73FB +7402 +7411 +7412 +7414 +7415 +7417 +7419 +741C +741E +741F +7437 +7438 +7439 +743C +7443 +7445 +7447 +7448 +7449 +7453 +7456 +745D +7460 +7465 +7468 +746B +746C +7474 +7476 +747A +7482 +748C +748D +7499 +749B +74A4 +74B4 +74B9 +74C8 +74CC +74D0 +74D3 +74E7 +74F0 +74F1 +74F2 +74F8 +7505 +750E +7519 +751E +7534 +7535 +753B +7542 +7546 +754A +754D +7551 +7553 +7555 +7560 +7567 +756D +756E +7572 +757A +7583 +758D +758E +7592 +759E +75B1 +75B4 +75C3 +75C8 +75DC +7602 +7607 +762C +763B +7640 +764D +764E +764F +7651 +7654 +7666 +7667 +766F +7673 +7674 +7676 +767A +7690 +76A1 +76A5 +76B7 +76CC +76D6 +76D9 +770C +770E +770F +771E +7724 +7726 +772B +7740 +7743 +7758 +7772 +7777 +7778 +777A +777B +7793 +7798 +77AF +77B9 +77BE +77C3 +77C5 +77CB +77DD +77E6 +77F4 +77FE +7808 +7818 +781C +781E +7839 +783C +783D +7842 +7844 +7847 +784B +7851 +7853 +7854 +7866 +787A +7881 +7888 +788D +78AF +78B1 +78B6 +78B8 +78B9 +78C7 +78D2 +78D3 +78D7 +78D8 +78E4 +78EE +78F0 +78F1 +78F5 +7906 +792E +7932 +7933 +7934 +7936 +793B +793C +7958 +7959 +7962 +7971 +797E +7980 +7983 +7986 +7987 +7991 +7999 +799D +799F +79A5 +79A9 +79C4 +79C6 +79CC +79D4 +79E2 +79F1 +79F4 +7A06 +7A2A +7A2D +7A3A +7A3E +7A43 +7A45 +7A49 +7A65 +7A7D +7A83 +7A91 +7A93 +7AB0 +7ABB +7ABC +7AC2 +7AC3 +7AC8 +7AC9 +7ACF +7AD3 +7ADA +7ADB +7ADC +7ADD +7AE2 +7AE7 +7AE9 +7AEA +7AFE +7B0B +7B0C +7B14 +7B1F +7B27 +7B29 +7B39 +7B42 +7B43 +7B55 +7B62 +7B6C +7B6F +7B7B +7B92 +7BA2 +7BA3 +7BB2 +7BCF +7BD0 +7BEC +7BFA +7BFC +7C12 +7C15 +7C1B +7C35 +7C42 +7C44 +7C51 +7C56 +7C5D +7C6D +7C70 +7C74 +7C7B +7C7C +7C7E +7C83 +7C86 +7C8E +7C9C +7CA6 +7CA7 +7CAC +7CAE +7CB8 +7CC2 +7CC3 +7CC7 +7CC9 +7CCD +7CD3 +7CDA +7CE6 +7CED +7CF3 +7CF5 +7CF9 +7CFC +7D25 +7D4D +7D5A +7D5D +7D89 +7D8B +7D97 +7DA4 +7DA8 +7DAB +7DB3 +7DCD +7DCF +7DD0 +7DD3 +7DD4 +7DDC +7DE4 +7DE5 +7DF5 +7DFD +7DFE +7E07 +7E27 +7E5B +7E65 +7E67 +7E6C +7E6E +7E7F +7E8E +7E92 +7E9F +7EA4 +7EAC +7EBA +7EC7 +7ECF +7EDF +7F06 +7F37 +7F40 +7F41 +7F47 +7F49 +7F4E +7F52 +7F53 +7F71 +7F78 +7F8F +7F93 +7F97 +7FA3 +7FAE +7FB4 +7FDD +7FE7 +7FFA +8002 +8008 +801D +8020 +8025 +802E +802F +8031 +803B +803C +8054 +805B +8061 +8062 +8063 +8066 +8080 +809F +80A7 +80B6 +80B7 +80BC +80BD +80C6 +80E9 +80EC +80F6 +8103 +8107 +8109 +810C +810E +8112 +8114 +8117 +811A +812A +8132 +8134 +8137 +8142 +8148 +8156 +8159 +815A +816D +817C +8184 +8193 +81A5 +81AA +81B6 +81C1 +81C8 +81E4 +81EF +81F6 +8218 +821A +8226 +8229 +822D +823E +8254 +8262 +8265 +8276 +8279 +827A +827B +8287 +82A6 +82AA +82BF +82C4 +82CA +82CF +82D0 +82D8 +82E2 +82EE +82F7 +82F8 +82FC +82FD +82FF +830B +8318 +831A +831D +833D +8357 +8362 +8363 +8366 +836F +8385 +8391 +839C +83AC +83B9 +83BE +83CD +83D3 +83ED +8405 +8414 +8416 +8418 +841C +8420 +8421 +8424 +8426 +842E +843E +8448 +844A +8453 +8455 +8458 +845C +8462 +8464 +8471 +8472 +847F +8480 +8488 +8492 +8493 +8496 +84A3 +84AD +84BD +84BE +84DA +84DE +84E1 +84E2 +84E4 +84E5 +84F8 +8503 +8505 +8510 +8533 +8534 +8538 +8542 +854B +854C +8552 +855A +855F +856F +8570 +8573 +8597 +85C1 +85D6 +85E0 +85EE +85FC +8602 +860D +860F +8610 +8614 +8616 +8628 +862F +8642 +8645 +866C +8672 +867E +8692 +86A0 +86AD +86B2 +86EF +8770 +8771 +877D +8786 +878B +878C +87A5 +87A9 +87B1 +87C1 +87CE +87D6 +87DA +87EE +87F5 +8804 +880F +8818 +8827 +882D +8842 +8845 +8846 +884F +885E +8860 +8864 +8865 +886E +8884 +8887 +888F +8890 +889C +88A0 +88AE +88B4 +88B5 +88BF +88C5 +88C7 +88CF +88E6 +88F5 +88FF +8900 +8924 +8943 +8947 +894D +8954 +8965 +8977 +8980 +8987 +8989 +898A +8991 +8994 +89A5 +89A7 +89A9 +89BC +89C1 +89C6 +89E7 +8A1C +8A29 +8A2B +8A38 +8A3D +8A49 +8A67 +8A7E +8A90 +8A94 +8A9C +8AA9 +8AAF +8AB4 +8ADA +8AEA +8B0C +8B1F +8B2D +8B3F +8B43 +8B4C +8B4D +8B5E +8B62 +8B69 +8B81 +8B83 +8B90 +8B9B +8BA0 +8BBE +8BE2 +8C51 +8C9B +8C9F +8CAD +8CCD +8CD4 +8CD6 +8CDB +8CE9 +8CEB +8CF2 +8CF7 +8D03 +8D0B +8D0C +8D11 +8D12 +8D18 +8D1C +8D1D +8D7A +8D82 +8DA6 +8DA9 +8DC0 +8DC3 +8DD4 +8E01 +8E0E +8E28 +8E2A +8E2D +8E3A +8E46 +8E4F +8E68 +8E71 +8E75 +8E77 +8E7E +8E80 +8EA7 +8EAD +8EB0 +8EB6 +8EB9 +8EBC +8EC3 +8ECE +8EDA +8EE2 +8EE4 +8EED +8EF2 +8F19 +8F2D +8F30 +8F41 +8F4A +8F5C +8F66 +8F67 +8F6E +8F93 +8FA0 +8FA5 +8FA7 +8FB3 +8FB5 +8FB6 +8FB7 +8FB8 +8FB9 +8FBA +8FBB +8FBC +8FBE +8FC1 +8FCA +8FCC +8FCF +8FD0 +8FDA +8FF9 +9008 +9012 +9033 +9037 +904C +9056 +9061 +9064 +906C +90A8 +90AE +90BB +90C4 +9151 +9159 +915C +915E +9167 +9170 +9176 +917C +918C +918E +91A9 +91B6 +91BB +91C4 +91D6 +91DF +91E5 +91F6 +91FA +91FE +9208 +920E +9213 +9221 +9228 +922A +922B +9235 +923C +9241 +9244 +9255 +9258 +925D +925F +9262 +926B +926E +9277 +9281 +9284 +9289 +928F +92AE +92B1 +92B9 +92BA +92BE +92BF +92D4 +92DB +92E3 +92E5 +92EB +92EC +92F2 +92F3 +92F4 +92F6 +92FD +9303 +9307 +932C +9330 +9331 +9340 +9341 +9342 +9343 +9344 +9345 +9348 +935F +9362 +9366 +9368 +9369 +936B +936E +9373 +9374 +9378 +937D +9381 +9384 +9385 +9386 +9387 +9390 +939C +93A0 +93AD +93B8 +93BB +93BD +93BF +93C6 +93CB +93D3 +93DB +93E0 +93F0 +93F1 +93F3 +93F4 +9401 +9404 +9408 +9417 +941B +941D +9424 +9425 +9426 +9427 +942D +943E +9442 +9443 +944D +9454 +9458 +945B +9465 +9467 +946C +9479 +947B +9485 +949F +94A2 +94C1 +94C3 +94DC +94F6 +952D +9547 +9578 +957F +9585 +9596 +9597 +9599 +95A0 +95A2 +95A6 +95A7 +95AA +95E8 +95F4 +961D +9633 +9638 +9641 +9645 +9656 +9669 +967B +9681 +968F +9696 +96A3 +96A5 +96B6 +96BD +96F4 +9703 +971B +9721 +9731 +9736 +9740 +9741 +9751 +9755 +9757 +975D +975F +976D +9771 +9787 +9789 +979B +979F +97B1 +97B2 +97B4 +97B8 +97BA +97BD +97BE +97C0 +97C2 +97C8 +97D2 +97E0 +97E6 +97EE +97F2 +97F5 +9814 +9815 +981F +9823 +982E +9833 +9834 +9847 +984B +9866 +9868 +986C +9875 +98B4 +98B7 +98B9 +98C3 +98C7 +98C8 +98CA +98CE +98DC +98DE +98E0 +98E1 +98E6 +98EC +98F1 +98F5 +990E +9919 +991C +9937 +9938 +9939 +993B +9940 +9942 +994A +994D +995D +9962 +9963 +999B +99A4 +99AA +99B8 +99BC +99C4 +99C5 +99DA +99E0 +99E1 +99E6 +99F5 +9A0C +9A10 +9A1F +9A21 +9A26 +9A2F +9A3B +9A3C +9A58 +9A5C +9A63 +9A6C +9A8F +9AB2 +9AB6 +9ABA +9ABD +9AD7 +9AE0 +9AE2 +9AF4 +9AFF +9B02 +9B09 +9B0F +9B14 +9B2A +9B2D +9B34 +9B39 +9B40 +9B50 +9B69 +9B7F +9B81 +9B83 +9B8B +9B8D +9B8E +9B8F +9B97 +9B9D +9B9F +9BB0 +9BCF +9BDD +9BE9 +9BED +9BF1 +9BF4 +9BFF +9C02 +9C0A +9C0C +9C10 +9C15 +9C1B +9C1F +9C20 +9C26 +9C2F +9C35 +9C3A +9C45 +9C4F +9C53 +9C5D +9C72 +9C7B +9C7C +9D02 +9D0C +9D16 +9D21 +9D34 +9D39 +9D44 +9D49 +9D4E +9D50 +9D5E +9D6D +9D6E +9D7C +9D7E +9D83 +9D93 +9DA5 +9DAB +9DBD +9DC0 +9DC4 +9DC9 +9DD4 +9DFC +9E0A +9E0C +9E0E +9E18 +9E1C +9E1F +9E7B +9E81 +9E84 +9E85 +9E90 +9E95 +9E96 +9E98 +9E9E +9EA2 +9EA6 +9EA8 +9EAA +9EAB +9EAC +9EAF +9EB1 +9EBD +9EBF +9EC1 +9EC4 +9EC6 +9EC7 +9EE2 +9EF1 +9EF8 +9EFE +9F02 +9F08 +9F17 +9F26 +9F27 +9F39 +9F44 +9F45 +9F50 +9F53 +9F5A +9F62 +9F69 +9F7F +9F8E +9F99 +9F9F +9FA5 +20547 diff --git a/fontconfig/fc-lang/zh_mo.orth b/fontconfig/fc-lang/zh_mo.orth new file mode 100644 index 000000000..fe70977d7 --- /dev/null +++ b/fontconfig/fc-lang/zh_mo.orth @@ -0,0 +1,32 @@ +# +# fontconfig/fc-lang/zh_mo.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chinese in Macau (ZH-MO) +# +# from Abel Cheung: +# +# a majority of Macau people speak Cantonese too, and also uses additional +# traditional Chinese chars from Hong Kong (there are already some place names +# that can't be represented in just chars used in Taiwan). +# +include zh_hk.orth diff --git a/fontconfig/fc-lang/zh_sg.orth b/fontconfig/fc-lang/zh_sg.orth new file mode 100644 index 000000000..01919158f --- /dev/null +++ b/fontconfig/fc-lang/zh_sg.orth @@ -0,0 +1,27 @@ +# +# fontconfig/fc-lang/zh_sg.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chinese in Singapore (ZH-SG) +# +# Just use GB2312 as for ZH-CN +include zh_cn.orth diff --git a/fontconfig/fc-lang/zh_tw.orth b/fontconfig/fc-lang/zh_tw.orth new file mode 100644 index 000000000..a052bfde1 --- /dev/null +++ b/fontconfig/fc-lang/zh_tw.orth @@ -0,0 +1,13105 @@ +# +# fontconfig/fc-lang/zh_tw.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Chinese (traditional) ZH-TW +# +# Made by trimming the Big5 -> unicode mapping down to just Chinese glyphs +# +#0x3000 # ideographic space +#0x3001 # ideographic comma +#0x3002 # ideographic full stop +#0x3003 # ditto mark +#0x3005 # ideographic iteration mark +#0x3021 # Suzhou numeral 1 +#0x3022 # Suzhou numeral 2 +#0x3023 # Suzhou numeral 3 +#0x3024 # Suzhou numeral 4 +#0x3025 # Suzhou numeral 5 +#0x3026 # Suzhou numeral 6 +#0x3027 # Suzhou numeral 7 +#0x3028 # Suzhou numeral 8 +#0x3029 # Suzhou numeral 9 +# Han +0x4E00 +0x4E01 +0x4E03 +0x4E07 +0x4E08 +0x4E09 +0x4E0A +0x4E0B +0x4E0C +0x4E0D +0x4E0E +0x4E0F +0x4E10 +0x4E11 +0x4E14 +0x4E15 +0x4E16 +0x4E18 +0x4E19 +0x4E1E +0x4E1F +0x4E26 +0x4E2B +0x4E2D +0x4E2E +0x4E30 +0x4E31 +0x4E32 +0x4E33 +0x4E38 +0x4E39 +0x4E3B +0x4E3C +0x4E42 +0x4E43 +0x4E45 +0x4E47 +0x4E48 +0x4E4B +0x4E4D +0x4E4E +0x4E4F +0x4E52 +0x4E53 +0x4E56 +0x4E58 +0x4E59 +0x4E5C +0x4E5D +0x4E5E +0x4E5F +0x4E69 +0x4E73 +0x4E7E +0x4E7F +0x4E82 +0x4E83 +0x4E84 +0x4E86 +0x4E88 +0x4E8B +0x4E8C +0x4E8D +0x4E8E +0x4E91 +0x4E92 +0x4E93 +0x4E94 +0x4E95 +0x4E99 +0x4E9B +0x4E9E +0x4E9F +0x4EA1 +0x4EA2 +0x4EA4 +0x4EA5 +0x4EA6 +0x4EA8 +0x4EAB +0x4EAC +0x4EAD +0x4EAE +0x4EB3 +0x4EB6 +0x4EB9 +0x4EBA +0x4EC0 +0x4EC1 +0x4EC2 +0x4EC3 +0x4EC4 +0x4EC6 +0x4EC7 +0x4EC8 +0x4EC9 +0x4ECA +0x4ECB +0x4ECD +0x4ED4 +0x4ED5 +0x4ED6 +0x4ED7 +0x4ED8 +0x4ED9 +0x4EDA +0x4EDC +0x4EDD +0x4EDE +0x4EDF +0x4EE1 +0x4EE3 +0x4EE4 +0x4EE5 +0x4EE8 +0x4EE9 +0x4EF0 +0x4EF1 +0x4EF2 +0x4EF3 +0x4EF4 +0x4EF5 +0x4EF6 +0x4EF7 +0x4EFB +0x4EFD +0x4EFF +0x4F00 +0x4F01 +0x4F02 +0x4F04 +0x4F05 +0x4F08 +0x4F09 +0x4F0A +0x4F0B +0x4F0D +0x4F0E +0x4F0F +0x4F10 +0x4F11 +0x4F12 +0x4F13 +0x4F14 +0x4F15 +0x4F18 +0x4F19 +0x4F1D +0x4F22 +0x4F2C +0x4F2D +0x4F2F +0x4F30 +0x4F33 +0x4F34 +0x4F36 +0x4F38 +0x4F3A +0x4F3B +0x4F3C +0x4F3D +0x4F3E +0x4F3F +0x4F41 +0x4F43 +0x4F46 +0x4F47 +0x4F48 +0x4F49 +0x4F4C +0x4F4D +0x4F4E +0x4F4F +0x4F50 +0x4F51 +0x4F52 +0x4F53 +0x4F54 +0x4F55 +0x4F56 +0x4F57 +0x4F58 +0x4F59 +0x4F5A +0x4F5B +0x4F5C +0x4F5D +0x4F5E +0x4F5F +0x4F60 +0x4F61 +0x4F62 +0x4F63 +0x4F64 +0x4F67 +0x4F69 +0x4F6A +0x4F6B +0x4F6C +0x4F6E +0x4F6F +0x4F70 +0x4F73 +0x4F74 +0x4F75 +0x4F76 +0x4F77 +0x4F78 +0x4F79 +0x4F7A +0x4F7B +0x4F7C +0x4F7D +0x4F7E +0x4F7F +0x4F80 +0x4F81 +0x4F82 +0x4F83 +0x4F84 +0x4F85 +0x4F86 +0x4F87 +0x4F88 +0x4F89 +0x4F8B +0x4F8D +0x4F8F +0x4F90 +0x4F91 +0x4F92 +0x4F94 +0x4F95 +0x4F96 +0x4F97 +0x4F98 +0x4F9A +0x4F9B +0x4F9C +0x4F9D +0x4F9E +0x4FAE +0x4FAF +0x4FB2 +0x4FB3 +0x4FB5 +0x4FB6 +0x4FB7 +0x4FB9 +0x4FBA +0x4FBB +0x4FBF +0x4FC0 +0x4FC1 +0x4FC2 +0x4FC3 +0x4FC4 +0x4FC5 +0x4FC7 +0x4FC9 +0x4FCA +0x4FCB +0x4FCD +0x4FCE +0x4FCF +0x4FD0 +0x4FD1 +0x4FD3 +0x4FD4 +0x4FD6 +0x4FD7 +0x4FD8 +0x4FD9 +0x4FDA +0x4FDB +0x4FDC +0x4FDD +0x4FDE +0x4FDF +0x4FE0 +0x4FE1 +0x4FEC +0x4FEE +0x4FEF +0x4FF1 +0x4FF3 +0x4FF4 +0x4FF5 +0x4FF6 +0x4FF7 +0x4FF8 +0x4FFA +0x4FFE +0x5000 +0x5005 +0x5006 +0x5007 +0x5009 +0x500B +0x500C +0x500D +0x500E +0x500F +0x5011 +0x5012 +0x5013 +0x5014 +0x5015 +0x5016 +0x5017 +0x5018 +0x5019 +0x501A +0x501B +0x501C +0x501E +0x501F +0x5020 +0x5021 +0x5022 +0x5023 +0x5025 +0x5026 +0x5027 +0x5028 +0x5029 +0x502A +0x502B +0x502C +0x502D +0x502F +0x5030 +0x5031 +0x5033 +0x5035 +0x5037 +0x503C +0x5040 +0x5041 +0x5043 +0x5045 +0x5046 +0x5047 +0x5048 +0x5049 +0x504A +0x504B +0x504C +0x504D +0x504E +0x504F +0x5051 +0x5053 +0x5055 +0x5057 +0x505A +0x505B +0x505C +0x505D +0x505E +0x505F +0x5060 +0x5061 +0x5062 +0x5063 +0x5064 +0x5065 +0x5068 +0x5069 +0x506A +0x506B +0x506D +0x506E +0x506F +0x5070 +0x5072 +0x5073 +0x5074 +0x5075 +0x5076 +0x5077 +0x507A +0x507D +0x5080 +0x5082 +0x5083 +0x5085 +0x5087 +0x508B +0x508C +0x508D +0x508E +0x5091 +0x5092 +0x5094 +0x5095 +0x5096 +0x5098 +0x5099 +0x509A +0x509B +0x509C +0x509D +0x509E +0x50A2 +0x50A3 +0x50AC +0x50AD +0x50AE +0x50AF +0x50B0 +0x50B1 +0x50B2 +0x50B3 +0x50B4 +0x50B5 +0x50B6 +0x50B7 +0x50B8 +0x50BA +0x50BB +0x50BD +0x50BE +0x50BF +0x50C1 +0x50C2 +0x50C4 +0x50C5 +0x50C6 +0x50C7 +0x50C8 +0x50C9 +0x50CA +0x50CB +0x50CE +0x50CF +0x50D1 +0x50D3 +0x50D4 +0x50D5 +0x50D6 +0x50D7 +0x50DA +0x50DB +0x50DD +0x50E0 +0x50E3 +0x50E4 +0x50E5 +0x50E6 +0x50E7 +0x50E8 +0x50E9 +0x50EA +0x50EC +0x50ED +0x50EE +0x50EF +0x50F0 +0x50F1 +0x50F3 +0x50F5 +0x50F6 +0x50F8 +0x50F9 +0x50FB +0x50FD +0x50FE +0x50FF +0x5100 +0x5102 +0x5103 +0x5104 +0x5105 +0x5106 +0x5107 +0x5108 +0x5109 +0x510A +0x510B +0x510C +0x5110 +0x5111 +0x5112 +0x5113 +0x5114 +0x5115 +0x5117 +0x5118 +0x511A +0x511C +0x511F +0x5120 +0x5121 +0x5122 +0x5124 +0x5125 +0x5126 +0x5129 +0x512A +0x512D +0x512E +0x5130 +0x5131 +0x5132 +0x5133 +0x5134 +0x5135 +0x5137 +0x5138 +0x5139 +0x513A +0x513B +0x513C +0x513D +0x513F +0x5140 +0x5141 +0x5143 +0x5144 +0x5145 +0x5146 +0x5147 +0x5148 +0x5149 +0x514B +0x514C +0x514D +0x5152 +0x5154 +0x5155 +0x5157 +0x5159 +0x515A +0x515B +0x515C +0x515D +0x515E +0x515F +0x5161 +0x5162 +0x5163 +0x5165 +0x5167 +0x5168 +0x5169 +0x516B +0x516C +0x516D +0x516E +0x5171 +0x5175 +0x5176 +0x5177 +0x5178 +0x517C +0x5180 +0x5187 +0x5189 +0x518A +0x518D +0x518F +0x5191 +0x5192 +0x5193 +0x5194 +0x5195 +0x5197 +0x5198 +0x519E +0x51A0 +0x51A2 +0x51A4 +0x51A5 +0x51AA +0x51AC +0x51B0 +0x51B1 +0x51B6 +0x51B7 +0x51B9 +0x51BC +0x51BD +0x51BE +0x51C4 +0x51C5 +0x51C6 +0x51C8 +0x51CA +0x51CB +0x51CC +0x51CD +0x51CE +0x51D0 +0x51D4 +0x51D7 +0x51D8 +0x51DC +0x51DD +0x51DE +0x51E0 +0x51E1 +0x51F0 +0x51F1 +0x51F3 +0x51F5 +0x51F6 +0x51F8 +0x51F9 +0x51FA +0x51FD +0x5200 +0x5201 +0x5203 +0x5206 +0x5207 +0x5208 +0x5209 +0x520A +0x520C +0x520E +0x5210 +0x5211 +0x5212 +0x5213 +0x5216 +0x5217 +0x521C +0x521D +0x521E +0x5221 +0x5224 +0x5225 +0x5228 +0x5229 +0x522A +0x522E +0x5230 +0x5231 +0x5232 +0x5233 +0x5235 +0x5236 +0x5237 +0x5238 +0x523A +0x523B +0x5241 +0x5243 +0x5244 +0x5246 +0x5247 +0x5249 +0x524A +0x524B +0x524C +0x524D +0x524E +0x5252 +0x5254 +0x5255 +0x5256 +0x525A +0x525B +0x525C +0x525D +0x525E +0x525F +0x5261 +0x5262 +0x5269 +0x526A +0x526B +0x526C +0x526D +0x526E +0x526F +0x5272 +0x5274 +0x5275 +0x5277 +0x5278 +0x527A +0x527B +0x527C +0x527D +0x527F +0x5280 +0x5281 +0x5282 +0x5283 +0x5284 +0x5287 +0x5288 +0x5289 +0x528A +0x528B +0x528C +0x528D +0x5291 +0x5293 +0x5296 +0x5297 +0x5298 +0x5299 +0x529B +0x529F +0x52A0 +0x52A3 +0x52A6 +0x52A9 +0x52AA +0x52AB +0x52AC +0x52AD +0x52AE +0x52BB +0x52BC +0x52BE +0x52C0 +0x52C1 +0x52C2 +0x52C3 +0x52C7 +0x52C9 +0x52CD +0x52D2 +0x52D3 +0x52D5 +0x52D6 +0x52D7 +0x52D8 +0x52D9 +0x52DB +0x52DD +0x52DE +0x52DF +0x52E2 +0x52E3 +0x52E4 +0x52E6 +0x52E9 +0x52EB +0x52EF +0x52F0 +0x52F1 +0x52F3 +0x52F4 +0x52F5 +0x52F7 +0x52F8 +0x52FA +0x52FB +0x52FC +0x52FE +0x52FF +0x5305 +0x5306 +0x5308 +0x5309 +0x530A +0x530B +0x530D +0x530E +0x530F +0x5310 +0x5311 +0x5312 +0x5315 +0x5316 +0x5317 +0x5319 +0x531A +0x531C +0x531D +0x531F +0x5320 +0x5321 +0x5322 +0x5323 +0x532A +0x532D +0x532F +0x5330 +0x5331 +0x5334 +0x5337 +0x5339 +0x533C +0x533D +0x533E +0x533F +0x5340 +0x5341 +0x5343 +0x5344 +0x5345 +0x5347 +0x5348 +0x5349 +0x534A +0x534C +0x534D +0x5351 +0x5352 +0x5353 +0x5354 +0x5357 +0x535A +0x535C +0x535E +0x5360 +0x5361 +0x5363 +0x5366 +0x536C +0x536E +0x536F +0x5370 +0x5371 +0x5372 +0x5373 +0x5375 +0x5377 +0x5378 +0x5379 +0x537B +0x537C +0x537F +0x5382 +0x5384 +0x538A +0x538E +0x538F +0x5392 +0x5394 +0x5396 +0x5397 +0x5398 +0x5399 +0x539A +0x539C +0x539D +0x539E +0x539F +0x53A4 +0x53A5 +0x53A7 +0x53AC +0x53AD +0x53B2 +0x53B4 +0x53B9 +0x53BB +0x53C3 +0x53C8 +0x53C9 +0x53CA +0x53CB +0x53CD +0x53D4 +0x53D6 +0x53D7 +0x53DB +0x53DF +0x53E1 +0x53E2 +0x53E3 +0x53E4 +0x53E5 +0x53E6 +0x53E8 +0x53E9 +0x53EA +0x53EB +0x53EC +0x53ED +0x53EE +0x53EF +0x53F0 +0x53F1 +0x53F2 +0x53F3 +0x53F5 +0x53F8 +0x53FB +0x53FC +0x5401 +0x5403 +0x5404 +0x5406 +0x5407 +0x5408 +0x5409 +0x540A +0x540B +0x540C +0x540D +0x540E +0x540F +0x5410 +0x5411 +0x5412 +0x5418 +0x5419 +0x541B +0x541C +0x541D +0x541E +0x541F +0x5420 +0x5424 +0x5425 +0x5426 +0x5427 +0x5428 +0x5429 +0x542A +0x542B +0x542C +0x542D +0x542E +0x5430 +0x5431 +0x5433 +0x5435 +0x5436 +0x5437 +0x5438 +0x5439 +0x543B +0x543C +0x543D +0x543E +0x5440 +0x5441 +0x5442 +0x5443 +0x5445 +0x5446 +0x5447 +0x5448 +0x544A +0x544E +0x544F +0x5454 +0x5460 +0x5461 +0x5462 +0x5463 +0x5464 +0x5465 +0x5466 +0x5467 +0x5468 +0x546B +0x546C +0x546F +0x5470 +0x5471 +0x5472 +0x5473 +0x5474 +0x5475 +0x5476 +0x5477 +0x5478 +0x547A +0x547B +0x547C +0x547D +0x547E +0x547F +0x5480 +0x5481 +0x5482 +0x5484 +0x5486 +0x5487 +0x5488 +0x548B +0x548C +0x548D +0x548E +0x5490 +0x5491 +0x5492 +0x5495 +0x5496 +0x5498 +0x549A +0x54A0 +0x54A1 +0x54A2 +0x54A5 +0x54A6 +0x54A7 +0x54A8 +0x54A9 +0x54AA +0x54AB +0x54AC +0x54AD +0x54AE +0x54AF +0x54B0 +0x54B1 +0x54B3 +0x54B6 +0x54B7 +0x54B8 +0x54BA +0x54BB +0x54BC +0x54BD +0x54BE +0x54BF +0x54C0 +0x54C1 +0x54C2 +0x54C3 +0x54C4 +0x54C5 +0x54C6 +0x54C7 +0x54C8 +0x54C9 +0x54CE +0x54CF +0x54D6 +0x54DE +0x54E0 +0x54E1 +0x54E2 +0x54E4 +0x54E5 +0x54E6 +0x54E7 +0x54E8 +0x54E9 +0x54EA +0x54EB +0x54ED +0x54EE +0x54F1 +0x54F2 +0x54F3 +0x54F7 +0x54F8 +0x54FA +0x54FB +0x54FC +0x54FD +0x54FF +0x5501 +0x5503 +0x5504 +0x5505 +0x5506 +0x5507 +0x5508 +0x5509 +0x550A +0x550B +0x550C +0x550E +0x550F +0x5510 +0x5511 +0x5512 +0x5514 +0x5517 +0x551A +0x5526 +0x5527 +0x552A +0x552C +0x552D +0x552E +0x552F +0x5530 +0x5531 +0x5532 +0x5533 +0x5534 +0x5535 +0x5536 +0x5537 +0x5538 +0x5539 +0x553B +0x553C +0x553E +0x5540 +0x5541 +0x5543 +0x5544 +0x5545 +0x5546 +0x5548 +0x554A +0x554B +0x554D +0x554E +0x554F +0x5550 +0x5551 +0x5552 +0x5555 +0x5556 +0x5557 +0x555C +0x555E +0x555F +0x5561 +0x5562 +0x5563 +0x5564 +0x5565 +0x5566 +0x556A +0x5575 +0x5576 +0x5577 +0x557B +0x557C +0x557D +0x557E +0x557F +0x5580 +0x5581 +0x5582 +0x5583 +0x5584 +0x5587 +0x5588 +0x5589 +0x558A +0x558B +0x558C +0x558D +0x558E +0x558F +0x5591 +0x5592 +0x5593 +0x5594 +0x5595 +0x5598 +0x5599 +0x559A +0x559C +0x559D +0x559F +0x55A1 +0x55A2 +0x55A3 +0x55A4 +0x55A5 +0x55A6 +0x55A7 +0x55A8 +0x55AA +0x55AB +0x55AC +0x55AD +0x55AE +0x55B1 +0x55B2 +0x55B3 +0x55B5 +0x55BB +0x55BF +0x55C0 +0x55C2 +0x55C3 +0x55C4 +0x55C5 +0x55C6 +0x55C7 +0x55C8 +0x55C9 +0x55CA +0x55CB +0x55CC +0x55CD +0x55CE +0x55CF +0x55D0 +0x55D1 +0x55D2 +0x55D3 +0x55D4 +0x55D5 +0x55D6 +0x55D9 +0x55DA +0x55DB +0x55DC +0x55DD +0x55DF +0x55E1 +0x55E2 +0x55E3 +0x55E4 +0x55E5 +0x55E6 +0x55E7 +0x55E8 +0x55E9 +0x55EF +0x55F2 +0x55F6 +0x55F7 +0x55F9 +0x55FA +0x55FC +0x55FD +0x55FE +0x55FF +0x5600 +0x5601 +0x5602 +0x5604 +0x5606 +0x5608 +0x5609 +0x560C +0x560D +0x560E +0x560F +0x5610 +0x5612 +0x5613 +0x5614 +0x5615 +0x5616 +0x5617 +0x561B +0x561C +0x561D +0x561F +0x5627 +0x5629 +0x562A +0x562C +0x562E +0x562F +0x5630 +0x5632 +0x5633 +0x5634 +0x5635 +0x5636 +0x5638 +0x5639 +0x563A +0x563B +0x563D +0x563E +0x563F +0x5640 +0x5641 +0x5642 +0x5645 +0x5646 +0x5648 +0x5649 +0x564A +0x564C +0x564E +0x5653 +0x5657 +0x5658 +0x5659 +0x565A +0x565E +0x5660 +0x5662 +0x5663 +0x5664 +0x5665 +0x5666 +0x5668 +0x5669 +0x566A +0x566B +0x566C +0x566D +0x566E +0x566F +0x5670 +0x5671 +0x5672 +0x5673 +0x5674 +0x5676 +0x5677 +0x5678 +0x5679 +0x567E +0x567F +0x5680 +0x5681 +0x5682 +0x5683 +0x5684 +0x5685 +0x5686 +0x5687 +0x568C +0x568D +0x568E +0x568F +0x5690 +0x5693 +0x5695 +0x5697 +0x5698 +0x5699 +0x569A +0x569C +0x569D +0x56A5 +0x56A6 +0x56A7 +0x56A8 +0x56AA +0x56AB +0x56AC +0x56AD +0x56AE +0x56B2 +0x56B3 +0x56B4 +0x56B5 +0x56B6 +0x56B7 +0x56BC +0x56BD +0x56BE +0x56C0 +0x56C1 +0x56C2 +0x56C3 +0x56C5 +0x56C6 +0x56C8 +0x56C9 +0x56CA +0x56CB +0x56CC +0x56CD +0x56D1 +0x56D3 +0x56D4 +0x56D7 +0x56DA +0x56DB +0x56DD +0x56DE +0x56DF +0x56E0 +0x56E1 +0x56E4 +0x56E5 +0x56E7 +0x56EA +0x56EB +0x56EE +0x56F0 +0x56F7 +0x56F9 +0x56FA +0x56FF +0x5701 +0x5702 +0x5703 +0x5704 +0x5707 +0x5708 +0x5709 +0x570A +0x570B +0x570C +0x570D +0x5712 +0x5713 +0x5714 +0x5716 +0x5718 +0x571A +0x571B +0x571C +0x571E +0x571F +0x5720 +0x5722 +0x5723 +0x5728 +0x5729 +0x572A +0x572C +0x572D +0x572E +0x572F +0x5730 +0x5733 +0x5734 +0x573B +0x573E +0x5740 +0x5741 +0x5745 +0x5747 +0x5749 +0x574A +0x574B +0x574C +0x574D +0x574E +0x574F +0x5750 +0x5751 +0x5752 +0x5761 +0x5762 +0x5764 +0x5766 +0x5768 +0x5769 +0x576A +0x576B +0x576D +0x576F +0x5770 +0x5771 +0x5772 +0x5773 +0x5774 +0x5775 +0x5776 +0x5777 +0x577B +0x577C +0x577D +0x5780 +0x5782 +0x5783 +0x578B +0x578C +0x578F +0x5793 +0x5794 +0x5795 +0x5797 +0x5798 +0x5799 +0x579A +0x579B +0x579D +0x579E +0x579F +0x57A0 +0x57A2 +0x57A3 +0x57A4 +0x57A5 +0x57AE +0x57B5 +0x57B6 +0x57B8 +0x57B9 +0x57BA +0x57BC +0x57BD +0x57BF +0x57C1 +0x57C2 +0x57C3 +0x57C6 +0x57C7 +0x57CB +0x57CC +0x57CE +0x57CF +0x57D0 +0x57D2 +0x57D4 +0x57D5 +0x57DC +0x57DF +0x57E0 +0x57E1 +0x57E2 +0x57E3 +0x57E4 +0x57E5 +0x57E7 +0x57E9 +0x57EC +0x57ED +0x57EE +0x57F0 +0x57F1 +0x57F2 +0x57F3 +0x57F4 +0x57F5 +0x57F6 +0x57F7 +0x57F8 +0x57F9 +0x57FA +0x57FB +0x57FC +0x57FD +0x5800 +0x5801 +0x5802 +0x5804 +0x5805 +0x5806 +0x5807 +0x5808 +0x5809 +0x580A +0x580B +0x580C +0x580D +0x580E +0x5810 +0x5814 +0x5819 +0x581B +0x581C +0x581D +0x581E +0x5820 +0x5821 +0x5823 +0x5824 +0x5825 +0x5827 +0x5828 +0x5829 +0x582A +0x582C +0x582D +0x582E +0x582F +0x5830 +0x5831 +0x5832 +0x5833 +0x5834 +0x5835 +0x5836 +0x5837 +0x5838 +0x5839 +0x583B +0x583D +0x583F +0x5848 +0x5849 +0x584A +0x584B +0x584C +0x584D +0x584E +0x584F +0x5851 +0x5852 +0x5853 +0x5854 +0x5855 +0x5857 +0x5858 +0x5859 +0x585A +0x585B +0x585D +0x585E +0x5862 +0x5863 +0x5864 +0x5865 +0x5868 +0x586B +0x586D +0x586F +0x5871 +0x5874 +0x5875 +0x5876 +0x5879 +0x587A +0x587B +0x587C +0x587D +0x587E +0x587F +0x5880 +0x5881 +0x5882 +0x5883 +0x5885 +0x5886 +0x5887 +0x5888 +0x5889 +0x588A +0x588B +0x588E +0x588F +0x5890 +0x5891 +0x5893 +0x5894 +0x5898 +0x589C +0x589D +0x589E +0x589F +0x58A0 +0x58A1 +0x58A3 +0x58A5 +0x58A6 +0x58A8 +0x58A9 +0x58AB +0x58AC +0x58AE +0x58AF +0x58B1 +0x58B3 +0x58BA +0x58BC +0x58BD +0x58BE +0x58BF +0x58C1 +0x58C2 +0x58C5 +0x58C6 +0x58C7 +0x58C8 +0x58C9 +0x58CE +0x58CF +0x58D1 +0x58D2 +0x58D3 +0x58D4 +0x58D5 +0x58D6 +0x58D8 +0x58D9 +0x58DA +0x58DB +0x58DD +0x58DE +0x58DF +0x58E2 +0x58E3 +0x58E4 +0x58E7 +0x58E8 +0x58E9 +0x58EB +0x58EC +0x58EF +0x58F4 +0x58F9 +0x58FA +0x58FC +0x58FD +0x58FE +0x58FF +0x5903 +0x5906 +0x590C +0x590D +0x590E +0x590F +0x5912 +0x5914 +0x5915 +0x5916 +0x5917 +0x5919 +0x591A +0x591C +0x5920 +0x5922 +0x5924 +0x5925 +0x5927 +0x5929 +0x592A +0x592B +0x592C +0x592D +0x592E +0x592F +0x5931 +0x5937 +0x5938 +0x593C +0x593E +0x5940 +0x5944 +0x5945 +0x5947 +0x5948 +0x5949 +0x594A +0x594E +0x594F +0x5950 +0x5951 +0x5953 +0x5954 +0x5955 +0x5957 +0x5958 +0x595A +0x595C +0x5960 +0x5961 +0x5962 +0x5967 +0x5969 +0x596A +0x596B +0x596D +0x596E +0x5970 +0x5971 +0x5972 +0x5973 +0x5974 +0x5976 +0x5977 +0x5978 +0x5979 +0x597B +0x597C +0x597D +0x597E +0x597F +0x5980 +0x5981 +0x5982 +0x5983 +0x5984 +0x5985 +0x598A +0x598D +0x598E +0x598F +0x5990 +0x5992 +0x5993 +0x5996 +0x5997 +0x5998 +0x5999 +0x599D +0x599E +0x59A0 +0x59A1 +0x59A2 +0x59A3 +0x59A4 +0x59A5 +0x59A6 +0x59A7 +0x59A8 +0x59AE +0x59AF +0x59B1 +0x59B2 +0x59B3 +0x59B4 +0x59B5 +0x59B6 +0x59B9 +0x59BA +0x59BB +0x59BC +0x59BD +0x59BE +0x59C0 +0x59C1 +0x59C3 +0x59C5 +0x59C6 +0x59C7 +0x59C8 +0x59CA +0x59CB +0x59CC +0x59CD +0x59CE +0x59CF +0x59D0 +0x59D1 +0x59D2 +0x59D3 +0x59D4 +0x59D6 +0x59D8 +0x59DA +0x59DB +0x59DC +0x59DD +0x59DE +0x59E0 +0x59E1 +0x59E3 +0x59E4 +0x59E5 +0x59E6 +0x59E8 +0x59E9 +0x59EA +0x59EC +0x59ED +0x59EE +0x59F1 +0x59F2 +0x59F3 +0x59F4 +0x59F5 +0x59F6 +0x59F7 +0x59FA +0x59FB +0x59FC +0x59FD +0x59FE +0x59FF +0x5A00 +0x5A01 +0x5A03 +0x5A09 +0x5A0A +0x5A0C +0x5A0F +0x5A11 +0x5A13 +0x5A15 +0x5A16 +0x5A17 +0x5A18 +0x5A19 +0x5A1B +0x5A1C +0x5A1E +0x5A1F +0x5A20 +0x5A23 +0x5A25 +0x5A29 +0x5A2D +0x5A2E +0x5A33 +0x5A35 +0x5A36 +0x5A37 +0x5A38 +0x5A39 +0x5A3C +0x5A3E +0x5A40 +0x5A41 +0x5A42 +0x5A43 +0x5A44 +0x5A46 +0x5A47 +0x5A48 +0x5A49 +0x5A4A +0x5A4C +0x5A4D +0x5A50 +0x5A51 +0x5A52 +0x5A53 +0x5A55 +0x5A56 +0x5A57 +0x5A58 +0x5A5A +0x5A5B +0x5A5C +0x5A5D +0x5A5E +0x5A5F +0x5A60 +0x5A62 +0x5A64 +0x5A65 +0x5A66 +0x5A67 +0x5A69 +0x5A6A +0x5A6C +0x5A6D +0x5A70 +0x5A77 +0x5A78 +0x5A7A +0x5A7B +0x5A7C +0x5A7D +0x5A7F +0x5A83 +0x5A84 +0x5A8A +0x5A8B +0x5A8C +0x5A8E +0x5A8F +0x5A90 +0x5A92 +0x5A93 +0x5A94 +0x5A95 +0x5A97 +0x5A9A +0x5A9B +0x5A9C +0x5A9D +0x5A9E +0x5A9F +0x5AA2 +0x5AA5 +0x5AA6 +0x5AA7 +0x5AA9 +0x5AAC +0x5AAE +0x5AAF +0x5AB0 +0x5AB1 +0x5AB2 +0x5AB3 +0x5AB4 +0x5AB5 +0x5AB6 +0x5AB7 +0x5AB8 +0x5AB9 +0x5ABA +0x5ABB +0x5ABC +0x5ABD +0x5ABE +0x5ABF +0x5AC0 +0x5AC1 +0x5AC2 +0x5AC4 +0x5AC6 +0x5AC7 +0x5AC8 +0x5AC9 +0x5ACA +0x5ACB +0x5ACC +0x5ACD +0x5AD5 +0x5AD6 +0x5AD7 +0x5AD8 +0x5AD9 +0x5ADA +0x5ADB +0x5ADC +0x5ADD +0x5ADE +0x5ADF +0x5AE0 +0x5AE1 +0x5AE2 +0x5AE3 +0x5AE5 +0x5AE6 +0x5AE8 +0x5AE9 +0x5AEA +0x5AEB +0x5AEC +0x5AED +0x5AEE +0x5AF3 +0x5AF4 +0x5AF5 +0x5AF6 +0x5AF7 +0x5AF8 +0x5AF9 +0x5AFB +0x5AFD +0x5AFF +0x5B01 +0x5B02 +0x5B03 +0x5B05 +0x5B07 +0x5B08 +0x5B09 +0x5B0B +0x5B0C +0x5B0F +0x5B10 +0x5B13 +0x5B14 +0x5B16 +0x5B17 +0x5B19 +0x5B1A +0x5B1B +0x5B1D +0x5B1E +0x5B20 +0x5B21 +0x5B23 +0x5B24 +0x5B25 +0x5B26 +0x5B27 +0x5B28 +0x5B2A +0x5B2C +0x5B2D +0x5B2E +0x5B2F +0x5B30 +0x5B32 +0x5B34 +0x5B38 +0x5B3C +0x5B3D +0x5B3E +0x5B3F +0x5B40 +0x5B43 +0x5B45 +0x5B47 +0x5B48 +0x5B4B +0x5B4C +0x5B4D +0x5B4E +0x5B50 +0x5B51 +0x5B53 +0x5B54 +0x5B55 +0x5B56 +0x5B57 +0x5B58 +0x5B5A +0x5B5B +0x5B5C +0x5B5D +0x5B5F +0x5B62 +0x5B63 +0x5B64 +0x5B65 +0x5B69 +0x5B6B +0x5B6C +0x5B6E +0x5B70 +0x5B71 +0x5B72 +0x5B73 +0x5B75 +0x5B77 +0x5B78 +0x5B7A +0x5B7B +0x5B7D +0x5B7F +0x5B81 +0x5B83 +0x5B84 +0x5B85 +0x5B87 +0x5B88 +0x5B89 +0x5B8B +0x5B8C +0x5B8E +0x5B8F +0x5B92 +0x5B93 +0x5B95 +0x5B97 +0x5B98 +0x5B99 +0x5B9A +0x5B9B +0x5B9C +0x5BA2 +0x5BA3 +0x5BA4 +0x5BA5 +0x5BA6 +0x5BA7 +0x5BA8 +0x5BAC +0x5BAD +0x5BAE +0x5BB0 +0x5BB3 +0x5BB4 +0x5BB5 +0x5BB6 +0x5BB8 +0x5BB9 +0x5BBF +0x5BC0 +0x5BC1 +0x5BC2 +0x5BC4 +0x5BC5 +0x5BC6 +0x5BC7 +0x5BCA +0x5BCB +0x5BCC +0x5BCD +0x5BCE +0x5BD0 +0x5BD1 +0x5BD2 +0x5BD3 +0x5BD4 +0x5BD6 +0x5BD8 +0x5BD9 +0x5BDE +0x5BDF +0x5BE0 +0x5BE1 +0x5BE2 +0x5BE3 +0x5BE4 +0x5BE5 +0x5BE6 +0x5BE7 +0x5BE8 +0x5BE9 +0x5BEA +0x5BEB +0x5BEC +0x5BEE +0x5BEF +0x5BF0 +0x5BF1 +0x5BF2 +0x5BF5 +0x5BF6 +0x5BF8 +0x5BFA +0x5C01 +0x5C03 +0x5C04 +0x5C07 +0x5C08 +0x5C09 +0x5C0A +0x5C0B +0x5C0C +0x5C0D +0x5C0E +0x5C0F +0x5C10 +0x5C11 +0x5C12 +0x5C15 +0x5C16 +0x5C1A +0x5C1F +0x5C22 +0x5C24 +0x5C25 +0x5C28 +0x5C2A +0x5C2C +0x5C30 +0x5C31 +0x5C33 +0x5C37 +0x5C38 +0x5C39 +0x5C3A +0x5C3B +0x5C3C +0x5C3E +0x5C3F +0x5C40 +0x5C41 +0x5C44 +0x5C45 +0x5C46 +0x5C47 +0x5C48 +0x5C4B +0x5C4C +0x5C4D +0x5C4E +0x5C4F +0x5C50 +0x5C51 +0x5C54 +0x5C55 +0x5C56 +0x5C58 +0x5C59 +0x5C5C +0x5C5D +0x5C60 +0x5C62 +0x5C63 +0x5C64 +0x5C65 +0x5C67 +0x5C68 +0x5C69 +0x5C6A +0x5C6C +0x5C6D +0x5C6E +0x5C6F +0x5C71 +0x5C73 +0x5C74 +0x5C79 +0x5C7A +0x5C7B +0x5C7C +0x5C7E +0x5C86 +0x5C88 +0x5C89 +0x5C8A +0x5C8B +0x5C8C +0x5C8D +0x5C8F +0x5C90 +0x5C91 +0x5C92 +0x5C93 +0x5C94 +0x5C95 +0x5C9D +0x5C9F +0x5CA0 +0x5CA1 +0x5CA2 +0x5CA3 +0x5CA4 +0x5CA5 +0x5CA6 +0x5CA7 +0x5CA8 +0x5CA9 +0x5CAA +0x5CAB +0x5CAC +0x5CAD +0x5CAE +0x5CAF +0x5CB0 +0x5CB1 +0x5CB3 +0x5CB5 +0x5CB6 +0x5CB7 +0x5CB8 +0x5CC6 +0x5CC7 +0x5CC8 +0x5CC9 +0x5CCA +0x5CCB +0x5CCC +0x5CCE +0x5CCF +0x5CD0 +0x5CD2 +0x5CD3 +0x5CD4 +0x5CD6 +0x5CD7 +0x5CD8 +0x5CD9 +0x5CDA +0x5CDB +0x5CDE +0x5CDF +0x5CE8 +0x5CEA +0x5CEC +0x5CED +0x5CEE +0x5CF0 +0x5CF1 +0x5CF4 +0x5CF6 +0x5CF7 +0x5CF8 +0x5CF9 +0x5CFB +0x5CFD +0x5CFF +0x5D00 +0x5D01 +0x5D06 +0x5D07 +0x5D0B +0x5D0C +0x5D0D +0x5D0E +0x5D0F +0x5D11 +0x5D12 +0x5D14 +0x5D16 +0x5D17 +0x5D19 +0x5D1A +0x5D1B +0x5D1D +0x5D1E +0x5D1F +0x5D20 +0x5D22 +0x5D23 +0x5D24 +0x5D25 +0x5D26 +0x5D27 +0x5D28 +0x5D29 +0x5D2E +0x5D30 +0x5D31 +0x5D32 +0x5D33 +0x5D34 +0x5D35 +0x5D36 +0x5D37 +0x5D38 +0x5D39 +0x5D3A +0x5D3C +0x5D3D +0x5D3F +0x5D40 +0x5D41 +0x5D42 +0x5D43 +0x5D45 +0x5D47 +0x5D49 +0x5D4A +0x5D4B +0x5D4C +0x5D4E +0x5D50 +0x5D51 +0x5D52 +0x5D55 +0x5D59 +0x5D5E +0x5D62 +0x5D63 +0x5D65 +0x5D67 +0x5D68 +0x5D69 +0x5D6B +0x5D6C +0x5D6F +0x5D71 +0x5D72 +0x5D77 +0x5D79 +0x5D7A +0x5D7C +0x5D7D +0x5D7E +0x5D7F +0x5D80 +0x5D81 +0x5D82 +0x5D84 +0x5D86 +0x5D87 +0x5D88 +0x5D89 +0x5D8A +0x5D8D +0x5D92 +0x5D93 +0x5D94 +0x5D95 +0x5D97 +0x5D99 +0x5D9A +0x5D9C +0x5D9D +0x5D9E +0x5D9F +0x5DA0 +0x5DA1 +0x5DA2 +0x5DA7 +0x5DA8 +0x5DA9 +0x5DAA +0x5DAC +0x5DAD +0x5DAE +0x5DAF +0x5DB0 +0x5DB1 +0x5DB2 +0x5DB4 +0x5DB5 +0x5DB7 +0x5DB8 +0x5DBA +0x5DBC +0x5DBD +0x5DC0 +0x5DC2 +0x5DC3 +0x5DC6 +0x5DC7 +0x5DC9 +0x5DCB +0x5DCD +0x5DCF +0x5DD1 +0x5DD2 +0x5DD4 +0x5DD5 +0x5DD6 +0x5DD8 +0x5DDD +0x5DDE +0x5DDF +0x5DE0 +0x5DE1 +0x5DE2 +0x5DE5 +0x5DE6 +0x5DE7 +0x5DE8 +0x5DEB +0x5DEE +0x5DF0 +0x5DF1 +0x5DF2 +0x5DF3 +0x5DF4 +0x5DF7 +0x5DF9 +0x5DFD +0x5DFE +0x5DFF +0x5E02 +0x5E03 +0x5E04 +0x5E06 +0x5E0A +0x5E0C +0x5E0E +0x5E11 +0x5E14 +0x5E15 +0x5E16 +0x5E17 +0x5E18 +0x5E19 +0x5E1A +0x5E1B +0x5E1D +0x5E1F +0x5E20 +0x5E21 +0x5E22 +0x5E23 +0x5E24 +0x5E25 +0x5E28 +0x5E29 +0x5E2B +0x5E2D +0x5E33 +0x5E34 +0x5E36 +0x5E37 +0x5E38 +0x5E3D +0x5E3E +0x5E40 +0x5E41 +0x5E43 +0x5E44 +0x5E45 +0x5E4A +0x5E4B +0x5E4C +0x5E4D +0x5E4E +0x5E4F +0x5E53 +0x5E54 +0x5E55 +0x5E57 +0x5E58 +0x5E59 +0x5E5B +0x5E5C +0x5E5D +0x5E5F +0x5E60 +0x5E61 +0x5E62 +0x5E63 +0x5E66 +0x5E67 +0x5E68 +0x5E69 +0x5E6A +0x5E6B +0x5E6C +0x5E6D +0x5E6E +0x5E6F +0x5E70 +0x5E72 +0x5E73 +0x5E74 +0x5E75 +0x5E76 +0x5E78 +0x5E79 +0x5E7B +0x5E7C +0x5E7D +0x5E7E +0x5E80 +0x5E82 +0x5E84 +0x5E87 +0x5E88 +0x5E89 +0x5E8A +0x5E8B +0x5E8C +0x5E8D +0x5E8F +0x5E95 +0x5E96 +0x5E97 +0x5E9A +0x5E9B +0x5E9C +0x5EA0 +0x5EA2 +0x5EA3 +0x5EA4 +0x5EA5 +0x5EA6 +0x5EA7 +0x5EA8 +0x5EAA +0x5EAB +0x5EAC +0x5EAD +0x5EAE +0x5EB0 +0x5EB1 +0x5EB2 +0x5EB3 +0x5EB4 +0x5EB5 +0x5EB6 +0x5EB7 +0x5EB8 +0x5EB9 +0x5EBE +0x5EC1 +0x5EC2 +0x5EC4 +0x5EC5 +0x5EC6 +0x5EC7 +0x5EC8 +0x5EC9 +0x5ECA +0x5ECB +0x5ECC +0x5ECE +0x5ED1 +0x5ED2 +0x5ED3 +0x5ED4 +0x5ED5 +0x5ED6 +0x5ED7 +0x5ED8 +0x5ED9 +0x5EDA +0x5EDB +0x5EDC +0x5EDD +0x5EDE +0x5EDF +0x5EE0 +0x5EE1 +0x5EE2 +0x5EE3 +0x5EE5 +0x5EE6 +0x5EE7 +0x5EE8 +0x5EE9 +0x5EEC +0x5EEE +0x5EEF +0x5EF1 +0x5EF2 +0x5EF3 +0x5EF6 +0x5EF7 +0x5EFA +0x5EFE +0x5EFF +0x5F01 +0x5F02 +0x5F04 +0x5F05 +0x5F07 +0x5F08 +0x5F0A +0x5F0B +0x5F0F +0x5F12 +0x5F13 +0x5F14 +0x5F15 +0x5F17 +0x5F18 +0x5F1A +0x5F1B +0x5F1D +0x5F1F +0x5F22 +0x5F23 +0x5F24 +0x5F26 +0x5F27 +0x5F28 +0x5F29 +0x5F2D +0x5F2E +0x5F30 +0x5F31 +0x5F33 +0x5F35 +0x5F36 +0x5F37 +0x5F38 +0x5F3C +0x5F40 +0x5F43 +0x5F44 +0x5F46 +0x5F48 +0x5F49 +0x5F4A +0x5F4B +0x5F4C +0x5F4E +0x5F4F +0x5F54 +0x5F56 +0x5F57 +0x5F58 +0x5F59 +0x5F5D +0x5F62 +0x5F64 +0x5F65 +0x5F67 +0x5F69 +0x5F6A +0x5F6B +0x5F6C +0x5F6D +0x5F6F +0x5F70 +0x5F71 +0x5F73 +0x5F74 +0x5F76 +0x5F77 +0x5F78 +0x5F79 +0x5F7C +0x5F7D +0x5F7E +0x5F7F +0x5F80 +0x5F81 +0x5F82 +0x5F85 +0x5F86 +0x5F87 +0x5F88 +0x5F89 +0x5F8A +0x5F8B +0x5F8C +0x5F90 +0x5F91 +0x5F92 +0x5F96 +0x5F97 +0x5F98 +0x5F99 +0x5F9B +0x5F9C +0x5F9E +0x5F9F +0x5FA0 +0x5FA1 +0x5FA5 +0x5FA6 +0x5FA8 +0x5FA9 +0x5FAA +0x5FAB +0x5FAC +0x5FAD +0x5FAE +0x5FAF +0x5FB2 +0x5FB5 +0x5FB6 +0x5FB7 +0x5FB9 +0x5FBB +0x5FBC +0x5FBD +0x5FBE +0x5FBF +0x5FC0 +0x5FC1 +0x5FC3 +0x5FC5 +0x5FC9 +0x5FCC +0x5FCD +0x5FCF +0x5FD0 +0x5FD1 +0x5FD2 +0x5FD4 +0x5FD5 +0x5FD6 +0x5FD7 +0x5FD8 +0x5FD9 +0x5FDD +0x5FDE +0x5FE0 +0x5FE1 +0x5FE3 +0x5FE4 +0x5FE5 +0x5FE8 +0x5FEA +0x5FEB +0x5FED +0x5FEE +0x5FEF +0x5FF1 +0x5FF3 +0x5FF4 +0x5FF5 +0x5FF7 +0x5FF8 +0x5FFA +0x5FFB +0x5FFD +0x5FFF +0x6000 +0x6009 +0x600A +0x600B +0x600C +0x600D +0x600E +0x600F +0x6010 +0x6011 +0x6012 +0x6013 +0x6014 +0x6015 +0x6016 +0x6017 +0x6019 +0x601A +0x601B +0x601C +0x601D +0x601E +0x6020 +0x6021 +0x6022 +0x6024 +0x6025 +0x6026 +0x6027 +0x6028 +0x6029 +0x602A +0x602B +0x602C +0x602D +0x602E +0x602F +0x6032 +0x6033 +0x6034 +0x6035 +0x6037 +0x6039 +0x6040 +0x6041 +0x6042 +0x6043 +0x6044 +0x6045 +0x6046 +0x6047 +0x6049 +0x604C +0x604D +0x6050 +0x6053 +0x6054 +0x6055 +0x6058 +0x6059 +0x605A +0x605B +0x605D +0x605E +0x605F +0x6062 +0x6063 +0x6064 +0x6065 +0x6066 +0x6067 +0x6068 +0x6069 +0x606A +0x606B +0x606C +0x606D +0x606E +0x606F +0x6070 +0x6072 +0x607F +0x6080 +0x6081 +0x6083 +0x6084 +0x6085 +0x6086 +0x6087 +0x6088 +0x6089 +0x608A +0x608C +0x608D +0x608E +0x6090 +0x6092 +0x6094 +0x6095 +0x6096 +0x6097 +0x609A +0x609B +0x609C +0x609D +0x609F +0x60A0 +0x60A2 +0x60A3 +0x60A8 +0x60B0 +0x60B1 +0x60B2 +0x60B4 +0x60B5 +0x60B6 +0x60B7 +0x60B8 +0x60B9 +0x60BA +0x60BB +0x60BC +0x60BD +0x60BE +0x60BF +0x60C0 +0x60C1 +0x60C3 +0x60C4 +0x60C5 +0x60C6 +0x60C7 +0x60C8 +0x60C9 +0x60CA +0x60CB +0x60CC +0x60CD +0x60CE +0x60CF +0x60D1 +0x60D3 +0x60D4 +0x60D5 +0x60D8 +0x60D9 +0x60DA +0x60DB +0x60DC +0x60DD +0x60DF +0x60E0 +0x60E1 +0x60E2 +0x60E4 +0x60E6 +0x60F0 +0x60F1 +0x60F2 +0x60F3 +0x60F4 +0x60F5 +0x60F6 +0x60F7 +0x60F8 +0x60F9 +0x60FA +0x60FB +0x60FC +0x60FE +0x60FF +0x6100 +0x6101 +0x6103 +0x6104 +0x6105 +0x6106 +0x6108 +0x6109 +0x610A +0x610B +0x610D +0x610E +0x610F +0x6110 +0x6112 +0x6113 +0x6114 +0x6115 +0x6116 +0x6118 +0x611A +0x611B +0x611C +0x611D +0x611F +0x6123 +0x6127 +0x6128 +0x6129 +0x612B +0x612C +0x612E +0x612F +0x6132 +0x6134 +0x6136 +0x6137 +0x613B +0x613E +0x613F +0x6140 +0x6141 +0x6144 +0x6145 +0x6146 +0x6147 +0x6148 +0x6149 +0x614A +0x614B +0x614C +0x614D +0x614E +0x614F +0x6152 +0x6153 +0x6154 +0x6155 +0x6156 +0x6158 +0x615A +0x615B +0x615D +0x615E +0x615F +0x6161 +0x6162 +0x6163 +0x6165 +0x6166 +0x6167 +0x6168 +0x616A +0x616B +0x616C +0x616E +0x6170 +0x6171 +0x6172 +0x6173 +0x6174 +0x6175 +0x6176 +0x6177 +0x6179 +0x617A +0x617C +0x617E +0x6180 +0x6182 +0x6183 +0x6189 +0x618A +0x618B +0x618C +0x618D +0x618E +0x6190 +0x6191 +0x6192 +0x6193 +0x6194 +0x6196 +0x619A +0x619B +0x619D +0x619F +0x61A1 +0x61A2 +0x61A4 +0x61A7 +0x61A8 +0x61A9 +0x61AA +0x61AB +0x61AC +0x61AD +0x61AE +0x61AF +0x61B0 +0x61B1 +0x61B2 +0x61B3 +0x61B4 +0x61B5 +0x61B6 +0x61B8 +0x61BA +0x61BC +0x61BE +0x61BF +0x61C1 +0x61C2 +0x61C3 +0x61C5 +0x61C6 +0x61C7 +0x61C8 +0x61C9 +0x61CA +0x61CB +0x61CC +0x61CD +0x61D6 +0x61D8 +0x61DE +0x61DF +0x61E0 +0x61E3 +0x61E4 +0x61E5 +0x61E6 +0x61E7 +0x61E8 +0x61E9 +0x61EA +0x61EB +0x61ED +0x61EE +0x61F0 +0x61F1 +0x61F2 +0x61F5 +0x61F6 +0x61F7 +0x61F8 +0x61F9 +0x61FA +0x61FB +0x61FC +0x61FD +0x61FE +0x61FF +0x6200 +0x6201 +0x6203 +0x6204 +0x6207 +0x6208 +0x6209 +0x620A +0x620C +0x620D +0x620E +0x6210 +0x6211 +0x6212 +0x6214 +0x6215 +0x6216 +0x6219 +0x621A +0x621B +0x621F +0x6220 +0x6221 +0x6222 +0x6223 +0x6224 +0x6225 +0x6227 +0x6229 +0x622A +0x622B +0x622D +0x622E +0x6230 +0x6232 +0x6233 +0x6234 +0x6236 +0x623A +0x623D +0x623E +0x623F +0x6240 +0x6241 +0x6242 +0x6243 +0x6246 +0x6247 +0x6248 +0x6249 +0x624A +0x624B +0x624D +0x624E +0x6250 +0x6251 +0x6252 +0x6253 +0x6254 +0x6258 +0x6259 +0x625A +0x625B +0x625C +0x625E +0x6260 +0x6261 +0x6262 +0x6263 +0x6264 +0x6265 +0x6266 +0x626D +0x626E +0x626F +0x6270 +0x6271 +0x6272 +0x6273 +0x6274 +0x6276 +0x6277 +0x6279 +0x627A +0x627B +0x627C +0x627D +0x627E +0x627F +0x6280 +0x6281 +0x6283 +0x6284 +0x6286 +0x6287 +0x6288 +0x6289 +0x628A +0x628C +0x628E +0x628F +0x6291 +0x6292 +0x6293 +0x6294 +0x6295 +0x6296 +0x6297 +0x6298 +0x62A8 +0x62A9 +0x62AA +0x62AB +0x62AC +0x62AD +0x62AE +0x62AF +0x62B0 +0x62B1 +0x62B3 +0x62B4 +0x62B5 +0x62B6 +0x62B8 +0x62B9 +0x62BB +0x62BC +0x62BD +0x62BE +0x62BF +0x62C2 +0x62C4 +0x62C6 +0x62C7 +0x62C8 +0x62C9 +0x62CA +0x62CB +0x62CC +0x62CD +0x62CE +0x62CF +0x62D0 +0x62D1 +0x62D2 +0x62D3 +0x62D4 +0x62D6 +0x62D7 +0x62D8 +0x62D9 +0x62DA +0x62DB +0x62DC +0x62EB +0x62EC +0x62ED +0x62EE +0x62EF +0x62F0 +0x62F1 +0x62F2 +0x62F3 +0x62F4 +0x62F5 +0x62F6 +0x62F7 +0x62F8 +0x62F9 +0x62FA +0x62FB +0x62FC +0x62FD +0x62FE +0x62FF +0x6300 +0x6301 +0x6302 +0x6303 +0x6307 +0x6308 +0x6309 +0x630B +0x630C +0x630D +0x630E +0x630F +0x6310 +0x6311 +0x6313 +0x6314 +0x6315 +0x6316 +0x6328 +0x6329 +0x632A +0x632B +0x632C +0x632D +0x632F +0x6332 +0x6333 +0x6334 +0x6336 +0x6338 +0x6339 +0x633A +0x633B +0x633C +0x633D +0x633E +0x6340 +0x6341 +0x6342 +0x6343 +0x6344 +0x6345 +0x6346 +0x6347 +0x6348 +0x6349 +0x634A +0x634B +0x634C +0x634D +0x634E +0x634F +0x6350 +0x6351 +0x6354 +0x6355 +0x6356 +0x6357 +0x6358 +0x6359 +0x635A +0x6365 +0x6367 +0x6368 +0x6369 +0x636B +0x636D +0x636E +0x636F +0x6370 +0x6371 +0x6372 +0x6375 +0x6376 +0x6377 +0x6378 +0x637A +0x637B +0x637C +0x637D +0x6380 +0x6381 +0x6382 +0x6383 +0x6384 +0x6385 +0x6387 +0x6388 +0x6389 +0x638A +0x638C +0x638D +0x638E +0x638F +0x6390 +0x6391 +0x6392 +0x6394 +0x6396 +0x6397 +0x6398 +0x6399 +0x639B +0x639C +0x639D +0x639E +0x639F +0x63A0 +0x63A1 +0x63A2 +0x63A3 +0x63A4 +0x63A5 +0x63A7 +0x63A8 +0x63A9 +0x63AA +0x63AB +0x63AC +0x63AD +0x63AE +0x63AF +0x63B0 +0x63B1 +0x63BD +0x63BE +0x63C0 +0x63C2 +0x63C3 +0x63C4 +0x63C5 +0x63C6 +0x63C7 +0x63C8 +0x63C9 +0x63CA +0x63CB +0x63CC +0x63CD +0x63CE +0x63CF +0x63D0 +0x63D2 +0x63D3 +0x63D5 +0x63D6 +0x63D7 +0x63D8 +0x63D9 +0x63DA +0x63DB +0x63DC +0x63DD +0x63DF +0x63E0 +0x63E1 +0x63E3 +0x63E4 +0x63E5 +0x63E7 +0x63E8 +0x63E9 +0x63EA +0x63EB +0x63ED +0x63EE +0x63EF +0x63F0 +0x63F1 +0x63F2 +0x63F3 +0x63F4 +0x63F5 +0x63F6 +0x63F9 +0x6406 +0x6409 +0x640A +0x640B +0x640C +0x640D +0x640E +0x640F +0x6410 +0x6412 +0x6413 +0x6414 +0x6415 +0x6416 +0x6417 +0x6418 +0x641A +0x641B +0x641C +0x641E +0x641F +0x6420 +0x6421 +0x6422 +0x6423 +0x6424 +0x6425 +0x6426 +0x6427 +0x6428 +0x642A +0x642B +0x642C +0x642D +0x642E +0x642F +0x6430 +0x6433 +0x6434 +0x6435 +0x6436 +0x6437 +0x6439 +0x643D +0x643E +0x643F +0x6440 +0x6441 +0x6443 +0x644B +0x644D +0x644E +0x6450 +0x6451 +0x6452 +0x6453 +0x6454 +0x6458 +0x6459 +0x645B +0x645C +0x645D +0x645E +0x645F +0x6460 +0x6461 +0x6465 +0x6466 +0x6467 +0x6468 +0x6469 +0x646B +0x646C +0x646D +0x646E +0x646F +0x6470 +0x6472 +0x6473 +0x6474 +0x6475 +0x6476 +0x6477 +0x6478 +0x6479 +0x647A +0x647B +0x647D +0x647F +0x6482 +0x6485 +0x6487 +0x6488 +0x6489 +0x648A +0x648B +0x648C +0x648F +0x6490 +0x6492 +0x6493 +0x6495 +0x6496 +0x6497 +0x6498 +0x6499 +0x649A +0x649C +0x649D +0x649E +0x649F +0x64A0 +0x64A2 +0x64A3 +0x64A4 +0x64A5 +0x64A6 +0x64A9 +0x64AB +0x64AC +0x64AD +0x64AE +0x64B0 +0x64B1 +0x64B2 +0x64B3 +0x64BB +0x64BC +0x64BD +0x64BE +0x64BF +0x64C1 +0x64C2 +0x64C3 +0x64C4 +0x64C5 +0x64C7 +0x64C9 +0x64CA +0x64CB +0x64CD +0x64CE +0x64CF +0x64D0 +0x64D2 +0x64D4 +0x64D6 +0x64D7 +0x64D8 +0x64D9 +0x64DA +0x64DB +0x64E0 +0x64E2 +0x64E3 +0x64E4 +0x64E6 +0x64E8 +0x64E9 +0x64EB +0x64EC +0x64ED +0x64EF +0x64F0 +0x64F1 +0x64F2 +0x64F3 +0x64F4 +0x64F7 +0x64F8 +0x64FA +0x64FB +0x64FC +0x64FD +0x64FE +0x64FF +0x6500 +0x6501 +0x6503 +0x6504 +0x6506 +0x6507 +0x6509 +0x650C +0x650D +0x650E +0x650F +0x6510 +0x6513 +0x6514 +0x6515 +0x6516 +0x6517 +0x6518 +0x6519 +0x651B +0x651C +0x651D +0x6520 +0x6521 +0x6522 +0x6523 +0x6524 +0x6525 +0x6526 +0x6529 +0x652A +0x652B +0x652C +0x652D +0x652E +0x652F +0x6532 +0x6533 +0x6536 +0x6537 +0x6538 +0x6539 +0x653B +0x653D +0x653E +0x653F +0x6541 +0x6543 +0x6545 +0x6546 +0x6548 +0x6549 +0x654A +0x654F +0x6551 +0x6553 +0x6554 +0x6555 +0x6556 +0x6557 +0x6558 +0x6559 +0x655C +0x655D +0x655E +0x6562 +0x6563 +0x6564 +0x6565 +0x6566 +0x6567 +0x6568 +0x656A +0x656C +0x656F +0x6572 +0x6573 +0x6574 +0x6575 +0x6576 +0x6577 +0x6578 +0x6579 +0x657A +0x657B +0x657C +0x657F +0x6580 +0x6581 +0x6582 +0x6583 +0x6584 +0x6587 +0x658C +0x6590 +0x6591 +0x6592 +0x6594 +0x6595 +0x6596 +0x6597 +0x6599 +0x659B +0x659C +0x659D +0x659E +0x659F +0x65A0 +0x65A1 +0x65A2 +0x65A4 +0x65A5 +0x65A7 +0x65A8 +0x65AA +0x65AB +0x65AC +0x65AE +0x65AF +0x65B0 +0x65B2 +0x65B3 +0x65B6 +0x65B7 +0x65B8 +0x65B9 +0x65BB +0x65BC +0x65BD +0x65BF +0x65C1 +0x65C2 +0x65C3 +0x65C4 +0x65C5 +0x65C6 +0x65CB +0x65CC +0x65CD +0x65CE +0x65CF +0x65D0 +0x65D2 +0x65D3 +0x65D6 +0x65D7 +0x65DA +0x65DB +0x65DD +0x65DE +0x65DF +0x65E1 +0x65E2 +0x65E5 +0x65E6 +0x65E8 +0x65E9 +0x65EC +0x65ED +0x65EE +0x65EF +0x65F0 +0x65F1 +0x65F2 +0x65F3 +0x65F4 +0x65F5 +0x65FA +0x65FB +0x65FC +0x65FD +0x6600 +0x6602 +0x6603 +0x6604 +0x6605 +0x6606 +0x6607 +0x6608 +0x6609 +0x660A +0x660B +0x660C +0x660D +0x660E +0x660F +0x6610 +0x6611 +0x6612 +0x6613 +0x6614 +0x6615 +0x661C +0x661D +0x661F +0x6620 +0x6621 +0x6622 +0x6624 +0x6625 +0x6626 +0x6627 +0x6628 +0x662B +0x662D +0x662E +0x662F +0x6631 +0x6632 +0x6633 +0x6634 +0x6635 +0x6636 +0x6639 +0x663A +0x6641 +0x6642 +0x6643 +0x6645 +0x6647 +0x6649 +0x664A +0x664C +0x664F +0x6651 +0x6652 +0x6659 +0x665A +0x665B +0x665C +0x665D +0x665E +0x665F +0x6661 +0x6662 +0x6664 +0x6665 +0x6666 +0x6668 +0x666A +0x666C +0x666E +0x666F +0x6670 +0x6671 +0x6672 +0x6674 +0x6676 +0x6677 +0x6678 +0x6679 +0x667A +0x667B +0x667C +0x667E +0x6680 +0x6684 +0x6686 +0x6687 +0x6688 +0x6689 +0x668A +0x668B +0x668C +0x668D +0x6690 +0x6691 +0x6694 +0x6695 +0x6696 +0x6697 +0x6698 +0x6699 +0x669D +0x669F +0x66A0 +0x66A1 +0x66A2 +0x66A8 +0x66A9 +0x66AA +0x66AB +0x66AE +0x66AF +0x66B0 +0x66B1 +0x66B2 +0x66B4 +0x66B5 +0x66B7 +0x66B8 +0x66B9 +0x66BA +0x66BB +0x66BD +0x66BE +0x66C0 +0x66C4 +0x66C6 +0x66C7 +0x66C8 +0x66C9 +0x66CA +0x66CB +0x66CC +0x66CF +0x66D2 +0x66D6 +0x66D8 +0x66D9 +0x66DA +0x66DB +0x66DC +0x66DD +0x66DE +0x66E0 +0x66E3 +0x66E4 +0x66E6 +0x66E8 +0x66E9 +0x66EB +0x66EC +0x66ED +0x66EE +0x66F0 +0x66F2 +0x66F3 +0x66F4 +0x66F6 +0x66F7 +0x66F8 +0x66F9 +0x66FC +0x66FE +0x66FF +0x6700 +0x6701 +0x6703 +0x6704 +0x6705 +0x6708 +0x6709 +0x670A +0x670B +0x670D +0x670F +0x6710 +0x6712 +0x6713 +0x6714 +0x6715 +0x6717 +0x6718 +0x671B +0x671D +0x671F +0x6720 +0x6721 +0x6722 +0x6723 +0x6726 +0x6727 +0x6728 +0x672A +0x672B +0x672C +0x672D +0x672E +0x6731 +0x6733 +0x6734 +0x6735 +0x6738 +0x6739 +0x673A +0x673B +0x673C +0x673D +0x673E +0x673F +0x6745 +0x6746 +0x6747 +0x6748 +0x6749 +0x674B +0x674C +0x674D +0x674E +0x674F +0x6750 +0x6751 +0x6753 +0x6755 +0x6756 +0x6757 +0x6759 +0x675A +0x675C +0x675D +0x675E +0x675F +0x6760 +0x676A +0x676C +0x676D +0x676F +0x6770 +0x6771 +0x6772 +0x6773 +0x6774 +0x6775 +0x6776 +0x6777 +0x6778 +0x6779 +0x677A +0x677B +0x677C +0x677D +0x677E +0x677F +0x6781 +0x6783 +0x6784 +0x6785 +0x6786 +0x6787 +0x6789 +0x678B +0x678C +0x678D +0x678E +0x6790 +0x6791 +0x6792 +0x6793 +0x6794 +0x6795 +0x6797 +0x6798 +0x6799 +0x679A +0x679C +0x679D +0x679F +0x67AE +0x67AF +0x67B0 +0x67B2 +0x67B3 +0x67B4 +0x67B5 +0x67B6 +0x67B7 +0x67B8 +0x67B9 +0x67BA +0x67BB +0x67C0 +0x67C1 +0x67C2 +0x67C3 +0x67C4 +0x67C5 +0x67C6 +0x67C8 +0x67C9 +0x67CA +0x67CB +0x67CC +0x67CD +0x67CE +0x67CF +0x67D0 +0x67D1 +0x67D2 +0x67D3 +0x67D4 +0x67D8 +0x67D9 +0x67DA +0x67DB +0x67DC +0x67DD +0x67DE +0x67DF +0x67E2 +0x67E3 +0x67E4 +0x67E5 +0x67E6 +0x67E7 +0x67E9 +0x67EA +0x67EB +0x67EC +0x67ED +0x67EE +0x67EF +0x67F0 +0x67F1 +0x67F2 +0x67F3 +0x67F4 +0x67F5 +0x67F6 +0x67F7 +0x67F8 +0x67FA +0x67FC +0x67FF +0x6812 +0x6813 +0x6814 +0x6816 +0x6817 +0x6818 +0x681A +0x681C +0x681D +0x681F +0x6820 +0x6821 +0x6825 +0x6826 +0x6828 +0x6829 +0x682A +0x682B +0x682D +0x682E +0x682F +0x6831 +0x6832 +0x6833 +0x6834 +0x6835 +0x6838 +0x6839 +0x683A +0x683B +0x683C +0x683D +0x6840 +0x6841 +0x6842 +0x6843 +0x6844 +0x6845 +0x6846 +0x6848 +0x6849 +0x684B +0x684C +0x684D +0x684E +0x684F +0x6850 +0x6851 +0x6853 +0x6854 +0x686B +0x686D +0x686E +0x686F +0x6871 +0x6872 +0x6874 +0x6875 +0x6876 +0x6877 +0x6878 +0x6879 +0x687B +0x687C +0x687D +0x687E +0x687F +0x6880 +0x6881 +0x6882 +0x6883 +0x6885 +0x6886 +0x6887 +0x6889 +0x688A +0x688B +0x688C +0x688F +0x6890 +0x6891 +0x6892 +0x6893 +0x6894 +0x6896 +0x6897 +0x689B +0x689C +0x689D +0x689F +0x68A0 +0x68A1 +0x68A2 +0x68A3 +0x68A4 +0x68A7 +0x68A8 +0x68A9 +0x68AA +0x68AB +0x68AC +0x68AD +0x68AE +0x68AF +0x68B0 +0x68B1 +0x68B2 +0x68B3 +0x68B4 +0x68B5 +0x68C4 +0x68C6 +0x68C7 +0x68C8 +0x68C9 +0x68CB +0x68CC +0x68CD +0x68CE +0x68D0 +0x68D1 +0x68D2 +0x68D3 +0x68D4 +0x68D5 +0x68D6 +0x68D7 +0x68D8 +0x68DA +0x68DC +0x68DD +0x68DE +0x68DF +0x68E0 +0x68E1 +0x68E3 +0x68E4 +0x68E6 +0x68E7 +0x68E8 +0x68E9 +0x68EA +0x68EB +0x68EC +0x68EE +0x68EF +0x68F0 +0x68F1 +0x68F2 +0x68F3 +0x68F4 +0x68F5 +0x68F6 +0x68F7 +0x68F8 +0x68F9 +0x68FA +0x68FB +0x68FC +0x68FD +0x6904 +0x6905 +0x6906 +0x6907 +0x6908 +0x690A +0x690B +0x690C +0x690D +0x690E +0x690F +0x6910 +0x6911 +0x6912 +0x6913 +0x6914 +0x6915 +0x6917 +0x6925 +0x692A +0x692F +0x6930 +0x6932 +0x6933 +0x6934 +0x6935 +0x6937 +0x6938 +0x6939 +0x693B +0x693C +0x693D +0x693F +0x6940 +0x6941 +0x6942 +0x6944 +0x6945 +0x6948 +0x6949 +0x694A +0x694B +0x694C +0x694E +0x694F +0x6951 +0x6952 +0x6953 +0x6954 +0x6956 +0x6957 +0x6958 +0x6959 +0x695A +0x695B +0x695C +0x695D +0x695E +0x695F +0x6960 +0x6962 +0x6963 +0x6965 +0x6966 +0x6968 +0x6969 +0x696A +0x696B +0x696C +0x696D +0x696E +0x696F +0x6970 +0x6971 +0x6974 +0x6975 +0x6976 +0x6977 +0x6978 +0x6979 +0x697A +0x697B +0x6982 +0x6983 +0x6986 +0x698D +0x698E +0x6990 +0x6991 +0x6993 +0x6994 +0x6995 +0x6996 +0x6997 +0x6999 +0x699A +0x699B +0x699C +0x699E +0x69A0 +0x69A1 +0x69A3 +0x69A4 +0x69A5 +0x69A6 +0x69A7 +0x69A8 +0x69A9 +0x69AA +0x69AB +0x69AC +0x69AD +0x69AE +0x69AF +0x69B0 +0x69B1 +0x69B3 +0x69B4 +0x69B5 +0x69B6 +0x69B7 +0x69B9 +0x69BB +0x69BC +0x69BD +0x69BE +0x69BF +0x69C1 +0x69C2 +0x69C3 +0x69C4 +0x69C6 +0x69C9 +0x69CA +0x69CB +0x69CC +0x69CD +0x69CE +0x69CF +0x69D0 +0x69D3 +0x69D4 +0x69D9 +0x69E2 +0x69E4 +0x69E5 +0x69E6 +0x69E7 +0x69E8 +0x69EB +0x69EC +0x69ED +0x69EE +0x69F1 +0x69F2 +0x69F3 +0x69F4 +0x69F6 +0x69F7 +0x69F8 +0x69FB +0x69FC +0x69FD +0x69FE +0x69FF +0x6A00 +0x6A01 +0x6A02 +0x6A04 +0x6A05 +0x6A06 +0x6A07 +0x6A08 +0x6A09 +0x6A0A +0x6A0D +0x6A0F +0x6A11 +0x6A13 +0x6A14 +0x6A15 +0x6A16 +0x6A17 +0x6A18 +0x6A19 +0x6A1B +0x6A1D +0x6A1E +0x6A1F +0x6A20 +0x6A21 +0x6A23 +0x6A25 +0x6A26 +0x6A27 +0x6A28 +0x6A32 +0x6A34 +0x6A35 +0x6A38 +0x6A39 +0x6A3A +0x6A3B +0x6A3C +0x6A3D +0x6A3E +0x6A3F +0x6A40 +0x6A41 +0x6A44 +0x6A46 +0x6A47 +0x6A48 +0x6A49 +0x6A4B +0x6A4D +0x6A4E +0x6A4F +0x6A50 +0x6A51 +0x6A54 +0x6A55 +0x6A56 +0x6A58 +0x6A59 +0x6A5A +0x6A5B +0x6A5D +0x6A5E +0x6A5F +0x6A60 +0x6A61 +0x6A62 +0x6A64 +0x6A66 +0x6A67 +0x6A68 +0x6A69 +0x6A6A +0x6A6B +0x6A6D +0x6A6F +0x6A76 +0x6A7E +0x6A7F +0x6A80 +0x6A81 +0x6A83 +0x6A84 +0x6A85 +0x6A87 +0x6A89 +0x6A8C +0x6A8D +0x6A8E +0x6A90 +0x6A91 +0x6A92 +0x6A93 +0x6A94 +0x6A95 +0x6A96 +0x6A97 +0x6A9A +0x6A9B +0x6A9C +0x6A9E +0x6A9F +0x6AA0 +0x6AA1 +0x6AA2 +0x6AA3 +0x6AA4 +0x6AA5 +0x6AA6 +0x6AA8 +0x6AAC +0x6AAD +0x6AAE +0x6AAF +0x6AB3 +0x6AB4 +0x6AB6 +0x6AB7 +0x6AB8 +0x6AB9 +0x6ABA +0x6ABB +0x6ABD +0x6AC2 +0x6AC3 +0x6AC5 +0x6AC6 +0x6AC7 +0x6ACB +0x6ACC +0x6ACD +0x6ACF +0x6AD0 +0x6AD1 +0x6AD3 +0x6AD9 +0x6ADA +0x6ADB +0x6ADC +0x6ADD +0x6ADE +0x6ADF +0x6AE0 +0x6AE1 +0x6AE5 +0x6AE7 +0x6AE8 +0x6AEA +0x6AEB +0x6AEC +0x6AEE +0x6AEF +0x6AF0 +0x6AF1 +0x6AF3 +0x6AF8 +0x6AF9 +0x6AFA +0x6AFB +0x6AFC +0x6B00 +0x6B02 +0x6B03 +0x6B04 +0x6B08 +0x6B09 +0x6B0A +0x6B0B +0x6B0F +0x6B10 +0x6B11 +0x6B12 +0x6B13 +0x6B16 +0x6B17 +0x6B18 +0x6B19 +0x6B1A +0x6B1E +0x6B20 +0x6B21 +0x6B23 +0x6B25 +0x6B28 +0x6B2C +0x6B2D +0x6B2F +0x6B31 +0x6B32 +0x6B33 +0x6B34 +0x6B36 +0x6B37 +0x6B38 +0x6B39 +0x6B3A +0x6B3B +0x6B3C +0x6B3D +0x6B3E +0x6B3F +0x6B41 +0x6B42 +0x6B43 +0x6B45 +0x6B46 +0x6B47 +0x6B48 +0x6B49 +0x6B4A +0x6B4B +0x6B4C +0x6B4D +0x6B4E +0x6B50 +0x6B51 +0x6B54 +0x6B55 +0x6B56 +0x6B59 +0x6B5B +0x6B5C +0x6B5E +0x6B5F +0x6B60 +0x6B61 +0x6B62 +0x6B63 +0x6B64 +0x6B65 +0x6B66 +0x6B67 +0x6B6A +0x6B6D +0x6B72 +0x6B76 +0x6B77 +0x6B78 +0x6B79 +0x6B7B +0x6B7E +0x6B7F +0x6B80 +0x6B82 +0x6B83 +0x6B84 +0x6B86 +0x6B88 +0x6B89 +0x6B8A +0x6B8C +0x6B8D +0x6B8E +0x6B8F +0x6B91 +0x6B94 +0x6B95 +0x6B96 +0x6B97 +0x6B98 +0x6B99 +0x6B9B +0x6B9E +0x6B9F +0x6BA0 +0x6BA2 +0x6BA3 +0x6BA4 +0x6BA5 +0x6BA6 +0x6BA7 +0x6BAA +0x6BAB +0x6BAD +0x6BAE +0x6BAF +0x6BB0 +0x6BB2 +0x6BB3 +0x6BB5 +0x6BB6 +0x6BB7 +0x6BBA +0x6BBC +0x6BBD +0x6BBF +0x6BC0 +0x6BC3 +0x6BC4 +0x6BC5 +0x6BC6 +0x6BC7 +0x6BC8 +0x6BC9 +0x6BCA +0x6BCB +0x6BCC +0x6BCD +0x6BCF +0x6BD0 +0x6BD2 +0x6BD3 +0x6BD4 +0x6BD6 +0x6BD7 +0x6BD8 +0x6BDA +0x6BDB +0x6BDE +0x6BE0 +0x6BE2 +0x6BE3 +0x6BE4 +0x6BE6 +0x6BE7 +0x6BE8 +0x6BEB +0x6BEC +0x6BEF +0x6BF0 +0x6BF2 +0x6BF3 +0x6BF7 +0x6BF8 +0x6BF9 +0x6BFB +0x6BFC +0x6BFD +0x6BFE +0x6BFF +0x6C00 +0x6C01 +0x6C02 +0x6C03 +0x6C04 +0x6C05 +0x6C06 +0x6C08 +0x6C09 +0x6C0B +0x6C0C +0x6C0D +0x6C0F +0x6C10 +0x6C11 +0x6C13 +0x6C14 +0x6C15 +0x6C16 +0x6C18 +0x6C19 +0x6C1A +0x6C1B +0x6C1D +0x6C1F +0x6C20 +0x6C21 +0x6C23 +0x6C24 +0x6C25 +0x6C26 +0x6C27 +0x6C28 +0x6C2A +0x6C2B +0x6C2C +0x6C2E +0x6C2F +0x6C30 +0x6C33 +0x6C34 +0x6C36 +0x6C38 +0x6C3B +0x6C3E +0x6C3F +0x6C40 +0x6C41 +0x6C42 +0x6C43 +0x6C46 +0x6C4A +0x6C4B +0x6C4C +0x6C4D +0x6C4E +0x6C4F +0x6C50 +0x6C52 +0x6C54 +0x6C55 +0x6C57 +0x6C59 +0x6C5B +0x6C5C +0x6C5D +0x6C5E +0x6C5F +0x6C60 +0x6C61 +0x6C65 +0x6C66 +0x6C67 +0x6C68 +0x6C69 +0x6C6A +0x6C6B +0x6C6D +0x6C6F +0x6C70 +0x6C71 +0x6C72 +0x6C73 +0x6C74 +0x6C76 +0x6C78 +0x6C7A +0x6C7B +0x6C7D +0x6C7E +0x6C80 +0x6C81 +0x6C82 +0x6C83 +0x6C84 +0x6C85 +0x6C86 +0x6C87 +0x6C88 +0x6C89 +0x6C8A +0x6C8B +0x6C8C +0x6C8D +0x6C8E +0x6C8F +0x6C90 +0x6C92 +0x6C93 +0x6C94 +0x6C95 +0x6C96 +0x6C98 +0x6C99 +0x6C9A +0x6C9B +0x6C9C +0x6C9D +0x6CAB +0x6CAC +0x6CAD +0x6CAE +0x6CB0 +0x6CB1 +0x6CB3 +0x6CB4 +0x6CB6 +0x6CB7 +0x6CB8 +0x6CB9 +0x6CBA +0x6CBB +0x6CBC +0x6CBD +0x6CBE +0x6CBF +0x6CC0 +0x6CC1 +0x6CC2 +0x6CC3 +0x6CC4 +0x6CC5 +0x6CC6 +0x6CC7 +0x6CC9 +0x6CCA +0x6CCC +0x6CCD +0x6CCF +0x6CD0 +0x6CD1 +0x6CD2 +0x6CD3 +0x6CD4 +0x6CD5 +0x6CD6 +0x6CD7 +0x6CD9 +0x6CDA +0x6CDB +0x6CDC +0x6CDD +0x6CDE +0x6CE0 +0x6CE1 +0x6CE2 +0x6CE3 +0x6CE5 +0x6CE7 +0x6CE8 +0x6CE9 +0x6CEB +0x6CEC +0x6CED +0x6CEE +0x6CEF +0x6CF0 +0x6CF1 +0x6CF2 +0x6CF3 +0x6CF5 +0x6CF9 +0x6D00 +0x6D01 +0x6D03 +0x6D04 +0x6D07 +0x6D08 +0x6D09 +0x6D0A +0x6D0B +0x6D0C +0x6D0D +0x6D0E +0x6D0F +0x6D10 +0x6D11 +0x6D12 +0x6D16 +0x6D17 +0x6D18 +0x6D19 +0x6D1A +0x6D1B +0x6D1D +0x6D1E +0x6D1F +0x6D20 +0x6D22 +0x6D25 +0x6D27 +0x6D28 +0x6D29 +0x6D2A +0x6D2B +0x6D2C +0x6D2D +0x6D2E +0x6D2F +0x6D30 +0x6D31 +0x6D32 +0x6D33 +0x6D34 +0x6D35 +0x6D36 +0x6D37 +0x6D38 +0x6D39 +0x6D3A +0x6D3B +0x6D3C +0x6D3D +0x6D3E +0x6D3F +0x6D40 +0x6D41 +0x6D42 +0x6D58 +0x6D59 +0x6D5A +0x6D5E +0x6D5F +0x6D60 +0x6D61 +0x6D62 +0x6D63 +0x6D64 +0x6D65 +0x6D66 +0x6D67 +0x6D68 +0x6D69 +0x6D6A +0x6D6C +0x6D6D +0x6D6E +0x6D6F +0x6D70 +0x6D74 +0x6D75 +0x6D76 +0x6D77 +0x6D78 +0x6D79 +0x6D7A +0x6D7B +0x6D7C +0x6D7D +0x6D7E +0x6D7F +0x6D80 +0x6D82 +0x6D83 +0x6D84 +0x6D85 +0x6D86 +0x6D87 +0x6D88 +0x6D89 +0x6D8A +0x6D8B +0x6D8C +0x6D8D +0x6D8E +0x6D90 +0x6D91 +0x6D92 +0x6D93 +0x6D94 +0x6D95 +0x6D97 +0x6D98 +0x6DAA +0x6DAB +0x6DAC +0x6DAE +0x6DAF +0x6DB2 +0x6DB3 +0x6DB4 +0x6DB5 +0x6DB7 +0x6DB8 +0x6DBA +0x6DBB +0x6DBC +0x6DBD +0x6DBE +0x6DBF +0x6DC0 +0x6DC2 +0x6DC4 +0x6DC5 +0x6DC6 +0x6DC7 +0x6DC8 +0x6DC9 +0x6DCA +0x6DCB +0x6DCC +0x6DCD +0x6DCF +0x6DD0 +0x6DD1 +0x6DD2 +0x6DD3 +0x6DD4 +0x6DD5 +0x6DD6 +0x6DD7 +0x6DD8 +0x6DD9 +0x6DDA +0x6DDB +0x6DDC +0x6DDD +0x6DDE +0x6DDF +0x6DE0 +0x6DE1 +0x6DE2 +0x6DE3 +0x6DE4 +0x6DE5 +0x6DE6 +0x6DE8 +0x6DE9 +0x6DEA +0x6DEB +0x6DEC +0x6DED +0x6DEE +0x6DEF +0x6DF0 +0x6DF1 +0x6DF2 +0x6DF3 +0x6DF4 +0x6DF5 +0x6DF6 +0x6DF7 +0x6DF9 +0x6DFA +0x6DFB +0x6DFC +0x6DFD +0x6E00 +0x6E03 +0x6E05 +0x6E19 +0x6E1A +0x6E1B +0x6E1C +0x6E1D +0x6E1F +0x6E20 +0x6E21 +0x6E22 +0x6E23 +0x6E24 +0x6E25 +0x6E26 +0x6E27 +0x6E28 +0x6E2B +0x6E2C +0x6E2D +0x6E2E +0x6E2F +0x6E30 +0x6E31 +0x6E32 +0x6E33 +0x6E34 +0x6E35 +0x6E36 +0x6E38 +0x6E39 +0x6E3A +0x6E3B +0x6E3C +0x6E3D +0x6E3E +0x6E3F +0x6E40 +0x6E41 +0x6E43 +0x6E44 +0x6E45 +0x6E46 +0x6E47 +0x6E49 +0x6E4A +0x6E4B +0x6E4D +0x6E4E +0x6E51 +0x6E52 +0x6E53 +0x6E54 +0x6E55 +0x6E56 +0x6E58 +0x6E5A +0x6E5B +0x6E5C +0x6E5D +0x6E5E +0x6E5F +0x6E60 +0x6E61 +0x6E62 +0x6E63 +0x6E64 +0x6E65 +0x6E66 +0x6E67 +0x6E68 +0x6E69 +0x6E6B +0x6E6E +0x6E6F +0x6E71 +0x6E72 +0x6E73 +0x6E74 +0x6E77 +0x6E78 +0x6E79 +0x6E88 +0x6E89 +0x6E8D +0x6E8E +0x6E8F +0x6E90 +0x6E92 +0x6E93 +0x6E94 +0x6E96 +0x6E97 +0x6E98 +0x6E99 +0x6E9B +0x6E9C +0x6E9D +0x6E9E +0x6E9F +0x6EA0 +0x6EA1 +0x6EA2 +0x6EA3 +0x6EA4 +0x6EA5 +0x6EA6 +0x6EA7 +0x6EAA +0x6EAB +0x6EAE +0x6EAF +0x6EB0 +0x6EB1 +0x6EB2 +0x6EB3 +0x6EB4 +0x6EB6 +0x6EB7 +0x6EB9 +0x6EBA +0x6EBC +0x6EBD +0x6EBE +0x6EBF +0x6EC0 +0x6EC1 +0x6EC2 +0x6EC3 +0x6EC4 +0x6EC5 +0x6EC6 +0x6EC7 +0x6EC8 +0x6EC9 +0x6ECA +0x6ECB +0x6ECC +0x6ECD +0x6ECE +0x6ECF +0x6ED0 +0x6ED1 +0x6ED2 +0x6ED3 +0x6ED4 +0x6ED5 +0x6ED6 +0x6ED8 +0x6EDC +0x6EEB +0x6EEC +0x6EED +0x6EEE +0x6EEF +0x6EF1 +0x6EF2 +0x6EF4 +0x6EF5 +0x6EF6 +0x6EF7 +0x6EF8 +0x6EF9 +0x6EFB +0x6EFC +0x6EFD +0x6EFE +0x6EFF +0x6F00 +0x6F01 +0x6F02 +0x6F03 +0x6F05 +0x6F06 +0x6F07 +0x6F08 +0x6F09 +0x6F0A +0x6F0D +0x6F0E +0x6F0F +0x6F12 +0x6F13 +0x6F14 +0x6F15 +0x6F18 +0x6F19 +0x6F1A +0x6F1C +0x6F1E +0x6F1F +0x6F20 +0x6F21 +0x6F22 +0x6F23 +0x6F25 +0x6F26 +0x6F27 +0x6F29 +0x6F2A +0x6F2B +0x6F2C +0x6F2D +0x6F2E +0x6F2F +0x6F30 +0x6F31 +0x6F32 +0x6F33 +0x6F35 +0x6F36 +0x6F37 +0x6F38 +0x6F39 +0x6F3A +0x6F3B +0x6F3C +0x6F3E +0x6F3F +0x6F40 +0x6F41 +0x6F43 +0x6F4E +0x6F4F +0x6F50 +0x6F51 +0x6F52 +0x6F53 +0x6F54 +0x6F55 +0x6F57 +0x6F58 +0x6F5A +0x6F5B +0x6F5D +0x6F5E +0x6F5F +0x6F60 +0x6F61 +0x6F62 +0x6F63 +0x6F64 +0x6F66 +0x6F67 +0x6F69 +0x6F6A +0x6F6B +0x6F6C +0x6F6D +0x6F6E +0x6F6F +0x6F70 +0x6F72 +0x6F73 +0x6F76 +0x6F77 +0x6F78 +0x6F7A +0x6F7B +0x6F7C +0x6F7D +0x6F7E +0x6F7F +0x6F80 +0x6F82 +0x6F84 +0x6F85 +0x6F86 +0x6F87 +0x6F88 +0x6F89 +0x6F8B +0x6F8C +0x6F8D +0x6F8E +0x6F90 +0x6F92 +0x6F93 +0x6F94 +0x6F95 +0x6F96 +0x6F97 +0x6F9E +0x6FA0 +0x6FA1 +0x6FA2 +0x6FA3 +0x6FA4 +0x6FA5 +0x6FA6 +0x6FA7 +0x6FA8 +0x6FA9 +0x6FAA +0x6FAB +0x6FAC +0x6FAD +0x6FAE +0x6FAF +0x6FB0 +0x6FB1 +0x6FB2 +0x6FB3 +0x6FB4 +0x6FB6 +0x6FB8 +0x6FB9 +0x6FBA +0x6FBC +0x6FBD +0x6FBF +0x6FC0 +0x6FC1 +0x6FC2 +0x6FC3 +0x6FC4 +0x6FC6 +0x6FC7 +0x6FC8 +0x6FC9 +0x6FCA +0x6FCB +0x6FCC +0x6FCD +0x6FCE +0x6FCF +0x6FD4 +0x6FD5 +0x6FD8 +0x6FDB +0x6FDC +0x6FDD +0x6FDE +0x6FDF +0x6FE0 +0x6FE1 +0x6FE2 +0x6FE3 +0x6FE4 +0x6FE6 +0x6FE7 +0x6FE8 +0x6FE9 +0x6FEB +0x6FEC +0x6FED +0x6FEE +0x6FEF +0x6FF0 +0x6FF1 +0x6FF2 +0x6FF4 +0x6FF7 +0x6FFA +0x6FFB +0x6FFC +0x6FFE +0x6FFF +0x7000 +0x7001 +0x7004 +0x7005 +0x7006 +0x7007 +0x7009 +0x700A +0x700B +0x700C +0x700D +0x700E +0x700F +0x7011 +0x7014 +0x7015 +0x7016 +0x7017 +0x7018 +0x7019 +0x701A +0x701B +0x701C +0x701D +0x701F +0x7020 +0x7021 +0x7022 +0x7023 +0x7024 +0x7026 +0x7027 +0x7028 +0x7029 +0x702A +0x702B +0x702F +0x7030 +0x7031 +0x7032 +0x7033 +0x7034 +0x7035 +0x7037 +0x7038 +0x7039 +0x703A +0x703B +0x703C +0x703E +0x703F +0x7040 +0x7041 +0x7042 +0x7043 +0x7044 +0x7045 +0x7046 +0x7048 +0x7049 +0x704A +0x704C +0x7051 +0x7052 +0x7055 +0x7056 +0x7057 +0x7058 +0x705A +0x705B +0x705D +0x705E +0x705F +0x7060 +0x7061 +0x7062 +0x7063 +0x7064 +0x7065 +0x7066 +0x7068 +0x7069 +0x706A +0x706B +0x7070 +0x7071 +0x7074 +0x7076 +0x7078 +0x707A +0x707C +0x707D +0x7082 +0x7083 +0x7084 +0x7085 +0x7086 +0x708A +0x708E +0x7091 +0x7092 +0x7093 +0x7094 +0x7095 +0x7096 +0x7098 +0x7099 +0x709A +0x709F +0x70A1 +0x70A4 +0x70A9 +0x70AB +0x70AC +0x70AD +0x70AE +0x70AF +0x70B0 +0x70B1 +0x70B3 +0x70B4 +0x70B5 +0x70B7 +0x70B8 +0x70BA +0x70BE +0x70C5 +0x70C6 +0x70C7 +0x70C8 +0x70CA +0x70CB +0x70CD +0x70CE +0x70CF +0x70D1 +0x70D2 +0x70D3 +0x70D4 +0x70D7 +0x70D8 +0x70D9 +0x70DA +0x70DC +0x70DD +0x70DE +0x70E0 +0x70E1 +0x70E2 +0x70E4 +0x70EF +0x70F0 +0x70F3 +0x70F4 +0x70F6 +0x70F7 +0x70F8 +0x70F9 +0x70FA +0x70FB +0x70FC +0x70FD +0x70FF +0x7100 +0x7102 +0x7104 +0x7106 +0x7109 +0x710A +0x710B +0x710C +0x710D +0x710E +0x7110 +0x7113 +0x7117 +0x7119 +0x711A +0x711B +0x711C +0x711E +0x711F +0x7120 +0x7121 +0x7122 +0x7123 +0x7125 +0x7126 +0x7128 +0x712E +0x712F +0x7130 +0x7131 +0x7132 +0x7136 +0x713A +0x7141 +0x7142 +0x7143 +0x7144 +0x7146 +0x7147 +0x7149 +0x714B +0x714C +0x714D +0x714E +0x7150 +0x7152 +0x7153 +0x7154 +0x7156 +0x7158 +0x7159 +0x715A +0x715C +0x715D +0x715E +0x715F +0x7160 +0x7161 +0x7162 +0x7163 +0x7164 +0x7165 +0x7166 +0x7167 +0x7168 +0x7169 +0x716A +0x716C +0x716E +0x7170 +0x7172 +0x7178 +0x717B +0x717D +0x7180 +0x7181 +0x7182 +0x7184 +0x7185 +0x7186 +0x7187 +0x7189 +0x718A +0x718F +0x7190 +0x7192 +0x7194 +0x7197 +0x7199 +0x719A +0x719B +0x719C +0x719D +0x719E +0x719F +0x71A0 +0x71A1 +0x71A4 +0x71A5 +0x71A7 +0x71A8 +0x71A9 +0x71AA +0x71AC +0x71AF +0x71B0 +0x71B1 +0x71B2 +0x71B3 +0x71B5 +0x71B8 +0x71B9 +0x71BC +0x71BD +0x71BE +0x71BF +0x71C0 +0x71C1 +0x71C2 +0x71C3 +0x71C4 +0x71C5 +0x71C6 +0x71C7 +0x71C8 +0x71C9 +0x71CA +0x71CB +0x71CE +0x71CF +0x71D0 +0x71D2 +0x71D4 +0x71D5 +0x71D6 +0x71D8 +0x71D9 +0x71DA +0x71DB +0x71DC +0x71DF +0x71E0 +0x71E1 +0x71E2 +0x71E4 +0x71E5 +0x71E6 +0x71E7 +0x71E8 +0x71EC +0x71ED +0x71EE +0x71F0 +0x71F1 +0x71F2 +0x71F4 +0x71F8 +0x71F9 +0x71FB +0x71FC +0x71FD +0x71FE +0x71FF +0x7201 +0x7202 +0x7203 +0x7205 +0x7206 +0x7207 +0x720A +0x720C +0x720D +0x7210 +0x7213 +0x7214 +0x7219 +0x721A +0x721B +0x721D +0x721E +0x721F +0x7222 +0x7223 +0x7226 +0x7227 +0x7228 +0x7229 +0x722A +0x722C +0x722D +0x7230 +0x7235 +0x7236 +0x7238 +0x7239 +0x723A +0x723B +0x723D +0x723E +0x723F +0x7241 +0x7242 +0x7244 +0x7246 +0x7247 +0x7248 +0x7249 +0x724A +0x724B +0x724C +0x724F +0x7252 +0x7253 +0x7256 +0x7258 +0x7259 +0x725A +0x725B +0x725D +0x725E +0x725F +0x7260 +0x7261 +0x7262 +0x7263 +0x7267 +0x7269 +0x726A +0x726C +0x726E +0x726F +0x7270 +0x7272 +0x7273 +0x7274 +0x7276 +0x7277 +0x7278 +0x7279 +0x727B +0x727C +0x727D +0x727E +0x727F +0x7280 +0x7281 +0x7284 +0x7285 +0x7286 +0x7288 +0x7289 +0x728B +0x728C +0x728D +0x728E +0x7290 +0x7291 +0x7292 +0x7293 +0x7295 +0x7296 +0x7297 +0x7298 +0x729A +0x729B +0x729D +0x729E +0x72A1 +0x72A2 +0x72A3 +0x72A4 +0x72A5 +0x72A6 +0x72A7 +0x72A8 +0x72A9 +0x72AA +0x72AC +0x72AE +0x72AF +0x72B0 +0x72B4 +0x72B5 +0x72BA +0x72BD +0x72BF +0x72C0 +0x72C1 +0x72C2 +0x72C3 +0x72C4 +0x72C5 +0x72C6 +0x72C9 +0x72CA +0x72CB +0x72CC +0x72CE +0x72D0 +0x72D1 +0x72D2 +0x72D4 +0x72D6 +0x72D7 +0x72D8 +0x72D9 +0x72DA +0x72DC +0x72DF +0x72E0 +0x72E1 +0x72E3 +0x72E4 +0x72E6 +0x72E8 +0x72E9 +0x72EA +0x72EB +0x72F3 +0x72F4 +0x72F6 +0x72F7 +0x72F8 +0x72F9 +0x72FA +0x72FB +0x72FC +0x72FD +0x72FE +0x72FF +0x7300 +0x7301 +0x7307 +0x7308 +0x730A +0x730B +0x730C +0x730F +0x7311 +0x7312 +0x7313 +0x7316 +0x7317 +0x7318 +0x7319 +0x731B +0x731C +0x731D +0x731E +0x7322 +0x7323 +0x7325 +0x7326 +0x7327 +0x7329 +0x732D +0x7330 +0x7331 +0x7332 +0x7333 +0x7334 +0x7335 +0x7336 +0x7337 +0x733A +0x733B +0x733C +0x733E +0x733F +0x7340 +0x7342 +0x7343 +0x7344 +0x7345 +0x7349 +0x734A +0x734C +0x734D +0x734E +0x7350 +0x7351 +0x7352 +0x7357 +0x7358 +0x7359 +0x735A +0x735B +0x735D +0x735E +0x735F +0x7360 +0x7361 +0x7362 +0x7365 +0x7366 +0x7367 +0x7368 +0x7369 +0x736A +0x736B +0x736C +0x736E +0x736F +0x7370 +0x7372 +0x7373 +0x7375 +0x7376 +0x7377 +0x7378 +0x737A +0x737B +0x737C +0x737D +0x737E +0x737F +0x7380 +0x7381 +0x7382 +0x7383 +0x7384 +0x7385 +0x7386 +0x7387 +0x7388 +0x7389 +0x738A +0x738B +0x738E +0x7392 +0x7393 +0x7394 +0x7395 +0x7396 +0x7397 +0x739D +0x739F +0x73A0 +0x73A1 +0x73A2 +0x73A4 +0x73A5 +0x73A6 +0x73A8 +0x73A9 +0x73AB +0x73AC +0x73AD +0x73B2 +0x73B3 +0x73B4 +0x73B5 +0x73B6 +0x73B7 +0x73B8 +0x73B9 +0x73BB +0x73BC +0x73BE +0x73BF +0x73C0 +0x73C2 +0x73C3 +0x73C5 +0x73C6 +0x73C7 +0x73C8 +0x73CA +0x73CB +0x73CC +0x73CD +0x73D2 +0x73D3 +0x73D4 +0x73D6 +0x73D7 +0x73D8 +0x73D9 +0x73DA +0x73DB +0x73DC +0x73DD +0x73DE +0x73E0 +0x73E3 +0x73E5 +0x73E7 +0x73E8 +0x73E9 +0x73EA +0x73EB +0x73ED +0x73EE +0x73F4 +0x73F5 +0x73F6 +0x73F8 +0x73FA +0x73FC +0x73FD +0x73FE +0x73FF +0x7400 +0x7401 +0x7403 +0x7404 +0x7405 +0x7406 +0x7407 +0x7408 +0x7409 +0x740A +0x740B +0x740C +0x740D +0x7416 +0x741A +0x741B +0x741D +0x7420 +0x7421 +0x7422 +0x7423 +0x7424 +0x7425 +0x7426 +0x7428 +0x7429 +0x742A +0x742B +0x742C +0x742D +0x742E +0x742F +0x7430 +0x7431 +0x7432 +0x7433 +0x7434 +0x7435 +0x7436 +0x743A +0x743F +0x7440 +0x7441 +0x7442 +0x7444 +0x7446 +0x744A +0x744B +0x744D +0x744E +0x744F +0x7450 +0x7451 +0x7452 +0x7454 +0x7455 +0x7457 +0x7459 +0x745A +0x745B +0x745C +0x745E +0x745F +0x7462 +0x7463 +0x7464 +0x7467 +0x7469 +0x746A +0x746D +0x746E +0x746F +0x7470 +0x7471 +0x7472 +0x7473 +0x7475 +0x7479 +0x747C +0x747D +0x747E +0x747F +0x7480 +0x7481 +0x7483 +0x7485 +0x7486 +0x7487 +0x7488 +0x7489 +0x748A +0x748B +0x7490 +0x7492 +0x7494 +0x7495 +0x7497 +0x7498 +0x749A +0x749C +0x749E +0x749F +0x74A0 +0x74A1 +0x74A3 +0x74A5 +0x74A6 +0x74A7 +0x74A8 +0x74A9 +0x74AA +0x74AB +0x74AD +0x74AF +0x74B0 +0x74B1 +0x74B2 +0x74B5 +0x74B6 +0x74B7 +0x74B8 +0x74BA +0x74BB +0x74BD +0x74BE +0x74BF +0x74C0 +0x74C1 +0x74C2 +0x74C3 +0x74C5 +0x74CA +0x74CB +0x74CF +0x74D4 +0x74D5 +0x74D6 +0x74D7 +0x74D8 +0x74D9 +0x74DA +0x74DB +0x74DC +0x74DD +0x74DE +0x74DF +0x74E0 +0x74E1 +0x74E2 +0x74E3 +0x74E4 +0x74E5 +0x74E6 +0x74E8 +0x74E9 +0x74EC +0x74EE +0x74F4 +0x74F5 +0x74F6 +0x74F7 +0x74FB +0x74FD +0x74FE +0x74FF +0x7500 +0x7502 +0x7503 +0x7504 +0x7507 +0x7508 +0x750B +0x750C +0x750D +0x750F +0x7510 +0x7511 +0x7512 +0x7513 +0x7514 +0x7515 +0x7516 +0x7517 +0x7518 +0x751A +0x751C +0x751D +0x751F +0x7521 +0x7522 +0x7525 +0x7526 +0x7528 +0x7529 +0x752A +0x752B +0x752C +0x752D +0x752E +0x752F +0x7530 +0x7531 +0x7532 +0x7533 +0x7537 +0x7538 +0x7539 +0x753A +0x753D +0x753E +0x753F +0x7540 +0x7547 +0x7548 +0x754B +0x754C +0x754E +0x754F +0x7554 +0x7559 +0x755A +0x755B +0x755C +0x755D +0x755F +0x7562 +0x7563 +0x7564 +0x7565 +0x7566 +0x756A +0x756B +0x756C +0x756F +0x7570 +0x7576 +0x7577 +0x7578 +0x7579 +0x757D +0x757E +0x757F +0x7580 +0x7584 +0x7586 +0x7587 +0x758A +0x758B +0x758C +0x758F +0x7590 +0x7591 +0x7594 +0x7595 +0x7598 +0x7599 +0x759A +0x759D +0x75A2 +0x75A3 +0x75A4 +0x75A5 +0x75A7 +0x75AA +0x75AB +0x75B0 +0x75B2 +0x75B3 +0x75B5 +0x75B6 +0x75B8 +0x75B9 +0x75BA +0x75BB +0x75BC +0x75BD +0x75BE +0x75BF +0x75C0 +0x75C1 +0x75C2 +0x75C4 +0x75C5 +0x75C7 +0x75CA +0x75CB +0x75CC +0x75CD +0x75CE +0x75CF +0x75D0 +0x75D1 +0x75D2 +0x75D4 +0x75D5 +0x75D7 +0x75D8 +0x75D9 +0x75DA +0x75DB +0x75DD +0x75DE +0x75DF +0x75E0 +0x75E1 +0x75E2 +0x75E3 +0x75E4 +0x75E6 +0x75E7 +0x75ED +0x75EF +0x75F0 +0x75F1 +0x75F2 +0x75F3 +0x75F4 +0x75F5 +0x75F6 +0x75F7 +0x75F8 +0x75F9 +0x75FA +0x75FB +0x75FC +0x75FD +0x75FE +0x75FF +0x7600 +0x7601 +0x7603 +0x7608 +0x7609 +0x760A +0x760B +0x760C +0x760D +0x760F +0x7610 +0x7611 +0x7613 +0x7614 +0x7615 +0x7616 +0x7619 +0x761A +0x761B +0x761C +0x761D +0x761E +0x761F +0x7620 +0x7621 +0x7622 +0x7623 +0x7624 +0x7625 +0x7626 +0x7627 +0x7628 +0x7629 +0x762D +0x762F +0x7630 +0x7631 +0x7632 +0x7633 +0x7634 +0x7635 +0x7638 +0x763A +0x763C +0x763D +0x7642 +0x7643 +0x7646 +0x7647 +0x7648 +0x7649 +0x764C +0x7650 +0x7652 +0x7653 +0x7656 +0x7657 +0x7658 +0x7659 +0x765A +0x765C +0x765F +0x7660 +0x7661 +0x7662 +0x7664 +0x7665 +0x7669 +0x766A +0x766C +0x766D +0x766E +0x7670 +0x7671 +0x7672 +0x7675 +0x7678 +0x7679 +0x767B +0x767C +0x767D +0x767E +0x767F +0x7681 +0x7682 +0x7684 +0x7686 +0x7687 +0x7688 +0x7689 +0x768A +0x768B +0x768E +0x768F +0x7692 +0x7693 +0x7695 +0x7696 +0x7699 +0x769A +0x769B +0x769C +0x769D +0x769E +0x76A4 +0x76A6 +0x76AA +0x76AB +0x76AD +0x76AE +0x76AF +0x76B0 +0x76B4 +0x76B5 +0x76B8 +0x76BA +0x76BB +0x76BD +0x76BE +0x76BF +0x76C2 +0x76C3 +0x76C4 +0x76C5 +0x76C6 +0x76C8 +0x76C9 +0x76CA +0x76CD +0x76CE +0x76D2 +0x76D3 +0x76D4 +0x76DA +0x76DB +0x76DC +0x76DD +0x76DE +0x76DF +0x76E1 +0x76E3 +0x76E4 +0x76E5 +0x76E6 +0x76E7 +0x76E9 +0x76EA +0x76EC +0x76ED +0x76EE +0x76EF +0x76F0 +0x76F1 +0x76F2 +0x76F3 +0x76F4 +0x76F5 +0x76F7 +0x76F8 +0x76F9 +0x76FA +0x76FB +0x76FC +0x76FE +0x7701 +0x7703 +0x7704 +0x7705 +0x7707 +0x7708 +0x7709 +0x770A +0x770B +0x7710 +0x7711 +0x7712 +0x7713 +0x7715 +0x7719 +0x771A +0x771B +0x771D +0x771F +0x7720 +0x7722 +0x7723 +0x7725 +0x7727 +0x7728 +0x7729 +0x772D +0x772F +0x7731 +0x7732 +0x7733 +0x7734 +0x7735 +0x7736 +0x7737 +0x7738 +0x7739 +0x773A +0x773B +0x773C +0x773D +0x773E +0x7744 +0x7745 +0x7746 +0x7747 +0x774A +0x774B +0x774C +0x774D +0x774E +0x774F +0x7752 +0x7754 +0x7755 +0x7756 +0x7759 +0x775A +0x775B +0x775C +0x775E +0x775F +0x7760 +0x7761 +0x7762 +0x7763 +0x7765 +0x7766 +0x7767 +0x7768 +0x7769 +0x776A +0x776B +0x776C +0x776D +0x776E +0x776F +0x7779 +0x777C +0x777D +0x777E +0x777F +0x7780 +0x7781 +0x7782 +0x7783 +0x7784 +0x7785 +0x7787 +0x7788 +0x7789 +0x778B +0x778C +0x778D +0x778E +0x778F +0x7791 +0x7795 +0x7797 +0x7799 +0x779A +0x779B +0x779C +0x779D +0x779E +0x779F +0x77A0 +0x77A1 +0x77A2 +0x77A3 +0x77A5 +0x77A7 +0x77A8 +0x77AA +0x77AB +0x77AC +0x77AD +0x77B0 +0x77B1 +0x77B2 +0x77B3 +0x77B4 +0x77B5 +0x77B6 +0x77B7 +0x77BA +0x77BB +0x77BC +0x77BD +0x77BF +0x77C2 +0x77C4 +0x77C7 +0x77C9 +0x77CA +0x77CC +0x77CD +0x77CE +0x77CF +0x77D0 +0x77D3 +0x77D4 +0x77D5 +0x77D7 +0x77D8 +0x77D9 +0x77DA +0x77DB +0x77DC +0x77DE +0x77E0 +0x77E2 +0x77E3 +0x77E5 +0x77E7 +0x77E8 +0x77E9 +0x77EC +0x77ED +0x77EE +0x77EF +0x77F0 +0x77F1 +0x77F2 +0x77F3 +0x77F7 +0x77F8 +0x77F9 +0x77FA +0x77FB +0x77FC +0x77FD +0x7802 +0x7803 +0x7805 +0x7806 +0x7809 +0x780C +0x780D +0x780E +0x780F +0x7810 +0x7811 +0x7812 +0x7813 +0x7814 +0x781D +0x781F +0x7820 +0x7821 +0x7822 +0x7823 +0x7825 +0x7826 +0x7827 +0x7828 +0x7829 +0x782A +0x782B +0x782C +0x782D +0x782E +0x782F +0x7830 +0x7831 +0x7832 +0x7833 +0x7834 +0x7835 +0x7837 +0x7838 +0x7843 +0x7845 +0x7848 +0x7849 +0x784A +0x784C +0x784D +0x784E +0x7850 +0x7852 +0x785C +0x785D +0x785E +0x7860 +0x7862 +0x7864 +0x7865 +0x7868 +0x7869 +0x786A +0x786B +0x786C +0x786D +0x786E +0x786F +0x7870 +0x7871 +0x7879 +0x787B +0x787C +0x787E +0x787F +0x7880 +0x7883 +0x7884 +0x7885 +0x7886 +0x7887 +0x7889 +0x788C +0x788E +0x788F +0x7891 +0x7893 +0x7894 +0x7895 +0x7896 +0x7897 +0x7898 +0x7899 +0x789A +0x789E +0x789F +0x78A0 +0x78A1 +0x78A2 +0x78A3 +0x78A4 +0x78A5 +0x78A7 +0x78A8 +0x78A9 +0x78AA +0x78AB +0x78AC +0x78AD +0x78B0 +0x78B2 +0x78B3 +0x78B4 +0x78BA +0x78BB +0x78BC +0x78BE +0x78C1 +0x78C3 +0x78C4 +0x78C5 +0x78C8 +0x78C9 +0x78CA +0x78CB +0x78CC +0x78CD +0x78CE +0x78CF +0x78D0 +0x78D1 +0x78D4 +0x78D5 +0x78DA +0x78DB +0x78DD +0x78DE +0x78DF +0x78E0 +0x78E1 +0x78E2 +0x78E3 +0x78E5 +0x78E7 +0x78E8 +0x78E9 +0x78EA +0x78EC +0x78ED +0x78EF +0x78F2 +0x78F3 +0x78F4 +0x78F7 +0x78F9 +0x78FA +0x78FB +0x78FC +0x78FD +0x78FE +0x78FF +0x7901 +0x7902 +0x7904 +0x7905 +0x7909 +0x790C +0x790E +0x7910 +0x7911 +0x7912 +0x7913 +0x7914 +0x7917 +0x7919 +0x791B +0x791C +0x791D +0x791E +0x7921 +0x7923 +0x7924 +0x7925 +0x7926 +0x7927 +0x7928 +0x7929 +0x792A +0x792B +0x792C +0x792D +0x792F +0x7931 +0x7935 +0x7938 +0x7939 +0x793A +0x793D +0x793E +0x793F +0x7940 +0x7941 +0x7942 +0x7944 +0x7945 +0x7946 +0x7947 +0x7948 +0x7949 +0x794A +0x794B +0x794C +0x794F +0x7950 +0x7951 +0x7952 +0x7953 +0x7954 +0x7955 +0x7956 +0x7957 +0x795A +0x795B +0x795C +0x795D +0x795E +0x795F +0x7960 +0x7961 +0x7963 +0x7964 +0x7965 +0x7967 +0x7968 +0x7969 +0x796A +0x796B +0x796D +0x7970 +0x7972 +0x7973 +0x7974 +0x7979 +0x797A +0x797C +0x797D +0x797F +0x7981 +0x7982 +0x7988 +0x798A +0x798B +0x798D +0x798E +0x798F +0x7990 +0x7992 +0x7993 +0x7994 +0x7995 +0x7996 +0x7997 +0x7998 +0x799A +0x799B +0x799C +0x79A0 +0x79A1 +0x79A2 +0x79A4 +0x79A6 +0x79A7 +0x79A8 +0x79AA +0x79AB +0x79AC +0x79AD +0x79AE +0x79B0 +0x79B1 +0x79B2 +0x79B3 +0x79B4 +0x79B6 +0x79B7 +0x79B8 +0x79B9 +0x79BA +0x79BB +0x79BD +0x79BE +0x79BF +0x79C0 +0x79C1 +0x79C5 +0x79C8 +0x79C9 +0x79CB +0x79CD +0x79CE +0x79CF +0x79D1 +0x79D2 +0x79D5 +0x79D6 +0x79D8 +0x79DC +0x79DD +0x79DE +0x79DF +0x79E0 +0x79E3 +0x79E4 +0x79E6 +0x79E7 +0x79E9 +0x79EA +0x79EB +0x79EC +0x79ED +0x79EE +0x79F6 +0x79F7 +0x79F8 +0x79FA +0x79FB +0x7A00 +0x7A02 +0x7A03 +0x7A04 +0x7A05 +0x7A08 +0x7A0A +0x7A0B +0x7A0C +0x7A0D +0x7A10 +0x7A11 +0x7A12 +0x7A13 +0x7A14 +0x7A15 +0x7A17 +0x7A18 +0x7A19 +0x7A1A +0x7A1B +0x7A1C +0x7A1E +0x7A1F +0x7A20 +0x7A22 +0x7A26 +0x7A28 +0x7A2B +0x7A2E +0x7A2F +0x7A30 +0x7A31 +0x7A37 +0x7A39 +0x7A3B +0x7A3C +0x7A3D +0x7A3F +0x7A40 +0x7A44 +0x7A46 +0x7A47 +0x7A48 +0x7A4A +0x7A4B +0x7A4C +0x7A4D +0x7A4E +0x7A54 +0x7A56 +0x7A57 +0x7A58 +0x7A5A +0x7A5B +0x7A5C +0x7A5F +0x7A60 +0x7A61 +0x7A62 +0x7A67 +0x7A68 +0x7A69 +0x7A6B +0x7A6C +0x7A6D +0x7A6E +0x7A70 +0x7A71 +0x7A74 +0x7A75 +0x7A76 +0x7A78 +0x7A79 +0x7A7A +0x7A7B +0x7A7E +0x7A7F +0x7A80 +0x7A81 +0x7A84 +0x7A85 +0x7A86 +0x7A87 +0x7A88 +0x7A89 +0x7A8A +0x7A8B +0x7A8C +0x7A8F +0x7A90 +0x7A92 +0x7A94 +0x7A95 +0x7A96 +0x7A97 +0x7A98 +0x7A99 +0x7A9E +0x7A9F +0x7AA0 +0x7AA2 +0x7AA3 +0x7AA8 +0x7AA9 +0x7AAA +0x7AAB +0x7AAC +0x7AAE +0x7AAF +0x7AB1 +0x7AB2 +0x7AB3 +0x7AB4 +0x7AB5 +0x7AB6 +0x7AB7 +0x7AB8 +0x7ABA +0x7ABE +0x7ABF +0x7AC0 +0x7AC1 +0x7AC4 +0x7AC5 +0x7AC7 +0x7ACA +0x7ACB +0x7AD1 +0x7AD8 +0x7AD9 +0x7ADF +0x7AE0 +0x7AE3 +0x7AE4 +0x7AE5 +0x7AE6 +0x7AEB +0x7AED +0x7AEE +0x7AEF +0x7AF6 +0x7AF7 +0x7AF9 +0x7AFA +0x7AFB +0x7AFD +0x7AFF +0x7B00 +0x7B01 +0x7B04 +0x7B05 +0x7B06 +0x7B08 +0x7B09 +0x7B0A +0x7B0E +0x7B0F +0x7B10 +0x7B11 +0x7B12 +0x7B13 +0x7B18 +0x7B19 +0x7B1A +0x7B1B +0x7B1D +0x7B1E +0x7B20 +0x7B22 +0x7B23 +0x7B24 +0x7B25 +0x7B26 +0x7B28 +0x7B2A +0x7B2B +0x7B2C +0x7B2D +0x7B2E +0x7B2F +0x7B30 +0x7B31 +0x7B32 +0x7B33 +0x7B34 +0x7B35 +0x7B38 +0x7B3B +0x7B40 +0x7B44 +0x7B45 +0x7B46 +0x7B47 +0x7B48 +0x7B49 +0x7B4A +0x7B4B +0x7B4C +0x7B4D +0x7B4E +0x7B4F +0x7B50 +0x7B51 +0x7B52 +0x7B54 +0x7B56 +0x7B58 +0x7B60 +0x7B61 +0x7B63 +0x7B64 +0x7B65 +0x7B66 +0x7B67 +0x7B69 +0x7B6D +0x7B6E +0x7B70 +0x7B71 +0x7B72 +0x7B73 +0x7B74 +0x7B75 +0x7B76 +0x7B77 +0x7B78 +0x7B82 +0x7B84 +0x7B85 +0x7B87 +0x7B88 +0x7B8A +0x7B8B +0x7B8C +0x7B8D +0x7B8E +0x7B8F +0x7B90 +0x7B91 +0x7B94 +0x7B95 +0x7B96 +0x7B97 +0x7B98 +0x7B99 +0x7B9B +0x7B9C +0x7B9D +0x7BA0 +0x7BA1 +0x7BA4 +0x7BAC +0x7BAD +0x7BAF +0x7BB1 +0x7BB4 +0x7BB5 +0x7BB7 +0x7BB8 +0x7BB9 +0x7BBE +0x7BC0 +0x7BC1 +0x7BC4 +0x7BC6 +0x7BC7 +0x7BC9 +0x7BCA +0x7BCB +0x7BCC +0x7BCE +0x7BD4 +0x7BD5 +0x7BD8 +0x7BD9 +0x7BDA +0x7BDB +0x7BDC +0x7BDD +0x7BDE +0x7BDF +0x7BE0 +0x7BE1 +0x7BE2 +0x7BE3 +0x7BE4 +0x7BE5 +0x7BE6 +0x7BE7 +0x7BE8 +0x7BE9 +0x7BEA +0x7BEB +0x7BF0 +0x7BF1 +0x7BF2 +0x7BF3 +0x7BF4 +0x7BF7 +0x7BF8 +0x7BF9 +0x7BFB +0x7BFD +0x7BFE +0x7BFF +0x7C00 +0x7C01 +0x7C02 +0x7C03 +0x7C05 +0x7C06 +0x7C07 +0x7C09 +0x7C0A +0x7C0B +0x7C0C +0x7C0D +0x7C0E +0x7C0F +0x7C10 +0x7C11 +0x7C19 +0x7C1C +0x7C1D +0x7C1E +0x7C1F +0x7C20 +0x7C21 +0x7C22 +0x7C23 +0x7C25 +0x7C26 +0x7C27 +0x7C28 +0x7C29 +0x7C2A +0x7C2B +0x7C2C +0x7C2D +0x7C30 +0x7C33 +0x7C37 +0x7C38 +0x7C39 +0x7C3B +0x7C3C +0x7C3D +0x7C3E +0x7C3F +0x7C40 +0x7C43 +0x7C45 +0x7C47 +0x7C48 +0x7C49 +0x7C4A +0x7C4C +0x7C4D +0x7C50 +0x7C53 +0x7C54 +0x7C57 +0x7C59 +0x7C5A +0x7C5B +0x7C5C +0x7C5F +0x7C60 +0x7C63 +0x7C64 +0x7C65 +0x7C66 +0x7C67 +0x7C69 +0x7C6A +0x7C6B +0x7C6C +0x7C6E +0x7C6F +0x7C72 +0x7C73 +0x7C75 +0x7C78 +0x7C79 +0x7C7A +0x7C7D +0x7C7F +0x7C80 +0x7C81 +0x7C84 +0x7C85 +0x7C88 +0x7C89 +0x7C8A +0x7C8C +0x7C8D +0x7C91 +0x7C92 +0x7C94 +0x7C95 +0x7C96 +0x7C97 +0x7C98 +0x7C9E +0x7C9F +0x7CA1 +0x7CA2 +0x7CA3 +0x7CA5 +0x7CA8 +0x7CAF +0x7CB1 +0x7CB2 +0x7CB3 +0x7CB4 +0x7CB5 +0x7CB9 +0x7CBA +0x7CBB +0x7CBC +0x7CBD +0x7CBE +0x7CBF +0x7CC5 +0x7CC8 +0x7CCA +0x7CCB +0x7CCC +0x7CCE +0x7CD0 +0x7CD1 +0x7CD2 +0x7CD4 +0x7CD5 +0x7CD6 +0x7CD7 +0x7CD9 +0x7CDC +0x7CDD +0x7CDE +0x7CDF +0x7CE0 +0x7CE2 +0x7CE7 +0x7CE8 +0x7CEA +0x7CEC +0x7CEE +0x7CEF +0x7CF0 +0x7CF1 +0x7CF2 +0x7CF4 +0x7CF6 +0x7CF7 +0x7CF8 +0x7CFB +0x7CFD +0x7CFE +0x7D00 +0x7D01 +0x7D02 +0x7D03 +0x7D04 +0x7D05 +0x7D06 +0x7D07 +0x7D08 +0x7D09 +0x7D0A +0x7D0B +0x7D0C +0x7D0D +0x7D0E +0x7D0F +0x7D10 +0x7D11 +0x7D12 +0x7D13 +0x7D14 +0x7D15 +0x7D16 +0x7D17 +0x7D18 +0x7D19 +0x7D1A +0x7D1B +0x7D1C +0x7D1D +0x7D1E +0x7D1F +0x7D20 +0x7D21 +0x7D22 +0x7D28 +0x7D29 +0x7D2B +0x7D2C +0x7D2E +0x7D2F +0x7D30 +0x7D31 +0x7D32 +0x7D33 +0x7D35 +0x7D36 +0x7D38 +0x7D39 +0x7D3A +0x7D3B +0x7D3C +0x7D3D +0x7D3E +0x7D3F +0x7D40 +0x7D41 +0x7D42 +0x7D43 +0x7D44 +0x7D45 +0x7D46 +0x7D47 +0x7D4A +0x7D4E +0x7D4F +0x7D50 +0x7D51 +0x7D52 +0x7D53 +0x7D54 +0x7D55 +0x7D56 +0x7D58 +0x7D5B +0x7D5C +0x7D5E +0x7D5F +0x7D61 +0x7D62 +0x7D63 +0x7D66 +0x7D67 +0x7D68 +0x7D69 +0x7D6A +0x7D6B +0x7D6D +0x7D6E +0x7D6F +0x7D70 +0x7D71 +0x7D72 +0x7D73 +0x7D79 +0x7D7A +0x7D7B +0x7D7C +0x7D7D +0x7D7F +0x7D80 +0x7D81 +0x7D83 +0x7D84 +0x7D85 +0x7D86 +0x7D88 +0x7D8C +0x7D8D +0x7D8E +0x7D8F +0x7D91 +0x7D92 +0x7D93 +0x7D94 +0x7D96 +0x7D9C +0x7D9D +0x7D9E +0x7D9F +0x7DA0 +0x7DA1 +0x7DA2 +0x7DA3 +0x7DA6 +0x7DA7 +0x7DA9 +0x7DAA +0x7DAC +0x7DAD +0x7DAE +0x7DAF +0x7DB0 +0x7DB1 +0x7DB2 +0x7DB4 +0x7DB5 +0x7DB7 +0x7DB8 +0x7DB9 +0x7DBA +0x7DBB +0x7DBC +0x7DBD +0x7DBE +0x7DBF +0x7DC0 +0x7DC1 +0x7DC2 +0x7DC4 +0x7DC5 +0x7DC6 +0x7DC7 +0x7DC9 +0x7DCA +0x7DCB +0x7DCC +0x7DCE +0x7DD2 +0x7DD7 +0x7DD8 +0x7DD9 +0x7DDA +0x7DDB +0x7DDD +0x7DDE +0x7DDF +0x7DE0 +0x7DE1 +0x7DE3 +0x7DE6 +0x7DE7 +0x7DE8 +0x7DE9 +0x7DEA +0x7DEC +0x7DEE +0x7DEF +0x7DF0 +0x7DF1 +0x7DF2 +0x7DF3 +0x7DF4 +0x7DF6 +0x7DF7 +0x7DF9 +0x7DFA +0x7DFB +0x7E03 +0x7E08 +0x7E09 +0x7E0A +0x7E0B +0x7E0C +0x7E0D +0x7E0E +0x7E0F +0x7E10 +0x7E11 +0x7E12 +0x7E13 +0x7E14 +0x7E15 +0x7E16 +0x7E17 +0x7E1A +0x7E1B +0x7E1C +0x7E1D +0x7E1E +0x7E1F +0x7E20 +0x7E21 +0x7E22 +0x7E23 +0x7E24 +0x7E25 +0x7E29 +0x7E2A +0x7E2B +0x7E2D +0x7E2E +0x7E2F +0x7E30 +0x7E31 +0x7E32 +0x7E33 +0x7E34 +0x7E35 +0x7E36 +0x7E37 +0x7E38 +0x7E39 +0x7E3A +0x7E3B +0x7E3C +0x7E3D +0x7E3E +0x7E3F +0x7E40 +0x7E41 +0x7E42 +0x7E43 +0x7E44 +0x7E45 +0x7E46 +0x7E47 +0x7E48 +0x7E49 +0x7E4C +0x7E50 +0x7E51 +0x7E52 +0x7E53 +0x7E54 +0x7E55 +0x7E56 +0x7E57 +0x7E58 +0x7E59 +0x7E5A +0x7E5C +0x7E5E +0x7E5F +0x7E60 +0x7E61 +0x7E62 +0x7E63 +0x7E68 +0x7E69 +0x7E6A +0x7E6B +0x7E6D +0x7E6F +0x7E70 +0x7E72 +0x7E73 +0x7E74 +0x7E75 +0x7E76 +0x7E77 +0x7E78 +0x7E79 +0x7E7A +0x7E7B +0x7E7C +0x7E7D +0x7E7E +0x7E80 +0x7E81 +0x7E82 +0x7E86 +0x7E87 +0x7E88 +0x7E8A +0x7E8B +0x7E8C +0x7E8D +0x7E8F +0x7E91 +0x7E93 +0x7E94 +0x7E95 +0x7E96 +0x7E97 +0x7E98 +0x7E99 +0x7E9A +0x7E9B +0x7E9C +0x7F36 +0x7F38 +0x7F39 +0x7F3A +0x7F3D +0x7F3E +0x7F3F +0x7F43 +0x7F44 +0x7F45 +0x7F48 +0x7F4A +0x7F4B +0x7F4C +0x7F4D +0x7F4F +0x7F50 +0x7F51 +0x7F54 +0x7F55 +0x7F58 +0x7F5B +0x7F5C +0x7F5D +0x7F5E +0x7F5F +0x7F60 +0x7F61 +0x7F63 +0x7F65 +0x7F66 +0x7F67 +0x7F68 +0x7F69 +0x7F6A +0x7F6B +0x7F6C +0x7F6D +0x7F6E +0x7F70 +0x7F72 +0x7F73 +0x7F75 +0x7F76 +0x7F77 +0x7F79 +0x7F7A +0x7F7B +0x7F7C +0x7F7D +0x7F7E +0x7F7F +0x7F83 +0x7F85 +0x7F86 +0x7F87 +0x7F88 +0x7F89 +0x7F8A +0x7F8B +0x7F8C +0x7F8D +0x7F8E +0x7F91 +0x7F92 +0x7F94 +0x7F95 +0x7F96 +0x7F9A +0x7F9B +0x7F9C +0x7F9D +0x7F9E +0x7FA0 +0x7FA1 +0x7FA2 +0x7FA4 +0x7FA5 +0x7FA6 +0x7FA7 +0x7FA8 +0x7FA9 +0x7FAC +0x7FAD +0x7FAF +0x7FB0 +0x7FB1 +0x7FB2 +0x7FB3 +0x7FB5 +0x7FB6 +0x7FB7 +0x7FB8 +0x7FB9 +0x7FBA +0x7FBB +0x7FBC +0x7FBD +0x7FBE +0x7FBF +0x7FC0 +0x7FC1 +0x7FC2 +0x7FC3 +0x7FC5 +0x7FC7 +0x7FC9 +0x7FCA +0x7FCB +0x7FCC +0x7FCD +0x7FCE +0x7FCF +0x7FD0 +0x7FD1 +0x7FD2 +0x7FD4 +0x7FD5 +0x7FD7 +0x7FDB +0x7FDC +0x7FDE +0x7FDF +0x7FE0 +0x7FE1 +0x7FE2 +0x7FE3 +0x7FE5 +0x7FE6 +0x7FE8 +0x7FE9 +0x7FEA +0x7FEB +0x7FEC +0x7FED +0x7FEE +0x7FEF +0x7FF0 +0x7FF1 +0x7FF2 +0x7FF3 +0x7FF4 +0x7FF5 +0x7FF7 +0x7FF8 +0x7FF9 +0x7FFB +0x7FFC +0x7FFD +0x7FFE +0x7FFF +0x8000 +0x8001 +0x8003 +0x8004 +0x8005 +0x8006 +0x8007 +0x800B +0x800C +0x800D +0x800E +0x800F +0x8010 +0x8011 +0x8012 +0x8014 +0x8015 +0x8016 +0x8017 +0x8018 +0x8019 +0x801B +0x801C +0x801E +0x801F +0x8021 +0x8024 +0x8026 +0x8028 +0x8029 +0x802A +0x802C +0x8030 +0x8033 +0x8034 +0x8035 +0x8036 +0x8037 +0x8039 +0x803D +0x803E +0x803F +0x8043 +0x8046 +0x8047 +0x8048 +0x804A +0x804F +0x8050 +0x8051 +0x8052 +0x8056 +0x8058 +0x805A +0x805C +0x805D +0x805E +0x8064 +0x8067 +0x806C +0x806F +0x8070 +0x8071 +0x8072 +0x8073 +0x8075 +0x8076 +0x8077 +0x8078 +0x8079 +0x807D +0x807E +0x807F +0x8082 +0x8084 +0x8085 +0x8086 +0x8087 +0x8089 +0x808A +0x808B +0x808C +0x808F +0x8090 +0x8092 +0x8093 +0x8095 +0x8096 +0x8098 +0x8099 +0x809A +0x809B +0x809C +0x809D +0x80A1 +0x80A2 +0x80A3 +0x80A5 +0x80A9 +0x80AA +0x80AB +0x80AD +0x80AE +0x80AF +0x80B1 +0x80B2 +0x80B4 +0x80B5 +0x80B8 +0x80BA +0x80C2 +0x80C3 +0x80C4 +0x80C5 +0x80C7 +0x80C8 +0x80C9 +0x80CA +0x80CC +0x80CD +0x80CE +0x80CF +0x80D0 +0x80D1 +0x80D4 +0x80D5 +0x80D6 +0x80D7 +0x80D8 +0x80D9 +0x80DA +0x80DB +0x80DC +0x80DD +0x80DE +0x80E0 +0x80E1 +0x80E3 +0x80E4 +0x80E5 +0x80E6 +0x80ED +0x80EF +0x80F0 +0x80F1 +0x80F2 +0x80F3 +0x80F4 +0x80F5 +0x80F8 +0x80F9 +0x80FA +0x80FB +0x80FC +0x80FD +0x80FE +0x8100 +0x8101 +0x8102 +0x8105 +0x8106 +0x8108 +0x810A +0x8115 +0x8116 +0x8118 +0x8119 +0x811B +0x811D +0x811E +0x811F +0x8121 +0x8122 +0x8123 +0x8124 +0x8125 +0x8127 +0x8129 +0x812B +0x812C +0x812D +0x812F +0x8130 +0x8139 +0x813A +0x813D +0x813E +0x8143 +0x8144 +0x8146 +0x8147 +0x814A +0x814B +0x814C +0x814D +0x814E +0x814F +0x8150 +0x8151 +0x8152 +0x8153 +0x8154 +0x8155 +0x815B +0x815C +0x815E +0x8160 +0x8161 +0x8162 +0x8164 +0x8165 +0x8166 +0x8167 +0x8169 +0x816B +0x816E +0x816F +0x8170 +0x8171 +0x8172 +0x8173 +0x8174 +0x8176 +0x8177 +0x8178 +0x8179 +0x817A +0x817F +0x8180 +0x8182 +0x8183 +0x8186 +0x8187 +0x8188 +0x8189 +0x818A +0x818B +0x818C +0x818D +0x818F +0x8195 +0x8197 +0x8198 +0x8199 +0x819A +0x819B +0x819C +0x819D +0x819E +0x819F +0x81A0 +0x81A2 +0x81A3 +0x81A6 +0x81A7 +0x81A8 +0x81A9 +0x81AB +0x81AC +0x81AE +0x81B0 +0x81B1 +0x81B2 +0x81B3 +0x81B4 +0x81B5 +0x81B7 +0x81B9 +0x81BA +0x81BB +0x81BC +0x81BD +0x81BE +0x81BF +0x81C0 +0x81C2 +0x81C3 +0x81C4 +0x81C5 +0x81C6 +0x81C7 +0x81C9 +0x81CA +0x81CC +0x81CD +0x81CF +0x81D0 +0x81D1 +0x81D2 +0x81D5 +0x81D7 +0x81D8 +0x81D9 +0x81DA +0x81DB +0x81DD +0x81DE +0x81DF +0x81E0 +0x81E1 +0x81E2 +0x81E3 +0x81E5 +0x81E6 +0x81E7 +0x81E8 +0x81E9 +0x81EA +0x81EC +0x81ED +0x81EE +0x81F2 +0x81F3 +0x81F4 +0x81F7 +0x81F8 +0x81F9 +0x81FA +0x81FB +0x81FC +0x81FE +0x81FF +0x8200 +0x8201 +0x8202 +0x8204 +0x8205 +0x8207 +0x8208 +0x8209 +0x820A +0x820B +0x820C +0x820D +0x8210 +0x8211 +0x8212 +0x8214 +0x8215 +0x8216 +0x821B +0x821C +0x821D +0x821E +0x821F +0x8220 +0x8221 +0x8222 +0x8225 +0x8228 +0x822A +0x822B +0x822C +0x822F +0x8232 +0x8233 +0x8234 +0x8235 +0x8236 +0x8237 +0x8238 +0x8239 +0x823A +0x823C +0x823D +0x823F +0x8240 +0x8242 +0x8244 +0x8245 +0x8247 +0x8249 +0x824B +0x824E +0x824F +0x8250 +0x8251 +0x8252 +0x8253 +0x8255 +0x8256 +0x8257 +0x8258 +0x8259 +0x825A +0x825B +0x825C +0x825E +0x825F +0x8261 +0x8263 +0x8264 +0x8266 +0x8268 +0x8269 +0x826B +0x826C +0x826D +0x826E +0x826F +0x8271 +0x8272 +0x8274 +0x8275 +0x8277 +0x8278 +0x827C +0x827D +0x827E +0x827F +0x8280 +0x8283 +0x8284 +0x8285 +0x828A +0x828B +0x828D +0x828E +0x828F +0x8290 +0x8291 +0x8292 +0x8293 +0x8294 +0x8298 +0x8299 +0x829A +0x829B +0x829D +0x829E +0x829F +0x82A0 +0x82A1 +0x82A2 +0x82A3 +0x82A4 +0x82A5 +0x82A7 +0x82A8 +0x82A9 +0x82AB +0x82AC +0x82AD +0x82AE +0x82AF +0x82B0 +0x82B1 +0x82B3 +0x82B4 +0x82B5 +0x82B6 +0x82B7 +0x82B8 +0x82B9 +0x82BA +0x82BB +0x82BC +0x82BD +0x82BE +0x82C0 +0x82C2 +0x82C3 +0x82D1 +0x82D2 +0x82D3 +0x82D4 +0x82D5 +0x82D6 +0x82D7 +0x82D9 +0x82DB +0x82DC +0x82DE +0x82DF +0x82E0 +0x82E1 +0x82E3 +0x82E4 +0x82E5 +0x82E6 +0x82E7 +0x82E8 +0x82EA +0x82EB +0x82EC +0x82ED +0x82EF +0x82F0 +0x82F1 +0x82F2 +0x82F3 +0x82F4 +0x82F5 +0x82F6 +0x82F9 +0x82FA +0x82FB +0x82FE +0x8300 +0x8301 +0x8302 +0x8303 +0x8304 +0x8305 +0x8306 +0x8307 +0x8308 +0x8309 +0x830C +0x830D +0x8316 +0x8317 +0x8319 +0x831B +0x831C +0x831E +0x8320 +0x8322 +0x8324 +0x8325 +0x8326 +0x8327 +0x8328 +0x8329 +0x832A +0x832B +0x832C +0x832D +0x832F +0x8331 +0x8332 +0x8333 +0x8334 +0x8335 +0x8336 +0x8337 +0x8338 +0x8339 +0x833A +0x833B +0x833C +0x833F +0x8340 +0x8341 +0x8342 +0x8343 +0x8344 +0x8345 +0x8347 +0x8348 +0x8349 +0x834A +0x834B +0x834C +0x834D +0x834E +0x834F +0x8350 +0x8351 +0x8352 +0x8353 +0x8354 +0x8356 +0x8373 +0x8374 +0x8375 +0x8376 +0x8377 +0x8378 +0x837A +0x837B +0x837C +0x837D +0x837E +0x837F +0x8381 +0x8383 +0x8386 +0x8387 +0x8388 +0x8389 +0x838A +0x838B +0x838C +0x838D +0x838E +0x838F +0x8390 +0x8392 +0x8393 +0x8394 +0x8395 +0x8396 +0x8397 +0x8398 +0x8399 +0x839A +0x839B +0x839D +0x839E +0x83A0 +0x83A2 +0x83A3 +0x83A4 +0x83A5 +0x83A6 +0x83A7 +0x83A8 +0x83A9 +0x83AA +0x83AB +0x83AE +0x83AF +0x83B0 +0x83BD +0x83BF +0x83C0 +0x83C1 +0x83C2 +0x83C3 +0x83C4 +0x83C5 +0x83C6 +0x83C7 +0x83C8 +0x83C9 +0x83CA +0x83CB +0x83CC +0x83CE +0x83CF +0x83D1 +0x83D4 +0x83D5 +0x83D6 +0x83D7 +0x83D8 +0x83D9 +0x83DB +0x83DC +0x83DD +0x83DE +0x83DF +0x83E0 +0x83E1 +0x83E2 +0x83E3 +0x83E4 +0x83E5 +0x83E7 +0x83E8 +0x83E9 +0x83EA +0x83EB +0x83EC +0x83EE +0x83EF +0x83F0 +0x83F1 +0x83F2 +0x83F3 +0x83F4 +0x83F5 +0x83F6 +0x83F8 +0x83F9 +0x83FA +0x83FB +0x83FC +0x83FD +0x83FE +0x83FF +0x8401 +0x8403 +0x8404 +0x8406 +0x8407 +0x8409 +0x840A +0x840B +0x840C +0x840D +0x840E +0x840F +0x8410 +0x8411 +0x8412 +0x8413 +0x841B +0x8423 +0x8429 +0x842B +0x842C +0x842D +0x842F +0x8430 +0x8431 +0x8432 +0x8433 +0x8434 +0x8435 +0x8436 +0x8437 +0x8438 +0x8439 +0x843A +0x843B +0x843C +0x843D +0x843F +0x8440 +0x8442 +0x8443 +0x8444 +0x8445 +0x8446 +0x8447 +0x8449 +0x844B +0x844C +0x844D +0x844E +0x8450 +0x8451 +0x8452 +0x8454 +0x8456 +0x8457 +0x8459 +0x845A +0x845B +0x845D +0x845E +0x845F +0x8460 +0x8461 +0x8463 +0x8465 +0x8466 +0x8467 +0x8468 +0x8469 +0x846B +0x846C +0x846D +0x846E +0x846F +0x8470 +0x8473 +0x8474 +0x8475 +0x8476 +0x8477 +0x8478 +0x8479 +0x847A +0x847D +0x847E +0x8482 +0x8486 +0x848D +0x848E +0x848F +0x8490 +0x8491 +0x8494 +0x8497 +0x8498 +0x8499 +0x849A +0x849B +0x849C +0x849D +0x849E +0x849F +0x84A0 +0x84A1 +0x84A2 +0x84A4 +0x84A7 +0x84A8 +0x84A9 +0x84AA +0x84AB +0x84AC +0x84AE +0x84AF +0x84B0 +0x84B1 +0x84B2 +0x84B4 +0x84B6 +0x84B8 +0x84B9 +0x84BA +0x84BB +0x84BC +0x84BF +0x84C0 +0x84C1 +0x84C2 +0x84C4 +0x84C5 +0x84C6 +0x84C7 +0x84C9 +0x84CA +0x84CB +0x84CC +0x84CD +0x84CE +0x84CF +0x84D0 +0x84D1 +0x84D2 +0x84D3 +0x84D4 +0x84D6 +0x84D7 +0x84DB +0x84E7 +0x84E8 +0x84E9 +0x84EA +0x84EB +0x84EC +0x84EE +0x84EF +0x84F0 +0x84F1 +0x84F2 +0x84F3 +0x84F4 +0x84F6 +0x84F7 +0x84F9 +0x84FA +0x84FB +0x84FC +0x84FD +0x84FE +0x84FF +0x8500 +0x8502 +0x8506 +0x8507 +0x8508 +0x8509 +0x850A +0x850B +0x850C +0x850D +0x850E +0x850F +0x8511 +0x8512 +0x8513 +0x8514 +0x8515 +0x8516 +0x8517 +0x8518 +0x8519 +0x851A +0x851C +0x851D +0x851E +0x851F +0x8520 +0x8521 +0x8523 +0x8524 +0x8525 +0x8526 +0x8527 +0x8528 +0x8529 +0x852A +0x852B +0x852C +0x852D +0x852E +0x852F +0x8530 +0x8531 +0x853B +0x853D +0x853E +0x8540 +0x8541 +0x8543 +0x8544 +0x8545 +0x8546 +0x8547 +0x8548 +0x8549 +0x854A +0x854D +0x854E +0x8551 +0x8553 +0x8554 +0x8555 +0x8556 +0x8557 +0x8558 +0x8559 +0x855B +0x855D +0x855E +0x8560 +0x8561 +0x8562 +0x8563 +0x8564 +0x8565 +0x8566 +0x8567 +0x8568 +0x8569 +0x856A +0x856B +0x856C +0x856D +0x856E +0x8571 +0x8575 +0x8576 +0x8577 +0x8578 +0x8579 +0x857A +0x857B +0x857C +0x857E +0x8580 +0x8581 +0x8582 +0x8583 +0x8584 +0x8585 +0x8586 +0x8587 +0x8588 +0x8589 +0x858A +0x858B +0x858C +0x858D +0x858E +0x858F +0x8590 +0x8591 +0x8594 +0x8595 +0x8596 +0x8598 +0x8599 +0x859A +0x859B +0x859C +0x859D +0x859E +0x859F +0x85A0 +0x85A1 +0x85A2 +0x85A3 +0x85A4 +0x85A6 +0x85A7 +0x85A8 +0x85A9 +0x85AA +0x85AF +0x85B0 +0x85B1 +0x85B3 +0x85B4 +0x85B5 +0x85B6 +0x85B7 +0x85B8 +0x85B9 +0x85BA +0x85BD +0x85BE +0x85BF +0x85C0 +0x85C2 +0x85C3 +0x85C4 +0x85C5 +0x85C6 +0x85C7 +0x85C8 +0x85C9 +0x85CB +0x85CD +0x85CE +0x85CF +0x85D0 +0x85D1 +0x85D2 +0x85D5 +0x85D7 +0x85D8 +0x85D9 +0x85DA +0x85DC +0x85DD +0x85DE +0x85DF +0x85E1 +0x85E2 +0x85E3 +0x85E4 +0x85E5 +0x85E6 +0x85E8 +0x85E9 +0x85EA +0x85EB +0x85EC +0x85ED +0x85EF +0x85F0 +0x85F1 +0x85F2 +0x85F6 +0x85F7 +0x85F8 +0x85F9 +0x85FA +0x85FB +0x85FD +0x85FE +0x85FF +0x8600 +0x8601 +0x8604 +0x8605 +0x8606 +0x8607 +0x8609 +0x860A +0x860B +0x860C +0x8611 +0x8617 +0x8618 +0x8619 +0x861A +0x861B +0x861C +0x861E +0x861F +0x8620 +0x8621 +0x8622 +0x8623 +0x8624 +0x8625 +0x8626 +0x8627 +0x8629 +0x862A +0x862C +0x862D +0x862E +0x8631 +0x8632 +0x8633 +0x8634 +0x8635 +0x8636 +0x8638 +0x8639 +0x863A +0x863B +0x863C +0x863E +0x863F +0x8640 +0x8643 +0x8646 +0x8647 +0x8648 +0x864B +0x864C +0x864D +0x864E +0x8650 +0x8652 +0x8653 +0x8654 +0x8655 +0x8656 +0x8659 +0x865B +0x865C +0x865E +0x865F +0x8661 +0x8662 +0x8663 +0x8664 +0x8665 +0x8667 +0x8668 +0x8669 +0x866A +0x866B +0x866D +0x866E +0x866F +0x8670 +0x8671 +0x8673 +0x8674 +0x8677 +0x8679 +0x867A +0x867B +0x867C +0x8685 +0x8686 +0x8687 +0x868A +0x868B +0x868C +0x868D +0x868E +0x8690 +0x8691 +0x8693 +0x8694 +0x8695 +0x8696 +0x8697 +0x8698 +0x8699 +0x869A +0x869C +0x869D +0x869E +0x86A1 +0x86A2 +0x86A3 +0x86A4 +0x86A5 +0x86A7 +0x86A8 +0x86A9 +0x86AA +0x86AF +0x86B0 +0x86B1 +0x86B3 +0x86B4 +0x86B5 +0x86B6 +0x86B7 +0x86B8 +0x86B9 +0x86BA +0x86BB +0x86BC +0x86BD +0x86BE +0x86BF +0x86C0 +0x86C1 +0x86C2 +0x86C3 +0x86C4 +0x86C5 +0x86C6 +0x86C7 +0x86C8 +0x86C9 +0x86CB +0x86CC +0x86D0 +0x86D1 +0x86D3 +0x86D4 +0x86D6 +0x86D7 +0x86D8 +0x86D9 +0x86DA +0x86DB +0x86DC +0x86DD +0x86DE +0x86DF +0x86E2 +0x86E3 +0x86E4 +0x86E6 +0x86E8 +0x86E9 +0x86EA +0x86EB +0x86EC +0x86ED +0x86F5 +0x86F6 +0x86F7 +0x86F8 +0x86F9 +0x86FA +0x86FB +0x86FE +0x8700 +0x8701 +0x8702 +0x8703 +0x8704 +0x8705 +0x8706 +0x8707 +0x8708 +0x8709 +0x870A +0x870B +0x870C +0x870D +0x870E +0x8711 +0x8712 +0x8713 +0x8718 +0x8719 +0x871A +0x871B +0x871C +0x871E +0x8720 +0x8721 +0x8722 +0x8723 +0x8724 +0x8725 +0x8726 +0x8727 +0x8728 +0x8729 +0x872A +0x872C +0x872D +0x872E +0x8730 +0x8731 +0x8732 +0x8733 +0x8734 +0x8735 +0x8737 +0x8738 +0x873A +0x873B +0x873C +0x873E +0x873F +0x8740 +0x8741 +0x8742 +0x8743 +0x8746 +0x874C +0x874D +0x874E +0x874F +0x8750 +0x8751 +0x8752 +0x8753 +0x8754 +0x8755 +0x8756 +0x8757 +0x8758 +0x8759 +0x875A +0x875B +0x875C +0x875D +0x875E +0x875F +0x8760 +0x8761 +0x8762 +0x8763 +0x8764 +0x8765 +0x8766 +0x8767 +0x8768 +0x8769 +0x876A +0x876B +0x876C +0x876D +0x876E +0x876F +0x8773 +0x8774 +0x8775 +0x8776 +0x8777 +0x8778 +0x8779 +0x877A +0x877B +0x8781 +0x8782 +0x8783 +0x8784 +0x8785 +0x8787 +0x8788 +0x8789 +0x878D +0x878F +0x8790 +0x8791 +0x8792 +0x8793 +0x8794 +0x8796 +0x8797 +0x8798 +0x879A +0x879B +0x879C +0x879D +0x879E +0x879F +0x87A2 +0x87A3 +0x87A4 +0x87AA +0x87AB +0x87AC +0x87AD +0x87AE +0x87AF +0x87B0 +0x87B2 +0x87B3 +0x87B4 +0x87B5 +0x87B6 +0x87B7 +0x87B8 +0x87B9 +0x87BA +0x87BB +0x87BC +0x87BD +0x87BE +0x87BF +0x87C0 +0x87C2 +0x87C3 +0x87C4 +0x87C5 +0x87C6 +0x87C8 +0x87C9 +0x87CA +0x87CB +0x87CC +0x87D1 +0x87D2 +0x87D3 +0x87D4 +0x87D7 +0x87D8 +0x87D9 +0x87DB +0x87DC +0x87DD +0x87DE +0x87DF +0x87E0 +0x87E1 +0x87E2 +0x87E3 +0x87E4 +0x87E5 +0x87E6 +0x87E7 +0x87E8 +0x87EA +0x87EB +0x87EC +0x87ED +0x87EF +0x87F2 +0x87F3 +0x87F4 +0x87F6 +0x87F7 +0x87F9 +0x87FA +0x87FB +0x87FC +0x87FE +0x87FF +0x8800 +0x8801 +0x8802 +0x8803 +0x8805 +0x8806 +0x8808 +0x8809 +0x880A +0x880B +0x880C +0x880D +0x8810 +0x8811 +0x8813 +0x8814 +0x8815 +0x8816 +0x8817 +0x8819 +0x881B +0x881C +0x881D +0x881F +0x8820 +0x8821 +0x8822 +0x8823 +0x8824 +0x8825 +0x8826 +0x8828 +0x8829 +0x882A +0x882B +0x882C +0x882E +0x882F +0x8830 +0x8831 +0x8832 +0x8833 +0x8835 +0x8836 +0x8837 +0x8838 +0x8839 +0x883B +0x883C +0x883D +0x883E +0x883F +0x8840 +0x8841 +0x8843 +0x8844 +0x8848 +0x884A +0x884B +0x884C +0x884D +0x884E +0x8852 +0x8853 +0x8855 +0x8856 +0x8857 +0x8859 +0x885A +0x885B +0x885D +0x8861 +0x8862 +0x8863 +0x8867 +0x8868 +0x8869 +0x886A +0x886B +0x886D +0x886F +0x8870 +0x8871 +0x8872 +0x8874 +0x8875 +0x8876 +0x8877 +0x8879 +0x887C +0x887D +0x887E +0x887F +0x8880 +0x8881 +0x8882 +0x8883 +0x8888 +0x8889 +0x888B +0x888C +0x888D +0x888E +0x8891 +0x8892 +0x8893 +0x8895 +0x8896 +0x8897 +0x8898 +0x8899 +0x889A +0x889B +0x889E +0x889F +0x88A1 +0x88A2 +0x88A4 +0x88A7 +0x88A8 +0x88AA +0x88AB +0x88AC +0x88B1 +0x88B2 +0x88B6 +0x88B7 +0x88B8 +0x88B9 +0x88BA +0x88BC +0x88BD +0x88BE +0x88C0 +0x88C1 +0x88C2 +0x88C9 +0x88CA +0x88CB +0x88CC +0x88CD +0x88CE +0x88D0 +0x88D2 +0x88D4 +0x88D5 +0x88D6 +0x88D7 +0x88D8 +0x88D9 +0x88DA +0x88DB +0x88DC +0x88DD +0x88DE +0x88DF +0x88E1 +0x88E7 +0x88E8 +0x88EB +0x88EC +0x88EE +0x88EF +0x88F0 +0x88F1 +0x88F2 +0x88F3 +0x88F4 +0x88F6 +0x88F7 +0x88F8 +0x88F9 +0x88FA +0x88FB +0x88FC +0x88FD +0x88FE +0x8901 +0x8902 +0x8905 +0x8906 +0x8907 +0x8909 +0x890A +0x890B +0x890C +0x890E +0x8910 +0x8911 +0x8912 +0x8913 +0x8914 +0x8915 +0x8916 +0x8917 +0x8918 +0x8919 +0x891A +0x891E +0x891F +0x8921 +0x8922 +0x8923 +0x8925 +0x8926 +0x8927 +0x8929 +0x892A +0x892B +0x892C +0x892D +0x892E +0x892F +0x8930 +0x8931 +0x8932 +0x8933 +0x8935 +0x8936 +0x8937 +0x8938 +0x893B +0x893C +0x893D +0x893E +0x8941 +0x8942 +0x8944 +0x8946 +0x8949 +0x894B +0x894C +0x894F +0x8950 +0x8951 +0x8952 +0x8953 +0x8956 +0x8957 +0x8958 +0x8959 +0x895A +0x895B +0x895C +0x895D +0x895E +0x895F +0x8960 +0x8961 +0x8962 +0x8963 +0x8964 +0x8966 +0x8969 +0x896A +0x896B +0x896C +0x896D +0x896E +0x896F +0x8971 +0x8972 +0x8973 +0x8974 +0x8976 +0x8979 +0x897A +0x897B +0x897C +0x897E +0x897F +0x8981 +0x8982 +0x8983 +0x8985 +0x8986 +0x8988 +0x898B +0x898F +0x8993 +0x8995 +0x8996 +0x8997 +0x8998 +0x899B +0x899C +0x899D +0x899E +0x899F +0x89A1 +0x89A2 +0x89A3 +0x89A4 +0x89A6 +0x89AA +0x89AC +0x89AD +0x89AE +0x89AF +0x89B2 +0x89B6 +0x89B7 +0x89B9 +0x89BA +0x89BD +0x89BE +0x89BF +0x89C0 +0x89D2 +0x89D3 +0x89D4 +0x89D5 +0x89D6 +0x89D9 +0x89DA +0x89DB +0x89DC +0x89DD +0x89DF +0x89E0 +0x89E1 +0x89E2 +0x89E3 +0x89E4 +0x89E5 +0x89E6 +0x89E8 +0x89E9 +0x89EB +0x89EC +0x89ED +0x89F0 +0x89F1 +0x89F2 +0x89F3 +0x89F4 +0x89F6 +0x89F7 +0x89F8 +0x89FA +0x89FB +0x89FC +0x89FE +0x89FF +0x8A00 +0x8A02 +0x8A03 +0x8A04 +0x8A07 +0x8A08 +0x8A0A +0x8A0C +0x8A0E +0x8A0F +0x8A10 +0x8A11 +0x8A12 +0x8A13 +0x8A15 +0x8A16 +0x8A17 +0x8A18 +0x8A1B +0x8A1D +0x8A1E +0x8A1F +0x8A22 +0x8A23 +0x8A25 +0x8A27 +0x8A2A +0x8A2C +0x8A2D +0x8A30 +0x8A31 +0x8A34 +0x8A36 +0x8A39 +0x8A3A +0x8A3B +0x8A3C +0x8A3E +0x8A3F +0x8A40 +0x8A41 +0x8A44 +0x8A45 +0x8A46 +0x8A48 +0x8A4A +0x8A4C +0x8A4D +0x8A4E +0x8A4F +0x8A50 +0x8A51 +0x8A52 +0x8A54 +0x8A55 +0x8A56 +0x8A57 +0x8A58 +0x8A59 +0x8A5B +0x8A5E +0x8A60 +0x8A61 +0x8A62 +0x8A63 +0x8A66 +0x8A68 +0x8A69 +0x8A6B +0x8A6C +0x8A6D +0x8A6E +0x8A70 +0x8A71 +0x8A72 +0x8A73 +0x8A74 +0x8A75 +0x8A76 +0x8A77 +0x8A79 +0x8A7A +0x8A7B +0x8A7C +0x8A7F +0x8A81 +0x8A82 +0x8A83 +0x8A84 +0x8A85 +0x8A86 +0x8A87 +0x8A8B +0x8A8C +0x8A8D +0x8A8F +0x8A91 +0x8A92 +0x8A93 +0x8A95 +0x8A96 +0x8A98 +0x8A99 +0x8A9A +0x8A9E +0x8AA0 +0x8AA1 +0x8AA3 +0x8AA4 +0x8AA5 +0x8AA6 +0x8AA7 +0x8AA8 +0x8AAA +0x8AAB +0x8AB0 +0x8AB2 +0x8AB6 +0x8AB8 +0x8AB9 +0x8ABA +0x8ABB +0x8ABC +0x8ABD +0x8ABE +0x8ABF +0x8AC0 +0x8AC2 +0x8AC3 +0x8AC4 +0x8AC5 +0x8AC6 +0x8AC7 +0x8AC8 +0x8AC9 +0x8ACB +0x8ACD +0x8ACF +0x8AD1 +0x8AD2 +0x8AD3 +0x8AD4 +0x8AD5 +0x8AD6 +0x8AD7 +0x8AD8 +0x8AD9 +0x8ADB +0x8ADC +0x8ADD +0x8ADE +0x8ADF +0x8AE0 +0x8AE1 +0x8AE2 +0x8AE4 +0x8AE6 +0x8AE7 +0x8AE8 +0x8AEB +0x8AED +0x8AEE +0x8AEF +0x8AF0 +0x8AF1 +0x8AF2 +0x8AF3 +0x8AF4 +0x8AF5 +0x8AF6 +0x8AF7 +0x8AF8 +0x8AFA +0x8AFB +0x8AFC +0x8AFE +0x8AFF +0x8B00 +0x8B01 +0x8B02 +0x8B04 +0x8B05 +0x8B06 +0x8B07 +0x8B08 +0x8B0A +0x8B0B +0x8B0D +0x8B0E +0x8B0F +0x8B10 +0x8B11 +0x8B12 +0x8B13 +0x8B14 +0x8B15 +0x8B16 +0x8B17 +0x8B18 +0x8B19 +0x8B1A +0x8B1B +0x8B1C +0x8B1D +0x8B1E +0x8B20 +0x8B22 +0x8B23 +0x8B24 +0x8B25 +0x8B26 +0x8B27 +0x8B28 +0x8B2A +0x8B2B +0x8B2C +0x8B2E +0x8B2F +0x8B30 +0x8B31 +0x8B33 +0x8B35 +0x8B36 +0x8B37 +0x8B39 +0x8B3A +0x8B3B +0x8B3C +0x8B3D +0x8B3E +0x8B40 +0x8B41 +0x8B42 +0x8B45 +0x8B46 +0x8B47 +0x8B48 +0x8B49 +0x8B4A +0x8B4B +0x8B4E +0x8B4F +0x8B50 +0x8B51 +0x8B52 +0x8B53 +0x8B54 +0x8B55 +0x8B56 +0x8B57 +0x8B58 +0x8B59 +0x8B5A +0x8B5C +0x8B5D +0x8B5F +0x8B60 +0x8B63 +0x8B65 +0x8B66 +0x8B67 +0x8B68 +0x8B6A +0x8B6B +0x8B6C +0x8B6D +0x8B6F +0x8B70 +0x8B74 +0x8B77 +0x8B78 +0x8B79 +0x8B7A +0x8B7B +0x8B7D +0x8B7E +0x8B7F +0x8B80 +0x8B82 +0x8B84 +0x8B85 +0x8B86 +0x8B88 +0x8B8A +0x8B8B +0x8B8C +0x8B8E +0x8B92 +0x8B93 +0x8B94 +0x8B95 +0x8B96 +0x8B98 +0x8B99 +0x8B9A +0x8B9C +0x8B9E +0x8B9F +0x8C37 +0x8C39 +0x8C3B +0x8C3C +0x8C3D +0x8C3E +0x8C3F +0x8C41 +0x8C42 +0x8C43 +0x8C45 +0x8C46 +0x8C47 +0x8C48 +0x8C49 +0x8C4A +0x8C4B +0x8C4C +0x8C4D +0x8C4E +0x8C4F +0x8C50 +0x8C54 +0x8C55 +0x8C56 +0x8C57 +0x8C5A +0x8C5C +0x8C5D +0x8C5F +0x8C61 +0x8C62 +0x8C64 +0x8C65 +0x8C66 +0x8C68 +0x8C69 +0x8C6A +0x8C6B +0x8C6C +0x8C6D +0x8C6F +0x8C70 +0x8C71 +0x8C72 +0x8C73 +0x8C75 +0x8C76 +0x8C77 +0x8C78 +0x8C79 +0x8C7A +0x8C7B +0x8C7D +0x8C80 +0x8C81 +0x8C82 +0x8C84 +0x8C85 +0x8C86 +0x8C89 +0x8C8A +0x8C8C +0x8C8D +0x8C8F +0x8C90 +0x8C91 +0x8C92 +0x8C93 +0x8C94 +0x8C95 +0x8C97 +0x8C98 +0x8C99 +0x8C9A +0x8C9C +0x8C9D +0x8C9E +0x8CA0 +0x8CA1 +0x8CA2 +0x8CA3 +0x8CA4 +0x8CA5 +0x8CA7 +0x8CA8 +0x8CA9 +0x8CAA +0x8CAB +0x8CAC +0x8CAF +0x8CB0 +0x8CB2 +0x8CB3 +0x8CB4 +0x8CB5 +0x8CB6 +0x8CB7 +0x8CB8 +0x8CB9 +0x8CBA +0x8CBB +0x8CBC +0x8CBD +0x8CBE +0x8CBF +0x8CC0 +0x8CC1 +0x8CC2 +0x8CC3 +0x8CC4 +0x8CC5 +0x8CC7 +0x8CC8 +0x8CCA +0x8CCC +0x8CCF +0x8CD1 +0x8CD2 +0x8CD3 +0x8CD5 +0x8CD7 +0x8CD9 +0x8CDA +0x8CDC +0x8CDD +0x8CDE +0x8CDF +0x8CE0 +0x8CE1 +0x8CE2 +0x8CE3 +0x8CE4 +0x8CE5 +0x8CE6 +0x8CE7 +0x8CE8 +0x8CEA +0x8CEC +0x8CED +0x8CEE +0x8CF0 +0x8CF1 +0x8CF3 +0x8CF4 +0x8CF5 +0x8CF8 +0x8CF9 +0x8CFA +0x8CFB +0x8CFC +0x8CFD +0x8CFE +0x8D00 +0x8D02 +0x8D04 +0x8D05 +0x8D06 +0x8D07 +0x8D08 +0x8D09 +0x8D0A +0x8D0D +0x8D0F +0x8D10 +0x8D13 +0x8D14 +0x8D15 +0x8D16 +0x8D17 +0x8D19 +0x8D1B +0x8D64 +0x8D66 +0x8D67 +0x8D68 +0x8D69 +0x8D6B +0x8D6C +0x8D6D +0x8D6E +0x8D6F +0x8D70 +0x8D72 +0x8D73 +0x8D74 +0x8D76 +0x8D77 +0x8D78 +0x8D79 +0x8D7B +0x8D7D +0x8D80 +0x8D81 +0x8D84 +0x8D85 +0x8D89 +0x8D8A +0x8D8C +0x8D8D +0x8D8E +0x8D8F +0x8D90 +0x8D91 +0x8D92 +0x8D93 +0x8D94 +0x8D95 +0x8D96 +0x8D99 +0x8D9B +0x8D9C +0x8D9F +0x8DA0 +0x8DA1 +0x8DA3 +0x8DA5 +0x8DA7 +0x8DA8 +0x8DAA +0x8DAB +0x8DAC +0x8DAD +0x8DAE +0x8DAF +0x8DB2 +0x8DB3 +0x8DB4 +0x8DB5 +0x8DB6 +0x8DB7 +0x8DB9 +0x8DBA +0x8DBC +0x8DBE +0x8DBF +0x8DC1 +0x8DC2 +0x8DC5 +0x8DC6 +0x8DC7 +0x8DC8 +0x8DCB +0x8DCC +0x8DCD +0x8DCE +0x8DCF +0x8DD0 +0x8DD1 +0x8DD3 +0x8DD5 +0x8DD6 +0x8DD7 +0x8DD8 +0x8DD9 +0x8DDA +0x8DDB +0x8DDC +0x8DDD +0x8DDF +0x8DE0 +0x8DE1 +0x8DE2 +0x8DE3 +0x8DE4 +0x8DE6 +0x8DE7 +0x8DE8 +0x8DE9 +0x8DEA +0x8DEB +0x8DEC +0x8DEE +0x8DEF +0x8DF0 +0x8DF1 +0x8DF2 +0x8DF3 +0x8DF4 +0x8DFA +0x8DFC +0x8DFD +0x8DFE +0x8DFF +0x8E00 +0x8E02 +0x8E03 +0x8E04 +0x8E05 +0x8E06 +0x8E07 +0x8E09 +0x8E0A +0x8E0D +0x8E0F +0x8E10 +0x8E11 +0x8E12 +0x8E13 +0x8E14 +0x8E15 +0x8E16 +0x8E17 +0x8E18 +0x8E19 +0x8E1A +0x8E1B +0x8E1C +0x8E1D +0x8E1E +0x8E1F +0x8E20 +0x8E21 +0x8E22 +0x8E23 +0x8E24 +0x8E25 +0x8E26 +0x8E27 +0x8E29 +0x8E2B +0x8E2E +0x8E30 +0x8E31 +0x8E33 +0x8E34 +0x8E35 +0x8E36 +0x8E38 +0x8E39 +0x8E3C +0x8E3D +0x8E3E +0x8E3F +0x8E40 +0x8E41 +0x8E42 +0x8E44 +0x8E45 +0x8E47 +0x8E48 +0x8E49 +0x8E4A +0x8E4B +0x8E4C +0x8E4D +0x8E4E +0x8E50 +0x8E53 +0x8E54 +0x8E55 +0x8E56 +0x8E57 +0x8E59 +0x8E5A +0x8E5B +0x8E5C +0x8E5D +0x8E5E +0x8E5F +0x8E60 +0x8E61 +0x8E62 +0x8E63 +0x8E64 +0x8E65 +0x8E66 +0x8E67 +0x8E69 +0x8E6A +0x8E6C +0x8E6D +0x8E6F +0x8E72 +0x8E73 +0x8E74 +0x8E76 +0x8E78 +0x8E7A +0x8E7B +0x8E7C +0x8E81 +0x8E82 +0x8E84 +0x8E85 +0x8E86 +0x8E87 +0x8E88 +0x8E89 +0x8E8A +0x8E8B +0x8E8C +0x8E8D +0x8E8E +0x8E90 +0x8E91 +0x8E92 +0x8E93 +0x8E94 +0x8E95 +0x8E96 +0x8E97 +0x8E98 +0x8E9A +0x8E9D +0x8E9E +0x8E9F +0x8EA0 +0x8EA1 +0x8EA3 +0x8EA4 +0x8EA5 +0x8EA6 +0x8EA8 +0x8EA9 +0x8EAA +0x8EAB +0x8EAC +0x8EB2 +0x8EBA +0x8EBD +0x8EC0 +0x8EC2 +0x8EC9 +0x8ECA +0x8ECB +0x8ECC +0x8ECD +0x8ECF +0x8ED1 +0x8ED2 +0x8ED3 +0x8ED4 +0x8ED7 +0x8ED8 +0x8EDB +0x8EDC +0x8EDD +0x8EDE +0x8EDF +0x8EE0 +0x8EE1 +0x8EE5 +0x8EE6 +0x8EE7 +0x8EE8 +0x8EE9 +0x8EEB +0x8EEC +0x8EEE +0x8EEF +0x8EF1 +0x8EF4 +0x8EF5 +0x8EF6 +0x8EF7 +0x8EF8 +0x8EF9 +0x8EFA +0x8EFB +0x8EFC +0x8EFE +0x8EFF +0x8F00 +0x8F01 +0x8F02 +0x8F03 +0x8F05 +0x8F06 +0x8F07 +0x8F08 +0x8F09 +0x8F0A +0x8F0B +0x8F0D +0x8F0E +0x8F10 +0x8F11 +0x8F12 +0x8F13 +0x8F14 +0x8F15 +0x8F16 +0x8F17 +0x8F18 +0x8F1A +0x8F1B +0x8F1C +0x8F1D +0x8F1E +0x8F1F +0x8F20 +0x8F23 +0x8F24 +0x8F25 +0x8F26 +0x8F29 +0x8F2A +0x8F2C +0x8F2E +0x8F2F +0x8F32 +0x8F33 +0x8F34 +0x8F35 +0x8F36 +0x8F37 +0x8F38 +0x8F39 +0x8F3B +0x8F3E +0x8F3F +0x8F40 +0x8F42 +0x8F43 +0x8F44 +0x8F45 +0x8F46 +0x8F47 +0x8F48 +0x8F49 +0x8F4B +0x8F4D +0x8F4E +0x8F4F +0x8F50 +0x8F51 +0x8F52 +0x8F53 +0x8F54 +0x8F55 +0x8F56 +0x8F57 +0x8F58 +0x8F59 +0x8F5A +0x8F5B +0x8F5D +0x8F5E +0x8F5F +0x8F60 +0x8F61 +0x8F62 +0x8F63 +0x8F64 +0x8F9B +0x8F9C +0x8F9F +0x8FA3 +0x8FA6 +0x8FA8 +0x8FAD +0x8FAE +0x8FAF +0x8FB0 +0x8FB1 +0x8FB2 +0x8FB4 +0x8FBF +0x8FC2 +0x8FC4 +0x8FC5 +0x8FC6 +0x8FC9 +0x8FCB +0x8FCD +0x8FCE +0x8FD1 +0x8FD2 +0x8FD3 +0x8FD4 +0x8FD5 +0x8FD6 +0x8FD7 +0x8FE0 +0x8FE1 +0x8FE2 +0x8FE3 +0x8FE4 +0x8FE5 +0x8FE6 +0x8FE8 +0x8FEA +0x8FEB +0x8FED +0x8FEE +0x8FF0 +0x8FF4 +0x8FF5 +0x8FF6 +0x8FF7 +0x8FF8 +0x8FFA +0x8FFB +0x8FFC +0x8FFD +0x8FFE +0x8FFF +0x9000 +0x9001 +0x9002 +0x9003 +0x9004 +0x9005 +0x9006 +0x900B +0x900C +0x900D +0x900F +0x9010 +0x9011 +0x9014 +0x9015 +0x9016 +0x9017 +0x9019 +0x901A +0x901B +0x901C +0x901D +0x901E +0x901F +0x9020 +0x9021 +0x9022 +0x9023 +0x9024 +0x902D +0x902E +0x902F +0x9031 +0x9032 +0x9034 +0x9035 +0x9036 +0x9038 +0x903C +0x903D +0x903E +0x903F +0x9041 +0x9042 +0x9044 +0x9047 +0x9049 +0x904A +0x904B +0x904D +0x904E +0x904F +0x9050 +0x9051 +0x9052 +0x9053 +0x9054 +0x9055 +0x9058 +0x9059 +0x905B +0x905C +0x905D +0x905E +0x9060 +0x9062 +0x9063 +0x9067 +0x9068 +0x9069 +0x906B +0x906D +0x906E +0x906F +0x9070 +0x9072 +0x9073 +0x9074 +0x9075 +0x9076 +0x9077 +0x9078 +0x9079 +0x907A +0x907B +0x907C +0x907D +0x907E +0x907F +0x9080 +0x9081 +0x9082 +0x9083 +0x9084 +0x9085 +0x9086 +0x9087 +0x9088 +0x908A +0x908B +0x908D +0x908F +0x9090 +0x9091 +0x9094 +0x9095 +0x9097 +0x9098 +0x9099 +0x909B +0x909E +0x909F +0x90A0 +0x90A1 +0x90A2 +0x90A3 +0x90A5 +0x90A6 +0x90A7 +0x90AA +0x90AF +0x90B0 +0x90B1 +0x90B2 +0x90B3 +0x90B4 +0x90B5 +0x90B6 +0x90B8 +0x90BD +0x90BE +0x90BF +0x90C1 +0x90C3 +0x90C5 +0x90C7 +0x90C8 +0x90CA +0x90CB +0x90CE +0x90D4 +0x90D5 +0x90D6 +0x90D7 +0x90D8 +0x90D9 +0x90DA +0x90DB +0x90DC +0x90DD +0x90DF +0x90E0 +0x90E1 +0x90E2 +0x90E3 +0x90E4 +0x90E5 +0x90E8 +0x90E9 +0x90EA +0x90EB +0x90EC +0x90ED +0x90EF +0x90F0 +0x90F1 +0x90F2 +0x90F3 +0x90F4 +0x90F5 +0x90F9 +0x90FA +0x90FB +0x90FC +0x90FD +0x90FE +0x90FF +0x9100 +0x9101 +0x9102 +0x9103 +0x9104 +0x9105 +0x9106 +0x9107 +0x9108 +0x9109 +0x910B +0x910D +0x910E +0x910F +0x9110 +0x9111 +0x9112 +0x9114 +0x9116 +0x9117 +0x9118 +0x9119 +0x911A +0x911B +0x911C +0x911D +0x911E +0x911F +0x9120 +0x9121 +0x9122 +0x9123 +0x9124 +0x9126 +0x9127 +0x9128 +0x9129 +0x912A +0x912B +0x912C +0x912D +0x912E +0x912F +0x9130 +0x9131 +0x9132 +0x9133 +0x9134 +0x9135 +0x9136 +0x9138 +0x9139 +0x913A +0x913B +0x913E +0x913F +0x9140 +0x9141 +0x9143 +0x9144 +0x9145 +0x9146 +0x9147 +0x9148 +0x9149 +0x914A +0x914B +0x914C +0x914D +0x914E +0x914F +0x9150 +0x9152 +0x9153 +0x9155 +0x9156 +0x9157 +0x9158 +0x915A +0x915F +0x9160 +0x9161 +0x9162 +0x9163 +0x9164 +0x9165 +0x9168 +0x9169 +0x916A +0x916C +0x916E +0x916F +0x9172 +0x9173 +0x9174 +0x9175 +0x9177 +0x9178 +0x9179 +0x917A +0x9180 +0x9181 +0x9182 +0x9183 +0x9184 +0x9185 +0x9186 +0x9187 +0x9189 +0x918A +0x918B +0x918D +0x918F +0x9190 +0x9191 +0x9192 +0x9193 +0x9199 +0x919A +0x919B +0x919C +0x919D +0x919E +0x919F +0x91A0 +0x91A1 +0x91A2 +0x91A3 +0x91A5 +0x91A7 +0x91A8 +0x91AA +0x91AB +0x91AC +0x91AD +0x91AE +0x91AF +0x91B0 +0x91B1 +0x91B2 +0x91B3 +0x91B4 +0x91B5 +0x91B7 +0x91B9 +0x91BA +0x91BC +0x91BD +0x91BE +0x91C0 +0x91C1 +0x91C2 +0x91C3 +0x91C5 +0x91C6 +0x91C7 +0x91C9 +0x91CB +0x91CC +0x91CD +0x91CE +0x91CF +0x91D0 +0x91D1 +0x91D3 +0x91D4 +0x91D5 +0x91D7 +0x91D8 +0x91D9 +0x91DA +0x91DC +0x91DD +0x91E2 +0x91E3 +0x91E4 +0x91E6 +0x91E7 +0x91E8 +0x91E9 +0x91EA +0x91EB +0x91EC +0x91ED +0x91EE +0x91F1 +0x91F3 +0x91F4 +0x91F5 +0x91F7 +0x91F8 +0x91F9 +0x91FD +0x91FF +0x9200 +0x9201 +0x9202 +0x9203 +0x9204 +0x9205 +0x9206 +0x9207 +0x9209 +0x920A +0x920C +0x920D +0x920F +0x9210 +0x9211 +0x9212 +0x9214 +0x9215 +0x9216 +0x9217 +0x9219 +0x921A +0x921C +0x921E +0x9223 +0x9224 +0x9225 +0x9226 +0x9227 +0x922D +0x922E +0x9230 +0x9231 +0x9232 +0x9233 +0x9234 +0x9236 +0x9237 +0x9238 +0x9239 +0x923A +0x923D +0x923E +0x923F +0x9240 +0x9245 +0x9246 +0x9248 +0x9249 +0x924A +0x924B +0x924C +0x924D +0x924E +0x924F +0x9250 +0x9251 +0x9252 +0x9253 +0x9254 +0x9256 +0x9257 +0x925A +0x925B +0x925E +0x9260 +0x9261 +0x9263 +0x9264 +0x9265 +0x9266 +0x9267 +0x926C +0x926D +0x926F +0x9270 +0x9272 +0x9276 +0x9278 +0x9279 +0x927A +0x927B +0x927C +0x927D +0x927E +0x927F +0x9280 +0x9282 +0x9283 +0x9285 +0x9286 +0x9287 +0x9288 +0x928A +0x928B +0x928C +0x928D +0x928E +0x9291 +0x9293 +0x9294 +0x9295 +0x9296 +0x9297 +0x9298 +0x9299 +0x929A +0x929B +0x929C +0x929D +0x92A0 +0x92A1 +0x92A2 +0x92A3 +0x92A4 +0x92A5 +0x92A6 +0x92A7 +0x92A8 +0x92A9 +0x92AA +0x92AB +0x92AC +0x92B2 +0x92B3 +0x92B4 +0x92B5 +0x92B6 +0x92B7 +0x92BB +0x92BC +0x92C0 +0x92C1 +0x92C2 +0x92C3 +0x92C4 +0x92C5 +0x92C6 +0x92C7 +0x92C8 +0x92C9 +0x92CA +0x92CB +0x92CC +0x92CD +0x92CE +0x92CF +0x92D0 +0x92D1 +0x92D2 +0x92D3 +0x92D5 +0x92D7 +0x92D8 +0x92D9 +0x92DD +0x92DE +0x92DF +0x92E0 +0x92E1 +0x92E4 +0x92E6 +0x92E7 +0x92E8 +0x92E9 +0x92EA +0x92EE +0x92EF +0x92F0 +0x92F1 +0x92F7 +0x92F8 +0x92F9 +0x92FA +0x92FB +0x92FC +0x92FE +0x92FF +0x9300 +0x9301 +0x9302 +0x9304 +0x9306 +0x9308 +0x9309 +0x930B +0x930C +0x930D +0x930E +0x930F +0x9310 +0x9312 +0x9313 +0x9314 +0x9315 +0x9316 +0x9318 +0x9319 +0x931A +0x931B +0x931D +0x931E +0x931F +0x9320 +0x9321 +0x9322 +0x9323 +0x9324 +0x9325 +0x9326 +0x9327 +0x9328 +0x9329 +0x932A +0x932B +0x932D +0x932E +0x932F +0x9333 +0x9334 +0x9335 +0x9336 +0x9338 +0x9339 +0x933C +0x9346 +0x9347 +0x9349 +0x934A +0x934B +0x934C +0x934D +0x934E +0x934F +0x9350 +0x9351 +0x9352 +0x9354 +0x9355 +0x9356 +0x9357 +0x9358 +0x9359 +0x935A +0x935B +0x935C +0x935E +0x9360 +0x9361 +0x9363 +0x9364 +0x9365 +0x9367 +0x936A +0x936C +0x936D +0x9370 +0x9371 +0x9375 +0x9376 +0x9377 +0x9379 +0x937A +0x937B +0x937C +0x937E +0x9380 +0x9382 +0x9383 +0x9388 +0x9389 +0x938A +0x938C +0x938D +0x938E +0x938F +0x9391 +0x9392 +0x9394 +0x9395 +0x9396 +0x9397 +0x9398 +0x9399 +0x939A +0x939B +0x939D +0x939E +0x939F +0x93A1 +0x93A2 +0x93A3 +0x93A4 +0x93A5 +0x93A6 +0x93A7 +0x93A8 +0x93A9 +0x93AA +0x93AC +0x93AE +0x93AF +0x93B0 +0x93B1 +0x93B2 +0x93B3 +0x93B4 +0x93B5 +0x93B7 +0x93C0 +0x93C2 +0x93C3 +0x93C4 +0x93C7 +0x93C8 +0x93CA +0x93CC +0x93CD +0x93CE +0x93CF +0x93D0 +0x93D1 +0x93D2 +0x93D4 +0x93D5 +0x93D6 +0x93D7 +0x93D8 +0x93D9 +0x93DA +0x93DC +0x93DD +0x93DE +0x93DF +0x93E1 +0x93E2 +0x93E3 +0x93E4 +0x93E6 +0x93E7 +0x93E8 +0x93EC +0x93EE +0x93F5 +0x93F6 +0x93F7 +0x93F8 +0x93F9 +0x93FA +0x93FB +0x93FC +0x93FD +0x93FE +0x93FF +0x9400 +0x9403 +0x9406 +0x9407 +0x9409 +0x940A +0x940B +0x940C +0x940D +0x940E +0x940F +0x9410 +0x9411 +0x9412 +0x9413 +0x9414 +0x9415 +0x9416 +0x9418 +0x9419 +0x9420 +0x9428 +0x9429 +0x942A +0x942B +0x942C +0x942E +0x9430 +0x9431 +0x9432 +0x9433 +0x9435 +0x9436 +0x9437 +0x9438 +0x9439 +0x943A +0x943B +0x943C +0x943D +0x943F +0x9440 +0x9444 +0x9445 +0x9446 +0x9447 +0x9448 +0x9449 +0x944A +0x944B +0x944C +0x944F +0x9450 +0x9451 +0x9452 +0x9455 +0x9457 +0x945D +0x945E +0x9460 +0x9462 +0x9463 +0x9464 +0x9468 +0x9469 +0x946A +0x946B +0x946D +0x946E +0x946F +0x9470 +0x9471 +0x9472 +0x9473 +0x9474 +0x9475 +0x9476 +0x9477 +0x9478 +0x947C +0x947D +0x947E +0x947F +0x9480 +0x9481 +0x9482 +0x9483 +0x9577 +0x957A +0x957B +0x957C +0x957D +0x9580 +0x9582 +0x9583 +0x9586 +0x9588 +0x9589 +0x958B +0x958C +0x958D +0x958E +0x958F +0x9590 +0x9591 +0x9592 +0x9593 +0x9594 +0x9598 +0x959B +0x959C +0x959E +0x959F +0x95A1 +0x95A3 +0x95A4 +0x95A5 +0x95A8 +0x95A9 +0x95AB +0x95AC +0x95AD +0x95AE +0x95B0 +0x95B1 +0x95B5 +0x95B6 +0x95B7 +0x95B9 +0x95BA +0x95BB +0x95BC +0x95BD +0x95BE +0x95BF +0x95C0 +0x95C3 +0x95C5 +0x95C6 +0x95C7 +0x95C8 +0x95C9 +0x95CA +0x95CB +0x95CC +0x95CD +0x95D0 +0x95D1 +0x95D2 +0x95D3 +0x95D4 +0x95D5 +0x95D6 +0x95DA +0x95DB +0x95DC +0x95DE +0x95DF +0x95E0 +0x95E1 +0x95E2 +0x95E3 +0x95E4 +0x95E5 +0x961C +0x961E +0x9620 +0x9621 +0x9622 +0x9623 +0x9624 +0x9628 +0x962A +0x962C +0x962D +0x962E +0x962F +0x9630 +0x9631 +0x9632 +0x9639 +0x963A +0x963B +0x963C +0x963D +0x963F +0x9640 +0x9642 +0x9643 +0x9644 +0x964A +0x964B +0x964C +0x964D +0x964E +0x964F +0x9650 +0x9651 +0x9653 +0x9654 +0x9658 +0x965B +0x965C +0x965D +0x965E +0x965F +0x9661 +0x9662 +0x9663 +0x9664 +0x966A +0x966B +0x966C +0x966D +0x966F +0x9670 +0x9671 +0x9672 +0x9673 +0x9674 +0x9675 +0x9676 +0x9677 +0x9678 +0x967C +0x967D +0x967E +0x9680 +0x9683 +0x9684 +0x9685 +0x9686 +0x9687 +0x9688 +0x9689 +0x968A +0x968B +0x968D +0x968E +0x9691 +0x9692 +0x9693 +0x9694 +0x9695 +0x9697 +0x9698 +0x9699 +0x969B +0x969C +0x969E +0x96A1 +0x96A2 +0x96A4 +0x96A7 +0x96A8 +0x96A9 +0x96AA +0x96AC +0x96AE +0x96B0 +0x96B1 +0x96B3 +0x96B4 +0x96B8 +0x96B9 +0x96BB +0x96BC +0x96BF +0x96C0 +0x96C1 +0x96C2 +0x96C3 +0x96C4 +0x96C5 +0x96C6 +0x96C7 +0x96C8 +0x96C9 +0x96CA +0x96CB +0x96CC +0x96CD +0x96CE +0x96D2 +0x96D3 +0x96D4 +0x96D5 +0x96D6 +0x96D7 +0x96D8 +0x96D9 +0x96DA +0x96DB +0x96DC +0x96DD +0x96DE +0x96DF +0x96E1 +0x96E2 +0x96E3 +0x96E5 +0x96E8 +0x96E9 +0x96EA +0x96EF +0x96F0 +0x96F1 +0x96F2 +0x96F5 +0x96F6 +0x96F7 +0x96F8 +0x96F9 +0x96FA +0x96FB +0x96FD +0x96FF +0x9700 +0x9702 +0x9704 +0x9705 +0x9706 +0x9707 +0x9708 +0x9709 +0x970B +0x970D +0x970E +0x970F +0x9710 +0x9711 +0x9712 +0x9713 +0x9716 +0x9718 +0x9719 +0x971C +0x971D +0x971E +0x971F +0x9720 +0x9722 +0x9723 +0x9724 +0x9725 +0x9726 +0x9727 +0x9728 +0x9729 +0x972A +0x972B +0x972C +0x972E +0x972F +0x9730 +0x9732 +0x9735 +0x9738 +0x9739 +0x973A +0x973D +0x973E +0x973F +0x9742 +0x9743 +0x9744 +0x9746 +0x9747 +0x9748 +0x9749 +0x974B +0x9752 +0x9756 +0x9758 +0x975A +0x975B +0x975C +0x975E +0x9760 +0x9761 +0x9762 +0x9766 +0x9768 +0x9769 +0x976A +0x976C +0x976E +0x9770 +0x9772 +0x9773 +0x9774 +0x9776 +0x9777 +0x9778 +0x977A +0x977B +0x977C +0x977D +0x977E +0x977F +0x9780 +0x9781 +0x9782 +0x9783 +0x9784 +0x9785 +0x9788 +0x978A +0x978B +0x978D +0x978E +0x978F +0x9794 +0x9797 +0x9798 +0x9799 +0x979A +0x979C +0x979D +0x979E +0x97A0 +0x97A1 +0x97A2 +0x97A3 +0x97A4 +0x97A5 +0x97A6 +0x97A8 +0x97AA +0x97AB +0x97AC +0x97AD +0x97AE +0x97B3 +0x97B6 +0x97B7 +0x97B9 +0x97BB +0x97BF +0x97C1 +0x97C3 +0x97C4 +0x97C5 +0x97C6 +0x97C7 +0x97C9 +0x97CB +0x97CC +0x97CD +0x97CE +0x97CF +0x97D0 +0x97D3 +0x97D4 +0x97D5 +0x97D6 +0x97D7 +0x97D8 +0x97D9 +0x97DC +0x97DD +0x97DE +0x97DF +0x97E1 +0x97E3 +0x97E5 +0x97ED +0x97F0 +0x97F1 +0x97F3 +0x97F6 +0x97F8 +0x97F9 +0x97FA +0x97FB +0x97FD +0x97FE +0x97FF +0x9800 +0x9801 +0x9802 +0x9803 +0x9804 +0x9805 +0x9806 +0x9807 +0x9808 +0x980A +0x980C +0x980D +0x980E +0x980F +0x9810 +0x9811 +0x9812 +0x9813 +0x9816 +0x9817 +0x9818 +0x981B +0x981C +0x981D +0x981E +0x9820 +0x9821 +0x9824 +0x9826 +0x9827 +0x9828 +0x9829 +0x982B +0x982D +0x982F +0x9830 +0x9832 +0x9835 +0x9837 +0x9838 +0x9839 +0x983B +0x9841 +0x9843 +0x9844 +0x9845 +0x9846 +0x9848 +0x9849 +0x984A +0x984C +0x984D +0x984E +0x984F +0x9850 +0x9851 +0x9852 +0x9853 +0x9857 +0x9858 +0x9859 +0x985B +0x985C +0x985D +0x985E +0x985F +0x9860 +0x9862 +0x9863 +0x9864 +0x9865 +0x9867 +0x9869 +0x986A +0x986B +0x986F +0x9870 +0x9871 +0x9872 +0x9873 +0x9874 +0x98A8 +0x98A9 +0x98AC +0x98AD +0x98AE +0x98AF +0x98B1 +0x98B2 +0x98B3 +0x98B6 +0x98B8 +0x98BA +0x98BB +0x98BC +0x98BD +0x98BE +0x98BF +0x98C0 +0x98C1 +0x98C2 +0x98C4 +0x98C6 +0x98C9 +0x98CB +0x98CC +0x98DB +0x98DF +0x98E2 +0x98E3 +0x98E5 +0x98E7 +0x98E9 +0x98EA +0x98EB +0x98ED +0x98EF +0x98F2 +0x98F4 +0x98F6 +0x98F9 +0x98FA +0x98FC +0x98FD +0x98FE +0x9900 +0x9902 +0x9903 +0x9905 +0x9907 +0x9908 +0x9909 +0x990A +0x990C +0x9910 +0x9911 +0x9912 +0x9913 +0x9914 +0x9915 +0x9916 +0x9917 +0x9918 +0x991A +0x991B +0x991E +0x991F +0x9921 +0x9924 +0x9925 +0x9927 +0x9928 +0x9929 +0x992A +0x992B +0x992C +0x992D +0x992E +0x992F +0x9930 +0x9931 +0x9932 +0x9933 +0x9935 +0x993A +0x993C +0x993D +0x993E +0x993F +0x9941 +0x9943 +0x9945 +0x9947 +0x9948 +0x9949 +0x994B +0x994C +0x994E +0x9950 +0x9951 +0x9952 +0x9953 +0x9954 +0x9955 +0x9956 +0x9957 +0x9958 +0x9959 +0x995B +0x995C +0x995E +0x995F +0x9961 +0x9996 +0x9997 +0x9998 +0x9999 +0x999C +0x999D +0x999E +0x99A1 +0x99A3 +0x99A5 +0x99A6 +0x99A7 +0x99A8 +0x99AB +0x99AC +0x99AD +0x99AE +0x99AF +0x99B0 +0x99B1 +0x99B2 +0x99B3 +0x99B4 +0x99B5 +0x99B9 +0x99BA +0x99BB +0x99BD +0x99C1 +0x99C2 +0x99C3 +0x99C7 +0x99C9 +0x99CB +0x99CC +0x99CD +0x99CE +0x99CF +0x99D0 +0x99D1 +0x99D2 +0x99D3 +0x99D4 +0x99D5 +0x99D6 +0x99D7 +0x99D8 +0x99D9 +0x99DB +0x99DC +0x99DD +0x99DF +0x99E2 +0x99E3 +0x99E4 +0x99E5 +0x99E7 +0x99E9 +0x99EA +0x99EC +0x99ED +0x99EE +0x99F0 +0x99F1 +0x99F4 +0x99F6 +0x99F7 +0x99F8 +0x99F9 +0x99FA +0x99FB +0x99FC +0x99FD +0x99FE +0x99FF +0x9A01 +0x9A02 +0x9A03 +0x9A04 +0x9A05 +0x9A06 +0x9A07 +0x9A09 +0x9A0A +0x9A0B +0x9A0D +0x9A0E +0x9A0F +0x9A11 +0x9A14 +0x9A15 +0x9A16 +0x9A19 +0x9A1A +0x9A1B +0x9A1C +0x9A1D +0x9A1E +0x9A20 +0x9A22 +0x9A23 +0x9A24 +0x9A25 +0x9A27 +0x9A29 +0x9A2A +0x9A2B +0x9A2C +0x9A2D +0x9A2E +0x9A30 +0x9A31 +0x9A32 +0x9A34 +0x9A35 +0x9A36 +0x9A37 +0x9A38 +0x9A39 +0x9A3A +0x9A3D +0x9A3E +0x9A3F +0x9A40 +0x9A41 +0x9A42 +0x9A43 +0x9A44 +0x9A45 +0x9A46 +0x9A48 +0x9A49 +0x9A4A +0x9A4C +0x9A4D +0x9A4E +0x9A4F +0x9A50 +0x9A52 +0x9A53 +0x9A54 +0x9A55 +0x9A56 +0x9A57 +0x9A59 +0x9A5A +0x9A5B +0x9A5E +0x9A5F +0x9A60 +0x9A62 +0x9A64 +0x9A65 +0x9A66 +0x9A67 +0x9A68 +0x9A69 +0x9A6A +0x9A6B +0x9AA8 +0x9AAB +0x9AAD +0x9AAF +0x9AB0 +0x9AB1 +0x9AB3 +0x9AB4 +0x9AB7 +0x9AB8 +0x9AB9 +0x9ABB +0x9ABC +0x9ABE +0x9ABF +0x9AC0 +0x9AC1 +0x9AC2 +0x9AC6 +0x9AC7 +0x9ACA +0x9ACD +0x9ACF +0x9AD0 +0x9AD1 +0x9AD2 +0x9AD3 +0x9AD4 +0x9AD5 +0x9AD6 +0x9AD8 +0x9ADC +0x9ADF +0x9AE1 +0x9AE3 +0x9AE6 +0x9AE7 +0x9AEB +0x9AEC +0x9AED +0x9AEE +0x9AEF +0x9AF1 +0x9AF2 +0x9AF3 +0x9AF6 +0x9AF7 +0x9AF9 +0x9AFA +0x9AFB +0x9AFC +0x9AFD +0x9AFE +0x9B01 +0x9B03 +0x9B04 +0x9B05 +0x9B06 +0x9B08 +0x9B0A +0x9B0B +0x9B0C +0x9B0D +0x9B0E +0x9B10 +0x9B11 +0x9B12 +0x9B15 +0x9B16 +0x9B17 +0x9B18 +0x9B19 +0x9B1A +0x9B1E +0x9B1F +0x9B20 +0x9B22 +0x9B23 +0x9B24 +0x9B25 +0x9B27 +0x9B28 +0x9B29 +0x9B2B +0x9B2E +0x9B2F +0x9B31 +0x9B32 +0x9B33 +0x9B35 +0x9B37 +0x9B3A +0x9B3B +0x9B3C +0x9B3E +0x9B3F +0x9B41 +0x9B42 +0x9B43 +0x9B44 +0x9B45 +0x9B46 +0x9B48 +0x9B4A +0x9B4B +0x9B4C +0x9B4D +0x9B4E +0x9B4F +0x9B51 +0x9B52 +0x9B54 +0x9B55 +0x9B56 +0x9B58 +0x9B59 +0x9B5A +0x9B5B +0x9B5F +0x9B60 +0x9B61 +0x9B64 +0x9B66 +0x9B67 +0x9B68 +0x9B6C +0x9B6F +0x9B70 +0x9B71 +0x9B74 +0x9B75 +0x9B76 +0x9B77 +0x9B7A +0x9B7B +0x9B7C +0x9B7D +0x9B7E +0x9B80 +0x9B82 +0x9B85 +0x9B86 +0x9B87 +0x9B88 +0x9B90 +0x9B91 +0x9B92 +0x9B93 +0x9B95 +0x9B9A +0x9B9B +0x9B9E +0x9BA0 +0x9BA1 +0x9BA2 +0x9BA4 +0x9BA5 +0x9BA6 +0x9BA8 +0x9BAA +0x9BAB +0x9BAD +0x9BAE +0x9BAF +0x9BB5 +0x9BB6 +0x9BB8 +0x9BB9 +0x9BBD +0x9BBF +0x9BC0 +0x9BC1 +0x9BC3 +0x9BC4 +0x9BC6 +0x9BC7 +0x9BC8 +0x9BC9 +0x9BCA +0x9BD3 +0x9BD4 +0x9BD5 +0x9BD6 +0x9BD7 +0x9BD9 +0x9BDA +0x9BDB +0x9BDC +0x9BDE +0x9BE0 +0x9BE1 +0x9BE2 +0x9BE4 +0x9BE5 +0x9BE6 +0x9BE7 +0x9BE8 +0x9BEA +0x9BEB +0x9BEC +0x9BF0 +0x9BF7 +0x9BF8 +0x9BFD +0x9C05 +0x9C06 +0x9C07 +0x9C08 +0x9C09 +0x9C0B +0x9C0D +0x9C0E +0x9C12 +0x9C13 +0x9C14 +0x9C17 +0x9C1C +0x9C1D +0x9C21 +0x9C23 +0x9C24 +0x9C25 +0x9C28 +0x9C29 +0x9C2B +0x9C2C +0x9C2D +0x9C31 +0x9C32 +0x9C33 +0x9C34 +0x9C36 +0x9C37 +0x9C39 +0x9C3B +0x9C3C +0x9C3D +0x9C3E +0x9C3F +0x9C40 +0x9C41 +0x9C44 +0x9C46 +0x9C48 +0x9C49 +0x9C4A +0x9C4B +0x9C4C +0x9C4D +0x9C4E +0x9C50 +0x9C52 +0x9C54 +0x9C55 +0x9C56 +0x9C57 +0x9C58 +0x9C59 +0x9C5E +0x9C5F +0x9C60 +0x9C62 +0x9C63 +0x9C66 +0x9C67 +0x9C68 +0x9C6D +0x9C6E +0x9C71 +0x9C73 +0x9C74 +0x9C75 +0x9C77 +0x9C78 +0x9C79 +0x9C7A +0x9CE5 +0x9CE6 +0x9CE7 +0x9CE9 +0x9CEA +0x9CED +0x9CF1 +0x9CF2 +0x9CF3 +0x9CF4 +0x9CF5 +0x9CF6 +0x9CF7 +0x9CF9 +0x9CFA +0x9CFB +0x9CFC +0x9CFD +0x9CFF +0x9D00 +0x9D03 +0x9D04 +0x9D05 +0x9D06 +0x9D07 +0x9D08 +0x9D09 +0x9D10 +0x9D12 +0x9D14 +0x9D15 +0x9D17 +0x9D18 +0x9D19 +0x9D1B +0x9D1D +0x9D1E +0x9D1F +0x9D20 +0x9D22 +0x9D23 +0x9D25 +0x9D26 +0x9D28 +0x9D29 +0x9D2D +0x9D2E +0x9D2F +0x9D30 +0x9D31 +0x9D33 +0x9D36 +0x9D37 +0x9D38 +0x9D3B +0x9D3D +0x9D3E +0x9D3F +0x9D40 +0x9D41 +0x9D42 +0x9D43 +0x9D45 +0x9D4A +0x9D4B +0x9D4C +0x9D4F +0x9D51 +0x9D52 +0x9D53 +0x9D54 +0x9D56 +0x9D57 +0x9D58 +0x9D59 +0x9D5A +0x9D5B +0x9D5C +0x9D5D +0x9D5F +0x9D60 +0x9D61 +0x9D67 +0x9D68 +0x9D69 +0x9D6A +0x9D6B +0x9D6C +0x9D6F +0x9D70 +0x9D71 +0x9D72 +0x9D73 +0x9D74 +0x9D75 +0x9D77 +0x9D78 +0x9D79 +0x9D7B +0x9D7D +0x9D7F +0x9D80 +0x9D81 +0x9D82 +0x9D84 +0x9D85 +0x9D86 +0x9D87 +0x9D88 +0x9D89 +0x9D8A +0x9D8B +0x9D8C +0x9D90 +0x9D92 +0x9D94 +0x9D96 +0x9D97 +0x9D98 +0x9D99 +0x9D9A +0x9D9B +0x9D9C +0x9D9D +0x9D9E +0x9D9F +0x9DA0 +0x9DA1 +0x9DA2 +0x9DA3 +0x9DA4 +0x9DA6 +0x9DA7 +0x9DA8 +0x9DA9 +0x9DAA +0x9DAC +0x9DAD +0x9DAF +0x9DB1 +0x9DB2 +0x9DB3 +0x9DB4 +0x9DB5 +0x9DB6 +0x9DB7 +0x9DB8 +0x9DB9 +0x9DBA +0x9DBB +0x9DBC +0x9DBE +0x9DBF +0x9DC1 +0x9DC2 +0x9DC3 +0x9DC5 +0x9DC7 +0x9DC8 +0x9DCA +0x9DCB +0x9DCC +0x9DCD +0x9DCE +0x9DCF +0x9DD0 +0x9DD1 +0x9DD2 +0x9DD3 +0x9DD5 +0x9DD6 +0x9DD7 +0x9DD8 +0x9DD9 +0x9DDA +0x9DDB +0x9DDC +0x9DDD +0x9DDE +0x9DDF +0x9DE1 +0x9DE2 +0x9DE3 +0x9DE4 +0x9DE5 +0x9DE6 +0x9DE8 +0x9DE9 +0x9DEB +0x9DEC +0x9DED +0x9DEE +0x9DEF +0x9DF0 +0x9DF2 +0x9DF3 +0x9DF4 +0x9DF5 +0x9DF6 +0x9DF7 +0x9DF8 +0x9DF9 +0x9DFA +0x9DFB +0x9DFD +0x9DFE +0x9DFF +0x9E00 +0x9E01 +0x9E02 +0x9E03 +0x9E04 +0x9E05 +0x9E06 +0x9E07 +0x9E09 +0x9E0B +0x9E0D +0x9E0F +0x9E10 +0x9E11 +0x9E12 +0x9E13 +0x9E14 +0x9E15 +0x9E17 +0x9E19 +0x9E1A +0x9E1B +0x9E1D +0x9E1E +0x9E75 +0x9E79 +0x9E7A +0x9E7C +0x9E7D +0x9E7F +0x9E80 +0x9E82 +0x9E83 +0x9E86 +0x9E87 +0x9E88 +0x9E89 +0x9E8A +0x9E8B +0x9E8C +0x9E8D +0x9E8E +0x9E91 +0x9E92 +0x9E93 +0x9E94 +0x9E97 +0x9E99 +0x9E9A +0x9E9B +0x9E9C +0x9E9D +0x9E9F +0x9EA0 +0x9EA1 +0x9EA4 +0x9EA5 +0x9EA7 +0x9EA9 +0x9EAD +0x9EAE +0x9EB0 +0x9EB4 +0x9EB5 +0x9EB6 +0x9EB7 +0x9EBB +0x9EBC +0x9EBE +0x9EC0 +0x9EC2 +0x9EC3 +0x9EC8 +0x9ECC +0x9ECD +0x9ECE +0x9ECF +0x9ED0 +0x9ED1 +0x9ED3 +0x9ED4 +0x9ED5 +0x9ED6 +0x9ED8 +0x9EDA +0x9EDB +0x9EDC +0x9EDD +0x9EDE +0x9EDF +0x9EE0 +0x9EE4 +0x9EE5 +0x9EE6 +0x9EE7 +0x9EE8 +0x9EEB +0x9EED +0x9EEE +0x9EEF +0x9EF0 +0x9EF2 +0x9EF3 +0x9EF4 +0x9EF5 +0x9EF6 +0x9EF7 +0x9EF9 +0x9EFA +0x9EFB +0x9EFC +0x9EFD +0x9EFF +0x9F00 +0x9F01 +0x9F06 +0x9F07 +0x9F09 +0x9F0A +0x9F0E +0x9F0F +0x9F10 +0x9F12 +0x9F13 +0x9F15 +0x9F16 +0x9F18 +0x9F19 +0x9F1A +0x9F1B +0x9F1C +0x9F1E +0x9F20 +0x9F22 +0x9F23 +0x9F24 +0x9F25 +0x9F28 +0x9F29 +0x9F2A +0x9F2B +0x9F2C +0x9F2D +0x9F2E +0x9F2F +0x9F30 +0x9F31 +0x9F32 +0x9F33 +0x9F34 +0x9F35 +0x9F36 +0x9F37 +0x9F38 +0x9F3B +0x9F3D +0x9F3E +0x9F40 +0x9F41 +0x9F42 +0x9F43 +0x9F46 +0x9F47 +0x9F48 +0x9F49 +0x9F4A +0x9F4B +0x9F4C +0x9F4D +0x9F4E +0x9F4F +0x9F52 +0x9F54 +0x9F55 +0x9F56 +0x9F57 +0x9F58 +0x9F59 +0x9F5B +0x9F5C +0x9F5D +0x9F5E +0x9F5F +0x9F60 +0x9F61 +0x9F63 +0x9F64 +0x9F65 +0x9F66 +0x9F67 +0x9F6A +0x9F6B +0x9F6C +0x9F6E +0x9F6F +0x9F70 +0x9F71 +0x9F72 +0x9F74 +0x9F75 +0x9F76 +0x9F77 +0x9F78 +0x9F79 +0x9F7A +0x9F7B +0x9F7E +0x9F8D +0x9F90 +0x9F91 +0x9F92 +0x9F94 +0x9F95 +0x9F98 +0x9F9C +0x9FA0 +0x9FA2 +0x9FA4 +0xFA0C +0xFA0D diff --git a/fontconfig/fc-lang/zu.orth b/fontconfig/fc-lang/zu.orth new file mode 100644 index 000000000..dc236c820 --- /dev/null +++ b/fontconfig/fc-lang/zu.orth @@ -0,0 +1,29 @@ +# +# fontconfig/fc-lang/zu.orth +# +# Copyright © 2002 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. +# +# Zulu (zu) +# +# Orthography taken from http://www.ideography.co.uk/library/pdf/charsets.pdf +# +0041-005a +0061-007a diff --git a/fontconfig/fc-list/Makefile.am b/fontconfig/fc-list/Makefile.am new file mode 100644 index 000000000..b364271bd --- /dev/null +++ b/fontconfig/fc-list/Makefile.am @@ -0,0 +1,59 @@ +# +# fontconfig/fc-list/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +DOC2MAN = docbook2man + +FC_LIST_SRC=${top_srcdir}/fc-list + +SGML = ${FC_LIST_SRC}/fc-list.sgml + +bin_PROGRAMS=fc-list + +INCLUDES=-I${top_srcdir} $(WARN_CFLAGS) + +BUILT_MANS=fc-list.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-list.sgml $(BUILT_MANS) + +fc_list_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-list/fc-list.c b/fontconfig/fc-list/fc-list.c new file mode 100644 index 000000000..e7813a6b4 --- /dev/null +++ b/fontconfig/fc-list/fc-list.c @@ -0,0 +1,209 @@ +/* + * fontconfig/fc-list/fc-list.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include <fontconfig/fontconfig.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +const struct option longopts[] = { + {"verbose", 0, 0, 'v'}, + {"format", 1, 0, 'f'}, + {"quiet", 0, 0, 'q'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-vqVh] [-f FORMAT] [--verbose] [--format=FORMAT] [--quiet] [--version] [--help] [pattern] {element ...} \n", + program); +#else + fprintf (file, "usage: %s [-vqVh] [-f FORMAT] [pattern] {element ...} \n", + program); +#endif + fprintf (file, "List fonts matching [pattern]\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -v, --verbose display entire font pattern verbosely\n"); + fprintf (file, " -f, --format=FORMAT use the given output format\n"); + fprintf (file, " -q, --quiet suppress all normal output, exit 1 if no fonts matched\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -v (verbose) display entire font pattern verbosely\n"); + fprintf (file, " -f FORMAT (format) use the given output format\n"); + fprintf (file, " -q, (quiet) suppress all normal output, exit 1 if no fonts matched\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +int +main (int argc, char **argv) +{ + int verbose = 0; + int quiet = 0; + FcChar8 *format = NULL; + int nfont = 0; + int i; + FcObjectSet *os = 0; + FcFontSet *fs; + FcPattern *pat; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "vf:qVh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "vf:qVh")) != -1) +#endif + { + switch (c) { + case 'v': + verbose = 1; + break; + case 'f': + format = (FcChar8 *) strdup (optarg); + break; + case 'q': + quiet = 1; + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (!FcInit ()) + { + fprintf (stderr, "Can't init font config library\n"); + return 1; + } + if (argv[i]) + { + pat = FcNameParse ((FcChar8 *) argv[i]); + while (argv[++i]) + { + if (!os) + os = FcObjectSetCreate (); + FcObjectSetAdd (os, argv[i]); + } + } + else + pat = FcPatternCreate (); + if (quiet && !os) + os = FcObjectSetCreate (); + if (!verbose && !format && !os) + os = FcObjectSetBuild (FC_FAMILY, FC_STYLE, (char *) 0); + fs = FcFontList (0, pat, os); + if (os) + FcObjectSetDestroy (os); + if (pat) + FcPatternDestroy (pat); + + if (!quiet && fs) + { + int j; + + for (j = 0; j < fs->nfont; j++) + { + if (verbose) + { + FcPatternPrint (fs->fonts[j]); + } + else if (format) + { + FcChar8 *s; + + s = FcPatternFormat (fs->fonts[j], format); + if (s) + { + printf ("%s", s); + free (s); + } + } + else + { + FcChar8 *str; + FcChar8 *file; + + str = FcNameUnparse (fs->fonts[j]); + if (FcPatternGetString (fs->fonts[j], FC_FILE, 0, &file) == FcResultMatch) + printf ("%s: ", file); + printf ("%s\n", str); + free (str); + } + } + } + + if (fs) { + nfont = fs->nfont; + FcFontSetDestroy (fs); + } + + FcFini (); + + return quiet ? (nfont == 0 ? 1 : 0) : 0; +} diff --git a/fontconfig/fc-list/fc-list.sgml b/fontconfig/fc-list/fc-list.sgml new file mode 100644 index 000000000..ffa089144 --- /dev/null +++ b/fontconfig/fc-list/fc-list.sgml @@ -0,0 +1,214 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Josselin</firstname>"> + <!ENTITY dhsurname "<surname>Mouette</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Aug 13, 2008</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>joss@debian.org</email>"> + <!ENTITY dhusername "Josselin Mouette"> + <!ENTITY dhucpackage "<refentrytitle>fc-list</refentrytitle>"> + <!ENTITY dhpackage "fc-list"> + + <!ENTITY debian "<productname>Debian</productname>"> + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2003</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>list available fonts</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-vVh</option></arg> + <arg><option>--verbose</option></arg> + <group> + <arg><option>-f</option> <option><replaceable>format</replaceable></option></arg> + <arg><option>--format</option> <option><replaceable>format</replaceable></option></arg> + </group> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <sbr> + <arg><option><replaceable>pattern</replaceable></option> <arg rep="repeat"><option><replaceable>element</replaceable></option></arg> </arg> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> lists fonts and styles + available on the system for applications using fontconfig. + If any elements are specified, only those are printed. + Otherwise family and style are printed, unless verbose + output is requested.</para> + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-v</option> + <option>--verbose</option> + </term> + <listitem> + <para>Print verbose output of the whole font pattern for each match, + or <replaceable>element</replaceable>s if any is + provided.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-f</option> + <option>--format</option> + <option><replaceable>format</replaceable></option> + </term> + <listitem> + <para>Format output according to the format specifier + <replaceable>format</replaceable>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>pattern</replaceable></option> + </term> + <listitem> + <para>If this argument is set, only fonts matching + <replaceable>pattern</replaceable> are displayed.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>element</replaceable></option> + </term> + <listitem> + <para>If set, the <replaceable>element</replaceable> property + is displayed for matching fonts.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>EXAMPLES</title> + + <variablelist> + <varlistentry> + <term>fc-list</term> + <listitem><para>Lists all font faces.</para></listitem> + </varlistentry> + <varlistentry> + <term>fc-list :lang=hi</term> + <listitem><para>Lists font faces that cover Hindi.</para></listitem> + </varlistentry> + <varlistentry> + <term>fc-list : family style file spacing </term> + <listitem><para>Lists the filename and spacing value for each font + face. <quote>:</quote> is an empty pattern that matches all + fonts.</para></listitem> + </varlistentry> + </variablelist> + + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-match</command>(1) + <function>FcFontList</function>(3) + <function>FcPatternFormat</function>(3) + <command>fc-cat</command>(1) + <command>fc-cache</command>(1) + <command>fc-query</command>(1) + <command>fc-scan</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was written by Keith Packard + <email>keithp@keithp.com</email> and &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fc-match/Makefile.am b/fontconfig/fc-match/Makefile.am new file mode 100644 index 000000000..9d725a582 --- /dev/null +++ b/fontconfig/fc-match/Makefile.am @@ -0,0 +1,59 @@ +# +# fontconfig/fc-match/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +bin_PROGRAMS=fc-match + +DOC2MAN = docbook2man + +FC_MATCH_SRC=${top_srcdir}/fc-match + +SGML = ${FC_MATCH_SRC}/fc-match.sgml + +INCLUDES=-I${top_srcdir} $(WARN_CFLAGS) + +BUILT_MANS=fc-match.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-match.sgml $(BUILT_MANS) + +fc_match_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-match/fc-match.c b/fontconfig/fc-match/fc-match.c new file mode 100644 index 000000000..8963e7af3 --- /dev/null +++ b/fontconfig/fc-match/fc-match.c @@ -0,0 +1,263 @@ +/* + * fontconfig/fc-match/fc-match.c + * + * Copyright © 2003 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include <fontconfig/fontconfig.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +static const struct option longopts[] = { + {"sort", 0, 0, 's'}, + {"all", 0, 0, 'a'}, + {"verbose", 0, 0, 'v'}, + {"format", 1, 0, 'f'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-savVh] [-f FORMAT] [--sort] [--all] [--verbose] [--format=FORMAT] [--version] [--help] [pattern] {element...}\n", + program); +#else + fprintf (file, "usage: %s [-savVh] [-f FORMAT] [pattern] {element...}\n", + program); +#endif + fprintf (file, "List best font matching [pattern]\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -s, --sort display sorted list of matches\n"); + fprintf (file, " -a, --all display unpruned sorted list of matches\n"); + fprintf (file, " -v, --verbose display entire font pattern verbosely\n"); + fprintf (file, " -f, --format=FORMAT use the given output format\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -s, (sort) display sorted list of matches\n"); + fprintf (file, " -a (all) display unpruned sorted list of matches\n"); + fprintf (file, " -v (verbose) display entire font pattern verbosely\n"); + fprintf (file, " -f FORMAT (format) use the given output format\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +int +main (int argc, char **argv) +{ + int verbose = 0; + int sort = 0, all = 0; + FcChar8 *format = NULL; + int i; + FcObjectSet *os = 0; + FcFontSet *fs; + FcPattern *pat; + FcResult result; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "asvf:Vh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "asvf:Vh")) != -1) +#endif + { + switch (c) { + case 'a': + all = 1; + break; + case 's': + sort = 1; + break; + case 'v': + verbose = 1; + break; + case 'f': + format = (FcChar8 *) strdup (optarg); + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (!FcInit ()) + { + fprintf (stderr, "Can't init font config library\n"); + return 1; + } + if (argv[i]) + { + pat = FcNameParse ((FcChar8 *) argv[i]); + while (argv[++i]) + { + if (!os) + os = FcObjectSetCreate (); + FcObjectSetAdd (os, argv[i]); + } + } + else + pat = FcPatternCreate (); + + if (!pat) + return 1; + + FcConfigSubstitute (0, pat, FcMatchPattern); + FcDefaultSubstitute (pat); + + fs = FcFontSetCreate (); + + if (sort || all) + { + FcFontSet *font_patterns; + int j; + font_patterns = FcFontSort (0, pat, all ? FcFalse : FcTrue, 0, &result); + + for (j = 0; j < font_patterns->nfont; j++) + { + FcPattern *font_pattern; + + font_pattern = FcFontRenderPrepare (NULL, pat, font_patterns->fonts[j]); + if (font_pattern) + FcFontSetAdd (fs, font_pattern); + } + + FcFontSetSortDestroy (font_patterns); + } + else + { + FcPattern *match; + match = FcFontMatch (0, pat, &result); + if (match) + FcFontSetAdd (fs, match); + } + FcPatternDestroy (pat); + + if (fs) + { + int j; + + for (j = 0; j < fs->nfont; j++) + { + FcPattern *font; + + font = FcPatternFilter (fs->fonts[j], os); + + if (verbose) + { + FcPatternPrint (font); + } + else if (format) + { + FcChar8 *s; + + s = FcPatternFormat (font, format); + if (s) + { + printf ("%s", s); + free (s); + } + } + else if (os) + { + FcChar8 *str; + str = FcNameUnparse (font); + printf ("%s\n", str); + free (str); + } + else + { + FcChar8 *family; + FcChar8 *style; + FcChar8 *file; + + if (FcPatternGetString (font, FC_FILE, 0, &file) != FcResultMatch) + file = (FcChar8 *) "<unknown filename>"; + else + { + FcChar8 *slash = (FcChar8 *) strrchr ((char *) file, '/'); + if (slash) + file = slash+1; + } + if (FcPatternGetString (font, FC_FAMILY, 0, &family) != FcResultMatch) + family = (FcChar8 *) "<unknown family>"; + if (FcPatternGetString (font, FC_STYLE, 0, &style) != FcResultMatch) + style = (FcChar8 *) "<unknown style>"; + + printf ("%s: \"%s\" \"%s\"\n", file, family, style); + } + + FcPatternDestroy (font); + } + FcFontSetDestroy (fs); + } + + if (os) + FcObjectSetDestroy (os); + + FcFini (); + + return 0; +} diff --git a/fontconfig/fc-match/fc-match.sgml b/fontconfig/fc-match/fc-match.sgml new file mode 100644 index 000000000..390b733c3 --- /dev/null +++ b/fontconfig/fc-match/fc-match.sgml @@ -0,0 +1,216 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Patrick</firstname>"> + <!ENTITY dhsurname "<surname>Lam</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Aug 13, 2008</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>plam@csail.mit.edu</email>"> + <!ENTITY dhusername "Patrick Lam"> + <!ENTITY dhucpackage "<refentrytitle>fc-match</refentrytitle>"> + <!ENTITY dhpackage "fc-match"> + + <!ENTITY debian "<productname>Debian</productname>"> + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2003</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>match available fonts</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-asvVh</option></arg> + <arg><option>--all</option></arg> + <arg><option>--sort</option></arg> + <arg><option>--verbose</option></arg> + <group> + <arg><option>-f</option> <option><replaceable>format</replaceable></option></arg> + <arg><option>--format</option> <option><replaceable>format</replaceable></option></arg> + </group> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <sbr> + <arg><option><replaceable>pattern</replaceable></option> <arg rep="repeat"><option><replaceable>element</replaceable></option></arg> </arg> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> matches + <replaceable>pattern</replaceable> (empty +pattern by default) using the normal fontconfig matching rules to find +the best font available. If <option>--sort</option> is given, the sorted list of best +matching fonts is displayed. +The <option>--all</option> option works like +<option>--sort</option> except that no pruning is done on the list of fonts.</para> +<para>If any elements are specified, only those are printed. +Otherwise short file name, family, and style are printed, unless verbose +output is requested.</para> + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-a</option> + <option>--all</option> + </term> + <listitem> + <para>Displays sorted list of best matching fonts, but do not do any + pruning on the list.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-s</option> + <option>--sort</option> + </term> + <listitem> + <para>Displays sorted list of best matching fonts.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-v</option> + <option>--verbose</option> + </term> + <listitem> + <para>Print verbose output of the whole font pattern for each match, + or <replaceable>element</replaceable>s if any is + provided.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-f</option> + <option>--format</option> + <option><replaceable>format</replaceable></option> + </term> + <listitem> + <para>Format output according to the format specifier + <replaceable>format</replaceable>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>pattern</replaceable></option> + </term> + <listitem> + <para>Displays fonts matching + <replaceable>pattern</replaceable> (uses empty pattern by default).</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>element</replaceable></option> + </term> + <listitem> + <para>If set, the <replaceable>element</replaceable> property + is displayed for matching fonts.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-list</command>(1) + <function>FcFontMatch</function>(3) + <function>FcFontSort</function>(3) + <function>FcPatternFormat</function>(3) + <command>fc-cat</command>(1) + <command>fc-cache</command>(1) + <command>fc-query</command>(1) + <command>fc-scal</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was updated by &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fc-query/Makefile.am b/fontconfig/fc-query/Makefile.am new file mode 100644 index 000000000..114fd7f80 --- /dev/null +++ b/fontconfig/fc-query/Makefile.am @@ -0,0 +1,59 @@ +# +# fontconfig/fc-query/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +bin_PROGRAMS=fc-query + +DOC2MAN = docbook2man + +FC_QUERY_SRC=${top_srcdir}/fc-query + +SGML = ${FC_QUERY_SRC}/fc-query.sgml + +INCLUDES=-I${top_srcdir} $(FREETYPE_CFLAGS) $(WARN_CFLAGS) + +BUILT_MANS=fc-query.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-query.sgml $(BUILT_MANS) + +fc_query_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-query/fc-query.c b/fontconfig/fc-query/fc-query.c new file mode 100644 index 000000000..f2693de59 --- /dev/null +++ b/fontconfig/fc-query/fc-query.c @@ -0,0 +1,191 @@ +/* + * fontconfig/fc-query/fc-query.c + * + * Copyright © 2003 Keith Packard + * Copyright © 2008 Red Hat, Inc. + * Red Hat Author(s): Behdad Esfahbod + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include <fontconfig/fontconfig.h> +#include <fontconfig/fcfreetype.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +static const struct option longopts[] = { + {"index", 1, 0, 'i'}, + {"format", 1, 0, 'f'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-Vh] [-i index] [-f FORMAT] [--index index] [--format FORMAT] [--version] [--help] font-file...\n", + program); +#else + fprintf (file, "usage: %s [-Vh] [-i index] [-f FORMAT] font-file...\n", + program); +#endif + fprintf (file, "Query font files and print resulting pattern(s)\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -i, --index INDEX display the INDEX face of each font file only\n"); + fprintf (file, " -f, --format=FORMAT use the given output format\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -i INDEX (index) display the INDEX face of each font file only\n"); + fprintf (file, " -f FORMAT (format) use the given output format\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +int +main (int argc, char **argv) +{ + int index_set = 0; + int set_index = 0; + FcChar8 *format = NULL; + int err = 0; + int i; + FcBlanks *blanks; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "i:f:Vh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "i:f:Vh")) != -1) +#endif + { + switch (c) { + case 'i': + index_set = 1; + set_index = atoi (optarg); + break; + case 'f': + format = (FcChar8 *) strdup (optarg); + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (i == argc) + usage (argv[0], 1); + + if (!FcInit ()) + { + fprintf (stderr, "Can't init font config library\n"); + return 1; + } + + blanks = FcConfigGetBlanks (NULL); + + for (; i < argc; i++) + { + int index; + int count = 0; + + index = set_index; + + do { + FcPattern *pat; + + pat = FcFreeTypeQuery ((FcChar8 *) argv[i], index, blanks, &count); + if (pat) + { + if (format) + { + FcChar8 *s; + + s = FcPatternFormat (pat, format); + if (s) + { + printf ("%s", s); + free (s); + } + } + else + { + FcPatternPrint (pat); + } + + FcPatternDestroy (pat); + } + else + { + fprintf (stderr, "Can't query face %d of font file %s\n", + index, argv[i]); + err = 1; + } + + index++; + } while (!index_set && index < count); + } + + FcFini (); + return err; +} diff --git a/fontconfig/fc-query/fc-query.sgml b/fontconfig/fc-query/fc-query.sgml new file mode 100644 index 000000000..59fd63548 --- /dev/null +++ b/fontconfig/fc-query/fc-query.sgml @@ -0,0 +1,191 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Behdad</firstname>"> + <!ENTITY dhsurname "<surname>Esfahbod</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Aug 13, 2008</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>behdad@behdad.org</email>"> + <!ENTITY dhusername "Behdad Esfahbod"> + <!ENTITY dhucpackage "<refentrytitle>fc-query</refentrytitle>"> + <!ENTITY dhpackage "fc-query"> + + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2008</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>query font files</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-Vh</option></arg> + <sbr> + <group> + <arg><option>-i</option> <option><replaceable>index</replaceable></option></arg> + <arg><option>--index</option> <option><replaceable>index</replaceable></option></arg> + </group> + <group> + <arg><option>-f</option> <option><replaceable>format</replaceable></option></arg> + <arg><option>--format</option> <option><replaceable>format</replaceable></option></arg> + </group> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <arg choice="req" rep="repeat"><option><replaceable>font-file</replaceable></option></arg> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> queries + <replaceable>font-file</replaceable>(s) using the normal fontconfig + rules and prints out font pattern for each face found. + If <option>--index</option> is given, only one face of each file is + queried, otherwise all faces are queried.</para> + + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-i</option> + <option>--index</option> + <option><replaceable>index</replaceable></option> + </term> + <listitem> + <para>Only query face indexed <replaceable>index</replaceable> of + each file.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-f</option> + <option>--format</option> + <option><replaceable>format</replaceable></option> + </term> + <listitem> + <para>Format output according to the format specifier + <replaceable>format</replaceable>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>font-file</replaceable></option> + </term> + <listitem> + <para>Query <replaceable>font-file</replaceable> for font faces.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>RETURN CODES</title> + <para><command>fc-query</command> returns error code 0 for successful parsing, + or 1 if any errors occured or if at least one font face could not be opened.</para> + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-scan</command>(1) + <function>FcFreeTypeQuery</function>(3) + <function>FcPatternFormat</function>(3) + <command>fc-cat</command>(1) + <command>fc-cache</command>(1) + <command>fc-list</command>(1) + <command>fc-match</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was updated by &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fc-scan/Makefile.am b/fontconfig/fc-scan/Makefile.am new file mode 100644 index 000000000..af4383149 --- /dev/null +++ b/fontconfig/fc-scan/Makefile.am @@ -0,0 +1,59 @@ +# +# fontconfig/fc-scan/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +bin_PROGRAMS=fc-scan + +DOC2MAN = docbook2man + +FC_SCAN_SRC=${top_srcdir}/fc-scan + +SGML = ${FC_SCAN_SRC}/fc-scan.sgml + +INCLUDES=-I${top_srcdir} $(FREETYPE_CFLAGS) $(WARN_CFLAGS) + +BUILT_MANS=fc-scan.1 + +if ENABLE_DOCS +man_MANS=${BUILT_MANS} +endif + +EXTRA_DIST=fc-scan.sgml $(BUILT_MANS) + +fc_scan_LDADD = ${top_builddir}/src/libfontconfig.la + +if USEDOCBOOK + +${man_MANS}: ${SGML} + $(RM) $@ + $(DOC2MAN) ${SGML} + $(RM) manpage.* + +all-local: $(man_MANS) + +clean-local: + $(RM) $(man_MANS) + +else +all-local: +clean-local: +endif diff --git a/fontconfig/fc-scan/fc-scan.c b/fontconfig/fc-scan/fc-scan.c new file mode 100644 index 000000000..5f9a46670 --- /dev/null +++ b/fontconfig/fc-scan/fc-scan.c @@ -0,0 +1,184 @@ +/* + * fontconfig/fc-scan/fc-scan.c + * + * Copyright © 2003 Keith Packard + * Copyright © 2008 Red Hat, Inc. + * Red Hat Author(s): Behdad Esfahbod + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#else +#ifdef linux +#define HAVE_GETOPT_LONG 1 +#endif +#define HAVE_GETOPT 1 +#endif + +#include <fontconfig/fontconfig.h> +#include <fontconfig/fcfreetype.h> +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> + +#ifndef HAVE_GETOPT +#define HAVE_GETOPT 0 +#endif +#ifndef HAVE_GETOPT_LONG +#define HAVE_GETOPT_LONG 0 +#endif + +#if HAVE_GETOPT_LONG +#undef _GNU_SOURCE +#define _GNU_SOURCE +#include <getopt.h> +static const struct option longopts[] = { + {"format", 1, 0, 'f'}, + {"version", 0, 0, 'V'}, + {"help", 0, 0, 'h'}, + {NULL,0,0,0}, +}; +#else +#if HAVE_GETOPT +extern char *optarg; +extern int optind, opterr, optopt; +#endif +#endif + +static void +usage (char *program, int error) +{ + FILE *file = error ? stderr : stdout; +#if HAVE_GETOPT_LONG + fprintf (file, "usage: %s [-Vh] [-f FORMAT] [--format FORMAT] [--version] [--help] font-file...\n", + program); +#else + fprintf (file, "usage: %s [-Vh] [-f FORMAT] font-file...\n", + program); +#endif + fprintf (file, "Scan font files and directories, and print resulting pattern(s)\n"); + fprintf (file, "\n"); +#if HAVE_GETOPT_LONG + fprintf (file, " -f, --format=FORMAT use the given output format\n"); + fprintf (file, " -V, --version display font config version and exit\n"); + fprintf (file, " -h, --help display this help and exit\n"); +#else + fprintf (file, " -f FORMAT (format) use the given output format\n"); + fprintf (file, " -V (version) display font config version and exit\n"); + fprintf (file, " -h (help) display this help and exit\n"); +#endif + exit (error); +} + +int +main (int argc, char **argv) +{ + FcChar8 *format = NULL; + int i; + FcFontSet *fs; +#if HAVE_GETOPT_LONG || HAVE_GETOPT + int c; + +#if HAVE_GETOPT_LONG + while ((c = getopt_long (argc, argv, "f:Vh", longopts, NULL)) != -1) +#else + while ((c = getopt (argc, argv, "f:Vh")) != -1) +#endif + { + switch (c) { + case 'f': + format = (FcChar8 *) strdup (optarg); + break; + case 'V': + fprintf (stderr, "fontconfig version %d.%d.%d\n", + FC_MAJOR, FC_MINOR, FC_REVISION); + exit (0); + case 'h': + usage (argv[0], 0); + default: + usage (argv[0], 1); + } + } + i = optind; +#else + i = 1; +#endif + + if (i == argc) + usage (argv[0], 1); + + if (!FcInit ()) + { + fprintf (stderr, "Can't init font config library\n"); + return 1; + } + + fs = FcFontSetCreate (); + + for (; i < argc; i++) + { + const FcChar8 *file = (FcChar8*) argv[i]; + + if (!FcFileIsDir (file)) + FcFileScan (fs, NULL, NULL, NULL, file, FcTrue); + else + { + FcStrSet *dirs = FcStrSetCreate (); + FcStrList *strlist = FcStrListCreate (dirs); + do + { + FcDirScan (fs, dirs, NULL, NULL, file, FcTrue); + } + while ((file = FcStrListNext (strlist))); + FcStrListDone (strlist); + FcStrSetDestroy (dirs); + } + } + + for (i = 0; i < fs->nfont; i++) + { + FcPattern *pat; + + pat = fs->fonts[i]; + + if (format) + { + FcChar8 *s; + + s = FcPatternFormat (pat, format); + if (s) + { + printf ("%s", s); + free (s); + } + } + else + { + FcPatternPrint (pat); + } + } + + FcFontSetDestroy (fs); + + FcFini (); + return i > 0 ? 0 : 1; +} diff --git a/fontconfig/fc-scan/fc-scan.sgml b/fontconfig/fc-scan/fc-scan.sgml new file mode 100644 index 000000000..b9f7714e2 --- /dev/null +++ b/fontconfig/fc-scan/fc-scan.sgml @@ -0,0 +1,176 @@ +<!doctype refentry PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [ + +<!-- Process this file with docbook-to-man to generate an nroff manual + page: `docbook-to-man manpage.sgml > manpage.1'. You may view + the manual page with: `docbook-to-man manpage.sgml | nroff -man | + less'. A typical entry in a Makefile or Makefile.am is: + +manpage.1: manpage.sgml + docbook-to-man $< > $@ + + + The docbook-to-man binary is found in the docbook-to-man package. + Please remember that if you create the nroff version in one of the + debian/rules file targets (such as build), you will need to include + docbook-to-man in your Build-Depends control field. + + --> + + <!-- Fill in your name for FIRSTNAME and SURNAME. --> + <!ENTITY dhfirstname "<firstname>Behdad</firstname>"> + <!ENTITY dhsurname "<surname>Esfahbod</surname>"> + <!-- Please adjust the date whenever revising the manpage. --> + <!ENTITY dhdate "<date>Jan 15, 2009</date>"> + <!-- SECTION should be 1-8, maybe w/ subsection other parameters are + allowed: see man(7), man(1). --> + <!ENTITY dhsection "<manvolnum>1</manvolnum>"> + <!ENTITY dhemail "<email>behdad@behdad.org</email>"> + <!ENTITY dhusername "Behdad Esfahbod"> + <!ENTITY dhucpackage "<refentrytitle>fc-scan</refentrytitle>"> + <!ENTITY dhpackage "fc-scan"> + + <!ENTITY gnu "<acronym>GNU</acronym>"> + <!ENTITY gpl "&gnu; <acronym>GPL</acronym>"> +]> + +<refentry> + <refentryinfo> + <address> + &dhemail; + </address> + <author> + &dhfirstname; + &dhsurname; + </author> + <copyright> + <year>2008</year> + <holder>&dhusername;</holder> + </copyright> + &dhdate; + </refentryinfo> + <refmeta> + &dhucpackage; + + &dhsection; + </refmeta> + <refnamediv> + <refname>&dhpackage;</refname> + + <refpurpose>scan font files or directories</refpurpose> + </refnamediv> + <refsynopsisdiv> + <cmdsynopsis> + <command>&dhpackage;</command> + + <arg><option>-Vh</option></arg> + <sbr> + <group> + <arg><option>-f</option> <option><replaceable>format</replaceable></option></arg> + <arg><option>--format</option> <option><replaceable>format</replaceable></option></arg> + </group> + <arg><option>--version</option></arg> + <arg><option>--help</option></arg> + <arg choice="req" rep="repeat"><option><replaceable>file</replaceable></option></arg> + + </cmdsynopsis> + </refsynopsisdiv> + <refsect1> + <title>DESCRIPTION</title> + + <para><command>&dhpackage;</command> scans + <replaceable>file</replaceable>(s) recursively + and prints out font pattern for each face found.</para> + + </refsect1> + <refsect1> + <title>OPTIONS</title> + + <para>This program follows the usual &gnu; command line syntax, + with long options starting with two dashes (`-'). A summary of + options is included below.</para> + + <variablelist> + <varlistentry> + <term><option>-f</option> + <option>--format</option> + <option><replaceable>format</replaceable></option> + </term> + <listitem> + <para>Format output according to the format specifier + <replaceable>format</replaceable>.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-V</option> + <option>--version</option> + </term> + <listitem> + <para>Show version of the program and exit.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option>-h</option> + <option>--help</option> + </term> + <listitem> + <para>Show summary of options.</para> + </listitem> + </varlistentry> + <varlistentry> + <term><option><replaceable>file</replaceable></option> + </term> + <listitem> + <para>Scan <replaceable>file</replaceable> recursively for font faces.</para> + </listitem> + </varlistentry> + </variablelist> + </refsect1> + + <refsect1> + <title>RETURN CODES</title> + <para><command>fc-scan</command> returns error code 0 if at least one font + was found or 1 otherwise.</para> + </refsect1> + + <refsect1> + <title>SEE ALSO</title> + + <para> + <command>fc-query</command>(1) + <function>FcFileScan</function>(3) + <function>FcDirScan</function>(3) + <function>FcPatternFormat</function>(3) + <command>fc-cat</command>(1) + <command>fc-cache</command>(1) + <command>fc-list</command>(1) + <command>fc-match</command>(1) + </para> + + <para>The fontconfig user's guide, in HTML format: + <filename>/usr/share/doc/fontconfig/fontconfig-user.html</filename>.</para> + + </refsect1> + <refsect1> + <title>AUTHOR</title> + + <para>This manual page was updated by &dhusername; &dhemail;.</para> + + </refsect1> +</refentry> + +<!-- Keep this comment at the end of the file +Local variables: +mode: sgml +sgml-omittag:t +sgml-shorttag:t +sgml-minimize-attributes:nil +sgml-always-quote-attributes:t +sgml-indent-step:2 +sgml-indent-data:t +sgml-parent-document:nil +sgml-default-dtd-file:nil +sgml-exposed-tags:nil +sgml-local-catalogs:nil +sgml-local-ecat-files:nil +End: +--> diff --git a/fontconfig/fontconfig-zip.in b/fontconfig/fontconfig-zip.in new file mode 100644 index 000000000..1ca222cfb --- /dev/null +++ b/fontconfig/fontconfig-zip.in @@ -0,0 +1,29 @@ +#!/bin/sh + +# Build distribution zipfiles for fontconfig on Win32. (This script +# obviously needs to be run in Cygwin or similar.) Separate runtime +# and developer zipfiles. + +ZIP=/tmp/fontconfig-@VERSION@.zip +DEVZIP=/tmp/fontconfig-dev-@VERSION@.zip + +cd @prefix@ +rm -f $ZIP +zip $ZIP -@ <<EOF +bin/libfontconfig-@LIBT_CURRENT_MINUS_AGE@.dll +etc/fonts/fonts.conf +EOF + +rm -f $DEVZIP +zip -r -D $DEVZIP -@ <<EOF +etc/fonts/fonts.dtd +include/fontconfig +lib/libfontconfig.dll.a +lib/fontconfig.lib +lib/fontconfig.def +lib/pkgconfig/fontconfig.pc +bin/fc-list.exe +bin/fc-cache.exe +share/man +share/doc/fontconfig +EOF diff --git a/fontconfig/fontconfig.pc.in b/fontconfig/fontconfig.pc.in new file mode 100644 index 000000000..db55f6e14 --- /dev/null +++ b/fontconfig/fontconfig.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Fontconfig +Description: Font configuration and customization library +Version: @VERSION@ +Libs: -L${libdir} -lfontconfig +Libs.private: @LIBXML2_LIBS@ @EXPAT_LIBS@ @FREETYPE_LIBS@ @ICONV_LIBS@ +Cflags: -I${includedir} diff --git a/fontconfig/fontconfig.spec.in b/fontconfig/fontconfig.spec.in new file mode 100644 index 000000000..90373527c --- /dev/null +++ b/fontconfig/fontconfig.spec.in @@ -0,0 +1,138 @@ +# Some distributions name their Freetype 2 package "freetype", while others +# name it "freetype2". You can define the name your distribution uses here. +%define freetype2 freetype + +Summary: Font configuration and customization library +Name: fontconfig +Version: @VERSION@ +Release: 1 +License: MIT +Group: System Environment/Libraries +Source: http://fontconfig.org/release/fontconfig-%{version}.tar.gz +URL: http://fontconfig.org +BuildRoot: %{_tmppath}/%{name}-%{version}-root + +BuildRequires: %{_bindir}/docbook2html +BuildRequires: %{_bindir}/docbook2txt +BuildRequires: %{freetype2}-devel +BuildRequires: expat-devel +BuildRequires: perl + +PreReq: %{freetype2} + +%description +Fontconfig is designed to locate fonts within the +system and select them according to requirements specified by +applications. + +%package devel +Summary: Font configuration and customization library +Group: Development/Libraries +Requires: %{name} = %{version} +Requires: %{freetype2}-devel + +%description devel +The fontconfig-devel package includes the static libraries, +header files, and developer docs for the fontconfig package. + +Install fontconfig-devel if you want to develop programs which +will use fontconfig. + +# Some rpm specific directories. Prefix 'my' hopefully does not collide with anything. +%define my_docdir %{_datadir}/doc/%{name}-%{version} +%define my_develdocdir %{_datadir}/doc/%{name}-devel-%{version} +%define my_tmpdocdir $RPM_BUILD_ROOT%{my_docdir} +%define my_tmpdeveldocdir $RPM_BUILD_ROOT%{my_develdocdir} + +%prep +%setup -q + +%build +%configure --with-x-fonts=/usr/X11R6/lib/X11/fonts --disable-gtk-doc \ + --with-docdir=%{my_docdir} +make %{_smp_mflags} + +%install +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT +{ + %makeinstall docdir=%{my_tmpdocdir} + + # The make does not distinguish the base and devel packages + mkdir -p %{my_tmpdeveldocdir} + mv -f %{my_tmpdocdir}/*devel* %{my_tmpdeveldocdir} + + # Use a more informative directory name: + mv -f %{my_tmpdeveldocdir}/fontconfig-devel %{my_tmpdeveldocdir}/html +} + +%clean +[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf $RPM_BUILD_ROOT + +%post +{ + /sbin/ldconfig + # Force regeneration of all fontconfig cache files. + %{_bindir}/fc-cache -f --system-only +} + +%postun -p /sbin/ldconfig + +%files +%defattr(-, root, root) +%doc README AUTHORS COPYING ChangeLog doc/fontconfig-user.{html,txt} +%{my_docdir}/* +%dir %{_sysconfdir}/fonts +%{_sysconfdir}/fonts/fonts.conf +%{_sysconfdir}/fonts/fonts.dtd +%config %{_sysconfdir}/fonts/local.conf +%{_bindir}/fc-* +%{_libdir}/libfontconfig*.so.* +%{_mandir}/man1/* +%{_mandir}/man5/* + +%files devel +%defattr(-, root, root) +#%doc doc/fontconfig-devel.txt doc/fontconfig-devel/* +%{my_develdocdir} +%dir %{_includedir}/fontconfig +%{_includedir}/fontconfig/* +%{_libdir}/*.a +%{_libdir}/*.la +%{_libdir}/libfontconfig.so +%{_libdir}/pkgconfig +%{_mandir}/man3/* + +%changelog +* Wed Mar 20 2004 Enrique Perez-Terron <enrio@online.no> +- Added mandir /man1/* to main file list +- Added missing '/*' after includedir/fontconfig to avoid "listed twice" error. +- Removed configure option --disable-docs since its problem is solved, see below. +- Added option to makeinstall to have it install docs in the proper directory. + Notice though that the %doc macro deletes and recreates the docs directory. +- Cleaner separation of devel docs. +- Renamed doc/fontconfig-devel-*/fontconfig-devel subdirectory to 'html'. +- Removed %doc macro from devel filelist, since it deletes installed files. + +* Fri Mar 7 2003 Mike A. Harris <mharris@redhat.com> 2.1.92-1 +- Removed man1/* and added man5/* to main package and man3/* to devel package +- Added missing defattr(-, root, root) to main package +- Added HTML and text development documentation to -devel subpackage + +* Wed Mar 5 2003 Mike A. Harris <mharris@redhat.com> +- Added back the configure macro options --disable-docs because otherwise + fontconfig installs docs into /usr/share/doc/fontconfig (with no version + number) unconditionally, causing RPM to fail the build due to unpackaged + files terminate build + +* Wed Mar 5 2003 Mike A. Harris <mharris@redhat.com> +- Removed commented out rpm macro define at top of spec file, replacing it with + a simple explanation, since rpm macros are expanded by rpm even in comments +- Changed /usr/bin to _bindir in BuildRequires lines +- Cleaned up rpm postinstall script, and made fc-cache use _bindir +- Reorganized file manifest lists + +* Sun Mar 2 2003 Owen Taylor <otaylor@redhat.com> +- Various improvements from Red Hat spec file + +* Sun Mar 2 2003 Mike A. Harris <mharris@redhat.com> +- Initial changelog entry diff --git a/fontconfig/fontconfig/Makefile.am b/fontconfig/fontconfig/Makefile.am new file mode 100644 index 000000000..72fec336e --- /dev/null +++ b/fontconfig/fontconfig/Makefile.am @@ -0,0 +1,8 @@ +fontconfigincludedir=$(includedir)/fontconfig + +fontconfig_headers= \ + fontconfig.h \ + fcfreetype.h \ + fcprivate.h + +fontconfiginclude_HEADERS = $(fontconfig_headers) diff --git a/fontconfig/fontconfig/fcfreetype.h b/fontconfig/fontconfig/fcfreetype.h new file mode 100644 index 000000000..de9988f65 --- /dev/null +++ b/fontconfig/fontconfig/fcfreetype.h @@ -0,0 +1,59 @@ +/* + * fontconfig/fontconfig/fcfreetype.h + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _FCFREETYPE_H_ +#define _FCFREETYPE_H_ +#include <ft2build.h> +#include FT_FREETYPE_H + +#ifndef FcPublic +#define FcPublic +#endif + +_FCFUNCPROTOBEGIN + +FcPublic FT_UInt +FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4); + +FcPublic FcCharSet * +FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing); + +FcPublic FcCharSet * +FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks); + +FcPublic FcResult +FcPatternGetFTFace (const FcPattern *p, const char *object, int n, FT_Face *f); + +FcPublic FcBool +FcPatternAddFTFace (FcPattern *p, const char *object, const FT_Face f); + +FcPublic FcPattern * +FcFreeTypeQueryFace (const FT_Face face, + const FcChar8 *file, + int id, + FcBlanks *blanks); + +_FCFUNCPROTOEND + +#endif diff --git a/fontconfig/fontconfig/fcprivate.h b/fontconfig/fontconfig/fcprivate.h new file mode 100644 index 000000000..ec964fce1 --- /dev/null +++ b/fontconfig/fontconfig/fcprivate.h @@ -0,0 +1,123 @@ +/* + * fontconfig/fontconfig/fcprivate.h + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _FCPRIVATE_H_ +#define _FCPRIVATE_H_ + +/* + * I tried this with functions that took va_list* arguments + * but portability concerns made me change these functions + * into macros (sigh). + */ + +#define FcPatternVapBuild(result, orig, va) \ +{ \ + FcPattern *__p__ = (orig); \ + const char *__o__; \ + FcValue __v__; \ + \ + if (!__p__) \ + { \ + __p__ = FcPatternCreate (); \ + if (!__p__) \ + goto _FcPatternVapBuild_bail0; \ + } \ + for (;;) \ + { \ + __o__ = va_arg (va, const char *); \ + if (!__o__) \ + break; \ + __v__.type = va_arg (va, FcType); \ + switch (__v__.type) { \ + case FcTypeVoid: \ + goto _FcPatternVapBuild_bail1; \ + case FcTypeInteger: \ + __v__.u.i = va_arg (va, int); \ + break; \ + case FcTypeDouble: \ + __v__.u.d = va_arg (va, double); \ + break; \ + case FcTypeString: \ + __v__.u.s = va_arg (va, const FcChar8 *); \ + break; \ + case FcTypeBool: \ + __v__.u.b = va_arg (va, FcBool); \ + break; \ + case FcTypeMatrix: \ + __v__.u.m = va_arg (va, const FcMatrix *); \ + break; \ + case FcTypeCharSet: \ + __v__.u.c = va_arg (va, const FcCharSet *); \ + break; \ + case FcTypeFTFace: \ + __v__.u.f = va_arg (va, FT_Face); \ + break; \ + case FcTypeLangSet: \ + __v__.u.l = va_arg (va, const FcLangSet *); \ + break; \ + } \ + if (!FcPatternAdd (__p__, __o__, __v__, FcTrue)) \ + goto _FcPatternVapBuild_bail1; \ + } \ + result = __p__; \ + goto _FcPatternVapBuild_return; \ + \ +_FcPatternVapBuild_bail1: \ + if (!orig) \ + FcPatternDestroy (__p__); \ +_FcPatternVapBuild_bail0: \ + result = (void*)0; \ + \ +_FcPatternVapBuild_return: \ + ; \ +} + + +#define FcObjectSetVapBuild(__ret__, __first__, __va__) \ +{ \ + FcObjectSet *__os__; \ + const char *__ob__; \ + \ + __ret__ = 0; \ + __os__ = FcObjectSetCreate (); \ + if (!__os__) \ + goto _FcObjectSetVapBuild_bail0; \ + __ob__ = __first__; \ + while (__ob__) \ + { \ + if (!FcObjectSetAdd (__os__, __ob__)) \ + goto _FcObjectSetVapBuild_bail1; \ + __ob__ = va_arg (__va__, const char *); \ + } \ + __ret__ = __os__; \ + \ +_FcObjectSetVapBuild_bail1: \ + if (!__ret__ && __os__) \ + FcObjectSetDestroy (__os__); \ +_FcObjectSetVapBuild_bail0: \ + ; \ +} + +#endif /* _FCPRIVATE_H_ */ + diff --git a/fontconfig/fontconfig/fontconfig.h b/fontconfig/fontconfig/fontconfig.h new file mode 100644 index 000000000..4efa4507a --- /dev/null +++ b/fontconfig/fontconfig/fontconfig.h @@ -0,0 +1,963 @@ +/* + * fontconfig/fontconfig/fontconfig.h + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _FONTCONFIG_H_ +#define _FONTCONFIG_H_ + +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> +#include <stdarg.h> + +#if defined(__GNUC__) && (__GNUC__ >= 4) +#define FC_ATTRIBUTE_SENTINEL(x) __attribute__((__sentinel__(0))) +#else +#define FC_ATTRIBUTE_SENTINEL(x) +#endif + +#ifndef FcPublic +#define FcPublic +#endif + +typedef unsigned char FcChar8; +typedef unsigned short FcChar16; +typedef unsigned int FcChar32; +typedef int FcBool; + +/* + * Current Fontconfig version number. This same number + * must appear in the fontconfig configure.in file. Yes, + * it'a a pain to synchronize version numbers like this. + */ + +#define FC_MAJOR 2 +#define FC_MINOR 8 +#define FC_REVISION 0 + +#define FC_VERSION ((FC_MAJOR * 10000) + (FC_MINOR * 100) + (FC_REVISION)) + +/* + * Current font cache file format version + * This is appended to the cache files so that multiple + * versions of the library will peacefully coexist + * + * Change this value whenever the disk format for the cache file + * changes in any non-compatible way. Try to avoid such changes as + * it means multiple copies of the font information. + */ + +#define FC_CACHE_VERSION "3" + +#define FcTrue 1 +#define FcFalse 0 + +#define FC_FAMILY "family" /* String */ +#define FC_STYLE "style" /* String */ +#define FC_SLANT "slant" /* Int */ +#define FC_WEIGHT "weight" /* Int */ +#define FC_SIZE "size" /* Double */ +#define FC_ASPECT "aspect" /* Double */ +#define FC_PIXEL_SIZE "pixelsize" /* Double */ +#define FC_SPACING "spacing" /* Int */ +#define FC_FOUNDRY "foundry" /* String */ +#define FC_ANTIALIAS "antialias" /* Bool (depends) */ +#define FC_HINTING "hinting" /* Bool (true) */ +#define FC_HINT_STYLE "hintstyle" /* Int */ +#define FC_VERTICAL_LAYOUT "verticallayout" /* Bool (false) */ +#define FC_AUTOHINT "autohint" /* Bool (false) */ +#define FC_GLOBAL_ADVANCE "globaladvance" /* Bool (true) */ +#define FC_WIDTH "width" /* Int */ +#define FC_FILE "file" /* String */ +#define FC_INDEX "index" /* Int */ +#define FC_FT_FACE "ftface" /* FT_Face */ +#define FC_RASTERIZER "rasterizer" /* String */ +#define FC_OUTLINE "outline" /* Bool */ +#define FC_SCALABLE "scalable" /* Bool */ +#define FC_SCALE "scale" /* double */ +#define FC_DPI "dpi" /* double */ +#define FC_RGBA "rgba" /* Int */ +#define FC_MINSPACE "minspace" /* Bool use minimum line spacing */ +#define FC_SOURCE "source" /* String (deprecated) */ +#define FC_CHARSET "charset" /* CharSet */ +#define FC_LANG "lang" /* String RFC 3066 langs */ +#define FC_FONTVERSION "fontversion" /* Int from 'head' table */ +#define FC_FULLNAME "fullname" /* String */ +#define FC_FAMILYLANG "familylang" /* String RFC 3066 langs */ +#define FC_STYLELANG "stylelang" /* String RFC 3066 langs */ +#define FC_FULLNAMELANG "fullnamelang" /* String RFC 3066 langs */ +#define FC_CAPABILITY "capability" /* String */ +#define FC_FONTFORMAT "fontformat" /* String */ +#define FC_EMBOLDEN "embolden" /* Bool - true if emboldening needed*/ +#define FC_EMBEDDED_BITMAP "embeddedbitmap" /* Bool - true to enable embedded bitmaps */ +#define FC_DECORATIVE "decorative" /* Bool - true if style is a decorative variant */ +#define FC_LCD_FILTER "lcdfilter" /* Int */ + +#define FC_CACHE_SUFFIX ".cache-"FC_CACHE_VERSION +#define FC_DIR_CACHE_FILE "fonts.cache-"FC_CACHE_VERSION +#define FC_USER_CACHE_FILE ".fonts.cache-"FC_CACHE_VERSION + +/* Adjust outline rasterizer */ +#define FC_CHAR_WIDTH "charwidth" /* Int */ +#define FC_CHAR_HEIGHT "charheight"/* Int */ +#define FC_MATRIX "matrix" /* FcMatrix */ + +#define FC_WEIGHT_THIN 0 +#define FC_WEIGHT_EXTRALIGHT 40 +#define FC_WEIGHT_ULTRALIGHT FC_WEIGHT_EXTRALIGHT +#define FC_WEIGHT_LIGHT 50 +#define FC_WEIGHT_BOOK 75 +#define FC_WEIGHT_REGULAR 80 +#define FC_WEIGHT_NORMAL FC_WEIGHT_REGULAR +#define FC_WEIGHT_MEDIUM 100 +#define FC_WEIGHT_DEMIBOLD 180 +#define FC_WEIGHT_SEMIBOLD FC_WEIGHT_DEMIBOLD +#define FC_WEIGHT_BOLD 200 +#define FC_WEIGHT_EXTRABOLD 205 +#define FC_WEIGHT_ULTRABOLD FC_WEIGHT_EXTRABOLD +#define FC_WEIGHT_BLACK 210 +#define FC_WEIGHT_HEAVY FC_WEIGHT_BLACK +#define FC_WEIGHT_EXTRABLACK 215 +#define FC_WEIGHT_ULTRABLACK FC_WEIGHT_EXTRABLACK + +#define FC_SLANT_ROMAN 0 +#define FC_SLANT_ITALIC 100 +#define FC_SLANT_OBLIQUE 110 + +#define FC_WIDTH_ULTRACONDENSED 50 +#define FC_WIDTH_EXTRACONDENSED 63 +#define FC_WIDTH_CONDENSED 75 +#define FC_WIDTH_SEMICONDENSED 87 +#define FC_WIDTH_NORMAL 100 +#define FC_WIDTH_SEMIEXPANDED 113 +#define FC_WIDTH_EXPANDED 125 +#define FC_WIDTH_EXTRAEXPANDED 150 +#define FC_WIDTH_ULTRAEXPANDED 200 + +#define FC_PROPORTIONAL 0 +#define FC_DUAL 90 +#define FC_MONO 100 +#define FC_CHARCELL 110 + +/* sub-pixel order */ +#define FC_RGBA_UNKNOWN 0 +#define FC_RGBA_RGB 1 +#define FC_RGBA_BGR 2 +#define FC_RGBA_VRGB 3 +#define FC_RGBA_VBGR 4 +#define FC_RGBA_NONE 5 + +/* hinting style */ +#define FC_HINT_NONE 0 +#define FC_HINT_SLIGHT 1 +#define FC_HINT_MEDIUM 2 +#define FC_HINT_FULL 3 + +/* LCD filter */ +#define FC_LCD_NONE 0 +#define FC_LCD_DEFAULT 1 +#define FC_LCD_LIGHT 2 +#define FC_LCD_LEGACY 3 + +typedef enum _FcType { + FcTypeVoid, + FcTypeInteger, + FcTypeDouble, + FcTypeString, + FcTypeBool, + FcTypeMatrix, + FcTypeCharSet, + FcTypeFTFace, + FcTypeLangSet +} FcType; + +typedef struct _FcMatrix { + double xx, xy, yx, yy; +} FcMatrix; + +#define FcMatrixInit(m) ((m)->xx = (m)->yy = 1, \ + (m)->xy = (m)->yx = 0) + +/* + * A data structure to represent the available glyphs in a font. + * This is represented as a sparse boolean btree. + */ + +typedef struct _FcCharSet FcCharSet; + +typedef struct _FcObjectType { + const char *object; + FcType type; +} FcObjectType; + +typedef struct _FcConstant { + const FcChar8 *name; + const char *object; + int value; +} FcConstant; + +typedef enum _FcResult { + FcResultMatch, FcResultNoMatch, FcResultTypeMismatch, FcResultNoId, + FcResultOutOfMemory +} FcResult; + +typedef struct _FcPattern FcPattern; + +typedef struct _FcLangSet FcLangSet; + +typedef struct _FcValue { + FcType type; + union { + const FcChar8 *s; + int i; + FcBool b; + double d; + const FcMatrix *m; + const FcCharSet *c; + void *f; + const FcLangSet *l; + } u; +} FcValue; + +typedef struct _FcFontSet { + int nfont; + int sfont; + FcPattern **fonts; +} FcFontSet; + +typedef struct _FcObjectSet { + int nobject; + int sobject; + const char **objects; +} FcObjectSet; + +typedef enum _FcMatchKind { + FcMatchPattern, FcMatchFont, FcMatchScan +} FcMatchKind; + +typedef enum _FcLangResult { + FcLangEqual = 0, + FcLangDifferentCountry = 1, + FcLangDifferentTerritory = 1, + FcLangDifferentLang = 2 +} FcLangResult; + +typedef enum _FcSetName { + FcSetSystem = 0, + FcSetApplication = 1 +} FcSetName; + +typedef struct _FcAtomic FcAtomic; + +#if defined(__cplusplus) || defined(c_plusplus) /* for C++ V2.0 */ +#define _FCFUNCPROTOBEGIN extern "C" { /* do not leave open across includes */ +#define _FCFUNCPROTOEND } +#else +#define _FCFUNCPROTOBEGIN +#define _FCFUNCPROTOEND +#endif + +typedef enum { FcEndianBig, FcEndianLittle } FcEndian; + +typedef struct _FcConfig FcConfig; + +typedef struct _FcGlobalCache FcFileCache; + +typedef struct _FcBlanks FcBlanks; + +typedef struct _FcStrList FcStrList; + +typedef struct _FcStrSet FcStrSet; + +typedef struct _FcCache FcCache; + +_FCFUNCPROTOBEGIN + +/* fcblanks.c */ +FcPublic FcBlanks * +FcBlanksCreate (void); + +FcPublic void +FcBlanksDestroy (FcBlanks *b); + +FcPublic FcBool +FcBlanksAdd (FcBlanks *b, FcChar32 ucs4); + +FcPublic FcBool +FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4); + +/* fccache.c */ + +FcPublic const FcChar8 * +FcCacheDir(const FcCache *c); + +FcPublic FcFontSet * +FcCacheCopySet(const FcCache *c); + +FcPublic const FcChar8 * +FcCacheSubdir (const FcCache *c, int i); + +FcPublic int +FcCacheNumSubdir (const FcCache *c); + +FcPublic int +FcCacheNumFont (const FcCache *c); + +FcPublic FcBool +FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config); + +FcPublic FcBool +FcDirCacheValid (const FcChar8 *cache_file); + +/* fccfg.c */ +FcPublic FcChar8 * +FcConfigHome (void); + +FcPublic FcBool +FcConfigEnableHome (FcBool enable); + +FcPublic FcChar8 * +FcConfigFilename (const FcChar8 *url); + +FcPublic FcConfig * +FcConfigCreate (void); + +FcPublic FcConfig * +FcConfigReference (FcConfig *config); + +FcPublic void +FcConfigDestroy (FcConfig *config); + +FcPublic FcBool +FcConfigSetCurrent (FcConfig *config); + +FcPublic FcConfig * +FcConfigGetCurrent (void); + +FcPublic FcBool +FcConfigUptoDate (FcConfig *config); + +FcPublic FcBool +FcConfigBuildFonts (FcConfig *config); + +FcPublic FcStrList * +FcConfigGetFontDirs (FcConfig *config); + +FcPublic FcStrList * +FcConfigGetConfigDirs (FcConfig *config); + +FcPublic FcStrList * +FcConfigGetConfigFiles (FcConfig *config); + +FcPublic FcChar8 * +FcConfigGetCache (FcConfig *config); + +FcPublic FcBlanks * +FcConfigGetBlanks (FcConfig *config); + +FcPublic FcStrList * +FcConfigGetCacheDirs (FcConfig *config); + +FcPublic int +FcConfigGetRescanInterval (FcConfig *config); + +FcPublic FcBool +FcConfigSetRescanInterval (FcConfig *config, int rescanInterval); + +FcPublic FcFontSet * +FcConfigGetFonts (FcConfig *config, + FcSetName set); + +FcPublic FcBool +FcConfigAppFontAddFile (FcConfig *config, + const FcChar8 *file); + +FcPublic FcBool +FcConfigAppFontAddDir (FcConfig *config, + const FcChar8 *dir); + +FcPublic void +FcConfigAppFontClear (FcConfig *config); + +FcPublic FcBool +FcConfigSubstituteWithPat (FcConfig *config, + FcPattern *p, + FcPattern *p_pat, + FcMatchKind kind); + +FcPublic FcBool +FcConfigSubstitute (FcConfig *config, + FcPattern *p, + FcMatchKind kind); + +/* fccharset.c */ +FcPublic FcCharSet* +FcCharSetCreate (void); + +/* deprecated alias for FcCharSetCreate */ +FcPublic FcCharSet * +FcCharSetNew (void); + +FcPublic void +FcCharSetDestroy (FcCharSet *fcs); + +FcPublic FcBool +FcCharSetAddChar (FcCharSet *fcs, FcChar32 ucs4); + +FcPublic FcCharSet* +FcCharSetCopy (FcCharSet *src); + +FcPublic FcBool +FcCharSetEqual (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcCharSet* +FcCharSetIntersect (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcCharSet* +FcCharSetUnion (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcCharSet* +FcCharSetSubtract (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcBool +FcCharSetMerge (FcCharSet *a, const FcCharSet *b, FcBool *changed); + +FcPublic FcBool +FcCharSetHasChar (const FcCharSet *fcs, FcChar32 ucs4); + +FcPublic FcChar32 +FcCharSetCount (const FcCharSet *a); + +FcPublic FcChar32 +FcCharSetIntersectCount (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcChar32 +FcCharSetSubtractCount (const FcCharSet *a, const FcCharSet *b); + +FcPublic FcBool +FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b); + +#define FC_CHARSET_MAP_SIZE (256/32) +#define FC_CHARSET_DONE ((FcChar32) -1) + +FcPublic FcChar32 +FcCharSetFirstPage (const FcCharSet *a, + FcChar32 map[FC_CHARSET_MAP_SIZE], + FcChar32 *next); + +FcPublic FcChar32 +FcCharSetNextPage (const FcCharSet *a, + FcChar32 map[FC_CHARSET_MAP_SIZE], + FcChar32 *next); + +/* + * old coverage API, rather hard to use correctly + */ + +FcPublic FcChar32 +FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result); + +/* fcdbg.c */ +FcPublic void +FcValuePrint (const FcValue v); + +FcPublic void +FcPatternPrint (const FcPattern *p); + +FcPublic void +FcFontSetPrint (const FcFontSet *s); + +/* fcdefault.c */ +FcPublic void +FcDefaultSubstitute (FcPattern *pattern); + +/* fcdir.c */ +FcPublic FcBool +FcFileIsDir (const FcChar8 *file); + +FcPublic FcBool +FcFileScan (FcFontSet *set, + FcStrSet *dirs, + FcFileCache *cache, + FcBlanks *blanks, + const FcChar8 *file, + FcBool force); + +FcPublic FcBool +FcDirScan (FcFontSet *set, + FcStrSet *dirs, + FcFileCache *cache, + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force); + +FcPublic FcBool +FcDirSave (FcFontSet *set, FcStrSet *dirs, const FcChar8 *dir); + +FcPublic FcCache * +FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file); + +FcPublic FcCache * +FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config); + +FcPublic FcCache * +FcDirCacheLoadFile (const FcChar8 *cache_file, struct stat *file_stat); + +FcPublic void +FcDirCacheUnload (FcCache *cache); + +/* fcfreetype.c */ +FcPublic FcPattern * +FcFreeTypeQuery (const FcChar8 *file, int id, FcBlanks *blanks, int *count); + +/* fcfs.c */ + +FcPublic FcFontSet * +FcFontSetCreate (void); + +FcPublic void +FcFontSetDestroy (FcFontSet *s); + +FcPublic FcBool +FcFontSetAdd (FcFontSet *s, FcPattern *font); + +/* fcinit.c */ +FcPublic FcConfig * +FcInitLoadConfig (void); + +FcPublic FcConfig * +FcInitLoadConfigAndFonts (void); + +FcPublic FcBool +FcInit (void); + +FcPublic void +FcFini (void); + +FcPublic int +FcGetVersion (void); + +FcPublic FcBool +FcInitReinitialize (void); + +FcPublic FcBool +FcInitBringUptoDate (void); + +/* fclang.c */ +FcPublic FcStrSet * +FcGetLangs (void); + +FcPublic const FcCharSet * +FcLangGetCharSet (const FcChar8 *lang); + +FcPublic FcLangSet* +FcLangSetCreate (void); + +FcPublic void +FcLangSetDestroy (FcLangSet *ls); + +FcPublic FcLangSet* +FcLangSetCopy (const FcLangSet *ls); + +FcPublic FcBool +FcLangSetAdd (FcLangSet *ls, const FcChar8 *lang); + +FcPublic FcLangResult +FcLangSetHasLang (const FcLangSet *ls, const FcChar8 *lang); + +FcPublic FcLangResult +FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb); + +FcPublic FcBool +FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb); + +FcPublic FcBool +FcLangSetEqual (const FcLangSet *lsa, const FcLangSet *lsb); + +FcPublic FcChar32 +FcLangSetHash (const FcLangSet *ls); + +FcPublic FcStrSet * +FcLangSetGetLangs (const FcLangSet *ls); + +/* fclist.c */ +FcPublic FcObjectSet * +FcObjectSetCreate (void); + +FcPublic FcBool +FcObjectSetAdd (FcObjectSet *os, const char *object); + +FcPublic void +FcObjectSetDestroy (FcObjectSet *os); + +FcPublic FcObjectSet * +FcObjectSetVaBuild (const char *first, va_list va); + +FcPublic FcObjectSet * +FcObjectSetBuild (const char *first, ...) FC_ATTRIBUTE_SENTINEL(0); + +FcPublic FcFontSet * +FcFontSetList (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcObjectSet *os); + +FcPublic FcFontSet * +FcFontList (FcConfig *config, + FcPattern *p, + FcObjectSet *os); + +/* fcatomic.c */ + +FcPublic FcAtomic * +FcAtomicCreate (const FcChar8 *file); + +FcPublic FcBool +FcAtomicLock (FcAtomic *atomic); + +FcPublic FcChar8 * +FcAtomicNewFile (FcAtomic *atomic); + +FcPublic FcChar8 * +FcAtomicOrigFile (FcAtomic *atomic); + +FcPublic FcBool +FcAtomicReplaceOrig (FcAtomic *atomic); + +FcPublic void +FcAtomicDeleteNew (FcAtomic *atomic); + +FcPublic void +FcAtomicUnlock (FcAtomic *atomic); + +FcPublic void +FcAtomicDestroy (FcAtomic *atomic); + +/* fcmatch.c */ +FcPublic FcPattern * +FcFontSetMatch (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcResult *result); + +FcPublic FcPattern * +FcFontMatch (FcConfig *config, + FcPattern *p, + FcResult *result); + +FcPublic FcPattern * +FcFontRenderPrepare (FcConfig *config, + FcPattern *pat, + FcPattern *font); + +FcPublic FcFontSet * +FcFontSetSort (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcBool trim, + FcCharSet **csp, + FcResult *result); + +FcPublic FcFontSet * +FcFontSort (FcConfig *config, + FcPattern *p, + FcBool trim, + FcCharSet **csp, + FcResult *result); + +FcPublic void +FcFontSetSortDestroy (FcFontSet *fs); + +/* fcmatrix.c */ +FcPublic FcMatrix * +FcMatrixCopy (const FcMatrix *mat); + +FcPublic FcBool +FcMatrixEqual (const FcMatrix *mat1, const FcMatrix *mat2); + +FcPublic void +FcMatrixMultiply (FcMatrix *result, const FcMatrix *a, const FcMatrix *b); + +FcPublic void +FcMatrixRotate (FcMatrix *m, double c, double s); + +FcPublic void +FcMatrixScale (FcMatrix *m, double sx, double sy); + +FcPublic void +FcMatrixShear (FcMatrix *m, double sh, double sv); + +/* fcname.c */ + +FcPublic FcBool +FcNameRegisterObjectTypes (const FcObjectType *types, int ntype); + +FcPublic FcBool +FcNameUnregisterObjectTypes (const FcObjectType *types, int ntype); + +FcPublic const FcObjectType * +FcNameGetObjectType (const char *object); + +FcPublic FcBool +FcNameRegisterConstants (const FcConstant *consts, int nconsts); + +FcPublic FcBool +FcNameUnregisterConstants (const FcConstant *consts, int nconsts); + +FcPublic const FcConstant * +FcNameGetConstant (FcChar8 *string); + +FcPublic FcBool +FcNameConstant (FcChar8 *string, int *result); + +FcPublic FcPattern * +FcNameParse (const FcChar8 *name); + +FcPublic FcChar8 * +FcNameUnparse (FcPattern *pat); + +/* fcpat.c */ +FcPublic FcPattern * +FcPatternCreate (void); + +FcPublic FcPattern * +FcPatternDuplicate (const FcPattern *p); + +FcPublic void +FcPatternReference (FcPattern *p); + +FcPublic FcPattern * +FcPatternFilter (FcPattern *p, const FcObjectSet *os); + +FcPublic void +FcValueDestroy (FcValue v); + +FcPublic FcBool +FcValueEqual (FcValue va, FcValue vb); + +FcPublic FcValue +FcValueSave (FcValue v); + +FcPublic void +FcPatternDestroy (FcPattern *p); + +FcPublic FcBool +FcPatternEqual (const FcPattern *pa, const FcPattern *pb); + +FcPublic FcBool +FcPatternEqualSubset (const FcPattern *pa, const FcPattern *pb, const FcObjectSet *os); + +FcPublic FcChar32 +FcPatternHash (const FcPattern *p); + +FcPublic FcBool +FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append); + +FcPublic FcBool +FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append); + +FcPublic FcResult +FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v); + +FcPublic FcBool +FcPatternDel (FcPattern *p, const char *object); + +FcPublic FcBool +FcPatternRemove (FcPattern *p, const char *object, int id); + +FcPublic FcBool +FcPatternAddInteger (FcPattern *p, const char *object, int i); + +FcPublic FcBool +FcPatternAddDouble (FcPattern *p, const char *object, double d); + +FcPublic FcBool +FcPatternAddString (FcPattern *p, const char *object, const FcChar8 *s); + +FcPublic FcBool +FcPatternAddMatrix (FcPattern *p, const char *object, const FcMatrix *s); + +FcPublic FcBool +FcPatternAddCharSet (FcPattern *p, const char *object, const FcCharSet *c); + +FcPublic FcBool +FcPatternAddBool (FcPattern *p, const char *object, FcBool b); + +FcPublic FcBool +FcPatternAddLangSet (FcPattern *p, const char *object, const FcLangSet *ls); + +FcPublic FcResult +FcPatternGetInteger (const FcPattern *p, const char *object, int n, int *i); + +FcPublic FcResult +FcPatternGetDouble (const FcPattern *p, const char *object, int n, double *d); + +FcPublic FcResult +FcPatternGetString (const FcPattern *p, const char *object, int n, FcChar8 ** s); + +FcPublic FcResult +FcPatternGetMatrix (const FcPattern *p, const char *object, int n, FcMatrix **s); + +FcPublic FcResult +FcPatternGetCharSet (const FcPattern *p, const char *object, int n, FcCharSet **c); + +FcPublic FcResult +FcPatternGetBool (const FcPattern *p, const char *object, int n, FcBool *b); + +FcPublic FcResult +FcPatternGetLangSet (const FcPattern *p, const char *object, int n, FcLangSet **ls); + +FcPublic FcPattern * +FcPatternVaBuild (FcPattern *p, va_list va); + +FcPublic FcPattern * +FcPatternBuild (FcPattern *p, ...) FC_ATTRIBUTE_SENTINEL(0); + +FcPublic FcChar8 * +FcPatternFormat (FcPattern *pat, const FcChar8 *format); + +/* fcstr.c */ + +FcPublic FcChar8 * +FcStrCopy (const FcChar8 *s); + +FcPublic FcChar8 * +FcStrCopyFilename (const FcChar8 *s); + +FcPublic FcChar8 * +FcStrPlus (const FcChar8 *s1, const FcChar8 *s2); + +FcPublic void +FcStrFree (FcChar8 *s); + +/* These are ASCII only, suitable only for pattern element names */ +#define FcIsUpper(c) ((0101 <= (c) && (c) <= 0132)) +#define FcIsLower(c) ((0141 <= (c) && (c) <= 0172)) +#define FcToLower(c) (FcIsUpper(c) ? (c) - 0101 + 0141 : (c)) + +FcPublic FcChar8 * +FcStrDowncase (const FcChar8 *s); + +FcPublic int +FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2); + +FcPublic int +FcStrCmp (const FcChar8 *s1, const FcChar8 *s2); + +FcPublic const FcChar8 * +FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2); + +FcPublic const FcChar8 * +FcStrStr (const FcChar8 *s1, const FcChar8 *s2); + +FcPublic int +FcUtf8ToUcs4 (const FcChar8 *src_orig, + FcChar32 *dst, + int len); + +FcPublic FcBool +FcUtf8Len (const FcChar8 *string, + int len, + int *nchar, + int *wchar); + +#define FC_UTF8_MAX_LEN 6 + +FcPublic int +FcUcs4ToUtf8 (FcChar32 ucs4, + FcChar8 dest[FC_UTF8_MAX_LEN]); + +FcPublic int +FcUtf16ToUcs4 (const FcChar8 *src_orig, + FcEndian endian, + FcChar32 *dst, + int len); /* in bytes */ + +FcPublic FcBool +FcUtf16Len (const FcChar8 *string, + FcEndian endian, + int len, /* in bytes */ + int *nchar, + int *wchar); + +FcPublic FcChar8 * +FcStrDirname (const FcChar8 *file); + +FcPublic FcChar8 * +FcStrBasename (const FcChar8 *file); + +FcPublic FcStrSet * +FcStrSetCreate (void); + +FcPublic FcBool +FcStrSetMember (FcStrSet *set, const FcChar8 *s); + +FcPublic FcBool +FcStrSetEqual (FcStrSet *sa, FcStrSet *sb); + +FcPublic FcBool +FcStrSetAdd (FcStrSet *set, const FcChar8 *s); + +FcPublic FcBool +FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s); + +FcPublic FcBool +FcStrSetDel (FcStrSet *set, const FcChar8 *s); + +FcPublic void +FcStrSetDestroy (FcStrSet *set); + +FcPublic FcStrList * +FcStrListCreate (FcStrSet *set); + +FcPublic FcChar8 * +FcStrListNext (FcStrList *list); + +FcPublic void +FcStrListDone (FcStrList *list); + +/* fcxml.c */ +FcPublic FcBool +FcConfigParseAndLoad (FcConfig *config, const FcChar8 *file, FcBool complain); + +_FCFUNCPROTOEND + +#undef FC_ATTRIBUTE_SENTINEL + + +#ifndef _FCINT_H_ + +/* + * Deprecated functions are placed here to help users fix their code without + * digging through documentation + */ + +#define FcConfigGetRescanInverval FcConfigGetRescanInverval_REPLACE_BY_FcConfigGetRescanInterval +#define FcConfigSetRescanInverval FcConfigSetRescanInverval_REPLACE_BY_FcConfigSetRescanInterval + +#endif + +#endif /* _FONTCONFIG_H_ */ diff --git a/fontconfig/fonts.conf.in b/fontconfig/fonts.conf.in new file mode 100644 index 000000000..a17c01eeb --- /dev/null +++ b/fontconfig/fonts.conf.in @@ -0,0 +1,151 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<!-- /etc/fonts/fonts.conf file to configure system font access --> +<fontconfig> + +<!-- + DO NOT EDIT THIS FILE. + IT WILL BE REPLACED WHEN FONTCONFIG IS UPDATED. + LOCAL CHANGES BELONG IN 'local.conf'. + + The intent of this standard configuration file is to be adequate for + most environments. If you have a reasonably normal environment and + have found problems with this configuration, they are probably + things that others will also want fixed. Please submit any + problems to the fontconfig bugzilla system located at fontconfig.org + + Note that the normal 'make install' procedure for fontconfig is to + replace any existing fonts.conf file with the new version. Place + any local customizations in local.conf which this file references. + + Keith Packard +--> + +<!-- Font directory list --> + + <dir>@FC_DEFAULT_FONTS@</dir> + @FC_FONTPATH@ + <dir>~/.fonts</dir> + +<!-- + Accept deprecated 'mono' alias, replacing it with 'monospace' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>mono</string> + </test> + <edit name="family" mode="assign"> + <string>monospace</string> + </edit> + </match> + +<!-- + Accept alternate 'sans serif' spelling, replacing it with 'sans-serif' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans serif</string> + </test> + <edit name="family" mode="assign"> + <string>sans-serif</string> + </edit> + </match> + +<!-- + Accept deprecated 'sans' alias, replacing it with 'sans-serif' +--> + <match target="pattern"> + <test qual="any" name="family"> + <string>sans</string> + </test> + <edit name="family" mode="assign"> + <string>sans-serif</string> + </edit> + </match> + +<!-- + Load local system customization file +--> + <include ignore_missing="yes">conf.d</include> + +<!-- Font cache directory list --> + + <cachedir>@FC_CACHEDIR@</cachedir> + <cachedir>~/.fontconfig</cachedir> + + <config> +<!-- + These are the default Unicode chars that are expected to be blank + in fonts. All other blank chars are assumed to be broken and + won't appear in the resulting charsets + --> + <blank> + <int>0x0020</int> <!-- SPACE --> + <int>0x00A0</int> <!-- NO-BREAK SPACE --> + <int>0x00AD</int> <!-- SOFT HYPHEN --> + <int>0x034F</int> <!-- COMBINING GRAPHEME JOINER --> + <int>0x0600</int> <!-- ARABIC NUMBER SIGN --> + <int>0x0601</int> <!-- ARABIC SIGN SANAH --> + <int>0x0602</int> <!-- ARABIC FOOTNOTE MARKER --> + <int>0x0603</int> <!-- ARABIC SIGN SAFHA --> + <int>0x06DD</int> <!-- ARABIC END OF AYAH --> + <int>0x070F</int> <!-- SYRIAC ABBREVIATION MARK --> + <int>0x115F</int> <!-- HANGUL CHOSEONG FILLER --> + <int>0x1160</int> <!-- HANGUL JUNGSEONG FILLER --> + <int>0x1680</int> <!-- OGHAM SPACE MARK --> + <int>0x17B4</int> <!-- KHMER VOWEL INHERENT AQ --> + <int>0x17B5</int> <!-- KHMER VOWEL INHERENT AA --> + <int>0x180E</int> <!-- MONGOLIAN VOWEL SEPARATOR --> + <int>0x2000</int> <!-- EN QUAD --> + <int>0x2001</int> <!-- EM QUAD --> + <int>0x2002</int> <!-- EN SPACE --> + <int>0x2003</int> <!-- EM SPACE --> + <int>0x2004</int> <!-- THREE-PER-EM SPACE --> + <int>0x2005</int> <!-- FOUR-PER-EM SPACE --> + <int>0x2006</int> <!-- SIX-PER-EM SPACE --> + <int>0x2007</int> <!-- FIGURE SPACE --> + <int>0x2008</int> <!-- PUNCTUATION SPACE --> + <int>0x2009</int> <!-- THIN SPACE --> + <int>0x200A</int> <!-- HAIR SPACE --> + <int>0x200B</int> <!-- ZERO WIDTH SPACE --> + <int>0x200C</int> <!-- ZERO WIDTH NON-JOINER --> + <int>0x200D</int> <!-- ZERO WIDTH JOINER --> + <int>0x200E</int> <!-- LEFT-TO-RIGHT MARK --> + <int>0x200F</int> <!-- RIGHT-TO-LEFT MARK --> + <int>0x2028</int> <!-- LINE SEPARATOR --> + <int>0x2029</int> <!-- PARAGRAPH SEPARATOR --> + <int>0x202A</int> <!-- LEFT-TO-RIGHT EMBEDDING --> + <int>0x202B</int> <!-- RIGHT-TO-LEFT EMBEDDING --> + <int>0x202C</int> <!-- POP DIRECTIONAL FORMATTING --> + <int>0x202D</int> <!-- LEFT-TO-RIGHT OVERRIDE --> + <int>0x202E</int> <!-- RIGHT-TO-LEFT OVERRIDE --> + <int>0x202F</int> <!-- NARROW NO-BREAK SPACE --> + <int>0x205F</int> <!-- MEDIUM MATHEMATICAL SPACE --> + <int>0x2060</int> <!-- WORD JOINER --> + <int>0x2061</int> <!-- FUNCTION APPLICATION --> + <int>0x2062</int> <!-- INVISIBLE TIMES --> + <int>0x2063</int> <!-- INVISIBLE SEPARATOR --> + <int>0x206A</int> <!-- INHIBIT SYMMETRIC SWAPPING --> + <int>0x206B</int> <!-- ACTIVATE SYMMETRIC SWAPPING --> + <int>0x206C</int> <!-- INHIBIT ARABIC FORM SHAPING --> + <int>0x206D</int> <!-- ACTIVATE ARABIC FORM SHAPING --> + <int>0x206E</int> <!-- NATIONAL DIGIT SHAPES --> + <int>0x206F</int> <!-- NOMINAL DIGIT SHAPES --> + <int>0x2800</int> <!-- BRAILLE PATTERN BLANK --> + <int>0x3000</int> <!-- IDEOGRAPHIC SPACE --> + <int>0x3164</int> <!-- HANGUL FILLER --> + <int>0xFEFF</int> <!-- ZERO WIDTH NO-BREAK SPACE --> + <int>0xFFA0</int> <!-- HALFWIDTH HANGUL FILLER --> + <int>0xFFF9</int> <!-- INTERLINEAR ANNOTATION ANCHOR --> + <int>0xFFFA</int> <!-- INTERLINEAR ANNOTATION SEPARATOR --> + <int>0xFFFB</int> <!-- INTERLINEAR ANNOTATION TERMINATOR --> + </blank> +<!-- + Rescan configuration every 30 seconds when FcFontSetList is called + --> + <rescan> + <int>30</int> + </rescan> + </config> + +</fontconfig> diff --git a/fontconfig/fonts.dtd b/fontconfig/fonts.dtd new file mode 100644 index 000000000..cbdfdab3f --- /dev/null +++ b/fontconfig/fonts.dtd @@ -0,0 +1,224 @@ +<!-- This is the Document Type Definition for font configuration files --> +<!ELEMENT fontconfig (dir | + cache | + cachedir | + include | + config | + selectfont | + match | + alias)* > + +<!-- + Add a directory that provides fonts +--> +<!ELEMENT dir (#PCDATA)> +<!ATTLIST dir xml:space (default|preserve) 'preserve'> + +<!-- + Define the per-user file that holds cache font information. + + If the filename begins with '~', it is replaced with the users + home directory path. +--> +<!ELEMENT cache (#PCDATA)> +<!ATTLIST cache xml:space (default|preserve) 'preserve'> + +<!-- + Add a directory that is searched for font cache files. + These hold per-directory cache data and are searched in + order for each directory. When writing cache files, the first + directory which allows the cache file to be created is used. + + A leading '~' in a directory name is replaced with the users + home directory path. +--> +<!ELEMENT cachedir (#PCDATA)> +<!ATTLIST cachedir xml:space (default|preserve) 'preserve'> + +<!-- + Reference another configuration file; note that this + is another complete font configuration file and not + just a file included by the XML parser. + + Set 'ignore_missing' to 'yes' if errors are to be ignored. + + If the filename begins with '~', it is replaced with the users + home directory path. +--> +<!ELEMENT include (#PCDATA)> +<!ATTLIST include + ignore_missing (no|yes) "no" + xml:space (default|preserve) "preserve"> + +<!-- + Global library configuration data + --> +<!ELEMENT config (blank|rescan)*> + +<!-- + Specify the set of Unicode encoding values which + represent glyphs that are allowed to contain no + data. With this list, fontconfig can examine + fonts for broken glyphs and eliminate them from + the set of valid Unicode chars. This idea + was borrowed from Mozilla + --> +<!ELEMENT blank (int)*> + +<!-- + Aliases are just a special case for multiple match elements + + They are syntactically equivalent to: + + <match> + <test name="family"> + <string value=[family]/> + </test> + <edit name="family" mode="prepend"> + <string value=[prefer]/> + ... + </edit> + <edit name="family" mode="append"> + <string value=[accept]/> + ... + </edit> + <edit name="family" mode="append_last"> + <string value=[default]/> + ... + </edit> + </match> +--> +<!-- + Periodically rescan the font configuration and + directories to synch internal state with filesystem + --> +<!ELEMENT rescan (int)> + +<!-- + Edit list of available fonts at startup/reload time + --> +<!ELEMENT selectfont (rejectfont | acceptfont)* > + +<!ELEMENT rejectfont (glob | pattern)*> + +<!ELEMENT acceptfont (glob | pattern)*> + +<!ELEMENT glob (#PCDATA)> + +<!ELEMENT pattern (patelt)*> + +<!ENTITY % constant 'int|double|string|matrix|bool|charset|const'> + +<!ELEMENT patelt (%constant;)*> +<!ATTLIST patelt + name CDATA #REQUIRED> + +<!ELEMENT alias (family*, prefer?, accept?, default?)> +<!ATTLIST alias + binding (weak|strong|same) "weak"> +<!ELEMENT prefer (family)*> +<!ELEMENT accept (family)*> +<!ELEMENT default (family)*> +<!ELEMENT family (#PCDATA)> +<!ATTLIST family xml:space (default|preserve) 'preserve'> + +<!ENTITY % expr 'int|double|string|matrix|bool|charset + |name|const + |or|and|eq|not_eq|less|less_eq|more|more_eq|contains|not_contains + |plus|minus|times|divide|not|if|floor|ceil|round|trunc'> + +<!-- + Match and edit patterns. + + If 'target' is 'pattern', execute the match before selecting a font. + if 'target' is 'font', execute the match on the result of a font + selection. +--> +<!ELEMENT match (test*, edit*)> +<!ATTLIST match + target (pattern|font|scan) "pattern"> + +<!-- + Match a field in a pattern + + if 'qual' is 'any', then the match succeeds if any value in the field matches. + if 'qual' is 'all', then the match succeeds only if all values match. + if 'qual' is 'first', then the match succeeds only if the first value matches. + if 'qual' is 'not_first', then the match succeeds only if any value other than + the first matches. + For match elements with target=font, if test 'target' is 'pattern', + then the test is applied to the pattern used in matching rather than + to the resulting font. + + Match elements with target=scan are applied as fonts are scanned. + They edit the pattern generated from the scanned font and affect + what the fontconfig database contains. +--> +<!ELEMENT test (%expr;)*> +<!ATTLIST test + qual (any|all|first|not_first) "any" + name CDATA #REQUIRED + target (pattern|font|default) "default" + compare (eq|not_eq|less|less_eq|more|more_eq|contains|not_contains) "eq"> + +<!-- + Edit a field in a pattern + + The enclosed values are used together to edit the list of values + associated with 'name'. + + If 'name' matches one of those used in a test element for this match element: + if 'mode' is 'assign', replace the matched value. + if 'mode' is 'assign_replace', replace all of the values + if 'mode' is 'prepend', insert before the matched value + if 'mode' is 'append', insert after the matched value + if 'mode' is 'prepend_first', insert before all of the values + if 'mode' is 'append_last', insert after all of the values + If 'name' doesn't match any of those used in a test element: + if 'mode' is 'assign' or 'assign_replace, replace all of the values + if 'mode' is 'prepend' or 'prepend_first', insert before all of the values + if 'mode' is 'append' or 'append_last', insert after all of the values +--> +<!ELEMENT edit (%expr;)*> +<!ATTLIST edit + name CDATA #REQUIRED + mode (assign|assign_replace|prepend|append|prepend_first|append_last) "assign" + binding (weak|strong|same) "weak"> + +<!-- + Elements of expressions follow +--> +<!ELEMENT int (#PCDATA)> +<!ATTLIST int xml:space (default|preserve) 'preserve'> +<!ELEMENT double (#PCDATA)> +<!ATTLIST double xml:space (default|preserve) 'preserve'> +<!ELEMENT string (#PCDATA)> +<!ATTLIST string xml:space (default|preserve) 'preserve'> +<!ELEMENT matrix (double,double,double,double)> +<!ELEMENT bool (#PCDATA)> +<!ELEMENT charset (#PCDATA)> +<!ATTLIST charset xml:space (default|preserve) 'preserve'> +<!ELEMENT name (#PCDATA)> +<!ATTLIST name xml:space (default|preserve) 'preserve'> +<!ELEMENT const (#PCDATA)> +<!ATTLIST const xml:space (default|preserve) 'preserve'> +<!ELEMENT or (%expr;)*> +<!ELEMENT and (%expr;)*> +<!ELEMENT eq ((%expr;), (%expr;))> +<!ELEMENT not_eq ((%expr;), (%expr;))> +<!ELEMENT less ((%expr;), (%expr;))> +<!ELEMENT less_eq ((%expr;), (%expr;))> +<!ELEMENT more ((%expr;), (%expr;))> +<!ELEMENT more_eq ((%expr;), (%expr;))> +<!ELEMENT contains ((%expr;), (%expr;))> +<!ELEMENT not_contains ((%expr;), (%expr;))> +<!ELEMENT plus (%expr;)*> +<!ELEMENT minus (%expr;)*> +<!ELEMENT times (%expr;)*> +<!ELEMENT divide (%expr;)*> +<!ELEMENT not (%expr;)> +<!ELEMENT if ((%expr;), (%expr;), (%expr;))> +<!ELEMENT floor (%expr;)> +<!ELEMENT ceil (%expr;)> +<!ELEMENT round (%expr;)> +<!ELEMENT trunc (%expr;)> diff --git a/fontconfig/local.conf b/fontconfig/local.conf new file mode 100644 index 000000000..9f8beee66 --- /dev/null +++ b/fontconfig/local.conf @@ -0,0 +1,37 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<!-- /etc/fonts/local.conf file for local customizations --> +<fontconfig> +<!-- + Enable sub-pixel rendering + <match target="font"> + <test qual="all" name="rgba"> + <const>unknown</const> + </test> + <edit name="rgba" mode="assign"><const>rgb</const></edit> + </match> +--> +<!-- + Reject bitmap fonts + --> + + <selectfont> + <rejectfont> + <pattern> + <patelt name="scalable"><bool>false</bool></patelt> + </pattern> + </rejectfont> + </selectfont> + +<!-- + Accept bitmap fonts. This overrides any rejectfont which matches + + <selectfont> + <acceptfont> + <pattern> + <patelt name="scalable"><bool>false</bool></patelt> + </pattern> + </acceptfont> + </selectfont> + --> +</fontconfig> diff --git a/fontconfig/new-version.sh b/fontconfig/new-version.sh new file mode 100644 index 000000000..9ab64dd09 --- /dev/null +++ b/fontconfig/new-version.sh @@ -0,0 +1,118 @@ +#!/bin/sh + +if git status -a > /dev/null; then + echo 'Uncommited changes in repository' 1>&2 + exit 1 +fi + +version="$1" +case "$version" in +2.[0-9.]*) + ;; +*) + echo 'Invalid version number:' "$version" 1>&2 + exit 1 + ;; +esac + +eval `echo $version | + awk -F. '{ printf ("major=%d\nminor=%d\nrevision=%d\n", + $1, $2, $3); }'` + +# Update the version numbers + +sed -i configure.in -e "/^AM_INIT_AUTOMAKE/s/2\.[0-9.]*/$version/" + +sed -i fontconfig/fontconfig.h \ + -e "/^#define FC_MAJOR/s/[0-9][0-9]*/$major/" \ + -e "/^#define FC_MINOR/s/[0-9][0-9]*/$minor/" \ + -e "/^#define FC_REVISION/s/[0-9][0-9]*/$revision/" + +# +# Compute pretty form of new version number +# +version_note=`echo $version | awk -F. '{ + if ($3 > 90) + printf ("%d.%d.%d (%d.%d RC%d)\n", + $1, $2, $3, $1, $2 + 1, $3 - 90); + else if ($3 == 0) + printf ("%d.%d\n", $1, $2); + else + printf ("%d.%d.%d\n", $1, $2, $3); }'` + +# +# Find previous version in README +# +last_note=`grep '^2\.[0-9.]*' README | + head -1 | + sed 's/ (2\.[0-9]* RC[0-9]*)//'` +case $last_note in +2.*.*) + last=$last_note + ;; +2.*) + last="$last_note.0" + ;; +*) + echo 'cannot find previous changelog' 1>&2 + exit 1 +esac + +# +# Format the current date for the README header +# +date=`date '+%Y-%m-%d'` + +# +# Update the readme file +# +if [ $version != $last ]; then + # + # header + # + (sed '/^2\.[0-9.]*/,$d' README | + sed -e "s/Version.*/Version $version_note/" \ + -e "s/200.*/$date/" | awk ' + /^[ \t]/ { + gsub ("^[ \t]*", ""); + gsub ("[ \t]*$", ""); + space=(70 - length) / 2; + for (i = 0; i < space; i++) + printf (" "); + print + next + } + { + print + }' + + # + # changelog + # + + echo $version_note + echo + git log --pretty=short $last.. | git shortlog | cat + + # + # previous changelogs + # + + sed -n '/^2\.[0-9.]*/,$p' README) > README.tmp || + (echo "README update failed"; exit 1) + + mv README.tmp README +fi + +$test git commit -m"Bump version to $version" \ + configure.in \ + fontconfig/fontconfig.h \ + README + +# tag the tree +$test git tag -s -m "Version $version" $version + +# Make distributed change log + +git log --stat $last.. > ChangeLog-$version + diff --git a/fontconfig/src/Makefile.am b/fontconfig/src/Makefile.am new file mode 100644 index 000000000..406e85e15 --- /dev/null +++ b/fontconfig/src/Makefile.am @@ -0,0 +1,167 @@ +# +# fontconfig/src/Makefile.am +# +# Copyright © 2003 Keith Packard +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +if OS_WIN32 + +export_symbols = -export-symbols fontconfig.def + +fontconfig_def_dependency = fontconfig.def + +# gcc import library install/uninstall + +install-libtool-import-lib: + $(INSTALL) .libs/libfontconfig.dll.a $(DESTDIR)$(libdir) + $(INSTALL) fontconfig.def $(DESTDIR)$(libdir)/fontconfig.def + +uninstall-libtool-import-lib: + -rm $(DESTDIR)$(libdir)/libfontconfig.dll.a $(DESTDIR)$(libdir)/fontconfig.def + +else + +install-libtool-import-lib: +uninstall-libtool-import-lib: + +fontconfig_def_dependency = + +endif + +if MS_LIB_AVAILABLE + +# Microsoft import library install/uninstall + +noinst_DATA = fontconfig.lib + +fontconfig.lib : libfontconfig.la + lib -name:libfontconfig-@LIBT_CURRENT_MINUS_AGE@.dll -def:fontconfig.def -out:$@ + +install-ms-import-lib: + $(INSTALL) fontconfig.lib $(DESTDIR)$(libdir) + +uninstall-ms-import-lib: + -rm $(DESTDIR)$(libdir)/fontconfig.lib + +else + +install-ms-import-lib: +uninstall-ms-import-lib: + +endif + +INCLUDES = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src \ + $(FREETYPE_CFLAGS) \ + $(LIBXML2_CFLAGS) \ + $(EXPAT_CFLAGS) \ + $(WARN_CFLAGS) \ + -DFC_CACHEDIR='"$(FC_CACHEDIR)"' \ + -DFONTCONFIG_PATH='"$(CONFDIR)"' + +EXTRA_DIST = makealias + +noinst_HEADERS=fcint.h fcftint.h fcdeprecate.h + +ALIAS_FILES = fcalias.h fcaliastail.h fcftalias.h fcftaliastail.h + +BUILT_SOURCES = $(ALIAS_FILES) \ + ../fc-arch/fcarch.h \ + ../fc-case/fccase.h \ + ../fc-glyphname/fcglyphname.h \ + ../fc-lang/fclang.h + +../fc-arch/fcarch.h: + cd ../fc-arch && $(MAKE) $(AM_MAKEFLAGS) fcarch.h +../fc-case/fccase.h: + cd ../fc-case && $(MAKE) $(AM_MAKEFLAGS) fccase.h +../fc-glyphname/fcglyphname.h: + cd ../fc-glyphname && $(MAKE) $(AM_MAKEFLAGS) fcglyphname.h +../fc-lang/fclang.h: + cd ../fc-lang && $(MAKE) $(AM_MAKEFLAGS) fclang.h + +libfontconfig_la_SOURCES = \ + fcatomic.c \ + fcblanks.c \ + fccache.c \ + fccfg.c \ + fccharset.c \ + fcdbg.c \ + fcdefault.c \ + fcdir.c \ + fcformat.c \ + fcfreetype.c \ + fcfs.c \ + fcinit.c \ + fclang.c \ + fclist.c \ + fcmatch.c \ + fcmatrix.c \ + fcname.c \ + fcpat.c \ + fcserialize.c \ + fcstr.c \ + fcxml.c \ + ftglue.h \ + ftglue.c + +lib_LTLIBRARIES = libfontconfig.la + +libfontconfig_la_LDFLAGS = \ + -version-info @LIBT_VERSION_INFO@ -no-undefined $(export_symbols) + +libfontconfig_la_LIBADD = $(ICONV_LIBS) $(FREETYPE_LIBS) $(LIBXML2_LIBS) $(EXPAT_LIBS) + +libfontconfig_la_DEPENDENCIES = $(fontconfig_def_dependency) + +install-data-local: install-ms-import-lib install-libtool-import-lib + +uninstall-local: uninstall-ms-import-lib uninstall-libtool-import-lib + +PUBLIC_FILES = \ + $(top_srcdir)/fontconfig/fontconfig.h \ + $(top_srcdir)/src/fcdeprecate.h \ + $(top_srcdir)/fontconfig/fcprivate.h + +PUBLIC_FT_FILES = \ + $(top_srcdir)/fontconfig/fcfreetype.h + +fcaliastail.h: fcalias.h + +fcalias.h: $(top_srcdir)/src/makealias $(PUBLIC_FILES) + sh $(top_srcdir)/src/makealias "$(top_srcdir)/src" fcalias.h fcaliastail.h $(PUBLIC_FILES) + +fcftaliastail.h: fcftalias.h + +fcftalias.h: $(top_srcdir)/src/makealias $(PUBLIC_FT_FILES) + sh $(top_srcdir)/src/makealias "$(top_srcdir)/src" fcftalias.h fcftaliastail.h $(PUBLIC_FT_FILES) + +CLEANFILES = $(ALIAS_FILES) + +fontconfig.def: $(PUBLIC_FILES) $(PUBLIC_FT_FILES) + echo Generating $@ + (echo EXPORTS; \ + (cat $(PUBLIC_FILES) $(PUBLIC_FT_FILES) || echo 'FcERROR ()' ) | \ + grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$$//' -e 's/^/ /' | \ + sort; \ + echo LIBRARY libfontconfig-@LIBT_CURRENT_MINUS_AGE@.dll; \ + echo VERSION @LIBT_CURRENT@.@LIBT_REVISION@) >$@ + @ ! grep -q FcERROR $@ || ($(RM) $@; false) diff --git a/fontconfig/src/fcatomic.c b/fontconfig/src/fcatomic.c new file mode 100644 index 000000000..89cae6183 --- /dev/null +++ b/fontconfig/src/fcatomic.c @@ -0,0 +1,216 @@ +/* + * fontconfig/src/fcatomic.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * fcatomic.c + * + * Lock cache and configuration files for atomic update + * + * Uses only regular filesystem calls so it should + * work even in the absense of functioning file locking + * + * On Unix, four files are used: + * file - the data file accessed by other apps. + * new - a new version of the data file while it's being written + * lck - the lock file + * tmp - a temporary file made unique with mkstemp + * + * Here's how it works: + * Create 'tmp' and store our PID in it + * Attempt to link it to 'lck' + * Unlink 'tmp' + * If the link succeeded, the lock is held + * + * On Windows, where there are no links, no tmp file is used, and lck + * is a directory that's mkdir'ed. If the mkdir succeeds, the lock is + * held. + */ + +#include "fcint.h" +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <time.h> + +#ifdef _WIN32 +#define mkdir(path,mode) _mkdir(path) +#endif + +#define NEW_NAME ".NEW" +#define LCK_NAME ".LCK" +#define TMP_NAME ".TMP-XXXXXX" + +FcAtomic * +FcAtomicCreate (const FcChar8 *file) +{ + int file_len = strlen ((char *) file); + int new_len = file_len + sizeof (NEW_NAME); + int lck_len = file_len + sizeof (LCK_NAME); + int tmp_len = file_len + sizeof (TMP_NAME); + int total_len = (sizeof (FcAtomic) + + file_len + 1 + + new_len + 1 + + lck_len + 1 + + tmp_len + 1); + FcAtomic *atomic = malloc (total_len); + if (!atomic) + return 0; + FcMemAlloc (FC_MEM_ATOMIC, total_len); + + atomic->file = (FcChar8 *) (atomic + 1); + strcpy ((char *) atomic->file, (char *) file); + + atomic->new = atomic->file + file_len + 1; + strcpy ((char *) atomic->new, (char *) file); + strcat ((char *) atomic->new, NEW_NAME); + + atomic->lck = atomic->new + new_len + 1; + strcpy ((char *) atomic->lck, (char *) file); + strcat ((char *) atomic->lck, LCK_NAME); + + atomic->tmp = atomic->lck + lck_len + 1; + + return atomic; +} + +FcBool +FcAtomicLock (FcAtomic *atomic) +{ + int fd = -1; + FILE *f = 0; + int ret; + struct stat lck_stat; + +#ifdef HAVE_LINK + strcpy ((char *) atomic->tmp, (char *) atomic->file); + strcat ((char *) atomic->tmp, TMP_NAME); + fd = mkstemp ((char *) atomic->tmp); + if (fd < 0) + return FcFalse; + f = fdopen (fd, "w"); + if (!f) + { + close (fd); + unlink ((char *) atomic->tmp); + return FcFalse; + } + ret = fprintf (f, "%ld\n", (long)getpid()); + if (ret <= 0) + { + fclose (f); + unlink ((char *) atomic->tmp); + return FcFalse; + } + if (fclose (f) == EOF) + { + unlink ((char *) atomic->tmp); + return FcFalse; + } + ret = link ((char *) atomic->tmp, (char *) atomic->lck); + (void) unlink ((char *) atomic->tmp); +#else + ret = mkdir ((char *) atomic->lck, 0600); +#endif + if (ret < 0) + { + /* + * If the file is around and old (> 10 minutes), + * assume the lock is stale. This assumes that any + * machines sharing the same filesystem will have clocks + * reasonably close to each other. + */ + if (FcStat ((char *) atomic->lck, &lck_stat) >= 0) + { + time_t now = time (0); + if ((long int) (now - lck_stat.st_mtime) > 10 * 60) + { +#ifdef HAVE_LINK + if (unlink ((char *) atomic->lck) == 0) + return FcAtomicLock (atomic); +#else + if (rmdir ((char *) atomic->lck) == 0) + return FcAtomicLock (atomic); +#endif + } + } + return FcFalse; + } + (void) unlink ((char *) atomic->new); + return FcTrue; +} + +FcChar8 * +FcAtomicNewFile (FcAtomic *atomic) +{ + return atomic->new; +} + +FcChar8 * +FcAtomicOrigFile (FcAtomic *atomic) +{ + return atomic->file; +} + +FcBool +FcAtomicReplaceOrig (FcAtomic *atomic) +{ +#ifdef _WIN32 + unlink (atomic->file); +#endif + if (rename ((char *) atomic->new, (char *) atomic->file) < 0) + return FcFalse; + return FcTrue; +} + +void +FcAtomicDeleteNew (FcAtomic *atomic) +{ + unlink ((char *) atomic->new); +} + +void +FcAtomicUnlock (FcAtomic *atomic) +{ +#ifdef HAVE_LINK + unlink ((char *) atomic->lck); +#else + rmdir ((char *) atomic->lck); +#endif +} + +void +FcAtomicDestroy (FcAtomic *atomic) +{ + FcMemFree (FC_MEM_ATOMIC, sizeof (FcAtomic) + + strlen ((char *) atomic->file) * 4 + 4 + + sizeof (NEW_NAME) + sizeof (LCK_NAME) + + sizeof (TMP_NAME)); + + free (atomic); +} +#define __fcatomic__ +#include "fcaliastail.h" +#undef __fcatomic__ diff --git a/fontconfig/src/fcblanks.c b/fontconfig/src/fcblanks.c new file mode 100644 index 000000000..bab3066e8 --- /dev/null +++ b/fontconfig/src/fcblanks.c @@ -0,0 +1,95 @@ +/* + * fontconfig/src/fcblanks.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" + +FcBlanks * +FcBlanksCreate (void) +{ + FcBlanks *b; + + b = malloc (sizeof (FcBlanks)); + if (!b) + return 0; + FcMemAlloc (FC_MEM_BLANKS, sizeof (FcBlanks)); + b->nblank = 0; + b->sblank = 0; + b->blanks = 0; + return b; +} + +void +FcBlanksDestroy (FcBlanks *b) +{ + if (b->blanks) + { + FcMemFree (FC_MEM_BLANKS, b->sblank * sizeof (FcChar32)); + free (b->blanks); + } + FcMemFree (FC_MEM_BLANKS, sizeof (FcBlanks)); + free (b); +} + +FcBool +FcBlanksAdd (FcBlanks *b, FcChar32 ucs4) +{ + FcChar32 *c; + int sblank; + + for (sblank = 0; sblank < b->nblank; sblank++) + if (b->blanks[sblank] == ucs4) + return FcTrue; + + if (b->nblank == b->sblank) + { + sblank = b->sblank + 32; + if (b->blanks) + c = (FcChar32 *) realloc (b->blanks, sblank * sizeof (FcChar32)); + else + c = (FcChar32 *) malloc (sblank * sizeof (FcChar32)); + if (!c) + return FcFalse; + if (b->sblank) + FcMemFree (FC_MEM_BLANKS, b->sblank * sizeof (FcChar32)); + FcMemAlloc (FC_MEM_BLANKS, sblank * sizeof (FcChar32)); + b->sblank = sblank; + b->blanks = c; + } + b->blanks[b->nblank++] = ucs4; + return FcTrue; +} + +FcBool +FcBlanksIsMember (FcBlanks *b, FcChar32 ucs4) +{ + int i; + + for (i = 0; i < b->nblank; i++) + if (b->blanks[i] == ucs4) + return FcTrue; + return FcFalse; +} +#define __fcblanks__ +#include "fcaliastail.h" +#undef __fcblanks__ diff --git a/fontconfig/src/fccache.c b/fontconfig/src/fccache.c new file mode 100644 index 000000000..69e1a6b82 --- /dev/null +++ b/fontconfig/src/fccache.c @@ -0,0 +1,1265 @@ +/* + * Copyright © 2000 Keith Packard + * Copyright © 2005 Patrick Lam + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include "../fc-arch/fcarch.h" +#include <stdio.h> +#include <fcntl.h> +#include <dirent.h> +#include <string.h> +#include <sys/types.h> +#include <assert.h> +#if defined(HAVE_MMAP) || defined(__CYGWIN__) +# include <unistd.h> +# include <sys/mman.h> +#elif defined(_WIN32) +# define _WIN32_WINNT 0x0500 +# include <windows.h> +#endif + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +struct MD5Context { + FcChar32 buf[4]; + FcChar32 bits[2]; + unsigned char in[64]; +}; + +static void MD5Init(struct MD5Context *ctx); +static void MD5Update(struct MD5Context *ctx, const unsigned char *buf, unsigned len); +static void MD5Final(unsigned char digest[16], struct MD5Context *ctx); +static void MD5Transform(FcChar32 buf[4], FcChar32 in[16]); + +#define CACHEBASE_LEN (1 + 32 + 1 + sizeof (FC_ARCHITECTURE) + sizeof (FC_CACHE_SUFFIX)) + +#ifdef _WIN32 + +#include <windows.h> + +#ifdef __GNUC__ +typedef long long INT64; +#define EPOCH_OFFSET 11644473600ll +#else +#define EPOCH_OFFSET 11644473600i64 +typedef __int64 INT64; +#endif + +/* Workaround for problems in the stat() in the Microsoft C library: + * + * 1) stat() uses FindFirstFile() to get the file + * attributes. Unfortunately this API doesn't return correct values + * for modification time of a directory until some time after a file + * or subdirectory has been added to the directory. (This causes + * run-test.sh to fail, for instance.) GetFileAttributesEx() is + * better, it returns the updated timestamp right away. + * + * 2) stat() does some strange things related to backward + * compatibility with the local time timestamps on FAT volumes and + * daylight saving time. This causes problems after the switches + * to/from daylight saving time. See + * http://bugzilla.gnome.org/show_bug.cgi?id=154968 , especially + * comment #30, and http://www.codeproject.com/datetime/dstbugs.asp . + * We don't need any of that, FAT and Win9x are as good as dead. So + * just use the UTC timestamps from NTFS, converted to the Unix epoch. + */ + +int +FcStat (const char *file, struct stat *statb) +{ + WIN32_FILE_ATTRIBUTE_DATA wfad; + char full_path_name[MAX_PATH]; + char *basename; + DWORD rc; + + if (!GetFileAttributesEx (file, GetFileExInfoStandard, &wfad)) + return -1; + + statb->st_dev = 0; + + /* Calculate a pseudo inode number as a hash of the full path name. + * Call GetLongPathName() to get the spelling of the path name as it + * is on disk. + */ + rc = GetFullPathName (file, sizeof (full_path_name), full_path_name, &basename); + if (rc == 0 || rc > sizeof (full_path_name)) + return -1; + + rc = GetLongPathName (full_path_name, full_path_name, sizeof (full_path_name)); + statb->st_ino = FcStringHash (full_path_name); + + statb->st_mode = _S_IREAD | _S_IWRITE; + statb->st_mode |= (statb->st_mode >> 3) | (statb->st_mode >> 6); + + if (wfad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) + statb->st_mode |= _S_IFDIR; + else + statb->st_mode |= _S_IFREG; + + statb->st_nlink = 1; + statb->st_uid = statb->st_gid = 0; + statb->st_rdev = 0; + + if (wfad.nFileSizeHigh > 0) + return -1; + statb->st_size = wfad.nFileSizeLow; + + statb->st_atime = (*(INT64 *)&wfad.ftLastAccessTime)/10000000 - EPOCH_OFFSET; + statb->st_mtime = (*(INT64 *)&wfad.ftLastWriteTime)/10000000 - EPOCH_OFFSET; + statb->st_ctime = statb->st_mtime; + + return 0; +} +#endif + +static const char bin2hex[] = { '0', '1', '2', '3', + '4', '5', '6', '7', + '8', '9', 'a', 'b', + 'c', 'd', 'e', 'f' }; + +static FcChar8 * +FcDirCacheBasename (const FcChar8 * dir, FcChar8 cache_base[CACHEBASE_LEN]) +{ + unsigned char hash[16]; + FcChar8 *hex_hash; + int cnt; + struct MD5Context ctx; + + MD5Init (&ctx); + MD5Update (&ctx, (const unsigned char *)dir, strlen ((const char *) dir)); + + MD5Final (hash, &ctx); + + cache_base[0] = '/'; + hex_hash = cache_base + 1; + for (cnt = 0; cnt < 16; ++cnt) + { + hex_hash[2*cnt ] = bin2hex[hash[cnt] >> 4]; + hex_hash[2*cnt+1] = bin2hex[hash[cnt] & 0xf]; + } + hex_hash[2*cnt] = 0; + strcat ((char *) cache_base, "-" FC_ARCHITECTURE FC_CACHE_SUFFIX); + + return cache_base; +} + +FcBool +FcDirCacheUnlink (const FcChar8 *dir, FcConfig *config) +{ + FcChar8 *cache_hashed = NULL; + FcChar8 cache_base[CACHEBASE_LEN]; + FcStrList *list; + FcChar8 *cache_dir; + + FcDirCacheBasename (dir, cache_base); + + list = FcStrListCreate (config->cacheDirs); + if (!list) + return FcFalse; + + while ((cache_dir = FcStrListNext (list))) + { + cache_hashed = FcStrPlus (cache_dir, cache_base); + if (!cache_hashed) + break; + (void) unlink ((char *) cache_hashed); + FcStrFree (cache_hashed); + } + FcStrListDone (list); + /* return FcFalse if something went wrong */ + if (cache_dir) + return FcFalse; + return FcTrue; +} + +static int +FcDirCacheOpenFile (const FcChar8 *cache_file, struct stat *file_stat) +{ + int fd; + +#ifdef _WIN32 + if (FcStat (cache_file, file_stat) < 0) + return -1; +#endif + fd = open((char *) cache_file, O_RDONLY | O_BINARY); + if (fd < 0) + return fd; +#ifndef _WIN32 + if (fstat (fd, file_stat) < 0) + { + close (fd); + return -1; + } +#endif + return fd; +} + +/* + * Look for a cache file for the specified dir. Attempt + * to use each one we find, stopping when the callback + * indicates success + */ +static FcBool +FcDirCacheProcess (FcConfig *config, const FcChar8 *dir, + FcBool (*callback) (int fd, struct stat *fd_stat, + struct stat *dir_stat, void *closure), + void *closure, FcChar8 **cache_file_ret) +{ + int fd = -1; + FcChar8 cache_base[CACHEBASE_LEN]; + FcStrList *list; + FcChar8 *cache_dir; + struct stat file_stat, dir_stat; + FcBool ret = FcFalse; + + if (FcStat ((char *) dir, &dir_stat) < 0) + return FcFalse; + + FcDirCacheBasename (dir, cache_base); + + list = FcStrListCreate (config->cacheDirs); + if (!list) + return FcFalse; + + while ((cache_dir = FcStrListNext (list))) + { + FcChar8 *cache_hashed = FcStrPlus (cache_dir, cache_base); + if (!cache_hashed) + break; + fd = FcDirCacheOpenFile (cache_hashed, &file_stat); + if (fd >= 0) { + ret = (*callback) (fd, &file_stat, &dir_stat, closure); + close (fd); + if (ret) + { + if (cache_file_ret) + *cache_file_ret = cache_hashed; + else + FcStrFree (cache_hashed); + break; + } + } + FcStrFree (cache_hashed); + } + FcStrListDone (list); + + return ret; +} + +#define FC_CACHE_MIN_MMAP 1024 + +/* + * Skip list element, make sure the 'next' pointer is the last thing + * in the structure, it will be allocated large enough to hold all + * of the necessary pointers + */ + +typedef struct _FcCacheSkip FcCacheSkip; + +struct _FcCacheSkip { + FcCache *cache; + int ref; + intptr_t size; + dev_t cache_dev; + ino_t cache_ino; + time_t cache_mtime; + FcCacheSkip *next[1]; +}; + +/* + * The head of the skip list; pointers for every possible level + * in the skip list, plus the largest level in the list + */ + +#define FC_CACHE_MAX_LEVEL 16 + +static FcCacheSkip *fcCacheChains[FC_CACHE_MAX_LEVEL]; +static int fcCacheMaxLevel; + +#if HAVE_RANDOM +# define FcRandom() random() +#else +# if HAVE_LRAND48 +# define FcRandom() lrand48() +# else +# if HAVE_RAND +# define FcRandom() rand() +# endif +# endif +#endif +/* + * Generate a random level number, distributed + * so that each level is 1/4 as likely as the one before + * + * Note that level numbers run 1 <= level <= MAX_LEVEL + */ +static int +random_level (void) +{ + /* tricky bit -- each bit is '1' 75% of the time */ + long int bits = FcRandom () | FcRandom (); + int level = 0; + + while (++level < FC_CACHE_MAX_LEVEL) + { + if (bits & 1) + break; + bits >>= 1; + } + return level; +} + +/* + * Insert cache into the list + */ +static FcBool +FcCacheInsert (FcCache *cache, struct stat *cache_stat) +{ + FcCacheSkip **update[FC_CACHE_MAX_LEVEL]; + FcCacheSkip *s, **next; + int i, level; + + /* + * Find links along each chain + */ + next = fcCacheChains; + for (i = fcCacheMaxLevel; --i >= 0; ) + { + for (; (s = next[i]); next = s->next) + if (s->cache > cache) + break; + update[i] = &next[i]; + } + + /* + * Create new list element + */ + level = random_level (); + if (level > fcCacheMaxLevel) + { + level = fcCacheMaxLevel + 1; + update[fcCacheMaxLevel] = &fcCacheChains[fcCacheMaxLevel]; + fcCacheMaxLevel = level; + } + + s = malloc (sizeof (FcCacheSkip) + (level - 1) * sizeof (FcCacheSkip *)); + if (!s) + return FcFalse; + + s->cache = cache; + s->size = cache->size; + s->ref = 1; + if (cache_stat) + { + s->cache_dev = cache_stat->st_dev; + s->cache_ino = cache_stat->st_ino; + s->cache_mtime = cache_stat->st_mtime; + } + else + { + s->cache_dev = 0; + s->cache_ino = 0; + s->cache_mtime = 0; + } + + /* + * Insert into all fcCacheChains + */ + for (i = 0; i < level; i++) + { + s->next[i] = *update[i]; + *update[i] = s; + } + return FcTrue; +} + +static FcCacheSkip * +FcCacheFindByAddr (void *object) +{ + int i; + FcCacheSkip **next = fcCacheChains; + FcCacheSkip *s; + + /* + * Walk chain pointers one level at a time + */ + for (i = fcCacheMaxLevel; --i >= 0;) + while (next[i] && (char *) object >= ((char *) next[i]->cache + next[i]->size)) + next = next[i]->next; + /* + * Here we are + */ + s = next[0]; + if (s && (char *) object < ((char *) s->cache + s->size)) + return s; + return NULL; +} + +static void +FcCacheRemove (FcCache *cache) +{ + FcCacheSkip **update[FC_CACHE_MAX_LEVEL]; + FcCacheSkip *s, **next; + int i; + + /* + * Find links along each chain + */ + next = fcCacheChains; + for (i = fcCacheMaxLevel; --i >= 0; ) + { + for (; (s = next[i]); next = s->next) + if (s->cache >= cache) + break; + update[i] = &next[i]; + } + s = next[0]; + for (i = 0; i < fcCacheMaxLevel && *update[i] == s; i++) + *update[i] = s->next[i]; + while (fcCacheMaxLevel > 0 && fcCacheChains[fcCacheMaxLevel - 1] == NULL) + fcCacheMaxLevel--; + free (s); +} + +static FcCache * +FcCacheFindByStat (struct stat *cache_stat) +{ + FcCacheSkip *s; + + for (s = fcCacheChains[0]; s; s = s->next[0]) + if (s->cache_dev == cache_stat->st_dev && + s->cache_ino == cache_stat->st_ino && + s->cache_mtime == cache_stat->st_mtime) + { + s->ref++; + return s->cache; + } + return NULL; +} + +static void +FcDirCacheDispose (FcCache *cache) +{ + switch (cache->magic) { + case FC_CACHE_MAGIC_ALLOC: + free (cache); + break; + case FC_CACHE_MAGIC_MMAP: +#if defined(HAVE_MMAP) || defined(__CYGWIN__) + munmap (cache, cache->size); +#elif defined(_WIN32) + UnmapViewOfFile (cache); +#endif + break; + } + FcCacheRemove (cache); +} + +void +FcCacheObjectReference (void *object) +{ + FcCacheSkip *skip = FcCacheFindByAddr (object); + + if (skip) + skip->ref++; +} + +void +FcCacheObjectDereference (void *object) +{ + FcCacheSkip *skip = FcCacheFindByAddr (object); + + if (skip) + { + skip->ref--; + if (skip->ref <= 0) + FcDirCacheDispose (skip->cache); + } +} + +void +FcCacheFini (void) +{ + int i; + + for (i = 0; i < FC_CACHE_MAX_LEVEL; i++) + assert (fcCacheChains[i] == NULL); + assert (fcCacheMaxLevel == 0); +} + +static FcBool +FcCacheTimeValid (FcCache *cache, struct stat *dir_stat) +{ + struct stat dir_static; + + if (!dir_stat) + { + if (FcStat ((const char *) FcCacheDir (cache), &dir_static) < 0) + return FcFalse; + dir_stat = &dir_static; + } + if (FcDebug () & FC_DBG_CACHE) + printf ("FcCacheTimeValid dir \"%s\" cache time %d dir time %d\n", + FcCacheDir (cache), cache->mtime, (int) dir_stat->st_mtime); + return cache->mtime == (int) dir_stat->st_mtime; +} + +/* + * Map a cache file into memory + */ +static FcCache * +FcDirCacheMapFd (int fd, struct stat *fd_stat, struct stat *dir_stat) +{ + FcCache *cache; + FcBool allocated = FcFalse; + + if (fd_stat->st_size < sizeof (FcCache)) + return NULL; + cache = FcCacheFindByStat (fd_stat); + if (cache) + { + if (FcCacheTimeValid (cache, dir_stat)) + return cache; + FcDirCacheUnload (cache); + cache = NULL; + } + + /* + * Lage cache files are mmap'ed, smaller cache files are read. This + * balances the system cost of mmap against per-process memory usage. + */ + if (fd_stat->st_size >= FC_CACHE_MIN_MMAP) + { +#if defined(HAVE_MMAP) || defined(__CYGWIN__) + cache = mmap (0, fd_stat->st_size, PROT_READ, MAP_SHARED, fd, 0); + if (cache == MAP_FAILED) + cache = NULL; +#elif defined(_WIN32) + { + HANDLE hFileMap; + + cache = NULL; + hFileMap = CreateFileMapping((HANDLE) _get_osfhandle(fd), NULL, + PAGE_READONLY, 0, 0, NULL); + if (hFileMap != NULL) + { + cache = MapViewOfFile (hFileMap, FILE_MAP_READ, 0, 0, + fd_stat->st_size); + CloseHandle (hFileMap); + } + } +#endif + } + if (!cache) + { + cache = malloc (fd_stat->st_size); + if (!cache) + return NULL; + + if (read (fd, cache, fd_stat->st_size) != fd_stat->st_size) + { + free (cache); + return NULL; + } + allocated = FcTrue; + } + if (cache->magic != FC_CACHE_MAGIC_MMAP || + cache->version < FC_CACHE_CONTENT_VERSION || + cache->size != fd_stat->st_size || + !FcCacheTimeValid (cache, dir_stat) || + !FcCacheInsert (cache, fd_stat)) + { + if (allocated) + free (cache); + else + { +#if defined(HAVE_MMAP) || defined(__CYGWIN__) + munmap (cache, fd_stat->st_size); +#elif defined(_WIN32) + UnmapViewOfFile (cache); +#endif + } + return NULL; + } + + /* Mark allocated caches so they're freed rather than unmapped */ + if (allocated) + cache->magic = FC_CACHE_MAGIC_ALLOC; + + return cache; +} + +void +FcDirCacheReference (FcCache *cache, int nref) +{ + FcCacheSkip *skip = FcCacheFindByAddr (cache); + + if (skip) + skip->ref += nref; +} + +void +FcDirCacheUnload (FcCache *cache) +{ + FcCacheObjectDereference (cache); +} + +static FcBool +FcDirCacheMapHelper (int fd, struct stat *fd_stat, struct stat *dir_stat, void *closure) +{ + FcCache *cache = FcDirCacheMapFd (fd, fd_stat, dir_stat); + + if (!cache) + return FcFalse; + *((FcCache **) closure) = cache; + return FcTrue; +} + +FcCache * +FcDirCacheLoad (const FcChar8 *dir, FcConfig *config, FcChar8 **cache_file) +{ + FcCache *cache = NULL; + + if (!FcDirCacheProcess (config, dir, + FcDirCacheMapHelper, + &cache, cache_file)) + return NULL; + return cache; +} + +FcCache * +FcDirCacheLoadFile (const FcChar8 *cache_file, struct stat *file_stat) +{ + int fd; + FcCache *cache; + struct stat my_file_stat; + + if (!file_stat) + file_stat = &my_file_stat; + fd = FcDirCacheOpenFile (cache_file, file_stat); + if (fd < 0) + return NULL; + cache = FcDirCacheMapFd (fd, file_stat, NULL); + close (fd); + return cache; +} + +/* + * Validate a cache file by reading the header and checking + * the magic number and the size field + */ +static FcBool +FcDirCacheValidateHelper (int fd, struct stat *fd_stat, struct stat *dir_stat, void *closure) +{ + FcBool ret = FcTrue; + FcCache c; + + if (read (fd, &c, sizeof (FcCache)) != sizeof (FcCache)) + ret = FcFalse; + else if (c.magic != FC_CACHE_MAGIC_MMAP) + ret = FcFalse; + else if (c.version < FC_CACHE_CONTENT_VERSION) + ret = FcFalse; + else if (fd_stat->st_size != c.size) + ret = FcFalse; + else if (c.mtime != (int) dir_stat->st_mtime) + ret = FcFalse; + return ret; +} + +static FcBool +FcDirCacheValidConfig (const FcChar8 *dir, FcConfig *config) +{ + return FcDirCacheProcess (config, dir, + FcDirCacheValidateHelper, + NULL, NULL); +} + +FcBool +FcDirCacheValid (const FcChar8 *dir) +{ + FcConfig *config; + + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + + return FcDirCacheValidConfig (dir, config); +} + +/* + * Build a cache structure from the given contents + */ +FcCache * +FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs) +{ + FcSerialize *serialize = FcSerializeCreate (); + FcCache *cache; + int i; + intptr_t cache_offset; + intptr_t dirs_offset; + FcChar8 *dir_serialize; + intptr_t *dirs_serialize; + FcFontSet *set_serialize; + + if (!serialize) + return NULL; + /* + * Space for cache structure + */ + cache_offset = FcSerializeReserve (serialize, sizeof (FcCache)); + /* + * Directory name + */ + if (!FcStrSerializeAlloc (serialize, dir)) + goto bail1; + /* + * Subdirs + */ + dirs_offset = FcSerializeAlloc (serialize, dirs, dirs->num * sizeof (FcChar8 *)); + for (i = 0; i < dirs->num; i++) + if (!FcStrSerializeAlloc (serialize, dirs->strs[i])) + goto bail1; + + /* + * Patterns + */ + if (!FcFontSetSerializeAlloc (serialize, set)) + goto bail1; + + /* Serialize layout complete. Now allocate space and fill it */ + cache = malloc (serialize->size); + if (!cache) + goto bail1; + /* shut up valgrind */ + memset (cache, 0, serialize->size); + + serialize->linear = cache; + + cache->magic = FC_CACHE_MAGIC_ALLOC; + cache->version = FC_CACHE_CONTENT_VERSION; + cache->size = serialize->size; + cache->mtime = (int) dir_stat->st_mtime; + + /* + * Serialize directory name + */ + dir_serialize = FcStrSerialize (serialize, dir); + if (!dir_serialize) + goto bail2; + cache->dir = FcPtrToOffset (cache, dir_serialize); + + /* + * Serialize sub dirs + */ + dirs_serialize = FcSerializePtr (serialize, dirs); + if (!dirs_serialize) + goto bail2; + cache->dirs = FcPtrToOffset (cache, dirs_serialize); + cache->dirs_count = dirs->num; + for (i = 0; i < dirs->num; i++) + { + FcChar8 *d_serialize = FcStrSerialize (serialize, dirs->strs[i]); + if (!d_serialize) + goto bail2; + dirs_serialize[i] = FcPtrToOffset (dirs_serialize, d_serialize); + } + + /* + * Serialize font set + */ + set_serialize = FcFontSetSerialize (serialize, set); + if (!set_serialize) + goto bail2; + cache->set = FcPtrToOffset (cache, set_serialize); + + FcSerializeDestroy (serialize); + + FcCacheInsert (cache, NULL); + + return cache; + +bail2: + free (cache); +bail1: + FcSerializeDestroy (serialize); + return NULL; +} + + +#ifdef _WIN32 +#define mkdir(path,mode) _mkdir(path) +#endif + +static FcBool +FcMakeDirectory (const FcChar8 *dir) +{ + FcChar8 *parent; + FcBool ret; + + if (strlen ((char *) dir) == 0) + return FcFalse; + + parent = FcStrDirname (dir); + if (!parent) + return FcFalse; + if (access ((char *) parent, F_OK) == 0) + ret = mkdir ((char *) dir, 0755) == 0 && chmod ((char *) dir, 0755) == 0; + else if (access ((char *) parent, F_OK) == -1) + ret = FcMakeDirectory (parent) && (mkdir ((char *) dir, 0755) == 0) && chmod ((char *) dir, 0755) == 0; + else + ret = FcFalse; + FcStrFree (parent); + return ret; +} + +/* write serialized state to the cache file */ +FcBool +FcDirCacheWrite (FcCache *cache, FcConfig *config) +{ + FcChar8 *dir = FcCacheDir (cache); + FcChar8 cache_base[CACHEBASE_LEN]; + FcChar8 *cache_hashed; + int fd; + FcAtomic *atomic; + FcStrList *list; + FcChar8 *cache_dir = NULL; + FcChar8 *test_dir; + FcCacheSkip *skip; + struct stat cache_stat; + int magic; + int written; + + /* + * Write it to the first directory in the list which is writable + */ + + list = FcStrListCreate (config->cacheDirs); + if (!list) + return FcFalse; + while ((test_dir = FcStrListNext (list))) { + if (access ((char *) test_dir, W_OK|X_OK) == 0) + { + cache_dir = test_dir; + break; + } + else + { + /* + * If the directory doesn't exist, try to create it + */ + if (access ((char *) test_dir, F_OK) == -1) { + if (FcMakeDirectory (test_dir)) + { + cache_dir = test_dir; + break; + } + } + /* + * Otherwise, try making it writable + */ + else if (chmod ((char *) test_dir, 0755) == 0) + { + cache_dir = test_dir; + break; + } + } + } + FcStrListDone (list); + if (!cache_dir) + return FcFalse; + + FcDirCacheBasename (dir, cache_base); + cache_hashed = FcStrPlus (cache_dir, cache_base); + if (!cache_hashed) + return FcFalse; + + if (FcDebug () & FC_DBG_CACHE) + printf ("FcDirCacheWriteDir dir \"%s\" file \"%s\"\n", + dir, cache_hashed); + + atomic = FcAtomicCreate ((FcChar8 *)cache_hashed); + if (!atomic) + goto bail1; + + if (!FcAtomicLock (atomic)) + goto bail3; + + fd = open((char *)FcAtomicNewFile (atomic), O_RDWR | O_CREAT | O_BINARY, 0666); + if (fd == -1) + goto bail4; + + /* Temporarily switch magic to MMAP while writing to file */ + magic = cache->magic; + if (magic != FC_CACHE_MAGIC_MMAP) + cache->magic = FC_CACHE_MAGIC_MMAP; + + /* + * Write cache contents to file + */ + written = write (fd, cache, cache->size); + + /* Switch magic back */ + if (magic != FC_CACHE_MAGIC_MMAP) + cache->magic = magic; + + if (written != cache->size) + { + perror ("write cache"); + goto bail5; + } + + close(fd); + if (!FcAtomicReplaceOrig(atomic)) + goto bail4; + + /* If the file is small, update the cache chain entry such that the + * new cache file is not read again. If it's large, we don't do that + * such that we reload it, using mmap, which is shared across processes. + */ + if (cache->size < FC_CACHE_MIN_MMAP && + (skip = FcCacheFindByAddr (cache)) && + FcStat (cache_hashed, &cache_stat)) + { + skip->cache_dev = cache_stat.st_dev; + skip->cache_ino = cache_stat.st_ino; + skip->cache_mtime = cache_stat.st_mtime; + } + + FcStrFree (cache_hashed); + FcAtomicUnlock (atomic); + FcAtomicDestroy (atomic); + return FcTrue; + + bail5: + close (fd); + bail4: + FcAtomicUnlock (atomic); + bail3: + FcAtomicDestroy (atomic); + bail1: + FcStrFree (cache_hashed); + return FcFalse; +} + +/* + * Hokey little macro trick to permit the definitions of C functions + * with the same name as CPP macros + */ +#define args1(x) (x) +#define args2(x,y) (x,y) + +const FcChar8 * +FcCacheDir args1(const FcCache *c) +{ + return FcCacheDir (c); +} + +FcFontSet * +FcCacheCopySet args1(const FcCache *c) +{ + FcFontSet *old = FcCacheSet (c); + FcFontSet *new = FcFontSetCreate (); + int i; + + if (!new) + return NULL; + for (i = 0; i < old->nfont; i++) + { + FcPattern *font = FcFontSetFont (old, i); + + FcPatternReference (font); + if (!FcFontSetAdd (new, font)) + { + FcFontSetDestroy (new); + return NULL; + } + } + return new; +} + +const FcChar8 * +FcCacheSubdir args2(const FcCache *c, int i) +{ + return FcCacheSubdir (c, i); +} + +int +FcCacheNumSubdir args1(const FcCache *c) +{ + return c->dirs_count; +} + +int +FcCacheNumFont args1(const FcCache *c) +{ + return FcCacheSet(c)->nfont; +} + +/* + * This code implements the MD5 message-digest algorithm. + * The algorithm is due to Ron Rivest. This code was + * written by Colin Plumb in 1993, no copyright is claimed. + * This code is in the public domain; do with it what you wish. + * + * Equivalent code is available from RSA Data Security, Inc. + * This code has been tested against that, and is equivalent, + * except that you don't need to include two pages of legalese + * with every copy. + * + * To compute the message digest of a chunk of bytes, declare an + * MD5Context structure, pass it to MD5Init, call MD5Update as + * needed on buffers full of bytes, and then call MD5Final, which + * will fill a supplied 16-byte array with the digest. + */ + +#ifndef HIGHFIRST +#define byteReverse(buf, len) /* Nothing */ +#else +/* + * Note: this code is harmless on little-endian machines. + */ +void byteReverse(unsigned char *buf, unsigned longs) +{ + FcChar32 t; + do { + t = (FcChar32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | + ((unsigned) buf[1] << 8 | buf[0]); + *(FcChar32 *) buf = t; + buf += 4; + } while (--longs); +} +#endif + +/* + * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious + * initialization constants. + */ +static void MD5Init(struct MD5Context *ctx) +{ + ctx->buf[0] = 0x67452301; + ctx->buf[1] = 0xefcdab89; + ctx->buf[2] = 0x98badcfe; + ctx->buf[3] = 0x10325476; + + ctx->bits[0] = 0; + ctx->bits[1] = 0; +} + +/* + * Update context to reflect the concatenation of another buffer full + * of bytes. + */ +static void MD5Update(struct MD5Context *ctx, const unsigned char *buf, unsigned len) +{ + FcChar32 t; + + /* Update bitcount */ + + t = ctx->bits[0]; + if ((ctx->bits[0] = t + ((FcChar32) len << 3)) < t) + ctx->bits[1]++; /* Carry from low to high */ + ctx->bits[1] += len >> 29; + + t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ + + /* Handle any leading odd-sized chunks */ + + if (t) { + unsigned char *p = (unsigned char *) ctx->in + t; + + t = 64 - t; + if (len < t) { + memcpy(p, buf, len); + return; + } + memcpy(p, buf, t); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (FcChar32 *) ctx->in); + buf += t; + len -= t; + } + /* Process data in 64-byte chunks */ + + while (len >= 64) { + memcpy(ctx->in, buf, 64); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (FcChar32 *) ctx->in); + buf += 64; + len -= 64; + } + + /* Handle any remaining bytes of data. */ + + memcpy(ctx->in, buf, len); +} + +/* + * Final wrapup - pad to 64-byte boundary with the bit pattern + * 1 0* (64-bit count of bits processed, MSB-first) + */ +static void MD5Final(unsigned char digest[16], struct MD5Context *ctx) +{ + unsigned count; + unsigned char *p; + + /* Compute number of bytes mod 64 */ + count = (ctx->bits[0] >> 3) & 0x3F; + + /* Set the first char of padding to 0x80. This is safe since there is + always at least one byte free */ + p = ctx->in + count; + *p++ = 0x80; + + /* Bytes of padding needed to make 64 bytes */ + count = 64 - 1 - count; + + /* Pad out to 56 mod 64 */ + if (count < 8) { + /* Two lots of padding: Pad the first block to 64 bytes */ + memset(p, 0, count); + byteReverse(ctx->in, 16); + MD5Transform(ctx->buf, (FcChar32 *) ctx->in); + + /* Now fill the next block with 56 bytes */ + memset(ctx->in, 0, 56); + } else { + /* Pad block to 56 bytes */ + memset(p, 0, count - 8); + } + byteReverse(ctx->in, 14); + + /* Append length in bits and transform */ + ((FcChar32 *) ctx->in)[14] = ctx->bits[0]; + ((FcChar32 *) ctx->in)[15] = ctx->bits[1]; + + MD5Transform(ctx->buf, (FcChar32 *) ctx->in); + byteReverse((unsigned char *) ctx->buf, 4); + memcpy(digest, ctx->buf, 16); + memset(ctx, 0, sizeof(ctx)); /* In case it's sensitive */ +} + + +/* The four core functions - F1 is optimized somewhat */ + +/* #define F1(x, y, z) (x & y | ~x & z) */ +#define F1(x, y, z) (z ^ (x & (y ^ z))) +#define F2(x, y, z) F1(z, x, y) +#define F3(x, y, z) (x ^ y ^ z) +#define F4(x, y, z) (y ^ (x | ~z)) + +/* This is the central step in the MD5 algorithm. */ +#define MD5STEP(f, w, x, y, z, data, s) \ + ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x ) + +/* + * The core of the MD5 algorithm, this alters an existing MD5 hash to + * reflect the addition of 16 longwords of new data. MD5Update blocks + * the data and converts bytes into longwords for this routine. + */ +static void MD5Transform(FcChar32 buf[4], FcChar32 in[16]) +{ + register FcChar32 a, b, c, d; + + a = buf[0]; + b = buf[1]; + c = buf[2]; + d = buf[3]; + + MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); + MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); + MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); + MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); + MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); + MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); + MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); + MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); + MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); + MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); + MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); + MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); + MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); + MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); + MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); + MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); + + MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); + MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); + MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); + MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); + MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); + MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); + MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); + MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); + MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); + MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); + MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); + MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); + MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); + MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); + MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); + MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); + + MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); + MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); + MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); + MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); + MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); + MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); + MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); + MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); + MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); + MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); + MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); + MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); + MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); + MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); + MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); + MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); + + MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); + MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); + MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); + MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); + MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); + MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); + MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); + MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); + MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); + MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); + MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); + MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); + MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); + MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); + MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); + MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); + + buf[0] += a; + buf[1] += b; + buf[2] += c; + buf[3] += d; +} +#define __fccache__ +#include "fcaliastail.h" +#undef __fccache__ diff --git a/fontconfig/src/fccfg.c b/fontconfig/src/fccfg.c new file mode 100644 index 000000000..0f89b57a4 --- /dev/null +++ b/fontconfig/src/fccfg.c @@ -0,0 +1,2056 @@ +/* + * fontconfig/src/fccfg.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <dirent.h> +#include <sys/types.h> + +#if defined (_WIN32) && (defined (PIC) || defined (DLL_EXPORT)) +#define STRICT +#include <windows.h> +#undef STRICT +#endif + +#if defined (_WIN32) && !defined (R_OK) +#define R_OK 4 +#endif + +FcConfig *_fcConfig; + +FcConfig * +FcConfigCreate (void) +{ + FcSetName set; + FcConfig *config; + + config = malloc (sizeof (FcConfig)); + if (!config) + goto bail0; + FcMemAlloc (FC_MEM_CONFIG, sizeof (FcConfig)); + + config->configDirs = FcStrSetCreate (); + if (!config->configDirs) + goto bail1; + + config->configFiles = FcStrSetCreate (); + if (!config->configFiles) + goto bail2; + + config->fontDirs = FcStrSetCreate (); + if (!config->fontDirs) + goto bail3; + + config->acceptGlobs = FcStrSetCreate (); + if (!config->acceptGlobs) + goto bail4; + + config->rejectGlobs = FcStrSetCreate (); + if (!config->rejectGlobs) + goto bail5; + + config->acceptPatterns = FcFontSetCreate (); + if (!config->acceptPatterns) + goto bail6; + + config->rejectPatterns = FcFontSetCreate (); + if (!config->rejectPatterns) + goto bail7; + + config->cacheDirs = FcStrSetCreate (); + if (!config->cacheDirs) + goto bail8; + + config->blanks = 0; + + config->substPattern = 0; + config->substFont = 0; + config->substScan = 0; + config->maxObjects = 0; + for (set = FcSetSystem; set <= FcSetApplication; set++) + config->fonts[set] = 0; + + config->rescanTime = time(0); + config->rescanInterval = 30; + + config->expr_pool = NULL; + + config->ref = 1; + + return config; + +bail8: + FcFontSetDestroy (config->rejectPatterns); +bail7: + FcFontSetDestroy (config->acceptPatterns); +bail6: + FcStrSetDestroy (config->rejectGlobs); +bail5: + FcStrSetDestroy (config->acceptGlobs); +bail4: + FcStrSetDestroy (config->fontDirs); +bail3: + FcStrSetDestroy (config->configFiles); +bail2: + FcStrSetDestroy (config->configDirs); +bail1: + free (config); + FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig)); +bail0: + return 0; +} + +static FcFileTime +FcConfigNewestFile (FcStrSet *files) +{ + FcStrList *list = FcStrListCreate (files); + FcFileTime newest = { 0, FcFalse }; + FcChar8 *file; + struct stat statb; + + if (list) + { + while ((file = FcStrListNext (list))) + if (FcStat ((char *) file, &statb) == 0) + if (!newest.set || statb.st_mtime - newest.time > 0) + { + newest.set = FcTrue; + newest.time = statb.st_mtime; + } + FcStrListDone (list); + } + return newest; +} + +FcBool +FcConfigUptoDate (FcConfig *config) +{ + FcFileTime config_time, config_dir_time, font_time; + time_t now = time(0); + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + config_time = FcConfigNewestFile (config->configFiles); + config_dir_time = FcConfigNewestFile (config->configDirs); + font_time = FcConfigNewestFile (config->fontDirs); + if ((config_time.set && config_time.time - config->rescanTime > 0) || + (config_dir_time.set && (config_dir_time.time - config->rescanTime) > 0) || + (font_time.set && (font_time.time - config->rescanTime) > 0)) + { + /* We need to check for potential clock problems here (OLPC ticket #6046) */ + if ((config_time.set && (config_time.time - now) > 0) || + (config_dir_time.set && (config_dir_time.time - now) > 0) || + (font_time.set && (font_time.time - now) > 0)) + { + fprintf (stderr, + "Fontconfig warning: Directory/file mtime in the future. New fonts may not be detected\n"); + config->rescanTime = now; + return FcTrue; + } + else + return FcFalse; + } + config->rescanTime = now; + return FcTrue; +} + +static void +FcSubstDestroy (FcSubst *s) +{ + FcSubst *n; + + while (s) + { + n = s->next; + if (s->test) + FcTestDestroy (s->test); + if (s->edit) + FcEditDestroy (s->edit); + free (s); + FcMemFree (FC_MEM_SUBST, sizeof (FcSubst)); + s = n; + } +} + +FcExpr * +FcConfigAllocExpr (FcConfig *config) +{ + if (!config->expr_pool || config->expr_pool->next == config->expr_pool->end) + { + FcExprPage *new_page; + + new_page = malloc (sizeof (FcExprPage)); + if (!new_page) + return 0; + FcMemAlloc (FC_MEM_EXPR, sizeof (FcExprPage)); + + new_page->next_page = config->expr_pool; + new_page->next = new_page->exprs; + config->expr_pool = new_page; + } + + return config->expr_pool->next++; +} + +FcConfig * +FcConfigReference (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + + config->ref++; + + return config; +} + +void +FcConfigDestroy (FcConfig *config) +{ + FcSetName set; + FcExprPage *page; + + if (--config->ref > 0) + return; + + if (config == _fcConfig) + _fcConfig = 0; + + FcStrSetDestroy (config->configDirs); + FcStrSetDestroy (config->fontDirs); + FcStrSetDestroy (config->cacheDirs); + FcStrSetDestroy (config->configFiles); + FcStrSetDestroy (config->acceptGlobs); + FcStrSetDestroy (config->rejectGlobs); + FcFontSetDestroy (config->acceptPatterns); + FcFontSetDestroy (config->rejectPatterns); + + if (config->blanks) + FcBlanksDestroy (config->blanks); + + FcSubstDestroy (config->substPattern); + FcSubstDestroy (config->substFont); + FcSubstDestroy (config->substScan); + for (set = FcSetSystem; set <= FcSetApplication; set++) + if (config->fonts[set]) + FcFontSetDestroy (config->fonts[set]); + + page = config->expr_pool; + while (page) + { + FcExprPage *next = page->next_page; + FcMemFree (FC_MEM_EXPR, sizeof (FcExprPage)); + free (page); + page = next; + } + + free (config); + FcMemFree (FC_MEM_CONFIG, sizeof (FcConfig)); +} + +/* + * Add cache to configuration, adding fonts and directories + */ + +FcBool +FcConfigAddCache (FcConfig *config, FcCache *cache, + FcSetName set, FcStrSet *dirSet) +{ + FcFontSet *fs; + intptr_t *dirs; + int i; + + /* + * Add fonts + */ + fs = FcCacheSet (cache); + if (fs) + { + int nref = 0; + + for (i = 0; i < fs->nfont; i++) + { + FcPattern *font = FcFontSetFont (fs, i); + FcChar8 *font_file; + + /* + * Check to see if font is banned by filename + */ + if (FcPatternObjectGetString (font, FC_FILE_OBJECT, + 0, &font_file) == FcResultMatch && + !FcConfigAcceptFilename (config, font_file)) + { + continue; + } + + /* + * Check to see if font is banned by pattern + */ + if (!FcConfigAcceptFont (config, font)) + continue; + + nref++; + FcFontSetAdd (config->fonts[set], font); + } + FcDirCacheReference (cache, nref); + } + + /* + * Add directories + */ + dirs = FcCacheDirs (cache); + if (dirs) + { + for (i = 0; i < cache->dirs_count; i++) + { + FcChar8 *dir = FcOffsetToPtr (dirs, dirs[i], FcChar8); + if (FcConfigAcceptFilename (config, dir)) + FcStrSetAddFilename (dirSet, dir); + } + } + return FcTrue; +} + +static FcBool +FcConfigAddDirList (FcConfig *config, FcSetName set, FcStrSet *dirSet) +{ + FcStrList *dirlist; + FcChar8 *dir; + FcCache *cache; + + dirlist = FcStrListCreate (dirSet); + if (!dirlist) + return FcFalse; + + while ((dir = FcStrListNext (dirlist))) + { + if (FcDebug () & FC_DBG_FONTSET) + printf ("adding fonts from%s\n", dir); + cache = FcDirCacheRead (dir, FcFalse, config); + if (!cache) + continue; + FcConfigAddCache (config, cache, set, dirSet); + FcDirCacheUnload (cache); + } + FcStrListDone (dirlist); + return FcTrue; +} + +/* + * Scan the current list of directories in the configuration + * and build the set of available fonts. + */ + +FcBool +FcConfigBuildFonts (FcConfig *config) +{ + FcFontSet *fonts; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + + fonts = FcFontSetCreate (); + if (!fonts) + return FcFalse; + + FcConfigSetFonts (config, fonts, FcSetSystem); + + if (!FcConfigAddDirList (config, FcSetSystem, config->fontDirs)) + return FcFalse; + if (FcDebug () & FC_DBG_FONTSET) + FcFontSetPrint (fonts); + return FcTrue; +} + +FcBool +FcConfigSetCurrent (FcConfig *config) +{ + if (config == _fcConfig) + return FcTrue; + + if (!config->fonts) + if (!FcConfigBuildFonts (config)) + return FcFalse; + + if (_fcConfig) + FcConfigDestroy (_fcConfig); + _fcConfig = config; + return FcTrue; +} + +FcConfig * +FcConfigGetCurrent (void) +{ + if (!_fcConfig) + if (!FcInit ()) + return 0; + return _fcConfig; +} + +FcBool +FcConfigAddConfigDir (FcConfig *config, + const FcChar8 *d) +{ + return FcStrSetAddFilename (config->configDirs, d); +} + +FcStrList * +FcConfigGetConfigDirs (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return FcStrListCreate (config->configDirs); +} + +FcBool +FcConfigAddFontDir (FcConfig *config, + const FcChar8 *d) +{ + return FcStrSetAddFilename (config->fontDirs, d); +} + +FcBool +FcConfigAddDir (FcConfig *config, + const FcChar8 *d) +{ + return (FcConfigAddConfigDir (config, d) && + FcConfigAddFontDir (config, d)); +} + +FcStrList * +FcConfigGetFontDirs (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return FcStrListCreate (config->fontDirs); +} + +FcBool +FcConfigAddCacheDir (FcConfig *config, + const FcChar8 *d) +{ + return FcStrSetAddFilename (config->cacheDirs, d); +} + +FcStrList * +FcConfigGetCacheDirs (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return FcStrListCreate (config->cacheDirs); +} + +FcBool +FcConfigAddConfigFile (FcConfig *config, + const FcChar8 *f) +{ + FcBool ret; + FcChar8 *file = FcConfigFilename (f); + + if (!file) + return FcFalse; + + ret = FcStrSetAdd (config->configFiles, file); + FcStrFree (file); + return ret; +} + +FcStrList * +FcConfigGetConfigFiles (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return FcStrListCreate (config->configFiles); +} + +FcChar8 * +FcConfigGetCache (FcConfig *config) +{ + return NULL; +} + +FcFontSet * +FcConfigGetFonts (FcConfig *config, + FcSetName set) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return config->fonts[set]; +} + +void +FcConfigSetFonts (FcConfig *config, + FcFontSet *fonts, + FcSetName set) +{ + if (config->fonts[set]) + FcFontSetDestroy (config->fonts[set]); + config->fonts[set] = fonts; +} + +FcBlanks * +FcConfigGetBlanks (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return config->blanks; +} + +FcBool +FcConfigAddBlank (FcConfig *config, + FcChar32 blank) +{ + FcBlanks *b, *freeme = 0; + + b = config->blanks; + if (!b) + { + freeme = b = FcBlanksCreate (); + if (!b) + return FcFalse; + } + if (!FcBlanksAdd (b, blank)) + { + if (freeme) + FcBlanksDestroy (freeme); + return FcFalse; + } + config->blanks = b; + return FcTrue; +} + +int +FcConfigGetRescanInterval (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + return config->rescanInterval; +} + +FcBool +FcConfigSetRescanInterval (FcConfig *config, int rescanInterval) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + config->rescanInterval = rescanInterval; + return FcTrue; +} + +/* + * A couple of typos escaped into the library + */ +int +FcConfigGetRescanInverval (FcConfig *config) +{ + return FcConfigGetRescanInterval (config); +} + +FcBool +FcConfigSetRescanInverval (FcConfig *config, int rescanInterval) +{ + return FcConfigSetRescanInterval (config, rescanInterval); +} + + +FcBool +FcConfigAddEdit (FcConfig *config, + FcTest *test, + FcEdit *edit, + FcMatchKind kind) +{ + FcSubst *subst, **prev; + FcTest *t; + int num; + + switch (kind) { + case FcMatchPattern: + prev = &config->substPattern; + break; + case FcMatchFont: + prev = &config->substFont; + break; + case FcMatchScan: + prev = &config->substScan; + break; + default: + return FcFalse; + } + subst = (FcSubst *) malloc (sizeof (FcSubst)); + if (!subst) + return FcFalse; + FcMemAlloc (FC_MEM_SUBST, sizeof (FcSubst)); + for (; *prev; prev = &(*prev)->next); + *prev = subst; + subst->next = 0; + subst->test = test; + subst->edit = edit; + num = 0; + for (t = test; t; t = t->next) + { + if (t->kind == FcMatchDefault) + t->kind = kind; + num++; + } + if (config->maxObjects < num) + config->maxObjects = num; + if (FcDebug () & FC_DBG_EDIT) + { + printf ("Add Subst "); + FcSubstPrint (subst); + } + return FcTrue; +} + +typedef struct _FcSubState { + FcPatternElt *elt; + FcValueList *value; +} FcSubState; + +static FcValue +FcConfigPromote (FcValue v, FcValue u) +{ + if (v.type == FcTypeInteger) + { + v.type = FcTypeDouble; + v.u.d = (double) v.u.i; + } + else if (v.type == FcTypeVoid && u.type == FcTypeMatrix) + { + v.u.m = &FcIdentityMatrix; + v.type = FcTypeMatrix; + } + else if (v.type == FcTypeString && u.type == FcTypeLangSet) + { + v.u.l = FcLangSetPromote (v.u.s); + v.type = FcTypeLangSet; + } + return v; +} + +FcBool +FcConfigCompareValue (const FcValue *left_o, + FcOp op, + const FcValue *right_o) +{ + FcValue left = FcValueCanonicalize(left_o); + FcValue right = FcValueCanonicalize(right_o); + FcBool ret = FcFalse; + + left = FcConfigPromote (left, right); + right = FcConfigPromote (right, left); + if (left.type == right.type) + { + switch (left.type) { + case FcTypeInteger: + break; /* FcConfigPromote prevents this from happening */ + case FcTypeDouble: + switch (op) { + case FcOpEqual: + case FcOpContains: + case FcOpListing: + ret = left.u.d == right.u.d; + break; + case FcOpNotEqual: + case FcOpNotContains: + ret = left.u.d != right.u.d; + break; + case FcOpLess: + ret = left.u.d < right.u.d; + break; + case FcOpLessEqual: + ret = left.u.d <= right.u.d; + break; + case FcOpMore: + ret = left.u.d > right.u.d; + break; + case FcOpMoreEqual: + ret = left.u.d >= right.u.d; + break; + default: + break; + } + break; + case FcTypeBool: + switch (op) { + case FcOpEqual: + case FcOpContains: + case FcOpListing: + ret = left.u.b == right.u.b; + break; + case FcOpNotEqual: + case FcOpNotContains: + ret = left.u.b != right.u.b; + break; + default: + break; + } + break; + case FcTypeString: + switch (op) { + case FcOpEqual: + case FcOpListing: + ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) == 0; + break; + case FcOpContains: + ret = FcStrStrIgnoreCase (left.u.s, right.u.s) != 0; + break; + case FcOpNotEqual: + ret = FcStrCmpIgnoreCase (left.u.s, right.u.s) != 0; + break; + case FcOpNotContains: + ret = FcStrStrIgnoreCase (left.u.s, right.u.s) == 0; + break; + default: + break; + } + break; + case FcTypeMatrix: + switch (op) { + case FcOpEqual: + case FcOpContains: + case FcOpListing: + ret = FcMatrixEqual (left.u.m, right.u.m); + break; + case FcOpNotEqual: + case FcOpNotContains: + ret = !FcMatrixEqual (left.u.m, right.u.m); + break; + default: + break; + } + break; + case FcTypeCharSet: + switch (op) { + case FcOpContains: + case FcOpListing: + /* left contains right if right is a subset of left */ + ret = FcCharSetIsSubset (right.u.c, left.u.c); + break; + case FcOpNotContains: + /* left contains right if right is a subset of left */ + ret = !FcCharSetIsSubset (right.u.c, left.u.c); + break; + case FcOpEqual: + ret = FcCharSetEqual (left.u.c, right.u.c); + break; + case FcOpNotEqual: + ret = !FcCharSetEqual (left.u.c, right.u.c); + break; + default: + break; + } + break; + case FcTypeLangSet: + switch (op) { + case FcOpContains: + case FcOpListing: + ret = FcLangSetContains (left.u.l, right.u.l); + break; + case FcOpNotContains: + ret = !FcLangSetContains (left.u.l, right.u.l); + break; + case FcOpEqual: + ret = FcLangSetEqual (left.u.l, right.u.l); + break; + case FcOpNotEqual: + ret = !FcLangSetEqual (left.u.l, right.u.l); + break; + default: + break; + } + break; + case FcTypeVoid: + switch (op) { + case FcOpEqual: + case FcOpContains: + case FcOpListing: + ret = FcTrue; + break; + default: + break; + } + break; + case FcTypeFTFace: + switch (op) { + case FcOpEqual: + case FcOpContains: + case FcOpListing: + ret = left.u.f == right.u.f; + break; + case FcOpNotEqual: + case FcOpNotContains: + ret = left.u.f != right.u.f; + break; + default: + break; + } + break; + } + } + else + { + if (op == FcOpNotEqual || op == FcOpNotContains) + ret = FcTrue; + } + return ret; +} + + +#define _FcDoubleFloor(d) ((int) (d)) +#define _FcDoubleCeil(d) ((double) (int) (d) == (d) ? (int) (d) : (int) ((d) + 1)) +#define FcDoubleFloor(d) ((d) >= 0 ? _FcDoubleFloor(d) : -_FcDoubleCeil(-(d))) +#define FcDoubleCeil(d) ((d) >= 0 ? _FcDoubleCeil(d) : -_FcDoubleFloor(-(d))) +#define FcDoubleRound(d) FcDoubleFloor ((d) + 0.5) +#define FcDoubleTrunc(d) ((d) >= 0 ? _FcDoubleFloor (d) : -_FcDoubleFloor (-(d))) + +static FcValue +FcConfigEvaluate (FcPattern *p, FcExpr *e) +{ + FcValue v, vl, vr; + FcResult r; + FcMatrix *m; + FcChar8 *str; + + switch (e->op) { + case FcOpInteger: + v.type = FcTypeInteger; + v.u.i = e->u.ival; + break; + case FcOpDouble: + v.type = FcTypeDouble; + v.u.d = e->u.dval; + break; + case FcOpString: + v.type = FcTypeString; + v.u.s = e->u.sval; + v = FcValueSave (v); + break; + case FcOpMatrix: + v.type = FcTypeMatrix; + v.u.m = e->u.mval; + v = FcValueSave (v); + break; + case FcOpCharSet: + v.type = FcTypeCharSet; + v.u.c = e->u.cval; + v = FcValueSave (v); + break; + case FcOpBool: + v.type = FcTypeBool; + v.u.b = e->u.bval; + break; + case FcOpField: + r = FcPatternObjectGet (p, e->u.object, 0, &v); + if (r != FcResultMatch) + v.type = FcTypeVoid; + v = FcValueSave (v); + break; + case FcOpConst: + if (FcNameConstant (e->u.constant, &v.u.i)) + v.type = FcTypeInteger; + else + v.type = FcTypeVoid; + break; + case FcOpQuest: + vl = FcConfigEvaluate (p, e->u.tree.left); + if (vl.type == FcTypeBool) + { + if (vl.u.b) + v = FcConfigEvaluate (p, e->u.tree.right->u.tree.left); + else + v = FcConfigEvaluate (p, e->u.tree.right->u.tree.right); + } + else + v.type = FcTypeVoid; + FcValueDestroy (vl); + break; + case FcOpEqual: + case FcOpNotEqual: + case FcOpLess: + case FcOpLessEqual: + case FcOpMore: + case FcOpMoreEqual: + case FcOpContains: + case FcOpNotContains: + case FcOpListing: + vl = FcConfigEvaluate (p, e->u.tree.left); + vr = FcConfigEvaluate (p, e->u.tree.right); + v.type = FcTypeBool; + v.u.b = FcConfigCompareValue (&vl, e->op, &vr); + FcValueDestroy (vl); + FcValueDestroy (vr); + break; + case FcOpOr: + case FcOpAnd: + case FcOpPlus: + case FcOpMinus: + case FcOpTimes: + case FcOpDivide: + vl = FcConfigEvaluate (p, e->u.tree.left); + vr = FcConfigEvaluate (p, e->u.tree.right); + vl = FcConfigPromote (vl, vr); + vr = FcConfigPromote (vr, vl); + if (vl.type == vr.type) + { + switch (vl.type) { + case FcTypeDouble: + switch (e->op) { + case FcOpPlus: + v.type = FcTypeDouble; + v.u.d = vl.u.d + vr.u.d; + break; + case FcOpMinus: + v.type = FcTypeDouble; + v.u.d = vl.u.d - vr.u.d; + break; + case FcOpTimes: + v.type = FcTypeDouble; + v.u.d = vl.u.d * vr.u.d; + break; + case FcOpDivide: + v.type = FcTypeDouble; + v.u.d = vl.u.d / vr.u.d; + break; + default: + v.type = FcTypeVoid; + break; + } + if (v.type == FcTypeDouble && + v.u.d == (double) (int) v.u.d) + { + v.type = FcTypeInteger; + v.u.i = (int) v.u.d; + } + break; + case FcTypeBool: + switch (e->op) { + case FcOpOr: + v.type = FcTypeBool; + v.u.b = vl.u.b || vr.u.b; + break; + case FcOpAnd: + v.type = FcTypeBool; + v.u.b = vl.u.b && vr.u.b; + break; + default: + v.type = FcTypeVoid; + break; + } + break; + case FcTypeString: + switch (e->op) { + case FcOpPlus: + v.type = FcTypeString; + str = FcStrPlus (vl.u.s, vr.u.s); + v.u.s = FcStrStaticName (str); + FcStrFree (str); + + if (!v.u.s) + v.type = FcTypeVoid; + break; + default: + v.type = FcTypeVoid; + break; + } + break; + case FcTypeMatrix: + switch (e->op) { + case FcOpTimes: + v.type = FcTypeMatrix; + m = malloc (sizeof (FcMatrix)); + if (m) + { + FcMemAlloc (FC_MEM_MATRIX, sizeof (FcMatrix)); + FcMatrixMultiply (m, vl.u.m, vr.u.m); + v.u.m = m; + } + else + { + v.type = FcTypeVoid; + } + break; + default: + v.type = FcTypeVoid; + break; + } + break; + default: + v.type = FcTypeVoid; + break; + } + } + else + v.type = FcTypeVoid; + FcValueDestroy (vl); + FcValueDestroy (vr); + break; + case FcOpNot: + vl = FcConfigEvaluate (p, e->u.tree.left); + switch (vl.type) { + case FcTypeBool: + v.type = FcTypeBool; + v.u.b = !vl.u.b; + break; + default: + v.type = FcTypeVoid; + break; + } + FcValueDestroy (vl); + break; + case FcOpFloor: + vl = FcConfigEvaluate (p, e->u.tree.left); + switch (vl.type) { + case FcTypeInteger: + v = vl; + break; + case FcTypeDouble: + v.type = FcTypeInteger; + v.u.i = FcDoubleFloor (vl.u.d); + break; + default: + v.type = FcTypeVoid; + break; + } + FcValueDestroy (vl); + break; + case FcOpCeil: + vl = FcConfigEvaluate (p, e->u.tree.left); + switch (vl.type) { + case FcTypeInteger: + v = vl; + break; + case FcTypeDouble: + v.type = FcTypeInteger; + v.u.i = FcDoubleCeil (vl.u.d); + break; + default: + v.type = FcTypeVoid; + break; + } + FcValueDestroy (vl); + break; + case FcOpRound: + vl = FcConfigEvaluate (p, e->u.tree.left); + switch (vl.type) { + case FcTypeInteger: + v = vl; + break; + case FcTypeDouble: + v.type = FcTypeInteger; + v.u.i = FcDoubleRound (vl.u.d); + break; + default: + v.type = FcTypeVoid; + break; + } + FcValueDestroy (vl); + break; + case FcOpTrunc: + vl = FcConfigEvaluate (p, e->u.tree.left); + switch (vl.type) { + case FcTypeInteger: + v = vl; + break; + case FcTypeDouble: + v.type = FcTypeInteger; + v.u.i = FcDoubleTrunc (vl.u.d); + break; + default: + v.type = FcTypeVoid; + break; + } + FcValueDestroy (vl); + break; + default: + v.type = FcTypeVoid; + break; + } + return v; +} + +static FcValueList * +FcConfigMatchValueList (FcPattern *p, + FcTest *t, + FcValueList *values) +{ + FcValueList *ret = 0; + FcExpr *e = t->expr; + FcValue value; + FcValueList *v; + + while (e) + { + /* Compute the value of the match expression */ + if (e->op == FcOpComma) + { + value = FcConfigEvaluate (p, e->u.tree.left); + e = e->u.tree.right; + } + else + { + value = FcConfigEvaluate (p, e); + e = 0; + } + + for (v = values; v; v = FcValueListNext(v)) + { + /* Compare the pattern value to the match expression value */ + if (FcConfigCompareValue (&v->value, t->op, &value)) + { + if (!ret) + ret = v; + } + else + { + if (t->qual == FcQualAll) + { + ret = 0; + break; + } + } + } + FcValueDestroy (value); + } + return ret; +} + +static FcValueList * +FcConfigValues (FcPattern *p, FcExpr *e, FcValueBinding binding) +{ + FcValueList *l; + + if (!e) + return 0; + l = (FcValueList *) malloc (sizeof (FcValueList)); + if (!l) + return 0; + FcMemAlloc (FC_MEM_VALLIST, sizeof (FcValueList)); + if (e->op == FcOpComma) + { + l->value = FcConfigEvaluate (p, e->u.tree.left); + l->next = FcConfigValues (p, e->u.tree.right, binding); + } + else + { + l->value = FcConfigEvaluate (p, e); + l->next = NULL; + } + l->binding = binding; + if (l->value.type == FcTypeVoid) + { + FcValueList *next = FcValueListNext(l); + + FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList)); + free (l); + l = next; + } + + return l; +} + +static FcBool +FcConfigAdd (FcValueListPtr *head, + FcValueList *position, + FcBool append, + FcValueList *new) +{ + FcValueListPtr *prev, last, v; + FcValueBinding sameBinding; + + if (position) + sameBinding = position->binding; + else + sameBinding = FcValueBindingWeak; + for (v = new; v != NULL; v = FcValueListNext(v)) + if (v->binding == FcValueBindingSame) + v->binding = sameBinding; + if (append) + { + if (position) + prev = &position->next; + else + for (prev = head; *prev != NULL; + prev = &(*prev)->next) + ; + } + else + { + if (position) + { + for (prev = head; *prev != NULL; + prev = &(*prev)->next) + { + if (*prev == position) + break; + } + } + else + prev = head; + + if (FcDebug () & FC_DBG_EDIT) + { + if (*prev == NULL) + printf ("position not on list\n"); + } + } + + if (FcDebug () & FC_DBG_EDIT) + { + printf ("%s list before ", append ? "Append" : "Prepend"); + FcValueListPrint (*head); + printf ("\n"); + } + + if (new) + { + last = new; + while (last->next != NULL) + last = last->next; + + last->next = *prev; + *prev = new; + } + + if (FcDebug () & FC_DBG_EDIT) + { + printf ("%s list after ", append ? "Append" : "Prepend"); + FcValueListPrint (*head); + printf ("\n"); + } + + return FcTrue; +} + +static void +FcConfigDel (FcValueListPtr *head, + FcValueList *position) +{ + FcValueListPtr *prev; + + for (prev = head; *prev != NULL; prev = &(*prev)->next) + { + if (*prev == position) + { + *prev = position->next; + position->next = NULL; + FcValueListDestroy (position); + break; + } + } +} + +static void +FcConfigPatternAdd (FcPattern *p, + FcObject object, + FcValueList *list, + FcBool append) +{ + if (list) + { + FcPatternElt *e = FcPatternObjectInsertElt (p, object); + + if (!e) + return; + FcConfigAdd (&e->values, 0, append, list); + } +} + +/* + * Delete all values associated with a field + */ +static void +FcConfigPatternDel (FcPattern *p, + FcObject object) +{ + FcPatternElt *e = FcPatternObjectFindElt (p, object); + if (!e) + return; + while (e->values != NULL) + FcConfigDel (&e->values, e->values); +} + +static void +FcConfigPatternCanon (FcPattern *p, + FcObject object) +{ + FcPatternElt *e = FcPatternObjectFindElt (p, object); + if (!e) + return; + if (e->values == NULL) + FcPatternObjectDel (p, object); +} + +FcBool +FcConfigSubstituteWithPat (FcConfig *config, + FcPattern *p, + FcPattern *p_pat, + FcMatchKind kind) +{ + FcSubst *s; + FcSubState *st; + int i; + FcTest *t; + FcEdit *e; + FcValueList *l; + FcPattern *m; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + + switch (kind) { + case FcMatchPattern: + s = config->substPattern; + break; + case FcMatchFont: + s = config->substFont; + break; + case FcMatchScan: + s = config->substScan; + break; + default: + return FcFalse; + } + + st = (FcSubState *) malloc (config->maxObjects * sizeof (FcSubState)); + if (!st && config->maxObjects) + return FcFalse; + FcMemAlloc (FC_MEM_SUBSTATE, config->maxObjects * sizeof (FcSubState)); + + if (FcDebug () & FC_DBG_EDIT) + { + printf ("FcConfigSubstitute "); + FcPatternPrint (p); + } + for (; s; s = s->next) + { + /* + * Check the tests to see if + * they all match the pattern + */ + for (t = s->test, i = 0; t; t = t->next, i++) + { + if (FcDebug () & FC_DBG_EDIT) + { + printf ("FcConfigSubstitute test "); + FcTestPrint (t); + } + st[i].elt = 0; + if (kind == FcMatchFont && t->kind == FcMatchPattern) + m = p_pat; + else + m = p; + if (m) + st[i].elt = FcPatternObjectFindElt (m, t->object); + else + st[i].elt = 0; + /* + * If there's no such field in the font, + * then FcQualAll matches while FcQualAny does not + */ + if (!st[i].elt) + { + if (t->qual == FcQualAll) + { + st[i].value = 0; + continue; + } + else + break; + } + /* + * Check to see if there is a match, mark the location + * to apply match-relative edits + */ + st[i].value = FcConfigMatchValueList (m, t, st[i].elt->values); + if (!st[i].value) + break; + if (t->qual == FcQualFirst && st[i].value != st[i].elt->values) + break; + if (t->qual == FcQualNotFirst && st[i].value == st[i].elt->values) + break; + } + if (t) + { + if (FcDebug () & FC_DBG_EDIT) + printf ("No match\n"); + continue; + } + if (FcDebug () & FC_DBG_EDIT) + { + printf ("Substitute "); + FcSubstPrint (s); + } + for (e = s->edit; e; e = e->next) + { + /* + * Evaluate the list of expressions + */ + l = FcConfigValues (p, e->expr, e->binding); + /* + * Locate any test associated with this field, skipping + * tests associated with the pattern when substituting in + * the font + */ + for (t = s->test, i = 0; t; t = t->next, i++) + { + if ((t->kind == FcMatchFont || kind == FcMatchPattern) && + t->object == e->object) + { + /* + * KLUDGE - the pattern may have been reallocated or + * things may have been inserted or deleted above + * this element by other edits. Go back and find + * the element again + */ + if (e != s->edit && st[i].elt) + st[i].elt = FcPatternObjectFindElt (p, t->object); + if (!st[i].elt) + t = 0; + break; + } + } + switch (e->op) { + case FcOpAssign: + /* + * If there was a test, then replace the matched + * value with the new list of values + */ + if (t) + { + FcValueList *thisValue = st[i].value; + FcValueList *nextValue = thisValue; + + /* + * Append the new list of values after the current value + */ + FcConfigAdd (&st[i].elt->values, thisValue, FcTrue, l); + /* + * Delete the marked value + */ + if (thisValue) + FcConfigDel (&st[i].elt->values, thisValue); + /* + * Adjust any pointers into the value list to ensure + * future edits occur at the same place + */ + for (t = s->test, i = 0; t; t = t->next, i++) + { + if (st[i].value == thisValue) + st[i].value = nextValue; + } + break; + } + /* fall through ... */ + case FcOpAssignReplace: + /* + * Delete all of the values and insert + * the new set + */ + FcConfigPatternDel (p, e->object); + FcConfigPatternAdd (p, e->object, l, FcTrue); + /* + * Adjust any pointers into the value list as they no + * longer point to anything valid + */ + if (t) + { + FcPatternElt *thisElt = st[i].elt; + for (t = s->test, i = 0; t; t = t->next, i++) + { + if (st[i].elt == thisElt) + st[i].value = 0; + } + } + break; + case FcOpPrepend: + if (t) + { + FcConfigAdd (&st[i].elt->values, st[i].value, FcFalse, l); + break; + } + /* fall through ... */ + case FcOpPrependFirst: + FcConfigPatternAdd (p, e->object, l, FcFalse); + break; + case FcOpAppend: + if (t) + { + FcConfigAdd (&st[i].elt->values, st[i].value, FcTrue, l); + break; + } + /* fall through ... */ + case FcOpAppendLast: + FcConfigPatternAdd (p, e->object, l, FcTrue); + break; + default: + FcValueListDestroy (l); + break; + } + } + /* + * Now go through the pattern and eliminate + * any properties without data + */ + for (e = s->edit; e; e = e->next) + FcConfigPatternCanon (p, e->object); + + if (FcDebug () & FC_DBG_EDIT) + { + printf ("FcConfigSubstitute edit"); + FcPatternPrint (p); + } + } + FcMemFree (FC_MEM_SUBSTATE, config->maxObjects * sizeof (FcSubState)); + free (st); + if (FcDebug () & FC_DBG_EDIT) + { + printf ("FcConfigSubstitute done"); + FcPatternPrint (p); + } + return FcTrue; +} + +FcBool +FcConfigSubstitute (FcConfig *config, + FcPattern *p, + FcMatchKind kind) +{ + return FcConfigSubstituteWithPat (config, p, 0, kind); +} + +#if defined (_WIN32) + +# define WIN32_LEAN_AND_MEAN +# define WIN32_EXTRA_LEAN +# include <windows.h> + +static FcChar8 fontconfig_path[1000] = ""; + +# if (defined (PIC) || defined (DLL_EXPORT)) + +BOOL WINAPI +DllMain (HINSTANCE hinstDLL, + DWORD fdwReason, + LPVOID lpvReserved) +{ + FcChar8 *p; + + switch (fdwReason) { + case DLL_PROCESS_ATTACH: + if (!GetModuleFileName ((HMODULE) hinstDLL, fontconfig_path, + sizeof (fontconfig_path))) + break; + + /* If the fontconfig DLL is in a "bin" or "lib" subfolder, + * assume it's a Unix-style installation tree, and use + * "etc/fonts" in there as FONTCONFIG_PATH. Otherwise use the + * folder where the DLL is as FONTCONFIG_PATH. + */ + p = strrchr (fontconfig_path, '\\'); + if (p) + { + *p = '\0'; + p = strrchr (fontconfig_path, '\\'); + if (p && (FcStrCmpIgnoreCase (p + 1, "bin") == 0 || + FcStrCmpIgnoreCase (p + 1, "lib") == 0)) + *p = '\0'; + strcat (fontconfig_path, "\\etc\\fonts"); + } + else + fontconfig_path[0] = '\0'; + + break; + } + + return TRUE; +} + +# endif /* !PIC */ + +#undef FONTCONFIG_PATH +#define FONTCONFIG_PATH fontconfig_path + +#endif /* !_WIN32 */ + +#ifndef FONTCONFIG_FILE +#define FONTCONFIG_FILE "fonts.conf" +#endif + +static FcChar8 * +FcConfigFileExists (const FcChar8 *dir, const FcChar8 *file) +{ + FcChar8 *path; + + if (!dir) + dir = (FcChar8 *) ""; + path = malloc (strlen ((char *) dir) + 1 + strlen ((char *) file) + 1); + if (!path) + return 0; + + strcpy ((char *) path, (const char *) dir); + /* make sure there's a single separator */ +#ifdef _WIN32 + if ((!path[0] || (path[strlen((char *) path)-1] != '/' && + path[strlen((char *) path)-1] != '\\')) && + !(file[0] == '/' || + file[0] == '\\' || + (isalpha (file[0]) && file[1] == ':' && (file[2] == '/' || file[2] == '\\')))) + strcat ((char *) path, "\\"); +#else + if ((!path[0] || path[strlen((char *) path)-1] != '/') && file[0] != '/') + strcat ((char *) path, "/"); +#endif + strcat ((char *) path, (char *) file); + + FcMemAlloc (FC_MEM_STRING, strlen ((char *) path) + 1); + if (access ((char *) path, R_OK) == 0) + return path; + + FcStrFree (path); + return 0; +} + +static FcChar8 ** +FcConfigGetPath (void) +{ + FcChar8 **path; + FcChar8 *env, *e, *colon; + FcChar8 *dir; + int npath; + int i; + + npath = 2; /* default dir + null */ + env = (FcChar8 *) getenv ("FONTCONFIG_PATH"); + if (env) + { + e = env; + npath++; + while (*e) + if (*e++ == FC_SEARCH_PATH_SEPARATOR) + npath++; + } + path = calloc (npath, sizeof (FcChar8 *)); + if (!path) + goto bail0; + i = 0; + + if (env) + { + e = env; + while (*e) + { + colon = (FcChar8 *) strchr ((char *) e, FC_SEARCH_PATH_SEPARATOR); + if (!colon) + colon = e + strlen ((char *) e); + path[i] = malloc (colon - e + 1); + if (!path[i]) + goto bail1; + strncpy ((char *) path[i], (const char *) e, colon - e); + path[i][colon - e] = '\0'; + if (*colon) + e = colon + 1; + else + e = colon; + i++; + } + } + +#ifdef _WIN32 + if (fontconfig_path[0] == '\0') + { + char *p; + if(!GetModuleFileName(NULL, fontconfig_path, sizeof(fontconfig_path))) + goto bail1; + p = strrchr (fontconfig_path, '\\'); + if (p) *p = '\0'; + strcat (fontconfig_path, "\\fonts"); + } +#endif + dir = (FcChar8 *) FONTCONFIG_PATH; + path[i] = malloc (strlen ((char *) dir) + 1); + if (!path[i]) + goto bail1; + strcpy ((char *) path[i], (const char *) dir); + return path; + +bail1: + for (i = 0; path[i]; i++) + free (path[i]); + free (path); +bail0: + return 0; +} + +static void +FcConfigFreePath (FcChar8 **path) +{ + FcChar8 **p; + + for (p = path; *p; p++) + free (*p); + free (path); +} + +static FcBool _FcConfigHomeEnabled = FcTrue; + +FcChar8 * +FcConfigHome (void) +{ + if (_FcConfigHomeEnabled) + { + char *home = getenv ("HOME"); + +#ifdef _WIN32 + if (home == NULL) + home = getenv ("USERPROFILE"); +#endif + + return (FcChar8 *) home; + } + return 0; +} + +FcBool +FcConfigEnableHome (FcBool enable) +{ + FcBool prev = _FcConfigHomeEnabled; + _FcConfigHomeEnabled = enable; + return prev; +} + +FcChar8 * +FcConfigFilename (const FcChar8 *url) +{ + FcChar8 *file, *dir, **path, **p; + + if (!url || !*url) + { + url = (FcChar8 *) getenv ("FONTCONFIG_FILE"); + if (!url) + url = (FcChar8 *) FONTCONFIG_FILE; + } + file = 0; + +#ifdef _WIN32 + if (isalpha (*url) && + url[1] == ':' && + (url[2] == '/' || url[2] == '\\')) + goto absolute_path; +#endif + + switch (*url) { + case '~': + dir = FcConfigHome (); + if (dir) + file = FcConfigFileExists (dir, url + 1); + else + file = 0; + break; +#ifdef _WIN32 + case '\\': + absolute_path: +#endif + case '/': + file = FcConfigFileExists (0, url); + break; + default: + path = FcConfigGetPath (); + if (!path) + return 0; + for (p = path; *p; p++) + { + file = FcConfigFileExists (*p, url); + if (file) + break; + } + FcConfigFreePath (path); + break; + } + return file; +} + +/* + * Manage the application-specific fonts + */ + +FcBool +FcConfigAppFontAddFile (FcConfig *config, + const FcChar8 *file) +{ + FcFontSet *set; + FcStrSet *subdirs; + FcStrList *sublist; + FcChar8 *subdir; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + + subdirs = FcStrSetCreate (); + if (!subdirs) + return FcFalse; + + set = FcConfigGetFonts (config, FcSetApplication); + if (!set) + { + set = FcFontSetCreate (); + if (!set) + { + FcStrSetDestroy (subdirs); + return FcFalse; + } + FcConfigSetFonts (config, set, FcSetApplication); + } + + if (!FcFileScanConfig (set, subdirs, config->blanks, file, config)) + { + FcStrSetDestroy (subdirs); + return FcFalse; + } + if ((sublist = FcStrListCreate (subdirs))) + { + while ((subdir = FcStrListNext (sublist))) + { + FcConfigAppFontAddDir (config, subdir); + } + FcStrListDone (sublist); + } + FcStrSetDestroy (subdirs); + return FcTrue; +} + +FcBool +FcConfigAppFontAddDir (FcConfig *config, + const FcChar8 *dir) +{ + FcFontSet *set; + FcStrSet *dirs; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return FcFalse; + } + + dirs = FcStrSetCreate (); + if (!dirs) + return FcFalse; + + set = FcConfigGetFonts (config, FcSetApplication); + if (!set) + { + set = FcFontSetCreate (); + if (!set) + { + FcStrSetDestroy (dirs); + return FcFalse; + } + FcConfigSetFonts (config, set, FcSetApplication); + } + + FcStrSetAddFilename (dirs, dir); + + if (!FcConfigAddDirList (config, FcSetApplication, dirs)) + { + FcStrSetDestroy (dirs); + return FcFalse; + } + FcStrSetDestroy (dirs); + return FcTrue; +} + +void +FcConfigAppFontClear (FcConfig *config) +{ + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return; + } + + FcConfigSetFonts (config, 0, FcSetApplication); +} + +/* + * Manage filename-based font source selectors + */ + +FcBool +FcConfigGlobAdd (FcConfig *config, + const FcChar8 *glob, + FcBool accept) +{ + FcStrSet *set = accept ? config->acceptGlobs : config->rejectGlobs; + + return FcStrSetAdd (set, glob); +} + +static FcBool +FcConfigGlobMatch (const FcChar8 *glob, + const FcChar8 *string) +{ + FcChar8 c; + + while ((c = *glob++)) + { + switch (c) { + case '*': + /* short circuit common case */ + if (!*glob) + return FcTrue; + /* short circuit another common case */ + if (strchr ((char *) glob, '*') == 0) + string += strlen ((char *) string) - strlen ((char *) glob); + while (*string) + { + if (FcConfigGlobMatch (glob, string)) + return FcTrue; + string++; + } + return FcFalse; + case '?': + if (*string++ == '\0') + return FcFalse; + break; + default: + if (*string++ != c) + return FcFalse; + break; + } + } + return *string == '\0'; +} + +static FcBool +FcConfigGlobsMatch (const FcStrSet *globs, + const FcChar8 *string) +{ + int i; + + for (i = 0; i < globs->num; i++) + if (FcConfigGlobMatch (globs->strs[i], string)) + return FcTrue; + return FcFalse; +} + +FcBool +FcConfigAcceptFilename (FcConfig *config, + const FcChar8 *filename) +{ + if (FcConfigGlobsMatch (config->acceptGlobs, filename)) + return FcTrue; + if (FcConfigGlobsMatch (config->rejectGlobs, filename)) + return FcFalse; + return FcTrue; +} + +/* + * Manage font-pattern based font source selectors + */ + +FcBool +FcConfigPatternsAdd (FcConfig *config, + FcPattern *pattern, + FcBool accept) +{ + FcFontSet *set = accept ? config->acceptPatterns : config->rejectPatterns; + + return FcFontSetAdd (set, pattern); +} + +static FcBool +FcConfigPatternsMatch (const FcFontSet *patterns, + const FcPattern *font) +{ + int i; + + for (i = 0; i < patterns->nfont; i++) + if (FcListPatternMatchAny (patterns->fonts[i], font)) + return FcTrue; + return FcFalse; +} + +FcBool +FcConfigAcceptFont (FcConfig *config, + const FcPattern *font) +{ + if (FcConfigPatternsMatch (config->acceptPatterns, font)) + return FcTrue; + if (FcConfigPatternsMatch (config->rejectPatterns, font)) + return FcFalse; + return FcTrue; +} +#define __fccfg__ +#include "fcaliastail.h" +#undef __fccfg__ diff --git a/fontconfig/src/fccharset.c b/fontconfig/src/fccharset.c new file mode 100644 index 000000000..d30e1614a --- /dev/null +++ b/fontconfig/src/fccharset.c @@ -0,0 +1,1422 @@ +/* + * fontconfig/src/fccharset.c + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> + +/* #define CHECK */ + +FcCharSet * +FcCharSetCreate (void) +{ + FcCharSet *fcs; + + fcs = (FcCharSet *) malloc (sizeof (FcCharSet)); + if (!fcs) + return 0; + FcMemAlloc (FC_MEM_CHARSET, sizeof (FcCharSet)); + fcs->ref = 1; + fcs->num = 0; + fcs->leaves_offset = 0; + fcs->numbers_offset = 0; + return fcs; +} + +FcCharSet * +FcCharSetNew (void) +{ + return FcCharSetCreate (); +} + +void +FcCharSetDestroy (FcCharSet *fcs) +{ + int i; + + if (fcs->ref == FC_REF_CONSTANT) + { + FcCacheObjectDereference (fcs); + return; + } + if (--fcs->ref > 0) + return; + for (i = 0; i < fcs->num; i++) + { + FcMemFree (FC_MEM_CHARLEAF, sizeof (FcCharLeaf)); + free (FcCharSetLeaf (fcs, i)); + } + if (fcs->num) + { + /* the numbers here are estimates */ + FcMemFree (FC_MEM_CHARSET, fcs->num * sizeof (intptr_t)); + free (FcCharSetLeaves (fcs)); + FcMemFree (FC_MEM_CHARSET, fcs->num * sizeof (FcChar16)); + free (FcCharSetNumbers (fcs)); + } + FcMemFree (FC_MEM_CHARSET, sizeof (FcCharSet)); + free (fcs); +} + +/* + * Search for the leaf containing with the specified num. + * Return its index if it exists, otherwise return negative of + * the (position + 1) where it should be inserted + */ + + +static int +FcCharSetFindLeafForward (const FcCharSet *fcs, int start, FcChar16 num) +{ + FcChar16 *numbers = FcCharSetNumbers(fcs); + FcChar16 page; + int low = start; + int high = fcs->num - 1; + + if (!numbers) + return -1; + while (low <= high) + { + int mid = (low + high) >> 1; + page = numbers[mid]; + if (page == num) + return mid; + if (page < num) + low = mid + 1; + else + high = mid - 1; + } + if (high < 0 || (high < fcs->num && numbers[high] < num)) + high++; + return -(high + 1); +} + +/* + * Locate the leaf containing the specified char, return + * its index if it exists, otherwise return negative of + * the (position + 1) where it should be inserted + */ + +static int +FcCharSetFindLeafPos (const FcCharSet *fcs, FcChar32 ucs4) +{ + return FcCharSetFindLeafForward (fcs, 0, ucs4 >> 8); +} + +static FcCharLeaf * +FcCharSetFindLeaf (const FcCharSet *fcs, FcChar32 ucs4) +{ + int pos = FcCharSetFindLeafPos (fcs, ucs4); + if (pos >= 0) + return FcCharSetLeaf(fcs, pos); + return 0; +} + +#define FC_IS_ZERO_OR_POWER_OF_TWO(x) (!((x) & ((x)-1))) + +static FcBool +FcCharSetPutLeaf (FcCharSet *fcs, + FcChar32 ucs4, + FcCharLeaf *leaf, + int pos) +{ + intptr_t *leaves = FcCharSetLeaves (fcs); + FcChar16 *numbers = FcCharSetNumbers (fcs); + + ucs4 >>= 8; + if (ucs4 >= 0x10000) + return FcFalse; + + if (FC_IS_ZERO_OR_POWER_OF_TWO (fcs->num)) + { + if (!fcs->num) + { + unsigned int alloced = 8; + leaves = malloc (alloced * sizeof (*leaves)); + numbers = malloc (alloced * sizeof (*numbers)); + FcMemAlloc (FC_MEM_CHARSET, alloced * sizeof (*leaves)); + FcMemAlloc (FC_MEM_CHARSET, alloced * sizeof (*numbers)); + } + else + { + unsigned int alloced = fcs->num; + intptr_t *new_leaves, distance; + + FcMemFree (FC_MEM_CHARSET, alloced * sizeof (*leaves)); + FcMemFree (FC_MEM_CHARSET, alloced * sizeof (*numbers)); + + alloced *= 2; + new_leaves = realloc (leaves, alloced * sizeof (*leaves)); + numbers = realloc (numbers, alloced * sizeof (*numbers)); + + FcMemAlloc (FC_MEM_CHARSET, alloced * sizeof (*leaves)); + FcMemAlloc (FC_MEM_CHARSET, alloced * sizeof (*numbers)); + + distance = (intptr_t) new_leaves - (intptr_t) leaves; + if (new_leaves && distance) + { + int i; + for (i = 0; i < fcs->num; i++) + new_leaves[i] -= distance; + } + leaves = new_leaves; + } + + if (!leaves || !numbers) + return FcFalse; + + fcs->leaves_offset = FcPtrToOffset (fcs, leaves); + fcs->numbers_offset = FcPtrToOffset (fcs, numbers); + } + + memmove (leaves + pos + 1, leaves + pos, + (fcs->num - pos) * sizeof (*leaves)); + memmove (numbers + pos + 1, numbers + pos, + (fcs->num - pos) * sizeof (*numbers)); + numbers[pos] = (FcChar16) ucs4; + leaves[pos] = FcPtrToOffset (leaves, leaf); + fcs->num++; + return FcTrue; +} + +/* + * Locate the leaf containing the specified char, creating it + * if desired + */ + +FcCharLeaf * +FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4) +{ + int pos; + FcCharLeaf *leaf; + + pos = FcCharSetFindLeafPos (fcs, ucs4); + if (pos >= 0) + return FcCharSetLeaf(fcs, pos); + + leaf = calloc (1, sizeof (FcCharLeaf)); + if (!leaf) + return 0; + + pos = -pos - 1; + if (!FcCharSetPutLeaf (fcs, ucs4, leaf, pos)) + { + free (leaf); + return 0; + } + FcMemAlloc (FC_MEM_CHARLEAF, sizeof (FcCharLeaf)); + return leaf; +} + +static FcBool +FcCharSetInsertLeaf (FcCharSet *fcs, FcChar32 ucs4, FcCharLeaf *leaf) +{ + int pos; + + pos = FcCharSetFindLeafPos (fcs, ucs4); + if (pos >= 0) + { + FcMemFree (FC_MEM_CHARLEAF, sizeof (FcCharLeaf)); + free (FcCharSetLeaf (fcs, pos)); + FcCharSetLeaves(fcs)[pos] = FcPtrToOffset (FcCharSetLeaves(fcs), + leaf); + return FcTrue; + } + pos = -pos - 1; + return FcCharSetPutLeaf (fcs, ucs4, leaf, pos); +} + +FcBool +FcCharSetAddChar (FcCharSet *fcs, FcChar32 ucs4) +{ + FcCharLeaf *leaf; + FcChar32 *b; + + if (fcs->ref == FC_REF_CONSTANT) + return FcFalse; + leaf = FcCharSetFindLeafCreate (fcs, ucs4); + if (!leaf) + return FcFalse; + b = &leaf->map[(ucs4 & 0xff) >> 5]; + *b |= (1 << (ucs4 & 0x1f)); + return FcTrue; +} + +/* + * An iterator for the leaves of a charset + */ + +typedef struct _fcCharSetIter { + FcCharLeaf *leaf; + FcChar32 ucs4; + int pos; +} FcCharSetIter; + +/* + * Set iter->leaf to the leaf containing iter->ucs4 or higher + */ + +static void +FcCharSetIterSet (const FcCharSet *fcs, FcCharSetIter *iter) +{ + int pos = FcCharSetFindLeafPos (fcs, iter->ucs4); + + if (pos < 0) + { + pos = -pos - 1; + if (pos == fcs->num) + { + iter->ucs4 = ~0; + iter->leaf = 0; + return; + } + iter->ucs4 = (FcChar32) FcCharSetNumbers(fcs)[pos] << 8; + } + iter->leaf = FcCharSetLeaf(fcs, pos); + iter->pos = pos; +} + +static void +FcCharSetIterNext (const FcCharSet *fcs, FcCharSetIter *iter) +{ + int pos = iter->pos + 1; + if (pos >= fcs->num) + { + iter->ucs4 = ~0; + iter->leaf = 0; + } + else + { + iter->ucs4 = (FcChar32) FcCharSetNumbers(fcs)[pos] << 8; + iter->leaf = FcCharSetLeaf(fcs, pos); + iter->pos = pos; + } +} + + +static void +FcCharSetIterStart (const FcCharSet *fcs, FcCharSetIter *iter) +{ + iter->ucs4 = 0; + iter->pos = 0; + FcCharSetIterSet (fcs, iter); +} + +FcCharSet * +FcCharSetCopy (FcCharSet *src) +{ + if (src->ref != FC_REF_CONSTANT) + src->ref++; + else + FcCacheObjectReference (src); + return src; +} + +FcBool +FcCharSetEqual (const FcCharSet *a, const FcCharSet *b) +{ + FcCharSetIter ai, bi; + int i; + + if (a == b) + return FcTrue; + for (FcCharSetIterStart (a, &ai), FcCharSetIterStart (b, &bi); + ai.leaf && bi.leaf; + FcCharSetIterNext (a, &ai), FcCharSetIterNext (b, &bi)) + { + if (ai.ucs4 != bi.ucs4) + return FcFalse; + for (i = 0; i < 256/32; i++) + if (ai.leaf->map[i] != bi.leaf->map[i]) + return FcFalse; + } + return ai.leaf == bi.leaf; +} + +static FcBool +FcCharSetAddLeaf (FcCharSet *fcs, + FcChar32 ucs4, + FcCharLeaf *leaf) +{ + FcCharLeaf *new = FcCharSetFindLeafCreate (fcs, ucs4); + if (!new) + return FcFalse; + *new = *leaf; + return FcTrue; +} + +static FcCharSet * +FcCharSetOperate (const FcCharSet *a, + const FcCharSet *b, + FcBool (*overlap) (FcCharLeaf *result, + const FcCharLeaf *al, + const FcCharLeaf *bl), + FcBool aonly, + FcBool bonly) +{ + FcCharSet *fcs; + FcCharSetIter ai, bi; + + fcs = FcCharSetCreate (); + if (!fcs) + goto bail0; + FcCharSetIterStart (a, &ai); + FcCharSetIterStart (b, &bi); + while ((ai.leaf || (bonly && bi.leaf)) && (bi.leaf || (aonly && ai.leaf))) + { + if (ai.ucs4 < bi.ucs4) + { + if (aonly) + { + if (!FcCharSetAddLeaf (fcs, ai.ucs4, ai.leaf)) + goto bail1; + FcCharSetIterNext (a, &ai); + } + else + { + ai.ucs4 = bi.ucs4; + FcCharSetIterSet (a, &ai); + } + } + else if (bi.ucs4 < ai.ucs4 ) + { + if (bonly) + { + if (!FcCharSetAddLeaf (fcs, bi.ucs4, bi.leaf)) + goto bail1; + FcCharSetIterNext (b, &bi); + } + else + { + bi.ucs4 = ai.ucs4; + FcCharSetIterSet (b, &bi); + } + } + else + { + FcCharLeaf leaf; + + if ((*overlap) (&leaf, ai.leaf, bi.leaf)) + { + if (!FcCharSetAddLeaf (fcs, ai.ucs4, &leaf)) + goto bail1; + } + FcCharSetIterNext (a, &ai); + FcCharSetIterNext (b, &bi); + } + } + return fcs; +bail1: + FcCharSetDestroy (fcs); +bail0: + return 0; +} + +static FcBool +FcCharSetIntersectLeaf (FcCharLeaf *result, + const FcCharLeaf *al, + const FcCharLeaf *bl) +{ + int i; + FcBool nonempty = FcFalse; + + for (i = 0; i < 256/32; i++) + if ((result->map[i] = al->map[i] & bl->map[i])) + nonempty = FcTrue; + return nonempty; +} + +FcCharSet * +FcCharSetIntersect (const FcCharSet *a, const FcCharSet *b) +{ + return FcCharSetOperate (a, b, FcCharSetIntersectLeaf, FcFalse, FcFalse); +} + +static FcBool +FcCharSetUnionLeaf (FcCharLeaf *result, + const FcCharLeaf *al, + const FcCharLeaf *bl) +{ + int i; + + for (i = 0; i < 256/32; i++) + result->map[i] = al->map[i] | bl->map[i]; + return FcTrue; +} + +FcCharSet * +FcCharSetUnion (const FcCharSet *a, const FcCharSet *b) +{ + return FcCharSetOperate (a, b, FcCharSetUnionLeaf, FcTrue, FcTrue); +} + +FcBool +FcCharSetMerge (FcCharSet *a, const FcCharSet *b, FcBool *changed) +{ + int ai = 0, bi = 0; + FcChar16 an, bn; + + if (a->ref == FC_REF_CONSTANT) { + if (changed) + *changed = FcFalse; + return FcFalse; + } + + if (changed) { + *changed = !FcCharSetIsSubset(b, a); + if (!*changed) + return FcTrue; + } + + while (bi < b->num) + { + an = ai < a->num ? FcCharSetNumbers(a)[ai] : ~0; + bn = FcCharSetNumbers(b)[bi]; + + if (an < bn) + { + ai = FcCharSetFindLeafForward (a, ai + 1, bn); + if (ai < 0) + ai = -ai - 1; + } + else + { + FcCharLeaf *bl = FcCharSetLeaf(b, bi); + if (bn < an) + { + if (!FcCharSetAddLeaf (a, bn << 8, bl)) + return FcFalse; + } + else + { + FcCharLeaf *al = FcCharSetLeaf(a, ai); + FcCharSetUnionLeaf (al, al, bl); + } + + ai++; + bi++; + } + } + + return FcTrue; +} + +static FcBool +FcCharSetSubtractLeaf (FcCharLeaf *result, + const FcCharLeaf *al, + const FcCharLeaf *bl) +{ + int i; + FcBool nonempty = FcFalse; + + for (i = 0; i < 256/32; i++) + if ((result->map[i] = al->map[i] & ~bl->map[i])) + nonempty = FcTrue; + return nonempty; +} + +FcCharSet * +FcCharSetSubtract (const FcCharSet *a, const FcCharSet *b) +{ + return FcCharSetOperate (a, b, FcCharSetSubtractLeaf, FcTrue, FcFalse); +} + +FcBool +FcCharSetHasChar (const FcCharSet *fcs, FcChar32 ucs4) +{ + FcCharLeaf *leaf = FcCharSetFindLeaf (fcs, ucs4); + if (!leaf) + return FcFalse; + return (leaf->map[(ucs4 & 0xff) >> 5] & (1 << (ucs4 & 0x1f))) != 0; +} + +static FcChar32 +FcCharSetPopCount (FcChar32 c1) +{ +#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) + return __builtin_popcount (c1); +#else + /* hackmem 169 */ + FcChar32 c2 = (c1 >> 1) & 033333333333; + c2 = c1 - c2 - ((c2 >> 1) & 033333333333); + return (((c2 + (c2 >> 3)) & 030707070707) % 077); +#endif +} + +FcChar32 +FcCharSetIntersectCount (const FcCharSet *a, const FcCharSet *b) +{ + FcCharSetIter ai, bi; + FcChar32 count = 0; + + FcCharSetIterStart (a, &ai); + FcCharSetIterStart (b, &bi); + while (ai.leaf && bi.leaf) + { + if (ai.ucs4 == bi.ucs4) + { + FcChar32 *am = ai.leaf->map; + FcChar32 *bm = bi.leaf->map; + int i = 256/32; + while (i--) + count += FcCharSetPopCount (*am++ & *bm++); + FcCharSetIterNext (a, &ai); + } + else if (ai.ucs4 < bi.ucs4) + { + ai.ucs4 = bi.ucs4; + FcCharSetIterSet (a, &ai); + } + if (bi.ucs4 < ai.ucs4) + { + bi.ucs4 = ai.ucs4; + FcCharSetIterSet (b, &bi); + } + } + return count; +} + +FcChar32 +FcCharSetCount (const FcCharSet *a) +{ + FcCharSetIter ai; + FcChar32 count = 0; + + for (FcCharSetIterStart (a, &ai); ai.leaf; FcCharSetIterNext (a, &ai)) + { + int i = 256/32; + FcChar32 *am = ai.leaf->map; + + while (i--) + count += FcCharSetPopCount (*am++); + } + return count; +} + +FcChar32 +FcCharSetSubtractCount (const FcCharSet *a, const FcCharSet *b) +{ + FcCharSetIter ai, bi; + FcChar32 count = 0; + + FcCharSetIterStart (a, &ai); + FcCharSetIterStart (b, &bi); + while (ai.leaf) + { + if (ai.ucs4 <= bi.ucs4) + { + FcChar32 *am = ai.leaf->map; + int i = 256/32; + if (ai.ucs4 == bi.ucs4) + { + FcChar32 *bm = bi.leaf->map; + while (i--) + count += FcCharSetPopCount (*am++ & ~*bm++); + } + else + { + while (i--) + count += FcCharSetPopCount (*am++); + } + FcCharSetIterNext (a, &ai); + } + else if (bi.leaf) + { + bi.ucs4 = ai.ucs4; + FcCharSetIterSet (b, &bi); + } + } + return count; +} + +/* + * return FcTrue iff a is a subset of b + */ +FcBool +FcCharSetIsSubset (const FcCharSet *a, const FcCharSet *b) +{ + int ai, bi; + FcChar16 an, bn; + + if (a == b) return FcTrue; + bi = 0; + ai = 0; + while (ai < a->num && bi < b->num) + { + an = FcCharSetNumbers(a)[ai]; + bn = FcCharSetNumbers(b)[bi]; + /* + * Check matching pages + */ + if (an == bn) + { + FcChar32 *am = FcCharSetLeaf(a, ai)->map; + FcChar32 *bm = FcCharSetLeaf(b, bi)->map; + + if (am != bm) + { + int i = 256/32; + /* + * Does am have any bits not in bm? + */ + while (i--) + if (*am++ & ~*bm++) + return FcFalse; + } + ai++; + bi++; + } + /* + * Does a have any pages not in b? + */ + else if (an < bn) + return FcFalse; + else + { + bi = FcCharSetFindLeafForward (b, bi + 1, an); + if (bi < 0) + bi = -bi - 1; + } + } + /* + * did we look at every page? + */ + return ai >= a->num; +} + +/* + * These two functions efficiently walk the entire charmap for + * other software (like pango) that want their own copy + */ + +FcChar32 +FcCharSetNextPage (const FcCharSet *a, + FcChar32 map[FC_CHARSET_MAP_SIZE], + FcChar32 *next) +{ + FcCharSetIter ai; + FcChar32 page; + + ai.ucs4 = *next; + FcCharSetIterSet (a, &ai); + if (!ai.leaf) + return FC_CHARSET_DONE; + + /* + * Save current information + */ + page = ai.ucs4; + memcpy (map, ai.leaf->map, sizeof (ai.leaf->map)); + /* + * Step to next page + */ + FcCharSetIterNext (a, &ai); + *next = ai.ucs4; + + return page; +} + +FcChar32 +FcCharSetFirstPage (const FcCharSet *a, + FcChar32 map[FC_CHARSET_MAP_SIZE], + FcChar32 *next) +{ + *next = 0; + return FcCharSetNextPage (a, map, next); +} + +/* + * old coverage API, rather hard to use correctly + */ + +FcChar32 +FcCharSetCoverage (const FcCharSet *a, FcChar32 page, FcChar32 *result) +{ + FcCharSetIter ai; + + ai.ucs4 = page; + FcCharSetIterSet (a, &ai); + if (!ai.leaf) + { + memset (result, '\0', 256 / 8); + page = 0; + } + else + { + memcpy (result, ai.leaf->map, sizeof (ai.leaf->map)); + FcCharSetIterNext (a, &ai); + page = ai.ucs4; + } + return page; +} + +/* + * ASCII representation of charsets. + * + * Each leaf is represented as 9 32-bit values, the code of the first character followed + * by 8 32 bit values for the leaf itself. Each value is encoded as 5 ASCII characters, + * only 85 different values are used to avoid control characters as well as the other + * characters used to encode font names. 85**5 > 2^32 so things work out, but + * it's not exactly human readable output. As a special case, 0 is encoded as a space + */ + +static const unsigned char charToValue[256] = { + /* "" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\b" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\020" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\030" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* " " */ 0xff, 0x00, 0xff, 0x01, 0x02, 0x03, 0x04, 0xff, + /* "(" */ 0x05, 0x06, 0x07, 0x08, 0xff, 0xff, 0x09, 0x0a, + /* "0" */ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, + /* "8" */ 0x13, 0x14, 0xff, 0x15, 0x16, 0xff, 0x17, 0x18, + /* "@" */ 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, + /* "H" */ 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + /* "P" */ 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, + /* "X" */ 0x31, 0x32, 0x33, 0x34, 0xff, 0x35, 0x36, 0xff, + /* "`" */ 0xff, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, + /* "h" */ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, + /* "p" */ 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, + /* "x" */ 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0xff, + /* "\200" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\210" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\220" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\230" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\240" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\250" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\260" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\270" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\300" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\310" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\320" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\330" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\340" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\350" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\360" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + /* "\370" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, +}; + +static const FcChar8 valueToChar[0x55] = { + /* 0x00 */ '!', '#', '$', '%', '&', '(', ')', '*', + /* 0x08 */ '+', '.', '/', '0', '1', '2', '3', '4', + /* 0x10 */ '5', '6', '7', '8', '9', ';', '<', '>', + /* 0x18 */ '?', '@', 'A', 'B', 'C', 'D', 'E', 'F', + /* 0x20 */ 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + /* 0x28 */ 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + /* 0x30 */ 'W', 'X', 'Y', 'Z', '[', ']', '^', 'a', + /* 0x38 */ 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', + /* 0x40 */ 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', + /* 0x48 */ 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', + /* 0x50 */ 'z', '{', '|', '}', '~', +}; + +static FcChar8 * +FcCharSetParseValue (FcChar8 *string, FcChar32 *value) +{ + int i; + FcChar32 v; + FcChar32 c; + + if (*string == ' ') + { + v = 0; + string++; + } + else + { + v = 0; + for (i = 0; i < 5; i++) + { + if (!(c = (FcChar32) (unsigned char) *string++)) + return 0; + c = charToValue[c]; + if (c == 0xff) + return 0; + v = v * 85 + c; + } + } + *value = v; + return string; +} + +static FcBool +FcCharSetUnparseValue (FcStrBuf *buf, FcChar32 value) +{ + int i; + if (value == 0) + { + return FcStrBufChar (buf, ' '); + } + else + { + FcChar8 string[6]; + FcChar8 *s = string + 5; + string[5] = '\0'; + for (i = 0; i < 5; i++) + { + *--s = valueToChar[value % 85]; + value /= 85; + } + for (i = 0; i < 5; i++) + if (!FcStrBufChar (buf, *s++)) + return FcFalse; + } + return FcTrue; +} + +FcCharSet * +FcNameParseCharSet (FcChar8 *string) +{ + FcCharSet *c; + FcChar32 ucs4; + FcCharLeaf *leaf; + FcCharLeaf temp; + FcChar32 bits; + int i; + + c = FcCharSetCreate (); + if (!c) + goto bail0; + while (*string) + { + string = FcCharSetParseValue (string, &ucs4); + if (!string) + goto bail1; + bits = 0; + for (i = 0; i < 256/32; i++) + { + string = FcCharSetParseValue (string, &temp.map[i]); + if (!string) + goto bail1; + bits |= temp.map[i]; + } + if (bits) + { + leaf = malloc (sizeof (FcCharLeaf)); + if (!leaf) + goto bail1; + *leaf = temp; + if (!FcCharSetInsertLeaf (c, ucs4, leaf)) + goto bail1; + } + } + return c; +bail1: + if (c->num) + { + FcMemFree (FC_MEM_CHARSET, c->num * sizeof (FcCharLeaf *)); + free (FcCharSetLeaves (c)); + } + if (c->num) + { + FcMemFree (FC_MEM_CHARSET, c->num * sizeof (FcChar16)); + free (FcCharSetNumbers (c)); + } + FcMemFree (FC_MEM_CHARSET, sizeof (FcCharSet)); + free (c); +bail0: + return NULL; +} + +FcBool +FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c) +{ + FcCharSetIter ci; + int i; +#ifdef CHECK + int len = buf->len; +#endif + + for (FcCharSetIterStart (c, &ci); + ci.leaf; + FcCharSetIterNext (c, &ci)) + { + if (!FcCharSetUnparseValue (buf, ci.ucs4)) + return FcFalse; + for (i = 0; i < 256/32; i++) + if (!FcCharSetUnparseValue (buf, ci.leaf->map[i])) + return FcFalse; + } +#ifdef CHECK + { + FcCharSet *check; + FcChar32 missing; + FcCharSetIter ci, checki; + + /* null terminate for parser */ + FcStrBufChar (buf, '\0'); + /* step back over null for life after test */ + buf->len--; + check = FcNameParseCharSet (buf->buf + len); + FcCharSetIterStart (c, &ci); + FcCharSetIterStart (check, &checki); + while (ci.leaf || checki.leaf) + { + if (ci.ucs4 < checki.ucs4) + { + printf ("Missing leaf node at 0x%x\n", ci.ucs4); + FcCharSetIterNext (c, &ci); + } + else if (checki.ucs4 < ci.ucs4) + { + printf ("Extra leaf node at 0x%x\n", checki.ucs4); + FcCharSetIterNext (check, &checki); + } + else + { + int i = 256/32; + FcChar32 *cm = ci.leaf->map; + FcChar32 *checkm = checki.leaf->map; + + for (i = 0; i < 256; i += 32) + { + if (*cm != *checkm) + printf ("Mismatching sets at 0x%08x: 0x%08x != 0x%08x\n", + ci.ucs4 + i, *cm, *checkm); + cm++; + checkm++; + } + FcCharSetIterNext (c, &ci); + FcCharSetIterNext (check, &checki); + } + } + if ((missing = FcCharSetSubtractCount (c, check))) + printf ("%d missing in reparsed result\n", missing); + if ((missing = FcCharSetSubtractCount (check, c))) + printf ("%d extra in reparsed result\n", missing); + FcCharSetDestroy (check); + } +#endif + + return FcTrue; +} + +typedef struct _FcCharLeafEnt FcCharLeafEnt; + +struct _FcCharLeafEnt { + FcCharLeafEnt *next; + FcChar32 hash; + FcCharLeaf leaf; +}; + +#define FC_CHAR_LEAF_BLOCK (4096 / sizeof (FcCharLeafEnt)) +#define FC_CHAR_LEAF_HASH_SIZE 257 + +typedef struct _FcCharSetEnt FcCharSetEnt; + +struct _FcCharSetEnt { + FcCharSetEnt *next; + FcChar32 hash; + FcCharSet set; +}; + +typedef struct _FcCharSetOrigEnt FcCharSetOrigEnt; + +struct _FcCharSetOrigEnt { + FcCharSetOrigEnt *next; + const FcCharSet *orig; + const FcCharSet *frozen; +}; + +#define FC_CHAR_SET_HASH_SIZE 67 + +struct _FcCharSetFreezer { + FcCharLeafEnt *leaf_hash_table[FC_CHAR_LEAF_HASH_SIZE]; + FcCharLeafEnt **leaf_blocks; + int leaf_block_count; + FcCharSetEnt *set_hash_table[FC_CHAR_SET_HASH_SIZE]; + FcCharSetOrigEnt *orig_hash_table[FC_CHAR_SET_HASH_SIZE]; + FcCharLeafEnt *current_block; + int leaf_remain; + int leaves_seen; + int charsets_seen; + int leaves_allocated; + int charsets_allocated; +}; + +static FcCharLeafEnt * +FcCharLeafEntCreate (FcCharSetFreezer *freezer) +{ + if (!freezer->leaf_remain) + { + FcCharLeafEnt **newBlocks; + + freezer->leaf_block_count++; + newBlocks = realloc (freezer->leaf_blocks, freezer->leaf_block_count * sizeof (FcCharLeafEnt *)); + if (!newBlocks) + return 0; + freezer->leaf_blocks = newBlocks; + freezer->current_block = freezer->leaf_blocks[freezer->leaf_block_count-1] = malloc (FC_CHAR_LEAF_BLOCK * sizeof (FcCharLeafEnt)); + if (!freezer->current_block) + return 0; + FcMemAlloc (FC_MEM_CHARLEAF, FC_CHAR_LEAF_BLOCK * sizeof (FcCharLeafEnt)); + freezer->leaf_remain = FC_CHAR_LEAF_BLOCK; + } + freezer->leaf_remain--; + freezer->leaves_allocated++; + return freezer->current_block++; +} + +static FcChar32 +FcCharLeafHash (FcCharLeaf *leaf) +{ + FcChar32 hash = 0; + int i; + + for (i = 0; i < 256/32; i++) + hash = ((hash << 1) | (hash >> 31)) ^ leaf->map[i]; + return hash; +} + +static FcCharLeaf * +FcCharSetFreezeLeaf (FcCharSetFreezer *freezer, FcCharLeaf *leaf) +{ + FcChar32 hash = FcCharLeafHash (leaf); + FcCharLeafEnt **bucket = &freezer->leaf_hash_table[hash % FC_CHAR_LEAF_HASH_SIZE]; + FcCharLeafEnt *ent; + + for (ent = *bucket; ent; ent = ent->next) + { + if (ent->hash == hash && !memcmp (&ent->leaf, leaf, sizeof (FcCharLeaf))) + return &ent->leaf; + } + + ent = FcCharLeafEntCreate(freezer); + if (!ent) + return 0; + ent->leaf = *leaf; + ent->hash = hash; + ent->next = *bucket; + *bucket = ent; + return &ent->leaf; +} + +static FcChar32 +FcCharSetHash (FcCharSet *fcs) +{ + FcChar32 hash = 0; + int i; + + /* hash in leaves */ + for (i = 0; i < fcs->num; i++) + hash = ((hash << 1) | (hash >> 31)) ^ FcCharLeafHash (FcCharSetLeaf(fcs,i)); + /* hash in numbers */ + for (i = 0; i < fcs->num; i++) + hash = ((hash << 1) | (hash >> 31)) ^ *FcCharSetNumbers(fcs); + return hash; +} + +static FcBool +FcCharSetFreezeOrig (FcCharSetFreezer *freezer, const FcCharSet *orig, const FcCharSet *frozen) +{ + FcCharSetOrigEnt **bucket = &freezer->orig_hash_table[((uintptr_t) orig) & FC_CHAR_SET_HASH_SIZE]; + FcCharSetOrigEnt *ent; + + ent = malloc (sizeof (FcCharSetOrigEnt)); + if (!ent) + return FcFalse; + ent->orig = orig; + ent->frozen = frozen; + ent->next = *bucket; + *bucket = ent; + return FcTrue; +} + +static FcCharSet * +FcCharSetFreezeBase (FcCharSetFreezer *freezer, FcCharSet *fcs, const FcCharSet *orig) +{ + FcChar32 hash = FcCharSetHash (fcs); + FcCharSetEnt **bucket = &freezer->set_hash_table[hash % FC_CHAR_SET_HASH_SIZE]; + FcCharSetEnt *ent; + int size; + int i; + + for (ent = *bucket; ent; ent = ent->next) + { + if (ent->hash == hash && + ent->set.num == fcs->num && + !memcmp (FcCharSetNumbers(&ent->set), + FcCharSetNumbers(fcs), + fcs->num * sizeof (FcChar16))) + { + FcBool ok = FcTrue; + int i; + + for (i = 0; i < fcs->num; i++) + if (FcCharSetLeaf(&ent->set, i) != FcCharSetLeaf(fcs, i)) + ok = FcFalse; + if (ok) + return &ent->set; + } + } + + size = (sizeof (FcCharSetEnt) + + fcs->num * sizeof (FcCharLeaf *) + + fcs->num * sizeof (FcChar16)); + ent = malloc (size); + if (!ent) + return 0; + FcMemAlloc (FC_MEM_CHARSET, size); + + freezer->charsets_allocated++; + + ent->set.ref = FC_REF_CONSTANT; + ent->set.num = fcs->num; + if (fcs->num) + { + intptr_t *ent_leaves; + + ent->set.leaves_offset = sizeof (ent->set); + ent->set.numbers_offset = (ent->set.leaves_offset + + fcs->num * sizeof (intptr_t)); + + ent_leaves = FcCharSetLeaves (&ent->set); + for (i = 0; i < fcs->num; i++) + ent_leaves[i] = FcPtrToOffset (ent_leaves, + FcCharSetLeaf (fcs, i)); + memcpy (FcCharSetNumbers (&ent->set), + FcCharSetNumbers (fcs), + fcs->num * sizeof (FcChar16)); + } + else + { + ent->set.leaves_offset = 0; + ent->set.numbers_offset = 0; + } + + ent->hash = hash; + ent->next = *bucket; + *bucket = ent; + + return &ent->set; +} + +static const FcCharSet * +FcCharSetFindFrozen (FcCharSetFreezer *freezer, const FcCharSet *orig) +{ + FcCharSetOrigEnt **bucket = &freezer->orig_hash_table[((uintptr_t) orig) & FC_CHAR_SET_HASH_SIZE]; + FcCharSetOrigEnt *ent; + + for (ent = *bucket; ent; ent = ent->next) + if (ent->orig == orig) + return ent->frozen; + return NULL; +} + +const FcCharSet * +FcCharSetFreeze (FcCharSetFreezer *freezer, const FcCharSet *fcs) +{ + FcCharSet *b; + const FcCharSet *n = 0; + FcCharLeaf *l; + int i; + + b = FcCharSetCreate (); + if (!b) + goto bail0; + for (i = 0; i < fcs->num; i++) + { + l = FcCharSetFreezeLeaf (freezer, FcCharSetLeaf(fcs, i)); + if (!l) + goto bail1; + if (!FcCharSetInsertLeaf (b, FcCharSetNumbers(fcs)[i] << 8, l)) + goto bail1; + } + n = FcCharSetFreezeBase (freezer, b, fcs); + if (!FcCharSetFreezeOrig (freezer, fcs, n)) + { + n = NULL; + goto bail1; + } + freezer->charsets_seen++; + freezer->leaves_seen += fcs->num; +bail1: + if (b->num) + { + FcMemFree (FC_MEM_CHARSET, b->num * sizeof (FcCharLeaf *)); + free (FcCharSetLeaves (b)); + } + if (b->num) + { + FcMemFree (FC_MEM_CHARSET, b->num * sizeof (FcChar16)); + free (FcCharSetNumbers (b)); + } + FcMemFree (FC_MEM_CHARSET, sizeof (FcCharSet)); + free (b); +bail0: + return n; +} + +FcCharSetFreezer * +FcCharSetFreezerCreate (void) +{ + FcCharSetFreezer *freezer; + + freezer = calloc (1, sizeof (FcCharSetFreezer)); + return freezer; +} + +void +FcCharSetFreezerDestroy (FcCharSetFreezer *freezer) +{ + int i; + + if (FcDebug() & FC_DBG_CACHE) + { + printf ("\ncharsets %d -> %d leaves %d -> %d\n", + freezer->charsets_seen, freezer->charsets_allocated, + freezer->leaves_seen, freezer->leaves_allocated); + } + for (i = 0; i < FC_CHAR_SET_HASH_SIZE; i++) + { + FcCharSetEnt *ent, *next; + for (ent = freezer->set_hash_table[i]; ent; ent = next) + { + next = ent->next; + FcMemFree (FC_MEM_CHARSET, (sizeof (FcCharSetEnt) + + ent->set.num * sizeof (FcCharLeaf *) + + ent->set.num * sizeof (FcChar16))); + free (ent); + } + } + + for (i = 0; i < FC_CHAR_SET_HASH_SIZE; i++) + { + FcCharSetOrigEnt *ent, *next; + for (ent = freezer->orig_hash_table[i]; ent; ent = next) + { + next = ent->next; + free (ent); + } + } + + for (i = 0; i < freezer->leaf_block_count; i++) + { + free (freezer->leaf_blocks[i]); + FcMemFree (FC_MEM_CHARLEAF, FC_CHAR_LEAF_BLOCK * sizeof (FcCharLeafEnt)); + } + + free (freezer->leaf_blocks); + free (freezer); +} + +FcBool +FcCharSetSerializeAlloc (FcSerialize *serialize, const FcCharSet *cs) +{ + intptr_t *leaves; + FcChar16 *numbers; + int i; + + if (cs->ref != FC_REF_CONSTANT) + { + if (!serialize->cs_freezer) + { + serialize->cs_freezer = FcCharSetFreezerCreate (); + if (!serialize->cs_freezer) + return FcFalse; + } + if (FcCharSetFindFrozen (serialize->cs_freezer, cs)) + return FcTrue; + + cs = FcCharSetFreeze (serialize->cs_freezer, cs); + } + + leaves = FcCharSetLeaves (cs); + numbers = FcCharSetNumbers (cs); + + if (!FcSerializeAlloc (serialize, cs, sizeof (FcCharSet))) + return FcFalse; + if (!FcSerializeAlloc (serialize, leaves, cs->num * sizeof (intptr_t))) + return FcFalse; + if (!FcSerializeAlloc (serialize, numbers, cs->num * sizeof (FcChar16))) + return FcFalse; + for (i = 0; i < cs->num; i++) + if (!FcSerializeAlloc (serialize, FcCharSetLeaf(cs, i), + sizeof (FcCharLeaf))) + return FcFalse; + return FcTrue; +} + +FcCharSet * +FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs) +{ + FcCharSet *cs_serialized; + intptr_t *leaves, *leaves_serialized; + FcChar16 *numbers, *numbers_serialized; + FcCharLeaf *leaf, *leaf_serialized; + int i; + + if (cs->ref != FC_REF_CONSTANT && serialize->cs_freezer) + { + cs = FcCharSetFindFrozen (serialize->cs_freezer, cs); + if (!cs) + return NULL; + } + + cs_serialized = FcSerializePtr (serialize, cs); + if (!cs_serialized) + return NULL; + + cs_serialized->ref = FC_REF_CONSTANT; + cs_serialized->num = cs->num; + + if (cs->num) + { + leaves = FcCharSetLeaves (cs); + leaves_serialized = FcSerializePtr (serialize, leaves); + if (!leaves_serialized) + return NULL; + + cs_serialized->leaves_offset = FcPtrToOffset (cs_serialized, + leaves_serialized); + + numbers = FcCharSetNumbers (cs); + numbers_serialized = FcSerializePtr (serialize, numbers); + if (!numbers) + return NULL; + + cs_serialized->numbers_offset = FcPtrToOffset (cs_serialized, + numbers_serialized); + + for (i = 0; i < cs->num; i++) + { + leaf = FcCharSetLeaf (cs, i); + leaf_serialized = FcSerializePtr (serialize, leaf); + if (!leaf_serialized) + return NULL; + *leaf_serialized = *leaf; + leaves_serialized[i] = FcPtrToOffset (leaves_serialized, + leaf_serialized); + numbers_serialized[i] = numbers[i]; + } + } + else + { + cs_serialized->leaves_offset = 0; + cs_serialized->numbers_offset = 0; + } + + return cs_serialized; +} +#define __fccharset__ +#include "fcaliastail.h" +#undef __fccharset__ diff --git a/fontconfig/src/fcdbg.c b/fontconfig/src/fcdbg.c new file mode 100644 index 000000000..fd2d55a6b --- /dev/null +++ b/fontconfig/src/fcdbg.c @@ -0,0 +1,398 @@ +/* + * fontconfig/src/fcdbg.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdio.h> +#include <stdlib.h> + +void +FcValuePrint (const FcValue v) +{ + switch (v.type) { + case FcTypeVoid: + printf (" <void>"); + break; + case FcTypeInteger: + printf (" %d(i)", v.u.i); + break; + case FcTypeDouble: + printf (" %g(f)", v.u.d); + break; + case FcTypeString: + printf (" \"%s\"", v.u.s); + break; + case FcTypeBool: + printf (" %s", v.u.b ? "FcTrue" : "FcFalse"); + break; + case FcTypeMatrix: + printf (" (%f %f; %f %f)", v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); + break; + case FcTypeCharSet: /* XXX */ + printf (" "); + FcCharSetPrint (v.u.c); + break; + case FcTypeLangSet: + printf (" "); + FcLangSetPrint (v.u.l); + break; + case FcTypeFTFace: + printf (" face"); + break; + } +} + +void +FcValueListPrint (FcValueListPtr l) +{ + for (; l != NULL; l = FcValueListNext(l)) + { + FcValuePrint (FcValueCanonicalize(&l->value)); + switch (l->binding) { + case FcValueBindingWeak: + printf ("(w)"); + break; + case FcValueBindingStrong: + printf ("(s)"); + break; + case FcValueBindingSame: + printf ("(=)"); + break; + } + } +} + +void +FcLangSetPrint (const FcLangSet *ls) +{ + FcStrBuf buf; + FcChar8 init_buf[1024]; + + FcStrBufInit (&buf, init_buf, sizeof (init_buf)); + if (FcNameUnparseLangSet (&buf, ls) && FcStrBufChar (&buf,'\0')) + printf ("%s", buf.buf); + else + printf ("langset (alloc error)"); + FcStrBufDestroy (&buf); +} + +void +FcCharSetPrint (const FcCharSet *c) +{ + int i, j; + intptr_t *leaves = FcCharSetLeaves (c); + FcChar16 *numbers = FcCharSetNumbers (c); + +#if 0 + printf ("CharSet 0x%x\n", (intptr_t) c); + printf ("Leaves: +%d = 0x%x\n", c->leaves_offset, (intptr_t) leaves); + printf ("Numbers: +%d = 0x%x\n", c->numbers_offset, (intptr_t) numbers); + + for (i = 0; i < c->num; i++) + { + printf ("Page %d: %04x +%d = 0x%x\n", + i, numbers[i], leaves[i], + (intptr_t) FcOffsetToPtr (leaves, leaves[i], FcCharLeaf)); + } +#endif + + printf ("\n"); + for (i = 0; i < c->num; i++) + { + intptr_t leaf_offset = leaves[i]; + FcCharLeaf *leaf = FcOffsetToPtr (leaves, leaf_offset, FcCharLeaf); + + printf ("\t"); + printf ("%04x:", numbers[i]); + for (j = 0; j < 256/32; j++) + printf (" %08x", leaf->map[j]); + printf ("\n"); + } +} + +void +FcPatternPrint (const FcPattern *p) +{ + int i; + FcPatternElt *e; + + if (!p) + { + printf ("Null pattern\n"); + return; + } + printf ("Pattern has %d elts (size %d)\n", p->num, p->size); + for (i = 0; i < p->num; i++) + { + e = &FcPatternElts(p)[i]; + printf ("\t%s:", FcObjectName(e->object)); + FcValueListPrint (FcPatternEltValues(e)); + printf ("\n"); + } + printf ("\n"); +} + +void +FcOpPrint (FcOp op) +{ + switch (op) { + case FcOpInteger: printf ("Integer"); break; + case FcOpDouble: printf ("Double"); break; + case FcOpString: printf ("String"); break; + case FcOpMatrix: printf ("Matrix"); break; + case FcOpBool: printf ("Bool"); break; + case FcOpCharSet: printf ("CharSet"); break; + case FcOpField: printf ("Field"); break; + case FcOpConst: printf ("Const"); break; + case FcOpAssign: printf ("Assign"); break; + case FcOpAssignReplace: printf ("AssignReplace"); break; + case FcOpPrepend: printf ("Prepend"); break; + case FcOpPrependFirst: printf ("PrependFirst"); break; + case FcOpAppend: printf ("Append"); break; + case FcOpAppendLast: printf ("AppendLast"); break; + case FcOpQuest: printf ("Quest"); break; + case FcOpOr: printf ("Or"); break; + case FcOpAnd: printf ("And"); break; + case FcOpEqual: printf ("Equal"); break; + case FcOpNotEqual: printf ("NotEqual"); break; + case FcOpLess: printf ("Less"); break; + case FcOpLessEqual: printf ("LessEqual"); break; + case FcOpMore: printf ("More"); break; + case FcOpMoreEqual: printf ("MoreEqual"); break; + case FcOpContains: printf ("Contains"); break; + case FcOpNotContains: printf ("NotContains"); break; + case FcOpPlus: printf ("Plus"); break; + case FcOpMinus: printf ("Minus"); break; + case FcOpTimes: printf ("Times"); break; + case FcOpDivide: printf ("Divide"); break; + case FcOpNot: printf ("Not"); break; + case FcOpNil: printf ("Nil"); break; + case FcOpComma: printf ("Comma"); break; + case FcOpFloor: printf ("Floor"); break; + case FcOpCeil: printf ("Ceil"); break; + case FcOpRound: printf ("Round"); break; + case FcOpTrunc: printf ("Trunc"); break; + case FcOpListing: printf ("Listing"); break; + case FcOpInvalid: printf ("Invalid"); break; + } +} + +void +FcExprPrint (const FcExpr *expr) +{ + if (!expr) printf ("none"); + else switch (expr->op) { + case FcOpInteger: printf ("%d", expr->u.ival); break; + case FcOpDouble: printf ("%g", expr->u.dval); break; + case FcOpString: printf ("\"%s\"", expr->u.sval); break; + case FcOpMatrix: printf ("[%g %g %g %g]", + expr->u.mval->xx, + expr->u.mval->xy, + expr->u.mval->yx, + expr->u.mval->yy); break; + case FcOpBool: printf ("%s", expr->u.bval ? "true" : "false"); break; + case FcOpCharSet: printf ("charset\n"); break; + case FcOpNil: printf ("nil\n"); break; + case FcOpField: printf ("%s", FcObjectName(expr->u.object)); break; + case FcOpConst: printf ("%s", expr->u.constant); break; + case FcOpQuest: + FcExprPrint (expr->u.tree.left); + printf (" quest "); + FcExprPrint (expr->u.tree.right->u.tree.left); + printf (" colon "); + FcExprPrint (expr->u.tree.right->u.tree.right); + break; + case FcOpAssign: + case FcOpAssignReplace: + case FcOpPrependFirst: + case FcOpPrepend: + case FcOpAppend: + case FcOpAppendLast: + case FcOpOr: + case FcOpAnd: + case FcOpEqual: + case FcOpNotEqual: + case FcOpLess: + case FcOpLessEqual: + case FcOpMore: + case FcOpMoreEqual: + case FcOpContains: + case FcOpListing: + case FcOpNotContains: + case FcOpPlus: + case FcOpMinus: + case FcOpTimes: + case FcOpDivide: + case FcOpComma: + FcExprPrint (expr->u.tree.left); + printf (" "); + switch (expr->op) { + case FcOpAssign: printf ("Assign"); break; + case FcOpAssignReplace: printf ("AssignReplace"); break; + case FcOpPrependFirst: printf ("PrependFirst"); break; + case FcOpPrepend: printf ("Prepend"); break; + case FcOpAppend: printf ("Append"); break; + case FcOpAppendLast: printf ("AppendLast"); break; + case FcOpOr: printf ("Or"); break; + case FcOpAnd: printf ("And"); break; + case FcOpEqual: printf ("Equal"); break; + case FcOpNotEqual: printf ("NotEqual"); break; + case FcOpLess: printf ("Less"); break; + case FcOpLessEqual: printf ("LessEqual"); break; + case FcOpMore: printf ("More"); break; + case FcOpMoreEqual: printf ("MoreEqual"); break; + case FcOpContains: printf ("Contains"); break; + case FcOpListing: printf ("Listing"); break; + case FcOpNotContains: printf ("NotContains"); break; + case FcOpPlus: printf ("Plus"); break; + case FcOpMinus: printf ("Minus"); break; + case FcOpTimes: printf ("Times"); break; + case FcOpDivide: printf ("Divide"); break; + case FcOpComma: printf ("Comma"); break; + default: break; + } + printf (" "); + FcExprPrint (expr->u.tree.right); + break; + case FcOpNot: + printf ("Not "); + FcExprPrint (expr->u.tree.left); + break; + case FcOpFloor: + printf ("Floor "); + FcExprPrint (expr->u.tree.left); + break; + case FcOpCeil: + printf ("Ceil "); + FcExprPrint (expr->u.tree.left); + break; + case FcOpRound: + printf ("Round "); + FcExprPrint (expr->u.tree.left); + break; + case FcOpTrunc: + printf ("Trunc "); + FcExprPrint (expr->u.tree.left); + break; + case FcOpInvalid: printf ("Invalid"); break; + } +} + +void +FcTestPrint (const FcTest *test) +{ + switch (test->kind) { + case FcMatchPattern: + printf ("pattern "); + break; + case FcMatchFont: + printf ("font "); + break; + case FcMatchScan: + printf ("scan "); + break; + } + switch (test->qual) { + case FcQualAny: + printf ("any "); + break; + case FcQualAll: + printf ("all "); + break; + case FcQualFirst: + printf ("first "); + break; + case FcQualNotFirst: + printf ("not_first "); + break; + } + printf ("%s ", FcObjectName (test->object)); + FcOpPrint (test->op); + printf (" "); + FcExprPrint (test->expr); + printf ("\n"); +} + +void +FcEditPrint (const FcEdit *edit) +{ + printf ("Edit %s ", FcObjectName (edit->object)); + FcOpPrint (edit->op); + printf (" "); + FcExprPrint (edit->expr); +} + +void +FcSubstPrint (const FcSubst *subst) +{ + FcEdit *e; + FcTest *t; + + printf ("match\n"); + for (t = subst->test; t; t = t->next) + { + printf ("\t"); + FcTestPrint (t); + } + printf ("edit\n"); + for (e = subst->edit; e; e = e->next) + { + printf ("\t"); + FcEditPrint (e); + printf (";\n"); + } + printf ("\n"); +} + +void +FcFontSetPrint (const FcFontSet *s) +{ + int i; + + printf ("FontSet %d of %d\n", s->nfont, s->sfont); + for (i = 0; i < s->nfont; i++) + { + printf ("Font %d ", i); + FcPatternPrint (s->fonts[i]); + } +} + +int FcDebugVal; + +void +FcInitDebug (void) +{ + char *e; + + e = getenv ("FC_DEBUG"); + if (e) + { + printf ("FC_DEBUG=%s\n", e); + FcDebugVal = atoi (e); + if (FcDebugVal < 0) + FcDebugVal = 0; + } +} +#define __fcdbg__ +#include "fcaliastail.h" +#undef __fcdbg__ diff --git a/fontconfig/src/fcdefault.c b/fontconfig/src/fcdefault.c new file mode 100644 index 000000000..091276b70 --- /dev/null +++ b/fontconfig/src/fcdefault.c @@ -0,0 +1,181 @@ +/* + * fontconfig/src/fcdefault.c + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <locale.h> + +static const struct { + FcObject field; + FcBool value; +} FcBoolDefaults[] = { + { FC_HINTING_OBJECT, FcTrue }, /* !FT_LOAD_NO_HINTING */ + { FC_VERTICAL_LAYOUT_OBJECT, FcFalse }, /* FC_LOAD_VERTICAL_LAYOUT */ + { FC_AUTOHINT_OBJECT, FcFalse }, /* FC_LOAD_FORCE_AUTOHINT */ + { FC_GLOBAL_ADVANCE_OBJECT, FcTrue }, /* !FC_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH */ + { FC_EMBEDDED_BITMAP_OBJECT, FcTrue }, /* !FC_LOAD_NO_BITMAP */ + { FC_DECORATIVE_OBJECT, FcFalse }, +}; + +#define NUM_FC_BOOL_DEFAULTS (int) (sizeof FcBoolDefaults / sizeof FcBoolDefaults[0]) + +FcChar8 * +FcGetDefaultLang (void) +{ + static char lang_local [128] = {0}; + char *ctype; + char *territory; + char *after; + int lang_len, territory_len; + + if (lang_local [0]) + return (FcChar8 *) lang_local; + + ctype = setlocale (LC_CTYPE, NULL); + + /* + * Check if setlocale (LC_ALL, "") has been called + */ + if (!ctype || !strcmp (ctype, "C")) + { + ctype = getenv ("LC_ALL"); + if (!ctype) + { + ctype = getenv ("LC_CTYPE"); + if (!ctype) + ctype = getenv ("LANG"); + } + } + + /* ignore missing or empty ctype */ + if (ctype && *ctype != '\0') + { + territory = strchr (ctype, '_'); + if (territory) + { + lang_len = territory - ctype; + territory = territory + 1; + after = strchr (territory, '.'); + if (!after) + { + after = strchr (territory, '@'); + if (!after) + after = territory + strlen (territory); + } + territory_len = after - territory; + if (lang_len + 1 + territory_len + 1 <= (int) sizeof (lang_local)) + { + strncpy (lang_local, ctype, lang_len); + lang_local[lang_len] = '-'; + strncpy (lang_local + lang_len + 1, territory, territory_len); + lang_local[lang_len + 1 + territory_len] = '\0'; + } + } + else + { + after = strchr (ctype, '.'); + if (!after) + { + after = strchr (ctype, '@'); + if (!after) + after = ctype + strlen (ctype); + } + lang_len = after - ctype; + if (lang_len + 1 <= (int) sizeof (lang_local)) + { + strncpy (lang_local, ctype, lang_len); + lang_local[lang_len] = '\0'; + } + } + } + + /* set default lang to en */ + if (!lang_local [0]) + strcpy (lang_local, "en"); + + return (FcChar8 *) lang_local; +} + +void +FcDefaultSubstitute (FcPattern *pattern) +{ + FcValue v; + int i; + + if (FcPatternObjectGet (pattern, FC_WEIGHT_OBJECT, 0, &v) == FcResultNoMatch ) + FcPatternObjectAddInteger (pattern, FC_WEIGHT_OBJECT, FC_WEIGHT_MEDIUM); + + if (FcPatternObjectGet (pattern, FC_SLANT_OBJECT, 0, &v) == FcResultNoMatch) + FcPatternObjectAddInteger (pattern, FC_SLANT_OBJECT, FC_SLANT_ROMAN); + + if (FcPatternObjectGet (pattern, FC_WIDTH_OBJECT, 0, &v) == FcResultNoMatch) + FcPatternObjectAddInteger (pattern, FC_WIDTH_OBJECT, FC_WIDTH_NORMAL); + + for (i = 0; i < NUM_FC_BOOL_DEFAULTS; i++) + if (FcPatternObjectGet (pattern, FcBoolDefaults[i].field, 0, &v) == FcResultNoMatch) + FcPatternObjectAddBool (pattern, FcBoolDefaults[i].field, FcBoolDefaults[i].value); + + if (FcPatternObjectGet (pattern, FC_PIXEL_SIZE_OBJECT, 0, &v) == FcResultNoMatch) + { + double dpi, size, scale; + + if (FcPatternObjectGetDouble (pattern, FC_SIZE_OBJECT, 0, &size) != FcResultMatch) + { + size = 12.0; + (void) FcPatternObjectDel (pattern, FC_SIZE_OBJECT); + FcPatternObjectAddDouble (pattern, FC_SIZE_OBJECT, size); + } + if (FcPatternObjectGetDouble (pattern, FC_SCALE_OBJECT, 0, &scale) != FcResultMatch) + { + scale = 1.0; + (void) FcPatternObjectDel (pattern, FC_SCALE_OBJECT); + FcPatternObjectAddDouble (pattern, FC_SCALE_OBJECT, scale); + } + size *= scale; + if (FcPatternObjectGetDouble (pattern, FC_DPI_OBJECT, 0, &dpi) != FcResultMatch) + { + dpi = 75.0; + (void) FcPatternObjectDel (pattern, FC_DPI_OBJECT); + FcPatternObjectAddDouble (pattern, FC_DPI_OBJECT, dpi); + } + size *= dpi / 72.0; + FcPatternObjectAddDouble (pattern, FC_PIXEL_SIZE_OBJECT, size); + } + + if (FcPatternObjectGet (pattern, FC_LANG_OBJECT, 0, &v) == FcResultNoMatch) + { + FcPatternObjectAddString (pattern, FC_LANG_OBJECT, FcGetDefaultLang ()); + } + if (FcPatternObjectGet (pattern, FC_FONTVERSION_OBJECT, 0, &v) == FcResultNoMatch) + { + FcPatternObjectAddInteger (pattern, FC_FONTVERSION_OBJECT, 0x7fffffff); + } + + if (FcPatternObjectGet (pattern, FC_HINT_STYLE_OBJECT, 0, &v) == FcResultNoMatch) + { + FcPatternObjectAddInteger (pattern, FC_HINT_STYLE_OBJECT, FC_HINT_FULL); + } +} +#define __fcdefault__ +#include "fcaliastail.h" +#undef __fcdefault__ diff --git a/fontconfig/src/fcdeprecate.h b/fontconfig/src/fcdeprecate.h new file mode 100644 index 000000000..214b684cf --- /dev/null +++ b/fontconfig/src/fcdeprecate.h @@ -0,0 +1,36 @@ +/* + * Copyright © 2007 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +/* + * These APIs are deprecated; still exported by the library, but not + * declared in the public header file + */ +#ifndef _FCDEPRECATE_H_ +#define _FCDEPRECATE_H_ + +FcPublic int +FcConfigGetRescanInverval (FcConfig *config); + +FcPublic FcBool +FcConfigSetRescanInverval (FcConfig *config, int rescanInterval); + +#endif /* _FCDEPRECATE_H_ */ diff --git a/fontconfig/src/fcdir.c b/fontconfig/src/fcdir.c new file mode 100644 index 000000000..f927c0b28 --- /dev/null +++ b/fontconfig/src/fcdir.c @@ -0,0 +1,328 @@ +/* + * fontconfig/src/fcdir.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <dirent.h> + +FcBool +FcFileIsDir (const FcChar8 *file) +{ + struct stat statb; + + if (FcStat ((const char *) file, &statb) != 0) + return FcFalse; + return S_ISDIR(statb.st_mode); +} + +static FcBool +FcFileScanFontConfig (FcFontSet *set, + FcBlanks *blanks, + const FcChar8 *file, + FcConfig *config) +{ + FcPattern *font; + FcBool ret = FcTrue; + int id; + int count = 0; + + id = 0; + do + { + font = 0; + /* + * Nothing in the cache, scan the file + */ + if (FcDebug () & FC_DBG_SCAN) + { + printf ("\tScanning file %s...", file); + fflush (stdout); + } + font = FcFreeTypeQuery (file, id, blanks, &count); + if (FcDebug () & FC_DBG_SCAN) + printf ("done\n"); + + /* + * Edit pattern with user-defined rules + */ + if (font && config && !FcConfigSubstituteWithPat (config, font, NULL, FcMatchScan)) + { + FcPatternDestroy (font); + font = NULL; + ret = FcFalse; + } + + /* + * Add the font + */ + if (font && (!config || FcConfigAcceptFont (config, font))) + { + if (FcDebug() & FC_DBG_SCANV) + { + printf ("Final font pattern:\n"); + FcPatternPrint (font); + } + if (!FcFontSetAdd (set, font)) + { + FcPatternDestroy (font); + font = NULL; + ret = FcFalse; + } + } + else if (font) + FcPatternDestroy (font); + id++; + } while (font && ret && id < count); + return ret; +} + +FcBool +FcFileScanConfig (FcFontSet *set, + FcStrSet *dirs, + FcBlanks *blanks, + const FcChar8 *file, + FcConfig *config) +{ + if (FcFileIsDir (file)) + return FcStrSetAdd (dirs, file); + else + return FcFileScanFontConfig (set, blanks, file, config); +} + +FcBool +FcFileScan (FcFontSet *set, + FcStrSet *dirs, + FcFileCache *cache, /* XXX unused */ + FcBlanks *blanks, + const FcChar8 *file, + FcBool force) +{ + return FcFileScanConfig (set, dirs, blanks, file, FcConfigGetCurrent ()); +} + +/* + * Strcmp helper that takes pointers to pointers, copied from qsort(3) manpage + */ +static int +cmpstringp(const void *p1, const void *p2) +{ + return strcmp(* (char **) p1, * (char **) p2); +} + +FcBool +FcDirScanConfig (FcFontSet *set, + FcStrSet *dirs, + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force, /* XXX unused */ + FcConfig *config) +{ + DIR *d; + struct dirent *e; + FcStrSet *files; + FcChar8 *file; + FcChar8 *base; + FcBool ret = FcTrue; + int i; + + if (!force) + return FcFalse; + + if (!set && !dirs) + return FcTrue; + + if (!blanks) + blanks = FcConfigGetBlanks (config); + + /* freed below */ + file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1); + if (!file) { + ret = FcFalse; + goto bail; + } + + strcpy ((char *) file, (char *) dir); + strcat ((char *) file, "/"); + base = file + strlen ((char *) file); + + if (FcDebug () & FC_DBG_SCAN) + printf ("\tScanning dir %s\n", dir); + + d = opendir ((char *) dir); + if (!d) + { + /* Don't complain about missing directories */ + if (errno != ENOENT) + ret = FcFalse; + goto bail; + } + + files = FcStrSetCreate (); + if (!files) + { + ret = FcFalse; + goto bail1; + } + while ((e = readdir (d))) + { + if (e->d_name[0] != '.' && strlen (e->d_name) < FC_MAX_FILE_LEN) + { + strcpy ((char *) base, (char *) e->d_name); + if (!FcStrSetAdd (files, file)) { + ret = FcFalse; + goto bail2; + } + } + } + + /* + * Sort files to make things prettier + */ + qsort(files->strs, files->num, sizeof(FcChar8 *), cmpstringp); + + /* + * Scan file files to build font patterns + */ + for (i = 0; i < files->num; i++) + FcFileScanConfig (set, dirs, blanks, files->strs[i], config); + +bail2: + FcStrSetDestroy (files); +bail1: + closedir (d); +bail: + return ret; +} + +FcBool +FcDirScan (FcFontSet *set, + FcStrSet *dirs, + FcFileCache *cache, /* XXX unused */ + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force /* XXX unused */) +{ + if (cache || !force) + return FcFalse; + + return FcDirScanConfig (set, dirs, blanks, dir, force, FcConfigGetCurrent ()); +} + +/* + * Scan the specified directory and construct a cache of its contents + */ +FcCache * +FcDirCacheScan (const FcChar8 *dir, FcConfig *config) +{ + FcStrSet *dirs; + FcBool ret = FcTrue; + FcFontSet *set; + FcCache *cache = NULL; + struct stat dir_stat; + + if (FcDebug () & FC_DBG_FONTSET) + printf ("cache scan dir %s\n", dir); + + if (FcStat ((char *) dir, &dir_stat) < 0) + { + if (errno != ENOENT) + ret = FcFalse; + goto bail; + } + + set = FcFontSetCreate(); + if (!set) + { + ret = FcFalse; + goto bail; + } + + dirs = FcStrSetCreate (); + if (!dirs) + { + ret = FcFalse; + goto bail1; + } + + /* + * Scan the dir + */ + if (!FcDirScanConfig (set, dirs, NULL, dir, FcTrue, config)) + { + ret = FcFalse; + goto bail2; + } + + /* + * Build the cache object + */ + cache = FcDirCacheBuild (set, dir, &dir_stat, dirs); + if (!cache) + { + ret = FcFalse; + goto bail2; + } + + /* + * Write out the cache file, ignoring any troubles + */ + FcDirCacheWrite (cache, config); + + bail2: + FcStrSetDestroy (dirs); + bail1: + FcFontSetDestroy (set); + bail: + return cache; +} + +/* + * Read (or construct) the cache for a directory + */ +FcCache * +FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config) +{ + FcCache *cache = NULL; + + if (config && !FcConfigAcceptFilename (config, dir)) + return NULL; + + /* Try to use existing cache file */ + if (!force) + cache = FcDirCacheLoad (dir, config, NULL); + + /* Not using existing cache file, construct new cache */ + if (!cache) + cache = FcDirCacheScan (dir, config); + + return cache; +} + +FcBool +FcDirSave (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir) +{ + return FcFalse; /* XXX deprecated */ +} +#define __fcdir__ +#include "fcaliastail.h" +#undef __fcdir__ diff --git a/fontconfig/src/fcformat.c b/fontconfig/src/fcformat.c new file mode 100644 index 000000000..bf9401740 --- /dev/null +++ b/fontconfig/src/fcformat.c @@ -0,0 +1,1203 @@ +/* + * Copyright © 2008,2009 Red Hat, Inc. + * + * Red Hat Author(s): Behdad Esfahbod + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> +#include <string.h> +#include <stdarg.h> + + +/* The language is documented in doc/fcformat.fncs + * These are the features implemented: + * + * simple %{elt} + * width %width{elt} + * index %{elt[idx]} + * name= %{elt=} + * :name= %{:elt} + * default %{elt:-word} + * count %{#elt} + * subexpr %{{expr}} + * filter-out %{-elt1,elt2,elt3{expr}} + * filter-in %{+elt1,elt2,elt3{expr}} + * conditional %{?elt1,elt2,!elt3{}{}} + * enumerate %{[]elt1,elt2{expr}} + * langset langset enumeration using the same syntax + * builtin %{=blt} + * convert %{elt|conv1|conv2|conv3} + * + * converters: + * basename FcStrBasename + * dirname FcStrDirname + * downcase FcStrDowncase + * shescape + * cescape + * xmlescape + * delete delete chars + * escape escape chars + * translate translate chars + * + * builtins: + * unparse FcNameUnparse + * fcmatch fc-match default + * fclist fc-list default + * pkgkit PackageKit package tag format + * + * + * Some ideas for future syntax extensions: + * + * - verbose builtin that is like FcPatternPrint + * - allow indexing subexprs using '%{[idx]elt1,elt2{subexpr}}' + * - conditional/filtering/deletion on binding (using '(w)'/'(s)'/'(=)' notation) + */ + + +#define FCMATCH_FORMAT "%{file:-<unknown filename>|basename}: \"%{family[0]:-<unknown family>}\" \"%{style[0]:-<unknown style>}\"" +#define FCLIST_FORMAT "%{?file{%{file}: }}%{=unparse}" +#define PKGKIT_FORMAT "%{[]family{font(%{family|downcase|delete( )})\n}}%{[]lang{font(:lang=%{lang|downcase|translate(_,-)})\n}}" + + +static void +message (const char *fmt, ...) +{ + va_list args; + va_start (args, fmt); + fprintf (stderr, "Fontconfig: Pattern format error: "); + vfprintf (stderr, fmt, args); + fprintf (stderr, ".\n"); + va_end (args); +} + + +typedef struct _FcFormatContext +{ + const FcChar8 *format_orig; + const FcChar8 *format; + int format_len; + FcChar8 *word; + FcBool word_allocated; +} FcFormatContext; + +static FcBool +FcFormatContextInit (FcFormatContext *c, + const FcChar8 *format, + FcChar8 *scratch, + int scratch_len) +{ + c->format_orig = c->format = format; + c->format_len = strlen ((const char *) format); + + if (c->format_len < scratch_len) + { + c->word = scratch; + c->word_allocated = FcFalse; + } + else + { + c->word = malloc (c->format_len + 1); + c->word_allocated = FcTrue; + } + + return c->word != NULL; +} + +static void +FcFormatContextDone (FcFormatContext *c) +{ + if (c && c->word_allocated) + { + free (c->word); + } +} + +static FcBool +consume_char (FcFormatContext *c, + FcChar8 term) +{ + if (*c->format != term) + return FcFalse; + + c->format++; + return FcTrue; +} + +static FcBool +expect_char (FcFormatContext *c, + FcChar8 term) +{ + FcBool res = consume_char (c, term); + if (!res) + { + if (c->format == c->format_orig + c->format_len) + message ("format ended while expecting '%c'", + term); + else + message ("expected '%c' at %d", + term, c->format - c->format_orig + 1); + } + return res; +} + +static FcBool +FcCharIsPunct (const FcChar8 c) +{ + if (c < '0') + return FcTrue; + if (c <= '9') + return FcFalse; + if (c < 'A') + return FcTrue; + if (c <= 'Z') + return FcFalse; + if (c < 'a') + return FcTrue; + if (c <= 'z') + return FcFalse; + if (c <= '~') + return FcTrue; + return FcFalse; +} + +static char escaped_char(const char ch) +{ + switch (ch) { + case 'a': return '\a'; + case 'b': return '\b'; + case 'f': return '\f'; + case 'n': return '\n'; + case 'r': return '\r'; + case 't': return '\t'; + case 'v': return '\v'; + default: return ch; + } +} + +static FcBool +read_word (FcFormatContext *c) +{ + FcChar8 *p; + + p = c->word; + + while (*c->format) + { + if (*c->format == '\\') + { + c->format++; + if (*c->format) + *p++ = escaped_char (*c->format++); + continue; + } + else if (FcCharIsPunct (*c->format)) + break; + + *p++ = *c->format++; + } + *p = '\0'; + + if (p == c->word) + { + message ("expected identifier at %d", + c->format - c->format_orig + 1); + return FcFalse; + } + + return FcTrue; +} + +static FcBool +read_chars (FcFormatContext *c, + FcChar8 term) +{ + FcChar8 *p; + + p = c->word; + + while (*c->format && *c->format != '}' && *c->format != term) + { + if (*c->format == '\\') + { + c->format++; + if (*c->format) + *p++ = escaped_char (*c->format++); + continue; + } + + *p++ = *c->format++; + } + *p = '\0'; + + if (p == c->word) + { + message ("expected character data at %d", + c->format - c->format_orig + 1); + return FcFalse; + } + + return FcTrue; +} + +static FcBool +FcPatternFormatToBuf (FcPattern *pat, + const FcChar8 *format, + FcStrBuf *buf); + +static FcBool +interpret_builtin (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcChar8 *new_str; + FcBool ret; + + if (!expect_char (c, '=') || + !read_word (c)) + return FcFalse; + + /* try simple builtins first */ + if (0) { } +#define BUILTIN(name, func) \ + else if (0 == strcmp ((const char *) c->word, name))\ + do { new_str = func (pat); ret = FcTrue; } while (0) + BUILTIN ("unparse", FcNameUnparse); + /* BUILTIN ("verbose", FcPatternPrint); XXX */ +#undef BUILTIN + else + ret = FcFalse; + + if (ret) + { + if (new_str) + { + FcStrBufString (buf, new_str); + free (new_str); + return FcTrue; + } + else + return FcFalse; + } + + /* now try our custom formats */ + if (0) { } +#define BUILTIN(name, format) \ + else if (0 == strcmp ((const char *) c->word, name))\ + ret = FcPatternFormatToBuf (pat, (const FcChar8 *) format, buf) + BUILTIN ("fcmatch", FCMATCH_FORMAT); + BUILTIN ("fclist", FCLIST_FORMAT); + BUILTIN ("pkgkit", PKGKIT_FORMAT); +#undef BUILTIN + else + ret = FcFalse; + + if (!ret) + message ("unknown builtin \"%s\"", + c->word); + + return ret; +} + +static FcBool +interpret_expr (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf, + FcChar8 term); + +static FcBool +interpret_subexpr (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + return expect_char (c, '{') && + interpret_expr (c, pat, buf, '}') && + expect_char (c, '}'); +} + +static FcBool +maybe_interpret_subexpr (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + return (*c->format == '{') ? + interpret_subexpr (c, pat, buf) : + FcTrue; +} + +static FcBool +skip_subexpr (FcFormatContext *c); + +static FcBool +skip_percent (FcFormatContext *c) +{ + int width; + + if (!expect_char (c, '%')) + return FcFalse; + + /* skip an optional width specifier */ + width = strtol ((const char *) c->format, (char **) &c->format, 10); + + if (!expect_char (c, '{')) + return FcFalse; + + while(*c->format && *c->format != '}') + { + switch (*c->format) + { + case '\\': + c->format++; /* skip over '\\' */ + if (*c->format) + c->format++; + continue; + case '{': + if (!skip_subexpr (c)) + return FcFalse; + continue; + } + c->format++; + } + + return expect_char (c, '}'); +} + +static FcBool +skip_expr (FcFormatContext *c) +{ + while(*c->format && *c->format != '}') + { + switch (*c->format) + { + case '\\': + c->format++; /* skip over '\\' */ + if (*c->format) + c->format++; + continue; + case '%': + if (!skip_percent (c)) + return FcFalse; + continue; + } + c->format++; + } + + return FcTrue; +} + +static FcBool +skip_subexpr (FcFormatContext *c) +{ + return expect_char (c, '{') && + skip_expr (c) && + expect_char (c, '}'); +} + +static FcBool +maybe_skip_subexpr (FcFormatContext *c) +{ + return (*c->format == '{') ? + skip_subexpr (c) : + FcTrue; +} + +static FcBool +interpret_filter_in (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcObjectSet *os; + FcPattern *subpat; + + if (!expect_char (c, '+')) + return FcFalse; + + os = FcObjectSetCreate (); + if (!os) + return FcFalse; + + do + { + if (!read_word (c) || + !FcObjectSetAdd (os, (const char *) c->word)) + { + FcObjectSetDestroy (os); + return FcFalse; + } + } + while (consume_char (c, ',')); + + subpat = FcPatternFilter (pat, os); + FcObjectSetDestroy (os); + + if (!subpat || + !interpret_subexpr (c, subpat, buf)) + return FcFalse; + + FcPatternDestroy (subpat); + return FcTrue; +} + +static FcBool +interpret_filter_out (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcPattern *subpat; + + if (!expect_char (c, '-')) + return FcFalse; + + subpat = FcPatternDuplicate (pat); + if (!subpat) + return FcFalse; + + do + { + if (!read_word (c)) + { + FcPatternDestroy (subpat); + return FcFalse; + } + + FcPatternDel (subpat, (const char *) c->word); + } + while (consume_char (c, ',')); + + if (!interpret_subexpr (c, subpat, buf)) + return FcFalse; + + FcPatternDestroy (subpat); + return FcTrue; +} + +static FcBool +interpret_cond (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcBool pass; + + if (!expect_char (c, '?')) + return FcFalse; + + pass = FcTrue; + + do + { + FcBool negate; + FcValue v; + + negate = consume_char (c, '!'); + + if (!read_word (c)) + return FcFalse; + + pass = pass && + (negate ^ + (FcResultMatch == + FcPatternGet (pat, (const char *) c->word, 0, &v))); + } + while (consume_char (c, ',')); + + if (pass) + { + if (!interpret_subexpr (c, pat, buf) || + !maybe_skip_subexpr (c)) + return FcFalse; + } + else + { + if (!skip_subexpr (c) || + !maybe_interpret_subexpr (c, pat, buf)) + return FcFalse; + } + + return FcTrue; +} + +static FcBool +interpret_count (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + int count; + FcPatternElt *e; + FcChar8 buf_static[64]; + + if (!expect_char (c, '#')) + return FcFalse; + + if (!read_word (c)) + return FcFalse; + + count = 0; + e = FcPatternObjectFindElt (pat, + FcObjectFromName ((const char *) c->word)); + if (e) + { + FcValueListPtr l; + count++; + for (l = FcPatternEltValues(e); + l->next; + l = l->next) + count++; + } + + snprintf ((char *) buf_static, sizeof (buf_static), "%d", count); + FcStrBufString (buf, buf_static); + + return FcTrue; +} + +static FcBool +interpret_enumerate (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcObjectSet *os; + FcPattern *subpat; + const FcChar8 *format_save; + int idx; + FcBool ret, done; + FcStrList *lang_strs; + + if (!expect_char (c, '[') || + !expect_char (c, ']')) + return FcFalse; + + os = FcObjectSetCreate (); + if (!os) + return FcFalse; + + ret = FcTrue; + + do + { + if (!read_word (c) || + !FcObjectSetAdd (os, (const char *) c->word)) + { + FcObjectSetDestroy (os); + return FcFalse; + } + } + while (consume_char (c, ',')); + + /* If we have one element and it's of type FcLangSet, we want + * to enumerate the languages in it. */ + lang_strs = NULL; + if (os->nobject == 1) + { + FcLangSet *langset; + if (FcResultMatch == + FcPatternGetLangSet (pat, os->objects[0], idx, &langset)) + { + FcStrSet *ss; + if (!(ss = FcLangSetGetLangs (langset)) || + !(lang_strs = FcStrListCreate (ss))) + goto bail0; + } + } + + subpat = FcPatternDuplicate (pat); + if (!subpat) + goto bail0; + + format_save = c->format; + idx = 0; + do + { + int i; + + done = FcTrue; + + if (lang_strs) + { + FcChar8 *lang; + + FcPatternDel (subpat, os->objects[0]); + if ((lang = FcStrListNext (lang_strs))) + { + FcPatternAddString (subpat, os->objects[0], lang); + done = FcFalse; + } + } + else + { + for (i = 0; i < os->nobject; i++) + { + FcValue v; + + /* XXX this can be optimized by accessing valuelist linked lists + * directly and remembering where we were. Most (all) value lists + * in normal uses are pretty short though (language tags are + * stored as a LangSet, not separate values.). */ + FcPatternDel (subpat, os->objects[i]); + if (FcResultMatch == + FcPatternGet (pat, os->objects[i], idx, &v)) + { + FcPatternAdd (subpat, os->objects[i], v, FcFalse); + done = FcFalse; + } + } + } + + if (!done) + { + c->format = format_save; + ret = interpret_subexpr (c, subpat, buf); + if (!ret) + goto bail; + } + + idx++; + } while (!done); + + if (c->format == format_save) + skip_subexpr (c); + +bail: + FcPatternDestroy (subpat); +bail0: + if (lang_strs) + FcStrListDone (lang_strs); + FcObjectSetDestroy (os); + + return ret; +} + +static FcBool +interpret_simple (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + FcPatternElt *e; + FcBool add_colon = FcFalse; + FcBool add_elt_name = FcFalse; + int idx; + FcChar8 *else_string; + + if (consume_char (c, ':')) + add_colon = FcTrue; + + if (!read_word (c)) + return FcFalse; + + idx = -1; + if (consume_char (c, '[')) + { + idx = strtol ((const char *) c->format, (char **) &c->format, 10); + if (idx < 0) + { + message ("expected non-negative number at %d", + c->format-1 - c->format_orig + 1); + return FcFalse; + } + if (!expect_char (c, ']')) + return FcFalse; + } + + if (consume_char (c, '=')) + add_elt_name = FcTrue; + + /* modifiers */ + else_string = NULL; + if (consume_char (c, ':')) + { + FcChar8 *orig; + /* divert the c->word for now */ + orig = c->word; + c->word = c->word + strlen ((const char *) c->word) + 1; + /* for now we just support 'default value' */ + if (!expect_char (c, '-') || + !read_chars (c, '\0')) + { + c->word = orig; + return FcFalse; + } + else_string = c->word; + c->word = orig; + } + + e = FcPatternObjectFindElt (pat, + FcObjectFromName ((const char *) c->word)); + if (e || else_string) + { + FcValueListPtr l = NULL; + + if (add_colon) + FcStrBufChar (buf, ':'); + if (add_elt_name) + { + FcStrBufString (buf, c->word); + FcStrBufChar (buf, '='); + } + + if (e) + l = FcPatternEltValues(e); + + if (idx != -1) + { + while (l && idx > 0) + { + l = FcValueListNext(l); + idx--; + } + if (l && idx == 0) + { + if (!FcNameUnparseValue (buf, &l->value, '\0')) + return FcFalse; + } + else goto notfound; + } + else if (l) + { + FcNameUnparseValueList (buf, l, '\0'); + } + else + { + notfound: + if (else_string) + FcStrBufString (buf, else_string); + } + } + + return FcTrue; +} + +static FcBool +cescape (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + while(*str) + { + switch (*str) + { + case '\\': + case '"': + FcStrBufChar (buf, '\\'); + break; + } + FcStrBufChar (buf, *str++); + } + return FcTrue; +} + +static FcBool +shescape (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + FcStrBufChar (buf, '\''); + while(*str) + { + if (*str == '\'') + FcStrBufString (buf, (const FcChar8 *) "'\\''"); + else + FcStrBufChar (buf, *str); + str++; + } + FcStrBufChar (buf, '\''); + return FcTrue; +} + +static FcBool +xmlescape (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + while(*str) + { + switch (*str) + { + case '&': FcStrBufString (buf, (const FcChar8 *) "&"); break; + case '<': FcStrBufString (buf, (const FcChar8 *) "<"); break; + case '>': FcStrBufString (buf, (const FcChar8 *) ">"); break; + default: FcStrBufChar (buf, *str); break; + } + str++; + } + return FcTrue; +} + +static FcBool +delete_chars (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + /* XXX not UTF-8 aware */ + + if (!expect_char (c, '(') || + !read_chars (c, ')') || + !expect_char (c, ')')) + return FcFalse; + + while(*str) + { + FcChar8 *p; + + p = (FcChar8 *) strpbrk ((const char *) str, (const char *) c->word); + if (p) + { + FcStrBufData (buf, str, p - str); + str = p + 1; + } + else + { + FcStrBufString (buf, str); + break; + } + + } + + return FcTrue; +} + +static FcBool +escape_chars (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + /* XXX not UTF-8 aware */ + + if (!expect_char (c, '(') || + !read_chars (c, ')') || + !expect_char (c, ')')) + return FcFalse; + + while(*str) + { + FcChar8 *p; + + p = (FcChar8 *) strpbrk ((const char *) str, (const char *) c->word); + if (p) + { + FcStrBufData (buf, str, p - str); + FcStrBufChar (buf, c->word[0]); + FcStrBufChar (buf, *p); + str = p + 1; + } + else + { + FcStrBufString (buf, str); + break; + } + + } + + return FcTrue; +} + +static FcBool +translate_chars (FcFormatContext *c, + const FcChar8 *str, + FcStrBuf *buf) +{ + char *from, *to, repeat; + int from_len, to_len; + + /* XXX not UTF-8 aware */ + + if (!expect_char (c, '(') || + !read_chars (c, ',') || + !expect_char (c, ',')) + return FcFalse; + + from = (char *) c->word; + from_len = strlen (from); + to = from + from_len + 1; + + /* hack: we temporarily divert c->word */ + c->word = (FcChar8 *) to; + if (!read_chars (c, ')')) + { + c->word = (FcChar8 *) from; + return FcFalse; + } + c->word = (FcChar8 *) from; + + to_len = strlen (to); + repeat = to[to_len - 1]; + + if (!expect_char (c, ')')) + return FcFalse; + + while(*str) + { + FcChar8 *p; + + p = (FcChar8 *) strpbrk ((const char *) str, (const char *) from); + if (p) + { + int i; + FcStrBufData (buf, str, p - str); + i = strchr (from, *p) - from; + FcStrBufChar (buf, i < to_len ? to[i] : repeat); + str = p + 1; + } + else + { + FcStrBufString (buf, str); + break; + } + + } + + return FcTrue; +} + +static FcBool +interpret_convert (FcFormatContext *c, + FcStrBuf *buf, + int start) +{ + const FcChar8 *str; + FcChar8 *new_str; + FcStrBuf new_buf; + FcChar8 buf_static[8192]; + FcBool ret; + + if (!expect_char (c, '|') || + !read_word (c)) + return FcFalse; + + /* prepare the buffer */ + FcStrBufChar (buf, '\0'); + if (buf->failed) + return FcFalse; + str = buf->buf + start; + buf->len = start; + + /* try simple converters first */ + if (0) { } +#define CONVERTER(name, func) \ + else if (0 == strcmp ((const char *) c->word, name))\ + do { new_str = func (str); ret = FcTrue; } while (0) + CONVERTER ("downcase", FcStrDowncase); + CONVERTER ("basename", FcStrBasename); + CONVERTER ("dirname", FcStrDirname); +#undef CONVERTER + else + ret = FcFalse; + + if (ret) + { + if (new_str) + { + FcStrBufString (buf, new_str); + free (new_str); + return FcTrue; + } + else + return FcFalse; + } + + FcStrBufInit (&new_buf, buf_static, sizeof (buf_static)); + + /* now try our custom converters */ + if (0) { } +#define CONVERTER(name, func) \ + else if (0 == strcmp ((const char *) c->word, name))\ + ret = func (c, str, &new_buf) + CONVERTER ("cescape", cescape); + CONVERTER ("shescape", shescape); + CONVERTER ("xmlescape", xmlescape); + CONVERTER ("delete", delete_chars); + CONVERTER ("escape", escape_chars); + CONVERTER ("translate", translate_chars); +#undef CONVERTER + else + ret = FcFalse; + + if (ret) + { + FcStrBufChar (&new_buf, '\0'); + FcStrBufString (buf, new_buf.buf); + } + else + message ("unknown converter \"%s\"", + c->word); + + FcStrBufDestroy (&new_buf); + + return ret; +} + +static FcBool +maybe_interpret_converts (FcFormatContext *c, + FcStrBuf *buf, + int start) +{ + while (*c->format == '|') + if (!interpret_convert (c, buf, start)) + return FcFalse; + + return FcTrue; +} + +static FcBool +align_to_width (FcStrBuf *buf, + int start, + int width) +{ + int len; + + if (buf->failed) + return FcFalse; + + len = buf->len - start; + if (len < -width) + { + /* left align */ + while (len++ < -width) + FcStrBufChar (buf, ' '); + } + else if (len < width) + { + int old_len; + old_len = len; + /* right align */ + while (len++ < width) + FcStrBufChar (buf, ' '); + if (buf->failed) + return FcFalse; + len = old_len; + memmove (buf->buf + buf->len - len, + buf->buf + buf->len - width, + len); + memset (buf->buf + buf->len - width, + ' ', + width - len); + } + + return !buf->failed; +} +static FcBool +interpret_percent (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf) +{ + int width, start; + FcBool ret; + + if (!expect_char (c, '%')) + return FcFalse; + + if (consume_char (c, '%')) /* "%%" */ + { + FcStrBufChar (buf, '%'); + return FcTrue; + } + + /* parse an optional width specifier */ + width = strtol ((const char *) c->format, (char **) &c->format, 10); + + if (!expect_char (c, '{')) + return FcFalse; + + start = buf->len; + + switch (*c->format) { + case '=': ret = interpret_builtin (c, pat, buf); break; + case '{': ret = interpret_subexpr (c, pat, buf); break; + case '+': ret = interpret_filter_in (c, pat, buf); break; + case '-': ret = interpret_filter_out (c, pat, buf); break; + case '?': ret = interpret_cond (c, pat, buf); break; + case '#': ret = interpret_count (c, pat, buf); break; + case '[': ret = interpret_enumerate (c, pat, buf); break; + default: ret = interpret_simple (c, pat, buf); break; + } + + return ret && + maybe_interpret_converts (c, buf, start) && + align_to_width (buf, start, width) && + expect_char (c, '}'); +} + +static FcBool +interpret_expr (FcFormatContext *c, + FcPattern *pat, + FcStrBuf *buf, + FcChar8 term) +{ + while (*c->format && *c->format != term) + { + switch (*c->format) + { + case '\\': + c->format++; /* skip over '\\' */ + if (*c->format) + FcStrBufChar (buf, escaped_char (*c->format++)); + continue; + case '%': + if (!interpret_percent (c, pat, buf)) + return FcFalse; + continue; + } + FcStrBufChar (buf, *c->format++); + } + return FcTrue; +} + +static FcBool +FcPatternFormatToBuf (FcPattern *pat, + const FcChar8 *format, + FcStrBuf *buf) +{ + FcFormatContext c; + FcChar8 word_static[1024]; + FcBool ret; + + if (!FcFormatContextInit (&c, format, word_static, sizeof (word_static))) + return FcFalse; + + ret = interpret_expr (&c, pat, buf, '\0'); + + FcFormatContextDone (&c); + + return ret; +} + +FcChar8 * +FcPatternFormat (FcPattern *pat, + const FcChar8 *format) +{ + FcStrBuf buf; + FcChar8 buf_static[8192 - 1024]; + FcBool ret; + + FcStrBufInit (&buf, buf_static, sizeof (buf_static)); + + ret = FcPatternFormatToBuf (pat, format, &buf); + + if (ret) + return FcStrBufDone (&buf); + else + { + FcStrBufDestroy (&buf); + return NULL; + } +} + +#define __fcformat__ +#include "fcaliastail.h" +#undef __fcformat__ diff --git a/fontconfig/src/fcfreetype.c b/fontconfig/src/fcfreetype.c new file mode 100644 index 000000000..68596f5a4 --- /dev/null +++ b/fontconfig/src/fcfreetype.c @@ -0,0 +1,3004 @@ +/* + * fontconfig/src/fcfreetype.c + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* + Copyright © 2002-2003 by Juliusz Chroboczek + + 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. +*/ + +#include "fcint.h" +#include "fcftint.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ft2build.h> +#include FT_FREETYPE_H +#include FT_TRUETYPE_TABLES_H +#include FT_SFNT_NAMES_H +#include FT_TRUETYPE_IDS_H +#include FT_TYPE1_TABLES_H +#if HAVE_FT_GET_X11_FONT_FORMAT +#include FT_XFREE86_H +#endif +#if HAVE_FT_GET_BDF_PROPERTY +#include FT_BDF_H +#include FT_MODULE_H +#endif + +#include "ftglue.h" + +#if HAVE_WARNING_CPP_DIRECTIVE +#if !HAVE_FT_GET_BDF_PROPERTY +#warning "No FT_Get_BDF_Property: Please install freetype 2.1.4 or later" +#endif + +#if !HAVE_FT_GET_PS_FONT_INFO +#warning "No FT_Get_PS_Font_Info: Please install freetype 2.1.1 or later" +#endif +#endif + +/* + * Keep Han languages separated by eliminating languages + * that the codePageRange bits says aren't supported + */ + +static const struct { + char bit; + const FcChar8 lang[6]; +} FcCodePageRange[] = { + { 17, "ja" }, + { 18, "zh-cn" }, + { 19, "ko" }, + { 20, "zh-tw" }, +}; + +#define NUM_CODE_PAGE_RANGE (int) (sizeof FcCodePageRange / sizeof FcCodePageRange[0]) + +FcBool +FcFreeTypeIsExclusiveLang (const FcChar8 *lang) +{ + int i; + + for (i = 0; i < NUM_CODE_PAGE_RANGE; i++) + { + if (FcLangCompare (lang, FcCodePageRange[i].lang) == FcLangEqual) + return FcTrue; + } + return FcFalse; +} + +typedef struct { + const FT_UShort platform_id; + const FT_UShort encoding_id; + const char fromcode[12]; +} FcFtEncoding; + +#define TT_ENCODING_DONT_CARE 0xffff +#define FC_ENCODING_MAC_ROMAN "MACINTOSH" + +static const FcFtEncoding fcFtEncoding[] = { + { TT_PLATFORM_APPLE_UNICODE, TT_ENCODING_DONT_CARE, "UCS-2BE" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, "MACINTOSH" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_JAPANESE, "SJIS" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, "UTF-16BE" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, "SJIS-WIN" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_GB2312, "GB2312" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, "BIG-5" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, "Wansung" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, "Johab" }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, "UCS-2BE" }, + { TT_PLATFORM_ISO, TT_ISO_ID_7BIT_ASCII, "ASCII" }, + { TT_PLATFORM_ISO, TT_ISO_ID_10646, "UCS-2BE" }, + { TT_PLATFORM_ISO, TT_ISO_ID_8859_1, "ISO-8859-1" }, +}; + +#define NUM_FC_FT_ENCODING (int) (sizeof (fcFtEncoding) / sizeof (fcFtEncoding[0])) + +typedef struct { + const FT_UShort platform_id; + const FT_UShort language_id; + const char lang[8]; +} FcFtLanguage; + +#define TT_LANGUAGE_DONT_CARE 0xffff + +static const FcFtLanguage fcFtLanguage[] = { + { TT_PLATFORM_APPLE_UNICODE, TT_LANGUAGE_DONT_CARE, "" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ENGLISH, "en" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_FRENCH, "fr" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GERMAN, "de" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ITALIAN, "it" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_DUTCH, "nl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SWEDISH, "sv" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SPANISH, "es" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_DANISH, "da" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_PORTUGUESE, "pt" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_NORWEGIAN, "no" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_HEBREW, "he" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_JAPANESE, "ja" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ARABIC, "ar" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_FINNISH, "fi" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GREEK, "el" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ICELANDIC, "is" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MALTESE, "mt" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TURKISH, "tr" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CROATIAN, "hr" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CHINESE_TRADITIONAL, "zh-tw" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_URDU, "ur" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_HINDI, "hi" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_THAI, "th" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KOREAN, "ko" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_LITHUANIAN, "lt" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_POLISH, "pl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_HUNGARIAN, "hu" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ESTONIAN, "et" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_LETTISH, "lv" }, +/* { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SAAMISK, ??? */ + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_FAEROESE, "fo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_FARSI, "fa" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_RUSSIAN, "ru" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CHINESE_SIMPLIFIED, "zh-cn" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_FLEMISH, "nl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_IRISH, "ga" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ALBANIAN, "sq" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ROMANIAN, "ro" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CZECH, "cs" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SLOVAK, "sk" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SLOVENIAN, "sl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_YIDDISH, "yi" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SERBIAN, "sr" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MACEDONIAN, "mk" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BULGARIAN, "bg" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_UKRAINIAN, "uk" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BYELORUSSIAN, "be" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_UZBEK, "uz" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KAZAKH, "kk" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AZERBAIJANI, "az" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AZERBAIJANI_CYRILLIC_SCRIPT, "az" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AZERBAIJANI_ARABIC_SCRIPT, "ar" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ARMENIAN, "hy" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GEORGIAN, "ka" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MOLDAVIAN, "mo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KIRGHIZ, "ky" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TAJIKI, "tg" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TURKMEN, "tk" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN, "mo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_MONGOLIAN_SCRIPT,"mo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MONGOLIAN_CYRILLIC_SCRIPT, "mo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_PASHTO, "ps" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KURDISH, "ku" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KASHMIRI, "ks" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SINDHI, "sd" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TIBETAN, "bo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_NEPALI, "ne" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SANSKRIT, "sa" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MARATHI, "mr" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BENGALI, "bn" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ASSAMESE, "as" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GUJARATI, "gu" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_PUNJABI, "pa" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ORIYA, "or" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MALAYALAM, "ml" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KANNADA, "kn" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TAMIL, "ta" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TELUGU, "te" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SINHALESE, "si" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BURMESE, "my" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_KHMER, "km" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_LAO, "lo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_VIETNAMESE, "vi" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_INDONESIAN, "id" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TAGALOG, "tl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MALAY_ROMAN_SCRIPT, "ms" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MALAY_ARABIC_SCRIPT, "ms" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AMHARIC, "am" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TIGRINYA, "ti" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GALLA, "om" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SOMALI, "so" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SWAHILI, "sw" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_RUANDA, "rw" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_RUNDI, "rn" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CHEWA, "ny" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MALAGASY, "mg" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_ESPERANTO, "eo" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_WELSH, "cy" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BASQUE, "eu" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_CATALAN, "ca" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_LATIN, "la" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_QUECHUA, "qu" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GUARANI, "gn" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AYMARA, "ay" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TATAR, "tt" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_UIGHUR, "ug" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_DZONGKHA, "dz" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_JAVANESE, "jw" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SUNDANESE, "su" }, + +#if 0 /* these seem to be errors that have been dropped */ + + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SCOTTISH_GAELIC }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_IRISH_GAELIC }, + +#endif + + /* The following codes are new as of 2000-03-10 */ + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GALICIAN, "gl" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AFRIKAANS, "af" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_BRETON, "br" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_INUKTITUT, "iu" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_SCOTTISH_GAELIC, "gd" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_MANX_GAELIC, "gv" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_IRISH_GAELIC, "ga" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_TONGAN, "to" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GREEK_POLYTONIC, "el" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_GREELANDIC, "ik" }, + { TT_PLATFORM_MACINTOSH, TT_MAC_LANGID_AZERBAIJANI_ROMAN_SCRIPT,"az" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_SAUDI_ARABIA, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_IRAQ, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_EGYPT, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_LIBYA, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_ALGERIA, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_MOROCCO, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_TUNISIA, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_OMAN, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_YEMEN, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_SYRIA, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_JORDAN, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_LEBANON, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_KUWAIT, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_UAE, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_BAHRAIN, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_QATAR, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BULGARIAN_BULGARIA, "bg" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CATALAN_SPAIN, "ca" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_TAIWAN, "zh-tw" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_PRC, "zh-cn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_HONG_KONG, "zh-hk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_SINGAPORE, "zh-sg" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_MACAU, "zh-mo" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CZECH_CZECH_REPUBLIC, "cs" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DANISH_DENMARK, "da" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GERMAN_GERMANY, "de" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GERMAN_SWITZERLAND, "de" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GERMAN_AUSTRIA, "de" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GERMAN_LUXEMBOURG, "de" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GERMAN_LIECHTENSTEI, "de" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GREEK_GREECE, "el" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_UNITED_STATES, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_UNITED_KINGDOM, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_AUSTRALIA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_CANADA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_NEW_ZEALAND, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_IRELAND, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_SOUTH_AFRICA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_JAMAICA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_CARIBBEAN, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_BELIZE, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_TRINIDAD, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_ZIMBABWE, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_PHILIPPINES, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_SPAIN_TRADITIONAL_SORT,"es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_MEXICO, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_SPAIN_INTERNATIONAL_SORT,"es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_GUATEMALA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_COSTA_RICA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_PANAMA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_DOMINICAN_REPUBLIC,"es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_VENEZUELA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_COLOMBIA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_PERU, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_ARGENTINA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_ECUADOR, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_CHILE, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_URUGUAY, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_PARAGUAY, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_BOLIVIA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_EL_SALVADOR, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_HONDURAS, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_NICARAGUA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_PUERTO_RICO, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FINNISH_FINLAND, "fi" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_FRANCE, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_BELGIUM, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_CANADA, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_SWITZERLAND, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_LUXEMBOURG, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_MONACO, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_HEBREW_ISRAEL, "he" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_HUNGARIAN_HUNGARY, "hu" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ICELANDIC_ICELAND, "is" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ITALIAN_ITALY, "it" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ITALIAN_SWITZERLAND, "it" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_JAPANESE_JAPAN, "ja" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KOREAN_EXTENDED_WANSUNG_KOREA,"ko" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KOREAN_JOHAB_KOREA, "ko" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DUTCH_NETHERLANDS, "nl" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DUTCH_BELGIUM, "nl" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_NORWEGIAN_NORWAY_BOKMAL, "no" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_NORWEGIAN_NORWAY_NYNORSK, "nn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_POLISH_POLAND, "pl" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PORTUGUESE_BRAZIL, "pt" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PORTUGUESE_PORTUGAL, "pt" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_RHAETO_ROMANIC_SWITZERLAND,"rm" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ROMANIAN_ROMANIA, "ro" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MOLDAVIAN_MOLDAVIA, "mo" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_RUSSIAN_RUSSIA, "ru" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_RUSSIAN_MOLDAVIA, "ru" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CROATIAN_CROATIA, "hr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SERBIAN_SERBIA_LATIN, "sr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SERBIAN_SERBIA_CYRILLIC, "sr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SLOVAK_SLOVAKIA, "sk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ALBANIAN_ALBANIA, "sq" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SWEDISH_SWEDEN, "sv" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SWEDISH_FINLAND, "sv" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_THAI_THAILAND, "th" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TURKISH_TURKEY, "tr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_URDU_PAKISTAN, "ur" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_INDONESIAN_INDONESIA, "id" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_UKRAINIAN_UKRAINE, "uk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BELARUSIAN_BELARUS, "be" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SLOVENE_SLOVENIA, "sl" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ESTONIAN_ESTONIA, "et" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_LATVIAN_LATVIA, "lv" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_LITHUANIAN_LITHUANIA, "lt" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CLASSIC_LITHUANIAN_LITHUANIA,"lt" }, + +#ifdef TT_MS_LANGID_MAORI_NEW_ZELAND + /* this seems to be an error that have been dropped */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MAORI_NEW_ZEALAND, "mi" }, +#endif + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FARSI_IRAN, "fa" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_VIETNAMESE_VIET_NAM, "vi" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARMENIAN_ARMENIA, "hy" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_AZERI_AZERBAIJAN_LATIN, "az" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_AZERI_AZERBAIJAN_CYRILLIC, "az" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BASQUE_SPAIN, "eu" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SORBIAN_GERMANY, "wen" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MACEDONIAN_MACEDONIA, "mk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SUTU_SOUTH_AFRICA, "st" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TSONGA_SOUTH_AFRICA, "ts" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TSWANA_SOUTH_AFRICA, "tn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_VENDA_SOUTH_AFRICA, "ven" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_XHOSA_SOUTH_AFRICA, "xh" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ZULU_SOUTH_AFRICA, "zu" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_AFRIKAANS_SOUTH_AFRICA, "af" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GEORGIAN_GEORGIA, "ka" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FAEROESE_FAEROE_ISLANDS, "fo" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_HINDI_INDIA, "hi" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MALTESE_MALTA, "mt" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SAAMI_LAPONIA, "se" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SCOTTISH_GAELIC_UNITED_KINGDOM,"gd" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_IRISH_GAELIC_IRELAND, "ga" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MALAY_MALAYSIA, "ms" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MALAY_BRUNEI_DARUSSALAM, "ms" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KAZAK_KAZAKSTAN, "kk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SWAHILI_KENYA, "sw" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_UZBEK_UZBEKISTAN_LATIN, "uz" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_UZBEK_UZBEKISTAN_CYRILLIC, "uz" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TATAR_TATARSTAN, "tt" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BENGALI_INDIA, "bn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PUNJABI_INDIA, "pa" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GUJARATI_INDIA, "gu" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ORIYA_INDIA, "or" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TAMIL_INDIA, "ta" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TELUGU_INDIA, "te" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KANNADA_INDIA, "kn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MALAYALAM_INDIA, "ml" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ASSAMESE_INDIA, "as" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MARATHI_INDIA, "mr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SANSKRIT_INDIA, "sa" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KONKANI_INDIA, "kok" }, + + /* new as of 2001-01-01 */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ARABIC_GENERAL, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHINESE_GENERAL, "zh" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_GENERAL, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_WEST_INDIES, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_REUNION, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_CONGO, "fr" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_SENEGAL, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_CAMEROON, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_COTE_D_IVOIRE, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_MALI, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BOSNIAN_BOSNIA_HERZEGOVINA,"bs" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_URDU_INDIA, "ur" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TAJIK_TAJIKISTAN, "tg" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_YIDDISH_GERMANY, "yi" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KIRGHIZ_KIRGHIZSTAN, "ky" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TURKMEN_TURKMENISTAN, "tk" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MONGOLIAN_MONGOLIA, "mn" }, + + /* the following seems to be inconsistent; + here is the current "official" way: */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIBETAN_BHUTAN, "bo" }, + /* and here is what is used by Passport SDK */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIBETAN_CHINA, "bo" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DZONGHKA_BHUTAN, "dz" }, + /* end of inconsistency */ + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_WELSH_WALES, "cy" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KHMER_CAMBODIA, "km" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_LAO_LAOS, "lo" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BURMESE_MYANMAR, "my" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GALICIAN_SPAIN, "gl" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MANIPURI_INDIA, "mni" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SINDHI_INDIA, "sd" }, + /* the following one is only encountered in Microsoft RTF specification */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KASHMIRI_PAKISTAN, "ks" }, + /* the following one is not in the Passport list, looks like an omission */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KASHMIRI_INDIA, "ks" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_NEPALI_NEPAL, "ne" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_NEPALI_INDIA, "ne" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRISIAN_NETHERLANDS, "fy" }, + + /* new as of 2001-03-01 (from Office Xp) */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_HONG_KONG, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_INDIA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_MALAYSIA, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_ENGLISH_SINGAPORE, "en" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SYRIAC_SYRIA, "syr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SINHALESE_SRI_LANKA, "si" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_CHEROKEE_UNITED_STATES, "chr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_INUKTITUT_CANADA, "iu" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_AMHARIC_ETHIOPIA, "am" }, +#if 0 + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TAMAZIGHT_MOROCCO }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TAMAZIGHT_MOROCCO_LATIN }, +#endif + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PASHTO_AFGHANISTAN, "ps" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FILIPINO_PHILIPPINES, "phi" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_DHIVEHI_MALDIVES, "div" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_OROMO_ETHIOPIA, "om" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ETHIOPIA, "ti" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_TIGRIGNA_ERYTHREA, "ti" }, + + /* New additions from Windows Xp/Passport SDK 2001-11-10. */ + + /* don't ask what this one means... It is commented out currently. */ +#if 0 + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GREEK_GREECE2 }, +#endif + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_UNITED_STATES, "es" }, + /* The following two IDs blatantly violate MS specs by using a */ + /* sublanguage >,. */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SPANISH_LATIN_AMERICA, "es" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_NORTH_AFRICA, "fr" }, + + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_MOROCCO, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FRENCH_HAITI, "fr" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_BENGALI_BANGLADESH, "bn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PUNJABI_ARABIC_PAKISTAN, "ar" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_MONGOLIAN_MONGOLIA_MONGOLIAN,"mn" }, +#if 0 + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_EDO_NIGERIA }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_FULFULDE_NIGERIA }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_IBIBIO_NIGERIA }, +#endif + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_HAUSA_NIGERIA, "ha" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_YORUBA_NIGERIA, "yo" }, + /* language codes from, to, are (still) unknown. */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_IGBO_NIGERIA, "ibo" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_KANURI_NIGERIA, "kau" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_GUARANI_PARAGUAY, "gn" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_HAWAIIAN_UNITED_STATES, "haw" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_LATIN, "la" }, + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_SOMALI_SOMALIA, "so" }, +#if 0 + /* Note: Yi does not have a (proper) ISO 639-2 code, since it is mostly */ + /* not written (but OTOH the peculiar writing system is worth */ + /* studying). */ + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_YI_CHINA }, +#endif + { TT_PLATFORM_MICROSOFT, TT_MS_LANGID_PAPIAMENTU_NETHERLANDS_ANTILLES,"pap" }, +}; + +#define NUM_FC_FT_LANGUAGE (int) (sizeof (fcFtLanguage) / sizeof (fcFtLanguage[0])) + +typedef struct { + FT_UShort language_id; + char fromcode[12]; +} FcMacRomanFake; + +static const FcMacRomanFake fcMacRomanFake[] = { + { TT_MS_LANGID_JAPANESE_JAPAN, "SJIS-WIN" }, + { TT_MS_LANGID_ENGLISH_UNITED_STATES, "ASCII" }, +}; + +static FcChar8 * +FcFontCapabilities(FT_Face face); + +#define NUM_FC_MAC_ROMAN_FAKE (int) (sizeof (fcMacRomanFake) / sizeof (fcMacRomanFake[0])) + +#if USE_ICONV +#include <iconv.h> +#endif + +/* + * A shift-JIS will have many high bits turned on + */ +static FcBool +FcLooksLikeSJIS (FcChar8 *string, int len) +{ + int nhigh = 0, nlow = 0; + + while (len-- > 0) + { + if (*string++ & 0x80) nhigh++; + else nlow++; + } + /* + * Heuristic -- if more than 1/3 of the bytes have the high-bit set, + * this is likely to be SJIS and not ROMAN + */ + if (nhigh * 2 > nlow) + return FcTrue; + return FcFalse; +} + +static FcChar8 * +FcSfntNameTranscode (FT_SfntName *sname) +{ + int i; + const char *fromcode; +#if USE_ICONV + iconv_t cd; +#endif + FcChar8 *utf8; + + for (i = 0; i < NUM_FC_FT_ENCODING; i++) + if (fcFtEncoding[i].platform_id == sname->platform_id && + (fcFtEncoding[i].encoding_id == TT_ENCODING_DONT_CARE || + fcFtEncoding[i].encoding_id == sname->encoding_id)) + break; + if (i == NUM_FC_FT_ENCODING) + return 0; + fromcode = fcFtEncoding[i].fromcode; + + /* + * Many names encoded for TT_PLATFORM_MACINTOSH are broken + * in various ways. Kludge around them. + */ + if (!strcmp (fromcode, FC_ENCODING_MAC_ROMAN)) + { + if (sname->language_id == TT_MAC_LANGID_ENGLISH && + FcLooksLikeSJIS (sname->string, sname->string_len)) + { + fromcode = "SJIS"; + } + else if (sname->language_id >= 0x100) + { + /* + * "real" Mac language IDs are all less than 150. + * Names using one of the MS language IDs are assumed + * to use an associated encoding (Yes, this is a kludge) + */ + int f; + + fromcode = NULL; + for (f = 0; f < NUM_FC_MAC_ROMAN_FAKE; f++) + if (fcMacRomanFake[f].language_id == sname->language_id) + { + fromcode = fcMacRomanFake[f].fromcode; + break; + } + if (!fromcode) + return 0; + } + } + if (!strcmp (fromcode, "UCS-2BE") || !strcmp (fromcode, "UTF-16BE")) + { + FcChar8 *src = sname->string; + int src_len = sname->string_len; + int len; + int wchar; + int ilen, olen; + FcChar8 *u8; + FcChar32 ucs4; + + /* + * Convert Utf16 to Utf8 + */ + + if (!FcUtf16Len (src, FcEndianBig, src_len, &len, &wchar)) + return 0; + + /* + * Allocate plenty of space. Freed below + */ + utf8 = malloc (len * FC_UTF8_MAX_LEN + 1); + if (!utf8) + return 0; + + u8 = utf8; + + while ((ilen = FcUtf16ToUcs4 (src, FcEndianBig, &ucs4, src_len)) > 0) + { + src_len -= ilen; + src += ilen; + olen = FcUcs4ToUtf8 (ucs4, u8); + u8 += olen; + } + *u8 = '\0'; + goto done; + } + if (!strcmp (fromcode, "ASCII") || !strcmp (fromcode, "ISO-8859-1")) + { + FcChar8 *src = sname->string; + int src_len = sname->string_len; + int olen; + FcChar8 *u8; + FcChar32 ucs4; + + /* + * Convert Latin1 to Utf8. Freed below + */ + utf8 = malloc (src_len * 2 + 1); + if (!utf8) + return 0; + + u8 = utf8; + while (src_len > 0) + { + ucs4 = *src++; + src_len--; + olen = FcUcs4ToUtf8 (ucs4, u8); + u8 += olen; + } + *u8 = '\0'; + goto done; + } + if (!strcmp (fromcode, FC_ENCODING_MAC_ROMAN)) + { + FcChar8 *u8; + const FcCharMap *map = FcFreeTypeGetPrivateMap (ft_encoding_apple_roman); + FcChar8 *src = (FcChar8 *) sname->string; + int src_len = sname->string_len; + + /* + * Convert AppleRoman to Utf8 + */ + if (!map) + return 0; + + utf8 = malloc (sname->string_len * 3 + 1); + if (!utf8) + return 0; + + u8 = utf8; + while (src_len > 0) + { + FcChar32 ucs4 = FcFreeTypePrivateToUcs4 (*src++, map); + int olen = FcUcs4ToUtf8 (ucs4, u8); + src_len--; + u8 += olen; + } + *u8 = '\0'; + goto done; + } +#if USE_ICONV + cd = iconv_open ("UTF-8", fromcode); + if (cd && cd != (iconv_t) (-1)) + { + size_t in_bytes_left = sname->string_len; + size_t out_bytes_left = sname->string_len * FC_UTF8_MAX_LEN; + char *inbuf, *outbuf; + + utf8 = malloc (out_bytes_left + 1); + if (!utf8) + { + iconv_close (cd); + return 0; + } + + outbuf = (char *) utf8; + inbuf = (char *) sname->string; + + while (in_bytes_left) + { + size_t did = iconv (cd, + &inbuf, &in_bytes_left, + &outbuf, &out_bytes_left); + if (did == (size_t) (-1)) + { + iconv_close (cd); + free (utf8); + return 0; + } + } + iconv_close (cd); + *outbuf = '\0'; + goto done; + } +#endif + return 0; +done: + if (FcStrCmpIgnoreBlanksAndCase (utf8, (FcChar8 *) "") == 0) + { + free (utf8); + return 0; + } + return utf8; +} + +static const FcChar8 * +FcSfntNameLanguage (FT_SfntName *sname) +{ + int i; + FT_UShort platform_id = sname->platform_id; + FT_UShort language_id = sname->language_id; + + /* + * Many names encoded for TT_PLATFORM_MACINTOSH are broken + * in various ways. Kludge around them. + */ + if (platform_id == TT_PLATFORM_MACINTOSH && + sname->encoding_id == TT_MAC_ID_ROMAN && + FcLooksLikeSJIS (sname->string, sname->string_len)) + { + language_id = TT_MAC_LANGID_JAPANESE; + } + + for (i = 0; i < NUM_FC_FT_LANGUAGE; i++) + if (fcFtLanguage[i].platform_id == platform_id && + (fcFtLanguage[i].language_id == TT_LANGUAGE_DONT_CARE || + fcFtLanguage[i].language_id == language_id)) + { + if (fcFtLanguage[i].lang[0] == '\0') + return NULL; + else + return (FcChar8 *) fcFtLanguage[i].lang; + } + return 0; +} + +/* Order is significant. For example, some B&H fonts are hinted by + URW++, and both strings appear in the notice. */ + +static const char notice_foundry_data[] = + "Bigelow\0b&h\0" + "Adobe\0adobe\0" + "Bitstream\0bitstream\0" + "Monotype\0monotype\0" + "Linotype\0linotype\0" + "LINOTYPE-HELL\0linotype\0" + "IBM\0ibm\0" + "URW\0urw\0" + "International Typeface Corporation\0itc\0" + "Tiro Typeworks\0tiro\0" + "XFree86\0xfree86\0" + "Microsoft\0microsoft\0" + "Omega\0omega\0" + "Font21\0hwan\0" + "HanYang System\0hanyang"; + +struct _notice_foundry { + /* these are the offsets into the + * notice_foundry_data array. + */ + unsigned char notice_offset; + unsigned char foundry_offset; +}; + +static const struct _notice_foundry FcNoticeFoundries[] = { + { 0, 8 }, + { 12, 18 }, + { 24, 34 }, + { 44, 53 }, + { 62, 71 }, + { 80, 94 }, + { 103, 107 }, + { 111, 115 }, + { 119, 154 }, + { 158, 173 }, + { 178, 186 }, + { 194, 204 }, + { 214, 220 }, + { 226, 233 }, + { 238, 253 } +}; + +#define NUM_NOTICE_FOUNDRIES (int) (sizeof (FcNoticeFoundries) / sizeof (FcNoticeFoundries[0])) + +static const FcChar8 * +FcNoticeFoundry(const FT_String *notice) +{ + int i; + + if (notice) + for(i = 0; i < NUM_NOTICE_FOUNDRIES; i++) + { + const struct _notice_foundry *nf = &FcNoticeFoundries[i]; + const char *n = notice_foundry_data + nf->notice_offset; + const char *f = notice_foundry_data + nf->foundry_offset; + + if (strstr ((const char *) notice, n)) + return (const FcChar8 *) f; + } + return 0; +} + +static FcBool +FcVendorMatch(const FT_Char vendor[4], const FT_Char *vendor_string) +{ + /* vendor is not necessarily NUL-terminated. */ + int i, len; + + len = strlen((char *) vendor_string); + if (memcmp(vendor, vendor_string, len) != 0) + return FcFalse; + for (i = len; i < 4; i++) + if (vendor[i] != ' ' && vendor[i] != '\0') + return FcFalse; + return FcTrue; +} + +/* This table is partly taken from ttmkfdir by Joerg Pommnitz. */ + +/* It should not contain useless entries (such as UNKN) nor duplicate + entries for padding both with spaces and NULs. */ + +static const struct { + const FT_Char vendor[5]; + const FcChar8 foundry[13]; +} FcVendorFoundries[] = { + { "ADBE", "adobe"}, + { "AGFA", "agfa"}, + { "ALTS", "altsys"}, + { "APPL", "apple"}, + { "ARPH", "arphic"}, + { "ATEC", "alltype"}, + { "B&H", "b&h"}, + { "BITS", "bitstream"}, + { "CANO", "cannon"}, + { "DYNA", "dynalab"}, + { "EPSN", "epson"}, + { "FJ", "fujitsu"}, + { "IBM", "ibm"}, + { "ITC", "itc"}, + { "IMPR", "impress"}, + { "LARA", "larabiefonts"}, + { "LEAF", "interleaf"}, + { "LETR", "letraset"}, + { "LINO", "linotype"}, + { "MACR", "macromedia"}, + { "MONO", "monotype"}, + { "MS", "microsoft"}, + { "MT", "monotype"}, + { "NEC", "nec"}, + { "PARA", "paratype"}, + { "QMSI", "qms"}, + { "RICO", "ricoh"}, + { "URW", "urw"}, + { "Y&Y", "y&y"} +}; + +#define NUM_VENDOR_FOUNDRIES (int) (sizeof (FcVendorFoundries) / sizeof (FcVendorFoundries[0])) + +static const FcChar8 * +FcVendorFoundry(const FT_Char vendor[4]) +{ + int i; + + if (vendor) + for(i = 0; i < NUM_VENDOR_FOUNDRIES; i++) + if (FcVendorMatch (vendor, FcVendorFoundries[i].vendor)) + return FcVendorFoundries[i].foundry; + return 0; +} + +typedef struct _FcStringConst { + const FcChar8 *name; + int value; +} FcStringConst; + +static int +FcStringIsConst (const FcChar8 *string, + const FcStringConst *c, + int nc) +{ + int i; + + for (i = 0; i < nc; i++) + if (FcStrCmpIgnoreBlanksAndCase (string, c[i].name) == 0) + return c[i].value; + return -1; +} + +static int +FcStringContainsConst (const FcChar8 *string, + const FcStringConst *c, + int nc) +{ + int i; + + for (i = 0; i < nc; i++) + { + if (c[i].name[0] == '<') + { + if (FcStrContainsWord (string, c[i].name + 1)) + return c[i].value; + } + else + { + if (FcStrContainsIgnoreBlanksAndCase (string, c[i].name)) + return c[i].value; + } + } + return -1; +} + +typedef FcChar8 *FC8; + +static const FcStringConst weightConsts[] = { + { (FC8) "thin", FC_WEIGHT_THIN }, + { (FC8) "extralight", FC_WEIGHT_EXTRALIGHT }, + { (FC8) "ultralight", FC_WEIGHT_ULTRALIGHT }, + { (FC8) "light", FC_WEIGHT_LIGHT }, + { (FC8) "book", FC_WEIGHT_BOOK }, + { (FC8) "regular", FC_WEIGHT_REGULAR }, + { (FC8) "normal", FC_WEIGHT_NORMAL }, + { (FC8) "medium", FC_WEIGHT_MEDIUM }, + { (FC8) "demibold", FC_WEIGHT_DEMIBOLD }, + { (FC8) "demi", FC_WEIGHT_DEMIBOLD }, + { (FC8) "semibold", FC_WEIGHT_SEMIBOLD }, + { (FC8) "extrabold", FC_WEIGHT_EXTRABOLD }, + { (FC8) "superbold", FC_WEIGHT_EXTRABOLD }, + { (FC8) "ultrabold", FC_WEIGHT_ULTRABOLD }, + { (FC8) "bold", FC_WEIGHT_BOLD }, + { (FC8) "ultrablack", FC_WEIGHT_ULTRABLACK }, + { (FC8) "superblack", FC_WEIGHT_EXTRABLACK }, + { (FC8) "extrablack", FC_WEIGHT_EXTRABLACK }, + { (FC8) "<ultra", FC_WEIGHT_ULTRABOLD }, /* only if a word */ + { (FC8) "black", FC_WEIGHT_BLACK }, + { (FC8) "heavy", FC_WEIGHT_HEAVY }, +}; + +#define NUM_WEIGHT_CONSTS (int) (sizeof (weightConsts) / sizeof (weightConsts[0])) + +#define FcIsWeight(s) FcStringIsConst(s,weightConsts,NUM_WEIGHT_CONSTS) +#define FcContainsWeight(s) FcStringContainsConst (s,weightConsts,NUM_WEIGHT_CONSTS) + +static const FcStringConst widthConsts[] = { + { (FC8) "ultracondensed", FC_WIDTH_ULTRACONDENSED }, + { (FC8) "extracondensed", FC_WIDTH_EXTRACONDENSED }, + { (FC8) "semicondensed", FC_WIDTH_SEMICONDENSED }, + { (FC8) "condensed", FC_WIDTH_CONDENSED }, /* must be after *condensed */ + { (FC8) "normal", FC_WIDTH_NORMAL }, + { (FC8) "semiexpanded", FC_WIDTH_SEMIEXPANDED }, + { (FC8) "extraexpanded", FC_WIDTH_EXTRAEXPANDED }, + { (FC8) "ultraexpanded", FC_WIDTH_ULTRAEXPANDED }, + { (FC8) "expanded", FC_WIDTH_EXPANDED }, /* must be after *expanded */ + { (FC8) "extended", FC_WIDTH_EXPANDED }, +}; + +#define NUM_WIDTH_CONSTS (int) (sizeof (widthConsts) / sizeof (widthConsts[0])) + +#define FcIsWidth(s) FcStringIsConst(s,widthConsts,NUM_WIDTH_CONSTS) +#define FcContainsWidth(s) FcStringContainsConst (s,widthConsts,NUM_WIDTH_CONSTS) + +static const FcStringConst slantConsts[] = { + { (FC8) "italic", FC_SLANT_ITALIC }, + { (FC8) "kursiv", FC_SLANT_ITALIC }, + { (FC8) "oblique", FC_SLANT_OBLIQUE }, +}; + +#define NUM_SLANT_CONSTS (int) (sizeof (slantConsts) / sizeof (slantConsts[0])) + +#define FcIsSlant(s) FcStringIsConst(s,slantConsts,NUM_SLANT_CONSTS) +#define FcContainsSlant(s) FcStringContainsConst (s,slantConsts,NUM_SLANT_CONSTS) + +static const FcStringConst decorativeConsts[] = { + { (FC8) "shadow", FcTrue }, + { (FC8) "caps", FcTrue }, + { (FC8) "antiqua", FcTrue }, + { (FC8) "romansc", FcTrue }, + { (FC8) "embosed", FcTrue }, + { (FC8) "dunhill", FcTrue }, +}; + +#define NUM_DECORATIVE_CONSTS (int) (sizeof (decorativeConsts) / sizeof (decorativeConsts[0])) + +#define FcIsDecorative(s) FcStringIsConst(s,decorativeConsts,NUM_DECORATIVE_CONSTS) +#define FcContainsDecorative(s) FcStringContainsConst (s,decorativeConsts,NUM_DECORATIVE_CONSTS) + +static double +FcGetPixelSize (FT_Face face, int i) +{ +#if HAVE_FT_GET_BDF_PROPERTY + if (face->num_fixed_sizes == 1) + { + BDF_PropertyRec prop; + int rc; + + rc = FT_Get_BDF_Property (face, "PIXEL_SIZE", &prop); + if (rc == 0 && prop.type == BDF_PROPERTY_TYPE_INTEGER) + return (double) prop.u.integer; + } +#endif +#if HAVE_FT_BITMAP_SIZE_Y_PPEM + return (double) face->available_sizes[i].y_ppem / 64.0; +#else + return (double) face->available_sizes[i].height; +#endif +} + +static FcBool +FcStringInPatternElement (FcPattern *pat, const char *elt, FcChar8 *string) +{ + int e; + FcChar8 *old; + for (e = 0; FcPatternGetString (pat, elt, e, &old) == FcResultMatch; e++) + if (!FcStrCmpIgnoreBlanksAndCase (old, string)) + { + return FcTrue; + } + return FcFalse; +} + +static const FT_UShort platform_order[] = { + TT_PLATFORM_MICROSOFT, + TT_PLATFORM_APPLE_UNICODE, + TT_PLATFORM_MACINTOSH, +}; +#define NUM_PLATFORM_ORDER (sizeof (platform_order) / sizeof (platform_order[0])) + +static const FT_UShort nameid_order[] = { +#ifdef TT_NAME_ID_WWS_FAMILY + TT_NAME_ID_WWS_FAMILY, +#endif + TT_NAME_ID_PREFERRED_FAMILY, + TT_NAME_ID_FONT_FAMILY, + TT_NAME_ID_MAC_FULL_NAME, + TT_NAME_ID_FULL_NAME, +#ifdef TT_NAME_ID_WWS_SUBFAMILY + TT_NAME_ID_WWS_SUBFAMILY, +#endif + TT_NAME_ID_PREFERRED_SUBFAMILY, + TT_NAME_ID_FONT_SUBFAMILY, + TT_NAME_ID_TRADEMARK, + TT_NAME_ID_MANUFACTURER, +}; + +#define NUM_NAMEID_ORDER (sizeof (nameid_order) / sizeof (nameid_order[0])) +FcPattern * +FcFreeTypeQueryFace (const FT_Face face, + const FcChar8 *file, + int id, + FcBlanks *blanks) +{ + FcPattern *pat; + int slant = -1; + int weight = -1; + int width = -1; + FcBool decorative = FcFalse; + int i; + FcCharSet *cs; + FcLangSet *ls; +#if 0 + FcChar8 *family = 0; +#endif + FcChar8 *complex_; + const FcChar8 *foundry = 0; + int spacing; + TT_OS2 *os2; +#if HAVE_FT_GET_PS_FONT_INFO + PS_FontInfoRec psfontinfo; +#endif +#if HAVE_FT_GET_BDF_PROPERTY + BDF_PropertyRec prop; +#endif + TT_Header *head; + const FcChar8 *exclusiveLang = 0; + FT_SfntName sname; + FT_UInt snamei, snamec; + + int nfamily = 0; + int nfamily_lang = 0; + int nstyle = 0; + int nstyle_lang = 0; + int nfullname = 0; + int nfullname_lang = 0; + int p, platform; + int n, nameid; + + FcChar8 *style = 0; + int st; + + pat = FcPatternCreate (); + if (!pat) + goto bail0; + + if (!FcPatternAddBool (pat, FC_OUTLINE, + (face->face_flags & FT_FACE_FLAG_SCALABLE) != 0)) + goto bail1; + + if (!FcPatternAddBool (pat, FC_SCALABLE, + (face->face_flags & FT_FACE_FLAG_SCALABLE) != 0)) + goto bail1; + + + /* + * Get the OS/2 table + */ + os2 = (TT_OS2 *) FT_Get_Sfnt_Table (face, ft_sfnt_os2); + + /* + * Look first in the OS/2 table for the foundry, if + * not found here, the various notices will be searched for + * that information, either from the sfnt name tables or + * the Postscript FontInfo dictionary. Finally, the + * BDF properties will queried. + */ + + if (os2 && os2->version >= 0x0001 && os2->version != 0xffff) + foundry = FcVendorFoundry(os2->achVendID); + + if (FcDebug () & FC_DBG_SCANV) + printf ("\n"); + /* + * Grub through the name table looking for family + * and style names. FreeType makes quite a hash + * of them + */ + snamec = FT_Get_Sfnt_Name_Count (face); + for (p = 0; p <= NUM_PLATFORM_ORDER; p++) + { + if (p < NUM_PLATFORM_ORDER) + platform = platform_order[p]; + else + platform = 0xffff; + + /* + * Order nameids so preferred names appear first + * in the resulting list + */ + for (n = 0; n < NUM_NAMEID_ORDER; n++) + { + nameid = nameid_order[n]; + + for (snamei = 0; snamei < snamec; snamei++) + { + FcChar8 *utf8; + const FcChar8 *lang; + const char *elt = 0, *eltlang = 0; + int *np = 0, *nlangp = 0; + + if (FT_Get_Sfnt_Name (face, snamei, &sname) != 0) + continue; + if (sname.name_id != nameid) + continue; + + /* + * Sort platforms in preference order, accepting + * all other platforms last + */ + if (p < NUM_PLATFORM_ORDER) + { + if (sname.platform_id != platform) + continue; + } + else + { + int sp; + + for (sp = 0; sp < NUM_PLATFORM_ORDER; sp++) + if (sname.platform_id == platform_order[sp]) + break; + if (sp != NUM_PLATFORM_ORDER) + continue; + } + utf8 = FcSfntNameTranscode (&sname); + lang = FcSfntNameLanguage (&sname); + + if (!utf8) + continue; + + switch (sname.name_id) { +#ifdef TT_NAME_ID_WWS_FAMILY + case TT_NAME_ID_WWS_FAMILY: +#endif + case TT_NAME_ID_PREFERRED_FAMILY: + case TT_NAME_ID_FONT_FAMILY: +#if 0 + case TT_NAME_ID_PS_NAME: + case TT_NAME_ID_UNIQUE_ID: +#endif + if (FcDebug () & FC_DBG_SCANV) + printf ("found family (n %2d p %d e %d l 0x%04x) %s\n", + sname.name_id, sname.platform_id, + sname.encoding_id, sname.language_id, + utf8); + + elt = FC_FAMILY; + eltlang = FC_FAMILYLANG; + np = &nfamily; + nlangp = &nfamily_lang; + break; + case TT_NAME_ID_MAC_FULL_NAME: + case TT_NAME_ID_FULL_NAME: + if (FcDebug () & FC_DBG_SCANV) + printf ("found full (n %2d p %d e %d l 0x%04x) %s\n", + sname.name_id, sname.platform_id, + sname.encoding_id, sname.language_id, + utf8); + + elt = FC_FULLNAME; + eltlang = FC_FULLNAMELANG; + np = &nfullname; + nlangp = &nfullname_lang; + break; +#ifdef TT_NAME_ID_WWS_SUBFAMILY + case TT_NAME_ID_WWS_SUBFAMILY: +#endif + case TT_NAME_ID_PREFERRED_SUBFAMILY: + case TT_NAME_ID_FONT_SUBFAMILY: + if (FcDebug () & FC_DBG_SCANV) + printf ("found style (n %2d p %d e %d l 0x%04x) %s\n", + sname.name_id, sname.platform_id, + sname.encoding_id, sname.language_id, + utf8); + + elt = FC_STYLE; + eltlang = FC_STYLELANG; + np = &nstyle; + nlangp = &nstyle_lang; + break; + case TT_NAME_ID_TRADEMARK: + case TT_NAME_ID_MANUFACTURER: + /* If the foundry wasn't found in the OS/2 table, look here */ + if(!foundry) + foundry = FcNoticeFoundry((FT_String *) utf8); + break; + } + if (elt) + { + if (FcStringInPatternElement (pat, elt, utf8)) + { + free (utf8); + continue; + } + + /* add new element */ + if (!FcPatternAddString (pat, elt, utf8)) + { + free (utf8); + goto bail1; + } + free (utf8); + if (lang) + { + /* pad lang list with 'xx' to line up with elt */ + while (*nlangp < *np) + { + if (!FcPatternAddString (pat, eltlang, (FcChar8 *) "xx")) + goto bail1; + ++*nlangp; + } + if (!FcPatternAddString (pat, eltlang, lang)) + goto bail1; + ++*nlangp; + } + ++*np; + } + else + free (utf8); + } + } + } + + if (!nfamily && face->family_name && + FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->family_name, (FcChar8 *) "") != 0) + { + if (FcDebug () & FC_DBG_SCANV) + printf ("using FreeType family \"%s\"\n", face->family_name); + if (!FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) face->family_name)) + goto bail1; + ++nfamily; + } + + if (!nstyle && face->style_name && + FcStrCmpIgnoreBlanksAndCase ((FcChar8 *) face->style_name, (FcChar8 *) "") != 0) + { + if (FcDebug () & FC_DBG_SCANV) + printf ("using FreeType style \"%s\"\n", face->style_name); + if (!FcPatternAddString (pat, FC_STYLE, (FcChar8 *) face->style_name)) + goto bail1; + ++nstyle; + } + + if (!nfamily) + { + FcChar8 *start, *end; + FcChar8 *family; + + start = (FcChar8 *) strrchr ((char *) file, '/'); + if (start) + start++; + else + start = (FcChar8 *) file; + end = (FcChar8 *) strrchr ((char *) start, '.'); + if (!end) + end = start + strlen ((char *) start); + /* freed below */ + family = malloc (end - start + 1); + strncpy ((char *) family, (char *) start, end - start); + family[end - start] = '\0'; + if (FcDebug () & FC_DBG_SCANV) + printf ("using filename for family %s\n", family); + if (!FcPatternAddString (pat, FC_FAMILY, family)) + { + free (family); + goto bail1; + } + free (family); + ++nfamily; + } + + if (!FcPatternAddString (pat, FC_FILE, file)) + goto bail1; + + if (!FcPatternAddInteger (pat, FC_INDEX, id)) + goto bail1; + +#if 0 + /* + * don't even try this -- CJK 'monospace' fonts are really + * dual width, and most other fonts don't bother to set + * the attribute. Sigh. + */ + if ((face->face_flags & FT_FACE_FLAG_FIXED_WIDTH) != 0) + if (!FcPatternAddInteger (pat, FC_SPACING, FC_MONO)) + goto bail1; +#endif + + /* + * Find the font revision (if available) + */ + head = (TT_Header *) FT_Get_Sfnt_Table (face, ft_sfnt_head); + if (head) + { + if (!FcPatternAddInteger (pat, FC_FONTVERSION, head->Font_Revision)) + goto bail1; + } + else + { + if (!FcPatternAddInteger (pat, FC_FONTVERSION, 0)) + goto bail1; + } + + if (os2 && os2->version >= 0x0001 && os2->version != 0xffff) + { + for (i = 0; i < NUM_CODE_PAGE_RANGE; i++) + { + FT_ULong bits; + int bit; + if (FcCodePageRange[i].bit < 32) + { + bits = os2->ulCodePageRange1; + bit = FcCodePageRange[i].bit; + } + else + { + bits = os2->ulCodePageRange2; + bit = FcCodePageRange[i].bit - 32; + } + if (bits & (1 << bit)) + { + /* + * If the font advertises support for multiple + * "exclusive" languages, then include support + * for any language found to have coverage + */ + if (exclusiveLang) + { + exclusiveLang = 0; + break; + } + exclusiveLang = FcCodePageRange[i].lang; + } + } + } + + if (os2 && os2->version != 0xffff) + { + if (os2->usWeightClass == 0) + ; + else if (os2->usWeightClass < 150) + weight = FC_WEIGHT_THIN; + else if (os2->usWeightClass < 250) + weight = FC_WEIGHT_EXTRALIGHT; + else if (os2->usWeightClass < 350) + weight = FC_WEIGHT_LIGHT; + else if (os2->usWeightClass < 450) + weight = FC_WEIGHT_REGULAR; + else if (os2->usWeightClass < 550) + weight = FC_WEIGHT_MEDIUM; + else if (os2->usWeightClass < 650) + weight = FC_WEIGHT_SEMIBOLD; + else if (os2->usWeightClass < 750) + weight = FC_WEIGHT_BOLD; + else if (os2->usWeightClass < 850) + weight = FC_WEIGHT_EXTRABOLD; + else if (os2->usWeightClass < 925) + weight = FC_WEIGHT_BLACK; + else if (os2->usWeightClass < 1000) + weight = FC_WEIGHT_EXTRABLACK; + if ((FcDebug() & FC_DBG_SCANV) && weight != -1) + printf ("\tos2 weight class %d maps to weight %d\n", + os2->usWeightClass, weight); + + switch (os2->usWidthClass) { + case 1: width = FC_WIDTH_ULTRACONDENSED; break; + case 2: width = FC_WIDTH_EXTRACONDENSED; break; + case 3: width = FC_WIDTH_CONDENSED; break; + case 4: width = FC_WIDTH_SEMICONDENSED; break; + case 5: width = FC_WIDTH_NORMAL; break; + case 6: width = FC_WIDTH_SEMIEXPANDED; break; + case 7: width = FC_WIDTH_EXPANDED; break; + case 8: width = FC_WIDTH_EXTRAEXPANDED; break; + case 9: width = FC_WIDTH_ULTRAEXPANDED; break; + } + if ((FcDebug() & FC_DBG_SCANV) && width != -1) + printf ("\tos2 width class %d maps to width %d\n", + os2->usWidthClass, width); + } + if (os2 && (complex_ = FcFontCapabilities(face))) + { + if (!FcPatternAddString (pat, FC_CAPABILITY, complex_)) + { + free (complex_); + goto bail1; + } + free (complex_); + } + + /* + * Type 1: Check for FontInfo dictionary information + * Code from g2@magestudios.net (Gerard Escalante) + */ + +#if HAVE_FT_GET_PS_FONT_INFO + if (FT_Get_PS_Font_Info(face, &psfontinfo) == 0) + { + if (weight == -1 && psfontinfo.weight) + { + weight = FcIsWeight ((FcChar8 *) psfontinfo.weight); + if (FcDebug() & FC_DBG_SCANV) + printf ("\tType1 weight %s maps to %d\n", + psfontinfo.weight, weight); + } + +#if 0 + /* + * Don't bother with italic_angle; FreeType already extracts that + * information for us and sticks it into style_flags + */ + if (psfontinfo.italic_angle) + slant = FC_SLANT_ITALIC; + else + slant = FC_SLANT_ROMAN; +#endif + + if(!foundry) + foundry = FcNoticeFoundry(psfontinfo.notice); + } +#endif /* HAVE_FT_GET_PS_FONT_INFO */ + +#if HAVE_FT_GET_BDF_PROPERTY + /* + * Finally, look for a FOUNDRY BDF property if no other + * mechanism has managed to locate a foundry + */ + + if (!foundry) + { + int rc; + rc = FT_Get_BDF_Property(face, "FOUNDRY", &prop); + if(rc == 0 && prop.type == BDF_PROPERTY_TYPE_ATOM) + foundry = (FcChar8 *) prop.u.atom; + } + + if (width == -1) + { + if (FT_Get_BDF_Property(face, "RELATIVE_SETWIDTH", &prop) == 0 && + (prop.type == BDF_PROPERTY_TYPE_INTEGER || + prop.type == BDF_PROPERTY_TYPE_CARDINAL)) + { + FT_Int32 value; + + if (prop.type == BDF_PROPERTY_TYPE_INTEGER) + value = prop.u.integer; + else + value = (FT_Int32) prop.u.cardinal; + switch ((value + 5) / 10) { + case 1: width = FC_WIDTH_ULTRACONDENSED; break; + case 2: width = FC_WIDTH_EXTRACONDENSED; break; + case 3: width = FC_WIDTH_CONDENSED; break; + case 4: width = FC_WIDTH_SEMICONDENSED; break; + case 5: width = FC_WIDTH_NORMAL; break; + case 6: width = FC_WIDTH_SEMIEXPANDED; break; + case 7: width = FC_WIDTH_EXPANDED; break; + case 8: width = FC_WIDTH_EXTRAEXPANDED; break; + case 9: width = FC_WIDTH_ULTRAEXPANDED; break; + } + } + if (width == -1 && + FT_Get_BDF_Property (face, "SETWIDTH_NAME", &prop) == 0 && + prop.type == BDF_PROPERTY_TYPE_ATOM) + { + width = FcIsWidth ((FcChar8 *) prop.u.atom); + if (FcDebug () & FC_DBG_SCANV) + printf ("\tsetwidth %s maps to %d\n", prop.u.atom, width); + } + } +#endif + + /* + * Look for weight, width and slant names in the style value + */ + for (st = 0; FcPatternGetString (pat, FC_STYLE, st, &style) == FcResultMatch; st++) + { + if (weight == -1) + { + weight = FcContainsWeight (style); + if (FcDebug() & FC_DBG_SCANV) + printf ("\tStyle %s maps to weight %d\n", style, weight); + } + if (width == -1) + { + width = FcContainsWidth (style); + if (FcDebug() & FC_DBG_SCANV) + printf ("\tStyle %s maps to width %d\n", style, width); + } + if (slant == -1) + { + slant = FcContainsSlant (style); + if (FcDebug() & FC_DBG_SCANV) + printf ("\tStyle %s maps to slant %d\n", style, slant); + } + if (decorative == FcFalse) + { + decorative = FcContainsDecorative (style) > 0; + if (FcDebug() & FC_DBG_SCANV) + printf ("\tStyle %s maps to decorative %d\n", style, decorative); + } + } + /* + * Pull default values from the FreeType flags if more + * specific values not found above + */ + if (slant == -1) + { + slant = FC_SLANT_ROMAN; + if (face->style_flags & FT_STYLE_FLAG_ITALIC) + slant = FC_SLANT_ITALIC; + } + + if (weight == -1) + { + weight = FC_WEIGHT_MEDIUM; + if (face->style_flags & FT_STYLE_FLAG_BOLD) + weight = FC_WEIGHT_BOLD; + } + + if (width == -1) + width = FC_WIDTH_NORMAL; + + if (foundry == 0) + foundry = (FcChar8 *) "unknown"; + + if (!FcPatternAddInteger (pat, FC_SLANT, slant)) + goto bail1; + + if (!FcPatternAddInteger (pat, FC_WEIGHT, weight)) + goto bail1; + + if (!FcPatternAddInteger (pat, FC_WIDTH, width)) + goto bail1; + + if (!FcPatternAddString (pat, FC_FOUNDRY, foundry)) + goto bail1; + + if (!FcPatternAddBool (pat, FC_DECORATIVE, decorative)) + goto bail1; + + /* + * Compute the unicode coverage for the font + */ + cs = FcFreeTypeCharSetAndSpacing (face, blanks, &spacing); + if (!cs) + goto bail1; + +#if HAVE_FT_GET_BDF_PROPERTY + /* For PCF fonts, override the computed spacing with the one from + the property */ + if(FT_Get_BDF_Property(face, "SPACING", &prop) == 0 && + prop.type == BDF_PROPERTY_TYPE_ATOM) { + if(!strcmp(prop.u.atom, "c") || !strcmp(prop.u.atom, "C")) + spacing = FC_CHARCELL; + else if(!strcmp(prop.u.atom, "m") || !strcmp(prop.u.atom, "M")) + spacing = FC_MONO; + else if(!strcmp(prop.u.atom, "p") || !strcmp(prop.u.atom, "P")) + spacing = FC_PROPORTIONAL; + } +#endif + + /* + * Skip over PCF fonts that have no encoded characters; they're + * usually just Unicode fonts transcoded to some legacy encoding + * FT forces us to approximate whether a font is a PCF font + * or not by whether it has any BDF properties. Try PIXEL_SIZE; + * I don't know how to get a list of BDF properties on the font. -PL + */ + if (FcCharSetCount (cs) == 0) + { +#if HAVE_FT_GET_BDF_PROPERTY + if(FT_Get_BDF_Property(face, "PIXEL_SIZE", &prop) == 0) + goto bail2; +#endif + } + + if (!FcPatternAddCharSet (pat, FC_CHARSET, cs)) + goto bail2; + + ls = FcFreeTypeLangSet (cs, exclusiveLang); + if (!ls) + goto bail2; + + if (!FcPatternAddLangSet (pat, FC_LANG, ls)) + { + FcLangSetDestroy (ls); + goto bail2; + } + + FcLangSetDestroy (ls); + + if (spacing != FC_PROPORTIONAL) + if (!FcPatternAddInteger (pat, FC_SPACING, spacing)) + goto bail2; + + if (!(face->face_flags & FT_FACE_FLAG_SCALABLE)) + { + for (i = 0; i < face->num_fixed_sizes; i++) + if (!FcPatternAddDouble (pat, FC_PIXEL_SIZE, + FcGetPixelSize (face, i))) + goto bail2; + if (!FcPatternAddBool (pat, FC_ANTIALIAS, FcFalse)) + goto bail2; + } +#if HAVE_FT_GET_X11_FONT_FORMAT + /* + * Use the (not well documented or supported) X-specific function + * from FreeType to figure out the font format + */ + { + const char *font_format = FT_Get_X11_Font_Format (face); + if (font_format) + FcPatternAddString (pat, FC_FONTFORMAT, (FcChar8 *) font_format); + } +#endif + + /* + * Drop our reference to the charset + */ + FcCharSetDestroy (cs); + + return pat; + +bail2: + FcCharSetDestroy (cs); +bail1: + FcPatternDestroy (pat); +bail0: + return NULL; +} + +FcPattern * +FcFreeTypeQuery(const FcChar8 *file, + int id, + FcBlanks *blanks, + int *count) +{ + FT_Face face; + FT_Library ftLibrary; + FcPattern *pat = NULL; + + if (FT_Init_FreeType (&ftLibrary)) + return NULL; + + if (FT_New_Face (ftLibrary, (char *) file, id, &face)) + goto bail; + + *count = face->num_faces; + + pat = FcFreeTypeQueryFace (face, file, id, blanks); + + FT_Done_Face (face); +bail: + FT_Done_FreeType (ftLibrary); + return pat; +} + +/* + * For our purposes, this approximation is sufficient + */ +#if !HAVE_FT_GET_NEXT_CHAR +#define FT_Get_Next_Char(face, ucs4, gi) ((ucs4) >= 0xffffff ? \ + (*(gi) = 0), 0 : \ + (*(gi) = 1), (ucs4) + 1) +#warning "No FT_Get_Next_Char: Please install freetype version 2.1.0 or newer" +#endif + +typedef struct _FcCharEnt { + FcChar16 bmp; + unsigned char encode; +} FcCharEnt; + +struct _FcCharMap { + const FcCharEnt *ent; + int nent; +}; + +typedef struct _FcFontDecode { + FT_Encoding encoding; + const FcCharMap *map; + FcChar32 max; +} FcFontDecode; + +static const FcCharEnt AppleRomanEnt[] = { + { 0x0020, 0x20 }, /* SPACE */ + { 0x0021, 0x21 }, /* EXCLAMATION MARK */ + { 0x0022, 0x22 }, /* QUOTATION MARK */ + { 0x0023, 0x23 }, /* NUMBER SIGN */ + { 0x0024, 0x24 }, /* DOLLAR SIGN */ + { 0x0025, 0x25 }, /* PERCENT SIGN */ + { 0x0026, 0x26 }, /* AMPERSAND */ + { 0x0027, 0x27 }, /* APOSTROPHE */ + { 0x0028, 0x28 }, /* LEFT PARENTHESIS */ + { 0x0029, 0x29 }, /* RIGHT PARENTHESIS */ + { 0x002A, 0x2A }, /* ASTERISK */ + { 0x002B, 0x2B }, /* PLUS SIGN */ + { 0x002C, 0x2C }, /* COMMA */ + { 0x002D, 0x2D }, /* HYPHEN-MINUS */ + { 0x002E, 0x2E }, /* FULL STOP */ + { 0x002F, 0x2F }, /* SOLIDUS */ + { 0x0030, 0x30 }, /* DIGIT ZERO */ + { 0x0031, 0x31 }, /* DIGIT ONE */ + { 0x0032, 0x32 }, /* DIGIT TWO */ + { 0x0033, 0x33 }, /* DIGIT THREE */ + { 0x0034, 0x34 }, /* DIGIT FOUR */ + { 0x0035, 0x35 }, /* DIGIT FIVE */ + { 0x0036, 0x36 }, /* DIGIT SIX */ + { 0x0037, 0x37 }, /* DIGIT SEVEN */ + { 0x0038, 0x38 }, /* DIGIT EIGHT */ + { 0x0039, 0x39 }, /* DIGIT NINE */ + { 0x003A, 0x3A }, /* COLON */ + { 0x003B, 0x3B }, /* SEMICOLON */ + { 0x003C, 0x3C }, /* LESS-THAN SIGN */ + { 0x003D, 0x3D }, /* EQUALS SIGN */ + { 0x003E, 0x3E }, /* GREATER-THAN SIGN */ + { 0x003F, 0x3F }, /* QUESTION MARK */ + { 0x0040, 0x40 }, /* COMMERCIAL AT */ + { 0x0041, 0x41 }, /* LATIN CAPITAL LETTER A */ + { 0x0042, 0x42 }, /* LATIN CAPITAL LETTER B */ + { 0x0043, 0x43 }, /* LATIN CAPITAL LETTER C */ + { 0x0044, 0x44 }, /* LATIN CAPITAL LETTER D */ + { 0x0045, 0x45 }, /* LATIN CAPITAL LETTER E */ + { 0x0046, 0x46 }, /* LATIN CAPITAL LETTER F */ + { 0x0047, 0x47 }, /* LATIN CAPITAL LETTER G */ + { 0x0048, 0x48 }, /* LATIN CAPITAL LETTER H */ + { 0x0049, 0x49 }, /* LATIN CAPITAL LETTER I */ + { 0x004A, 0x4A }, /* LATIN CAPITAL LETTER J */ + { 0x004B, 0x4B }, /* LATIN CAPITAL LETTER K */ + { 0x004C, 0x4C }, /* LATIN CAPITAL LETTER L */ + { 0x004D, 0x4D }, /* LATIN CAPITAL LETTER M */ + { 0x004E, 0x4E }, /* LATIN CAPITAL LETTER N */ + { 0x004F, 0x4F }, /* LATIN CAPITAL LETTER O */ + { 0x0050, 0x50 }, /* LATIN CAPITAL LETTER P */ + { 0x0051, 0x51 }, /* LATIN CAPITAL LETTER Q */ + { 0x0052, 0x52 }, /* LATIN CAPITAL LETTER R */ + { 0x0053, 0x53 }, /* LATIN CAPITAL LETTER S */ + { 0x0054, 0x54 }, /* LATIN CAPITAL LETTER T */ + { 0x0055, 0x55 }, /* LATIN CAPITAL LETTER U */ + { 0x0056, 0x56 }, /* LATIN CAPITAL LETTER V */ + { 0x0057, 0x57 }, /* LATIN CAPITAL LETTER W */ + { 0x0058, 0x58 }, /* LATIN CAPITAL LETTER X */ + { 0x0059, 0x59 }, /* LATIN CAPITAL LETTER Y */ + { 0x005A, 0x5A }, /* LATIN CAPITAL LETTER Z */ + { 0x005B, 0x5B }, /* LEFT SQUARE BRACKET */ + { 0x005C, 0x5C }, /* REVERSE SOLIDUS */ + { 0x005D, 0x5D }, /* RIGHT SQUARE BRACKET */ + { 0x005E, 0x5E }, /* CIRCUMFLEX ACCENT */ + { 0x005F, 0x5F }, /* LOW LINE */ + { 0x0060, 0x60 }, /* GRAVE ACCENT */ + { 0x0061, 0x61 }, /* LATIN SMALL LETTER A */ + { 0x0062, 0x62 }, /* LATIN SMALL LETTER B */ + { 0x0063, 0x63 }, /* LATIN SMALL LETTER C */ + { 0x0064, 0x64 }, /* LATIN SMALL LETTER D */ + { 0x0065, 0x65 }, /* LATIN SMALL LETTER E */ + { 0x0066, 0x66 }, /* LATIN SMALL LETTER F */ + { 0x0067, 0x67 }, /* LATIN SMALL LETTER G */ + { 0x0068, 0x68 }, /* LATIN SMALL LETTER H */ + { 0x0069, 0x69 }, /* LATIN SMALL LETTER I */ + { 0x006A, 0x6A }, /* LATIN SMALL LETTER J */ + { 0x006B, 0x6B }, /* LATIN SMALL LETTER K */ + { 0x006C, 0x6C }, /* LATIN SMALL LETTER L */ + { 0x006D, 0x6D }, /* LATIN SMALL LETTER M */ + { 0x006E, 0x6E }, /* LATIN SMALL LETTER N */ + { 0x006F, 0x6F }, /* LATIN SMALL LETTER O */ + { 0x0070, 0x70 }, /* LATIN SMALL LETTER P */ + { 0x0071, 0x71 }, /* LATIN SMALL LETTER Q */ + { 0x0072, 0x72 }, /* LATIN SMALL LETTER R */ + { 0x0073, 0x73 }, /* LATIN SMALL LETTER S */ + { 0x0074, 0x74 }, /* LATIN SMALL LETTER T */ + { 0x0075, 0x75 }, /* LATIN SMALL LETTER U */ + { 0x0076, 0x76 }, /* LATIN SMALL LETTER V */ + { 0x0077, 0x77 }, /* LATIN SMALL LETTER W */ + { 0x0078, 0x78 }, /* LATIN SMALL LETTER X */ + { 0x0079, 0x79 }, /* LATIN SMALL LETTER Y */ + { 0x007A, 0x7A }, /* LATIN SMALL LETTER Z */ + { 0x007B, 0x7B }, /* LEFT CURLY BRACKET */ + { 0x007C, 0x7C }, /* VERTICAL LINE */ + { 0x007D, 0x7D }, /* RIGHT CURLY BRACKET */ + { 0x007E, 0x7E }, /* TILDE */ + { 0x00A0, 0xCA }, /* NO-BREAK SPACE */ + { 0x00A1, 0xC1 }, /* INVERTED EXCLAMATION MARK */ + { 0x00A2, 0xA2 }, /* CENT SIGN */ + { 0x00A3, 0xA3 }, /* POUND SIGN */ + { 0x00A5, 0xB4 }, /* YEN SIGN */ + { 0x00A7, 0xA4 }, /* SECTION SIGN */ + { 0x00A8, 0xAC }, /* DIAERESIS */ + { 0x00A9, 0xA9 }, /* COPYRIGHT SIGN */ + { 0x00AA, 0xBB }, /* FEMININE ORDINAL INDICATOR */ + { 0x00AB, 0xC7 }, /* LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */ + { 0x00AC, 0xC2 }, /* NOT SIGN */ + { 0x00AE, 0xA8 }, /* REGISTERED SIGN */ + { 0x00AF, 0xF8 }, /* MACRON */ + { 0x00B0, 0xA1 }, /* DEGREE SIGN */ + { 0x00B1, 0xB1 }, /* PLUS-MINUS SIGN */ + { 0x00B4, 0xAB }, /* ACUTE ACCENT */ + { 0x00B5, 0xB5 }, /* MICRO SIGN */ + { 0x00B6, 0xA6 }, /* PILCROW SIGN */ + { 0x00B7, 0xE1 }, /* MIDDLE DOT */ + { 0x00B8, 0xFC }, /* CEDILLA */ + { 0x00BA, 0xBC }, /* MASCULINE ORDINAL INDICATOR */ + { 0x00BB, 0xC8 }, /* RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */ + { 0x00BF, 0xC0 }, /* INVERTED QUESTION MARK */ + { 0x00C0, 0xCB }, /* LATIN CAPITAL LETTER A WITH GRAVE */ + { 0x00C1, 0xE7 }, /* LATIN CAPITAL LETTER A WITH ACUTE */ + { 0x00C2, 0xE5 }, /* LATIN CAPITAL LETTER A WITH CIRCUMFLEX */ + { 0x00C3, 0xCC }, /* LATIN CAPITAL LETTER A WITH TILDE */ + { 0x00C4, 0x80 }, /* LATIN CAPITAL LETTER A WITH DIAERESIS */ + { 0x00C5, 0x81 }, /* LATIN CAPITAL LETTER A WITH RING ABOVE */ + { 0x00C6, 0xAE }, /* LATIN CAPITAL LETTER AE */ + { 0x00C7, 0x82 }, /* LATIN CAPITAL LETTER C WITH CEDILLA */ + { 0x00C8, 0xE9 }, /* LATIN CAPITAL LETTER E WITH GRAVE */ + { 0x00C9, 0x83 }, /* LATIN CAPITAL LETTER E WITH ACUTE */ + { 0x00CA, 0xE6 }, /* LATIN CAPITAL LETTER E WITH CIRCUMFLEX */ + { 0x00CB, 0xE8 }, /* LATIN CAPITAL LETTER E WITH DIAERESIS */ + { 0x00CC, 0xED }, /* LATIN CAPITAL LETTER I WITH GRAVE */ + { 0x00CD, 0xEA }, /* LATIN CAPITAL LETTER I WITH ACUTE */ + { 0x00CE, 0xEB }, /* LATIN CAPITAL LETTER I WITH CIRCUMFLEX */ + { 0x00CF, 0xEC }, /* LATIN CAPITAL LETTER I WITH DIAERESIS */ + { 0x00D1, 0x84 }, /* LATIN CAPITAL LETTER N WITH TILDE */ + { 0x00D2, 0xF1 }, /* LATIN CAPITAL LETTER O WITH GRAVE */ + { 0x00D3, 0xEE }, /* LATIN CAPITAL LETTER O WITH ACUTE */ + { 0x00D4, 0xEF }, /* LATIN CAPITAL LETTER O WITH CIRCUMFLEX */ + { 0x00D5, 0xCD }, /* LATIN CAPITAL LETTER O WITH TILDE */ + { 0x00D6, 0x85 }, /* LATIN CAPITAL LETTER O WITH DIAERESIS */ + { 0x00D8, 0xAF }, /* LATIN CAPITAL LETTER O WITH STROKE */ + { 0x00D9, 0xF4 }, /* LATIN CAPITAL LETTER U WITH GRAVE */ + { 0x00DA, 0xF2 }, /* LATIN CAPITAL LETTER U WITH ACUTE */ + { 0x00DB, 0xF3 }, /* LATIN CAPITAL LETTER U WITH CIRCUMFLEX */ + { 0x00DC, 0x86 }, /* LATIN CAPITAL LETTER U WITH DIAERESIS */ + { 0x00DF, 0xA7 }, /* LATIN SMALL LETTER SHARP S */ + { 0x00E0, 0x88 }, /* LATIN SMALL LETTER A WITH GRAVE */ + { 0x00E1, 0x87 }, /* LATIN SMALL LETTER A WITH ACUTE */ + { 0x00E2, 0x89 }, /* LATIN SMALL LETTER A WITH CIRCUMFLEX */ + { 0x00E3, 0x8B }, /* LATIN SMALL LETTER A WITH TILDE */ + { 0x00E4, 0x8A }, /* LATIN SMALL LETTER A WITH DIAERESIS */ + { 0x00E5, 0x8C }, /* LATIN SMALL LETTER A WITH RING ABOVE */ + { 0x00E6, 0xBE }, /* LATIN SMALL LETTER AE */ + { 0x00E7, 0x8D }, /* LATIN SMALL LETTER C WITH CEDILLA */ + { 0x00E8, 0x8F }, /* LATIN SMALL LETTER E WITH GRAVE */ + { 0x00E9, 0x8E }, /* LATIN SMALL LETTER E WITH ACUTE */ + { 0x00EA, 0x90 }, /* LATIN SMALL LETTER E WITH CIRCUMFLEX */ + { 0x00EB, 0x91 }, /* LATIN SMALL LETTER E WITH DIAERESIS */ + { 0x00EC, 0x93 }, /* LATIN SMALL LETTER I WITH GRAVE */ + { 0x00ED, 0x92 }, /* LATIN SMALL LETTER I WITH ACUTE */ + { 0x00EE, 0x94 }, /* LATIN SMALL LETTER I WITH CIRCUMFLEX */ + { 0x00EF, 0x95 }, /* LATIN SMALL LETTER I WITH DIAERESIS */ + { 0x00F1, 0x96 }, /* LATIN SMALL LETTER N WITH TILDE */ + { 0x00F2, 0x98 }, /* LATIN SMALL LETTER O WITH GRAVE */ + { 0x00F3, 0x97 }, /* LATIN SMALL LETTER O WITH ACUTE */ + { 0x00F4, 0x99 }, /* LATIN SMALL LETTER O WITH CIRCUMFLEX */ + { 0x00F5, 0x9B }, /* LATIN SMALL LETTER O WITH TILDE */ + { 0x00F6, 0x9A }, /* LATIN SMALL LETTER O WITH DIAERESIS */ + { 0x00F7, 0xD6 }, /* DIVISION SIGN */ + { 0x00F8, 0xBF }, /* LATIN SMALL LETTER O WITH STROKE */ + { 0x00F9, 0x9D }, /* LATIN SMALL LETTER U WITH GRAVE */ + { 0x00FA, 0x9C }, /* LATIN SMALL LETTER U WITH ACUTE */ + { 0x00FB, 0x9E }, /* LATIN SMALL LETTER U WITH CIRCUMFLEX */ + { 0x00FC, 0x9F }, /* LATIN SMALL LETTER U WITH DIAERESIS */ + { 0x00FF, 0xD8 }, /* LATIN SMALL LETTER Y WITH DIAERESIS */ + { 0x0131, 0xF5 }, /* LATIN SMALL LETTER DOTLESS I */ + { 0x0152, 0xCE }, /* LATIN CAPITAL LIGATURE OE */ + { 0x0153, 0xCF }, /* LATIN SMALL LIGATURE OE */ + { 0x0178, 0xD9 }, /* LATIN CAPITAL LETTER Y WITH DIAERESIS */ + { 0x0192, 0xC4 }, /* LATIN SMALL LETTER F WITH HOOK */ + { 0x02C6, 0xF6 }, /* MODIFIER LETTER CIRCUMFLEX ACCENT */ + { 0x02C7, 0xFF }, /* CARON */ + { 0x02D8, 0xF9 }, /* BREVE */ + { 0x02D9, 0xFA }, /* DOT ABOVE */ + { 0x02DA, 0xFB }, /* RING ABOVE */ + { 0x02DB, 0xFE }, /* OGONEK */ + { 0x02DC, 0xF7 }, /* SMALL TILDE */ + { 0x02DD, 0xFD }, /* DOUBLE ACUTE ACCENT */ + { 0x03A9, 0xBD }, /* GREEK CAPITAL LETTER OMEGA */ + { 0x03C0, 0xB9 }, /* GREEK SMALL LETTER PI */ + { 0x2013, 0xD0 }, /* EN DASH */ + { 0x2014, 0xD1 }, /* EM DASH */ + { 0x2018, 0xD4 }, /* LEFT SINGLE QUOTATION MARK */ + { 0x2019, 0xD5 }, /* RIGHT SINGLE QUOTATION MARK */ + { 0x201A, 0xE2 }, /* SINGLE LOW-9 QUOTATION MARK */ + { 0x201C, 0xD2 }, /* LEFT DOUBLE QUOTATION MARK */ + { 0x201D, 0xD3 }, /* RIGHT DOUBLE QUOTATION MARK */ + { 0x201E, 0xE3 }, /* DOUBLE LOW-9 QUOTATION MARK */ + { 0x2020, 0xA0 }, /* DAGGER */ + { 0x2021, 0xE0 }, /* DOUBLE DAGGER */ + { 0x2022, 0xA5 }, /* BULLET */ + { 0x2026, 0xC9 }, /* HORIZONTAL ELLIPSIS */ + { 0x2030, 0xE4 }, /* PER MILLE SIGN */ + { 0x2039, 0xDC }, /* SINGLE LEFT-POINTING ANGLE QUOTATION MARK */ + { 0x203A, 0xDD }, /* SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */ + { 0x2044, 0xDA }, /* FRACTION SLASH */ + { 0x20AC, 0xDB }, /* EURO SIGN */ + { 0x2122, 0xAA }, /* TRADE MARK SIGN */ + { 0x2202, 0xB6 }, /* PARTIAL DIFFERENTIAL */ + { 0x2206, 0xC6 }, /* INCREMENT */ + { 0x220F, 0xB8 }, /* N-ARY PRODUCT */ + { 0x2211, 0xB7 }, /* N-ARY SUMMATION */ + { 0x221A, 0xC3 }, /* SQUARE ROOT */ + { 0x221E, 0xB0 }, /* INFINITY */ + { 0x222B, 0xBA }, /* INTEGRAL */ + { 0x2248, 0xC5 }, /* ALMOST EQUAL TO */ + { 0x2260, 0xAD }, /* NOT EQUAL TO */ + { 0x2264, 0xB2 }, /* LESS-THAN OR EQUAL TO */ + { 0x2265, 0xB3 }, /* GREATER-THAN OR EQUAL TO */ + { 0x25CA, 0xD7 }, /* LOZENGE */ + { 0xF8FF, 0xF0 }, /* Apple logo */ + { 0xFB01, 0xDE }, /* LATIN SMALL LIGATURE FI */ + { 0xFB02, 0xDF }, /* LATIN SMALL LIGATURE FL */ +}; + +static const FcCharMap AppleRoman = { + AppleRomanEnt, + sizeof (AppleRomanEnt) / sizeof (AppleRomanEnt[0]) +}; + +static const FcCharEnt AdobeSymbolEnt[] = { + { 0x0020, 0x20 }, /* SPACE # space */ + { 0x0021, 0x21 }, /* EXCLAMATION MARK # exclam */ + { 0x0023, 0x23 }, /* NUMBER SIGN # numbersign */ + { 0x0025, 0x25 }, /* PERCENT SIGN # percent */ + { 0x0026, 0x26 }, /* AMPERSAND # ampersand */ + { 0x0028, 0x28 }, /* LEFT PARENTHESIS # parenleft */ + { 0x0029, 0x29 }, /* RIGHT PARENTHESIS # parenright */ + { 0x002B, 0x2B }, /* PLUS SIGN # plus */ + { 0x002C, 0x2C }, /* COMMA # comma */ + { 0x002E, 0x2E }, /* FULL STOP # period */ + { 0x002F, 0x2F }, /* SOLIDUS # slash */ + { 0x0030, 0x30 }, /* DIGIT ZERO # zero */ + { 0x0031, 0x31 }, /* DIGIT ONE # one */ + { 0x0032, 0x32 }, /* DIGIT TWO # two */ + { 0x0033, 0x33 }, /* DIGIT THREE # three */ + { 0x0034, 0x34 }, /* DIGIT FOUR # four */ + { 0x0035, 0x35 }, /* DIGIT FIVE # five */ + { 0x0036, 0x36 }, /* DIGIT SIX # six */ + { 0x0037, 0x37 }, /* DIGIT SEVEN # seven */ + { 0x0038, 0x38 }, /* DIGIT EIGHT # eight */ + { 0x0039, 0x39 }, /* DIGIT NINE # nine */ + { 0x003A, 0x3A }, /* COLON # colon */ + { 0x003B, 0x3B }, /* SEMICOLON # semicolon */ + { 0x003C, 0x3C }, /* LESS-THAN SIGN # less */ + { 0x003D, 0x3D }, /* EQUALS SIGN # equal */ + { 0x003E, 0x3E }, /* GREATER-THAN SIGN # greater */ + { 0x003F, 0x3F }, /* QUESTION MARK # question */ + { 0x005B, 0x5B }, /* LEFT SQUARE BRACKET # bracketleft */ + { 0x005D, 0x5D }, /* RIGHT SQUARE BRACKET # bracketright */ + { 0x005F, 0x5F }, /* LOW LINE # underscore */ + { 0x007B, 0x7B }, /* LEFT CURLY BRACKET # braceleft */ + { 0x007C, 0x7C }, /* VERTICAL LINE # bar */ + { 0x007D, 0x7D }, /* RIGHT CURLY BRACKET # braceright */ + { 0x00A0, 0x20 }, /* NO-BREAK SPACE # space */ + { 0x00AC, 0xD8 }, /* NOT SIGN # logicalnot */ + { 0x00B0, 0xB0 }, /* DEGREE SIGN # degree */ + { 0x00B1, 0xB1 }, /* PLUS-MINUS SIGN # plusminus */ + { 0x00B5, 0x6D }, /* MICRO SIGN # mu */ + { 0x00D7, 0xB4 }, /* MULTIPLICATION SIGN # multiply */ + { 0x00F7, 0xB8 }, /* DIVISION SIGN # divide */ + { 0x0192, 0xA6 }, /* LATIN SMALL LETTER F WITH HOOK # florin */ + { 0x0391, 0x41 }, /* GREEK CAPITAL LETTER ALPHA # Alpha */ + { 0x0392, 0x42 }, /* GREEK CAPITAL LETTER BETA # Beta */ + { 0x0393, 0x47 }, /* GREEK CAPITAL LETTER GAMMA # Gamma */ + { 0x0394, 0x44 }, /* GREEK CAPITAL LETTER DELTA # Delta */ + { 0x0395, 0x45 }, /* GREEK CAPITAL LETTER EPSILON # Epsilon */ + { 0x0396, 0x5A }, /* GREEK CAPITAL LETTER ZETA # Zeta */ + { 0x0397, 0x48 }, /* GREEK CAPITAL LETTER ETA # Eta */ + { 0x0398, 0x51 }, /* GREEK CAPITAL LETTER THETA # Theta */ + { 0x0399, 0x49 }, /* GREEK CAPITAL LETTER IOTA # Iota */ + { 0x039A, 0x4B }, /* GREEK CAPITAL LETTER KAPPA # Kappa */ + { 0x039B, 0x4C }, /* GREEK CAPITAL LETTER LAMDA # Lambda */ + { 0x039C, 0x4D }, /* GREEK CAPITAL LETTER MU # Mu */ + { 0x039D, 0x4E }, /* GREEK CAPITAL LETTER NU # Nu */ + { 0x039E, 0x58 }, /* GREEK CAPITAL LETTER XI # Xi */ + { 0x039F, 0x4F }, /* GREEK CAPITAL LETTER OMICRON # Omicron */ + { 0x03A0, 0x50 }, /* GREEK CAPITAL LETTER PI # Pi */ + { 0x03A1, 0x52 }, /* GREEK CAPITAL LETTER RHO # Rho */ + { 0x03A3, 0x53 }, /* GREEK CAPITAL LETTER SIGMA # Sigma */ + { 0x03A4, 0x54 }, /* GREEK CAPITAL LETTER TAU # Tau */ + { 0x03A5, 0x55 }, /* GREEK CAPITAL LETTER UPSILON # Upsilon */ + { 0x03A6, 0x46 }, /* GREEK CAPITAL LETTER PHI # Phi */ + { 0x03A7, 0x43 }, /* GREEK CAPITAL LETTER CHI # Chi */ + { 0x03A8, 0x59 }, /* GREEK CAPITAL LETTER PSI # Psi */ + { 0x03A9, 0x57 }, /* GREEK CAPITAL LETTER OMEGA # Omega */ + { 0x03B1, 0x61 }, /* GREEK SMALL LETTER ALPHA # alpha */ + { 0x03B2, 0x62 }, /* GREEK SMALL LETTER BETA # beta */ + { 0x03B3, 0x67 }, /* GREEK SMALL LETTER GAMMA # gamma */ + { 0x03B4, 0x64 }, /* GREEK SMALL LETTER DELTA # delta */ + { 0x03B5, 0x65 }, /* GREEK SMALL LETTER EPSILON # epsilon */ + { 0x03B6, 0x7A }, /* GREEK SMALL LETTER ZETA # zeta */ + { 0x03B7, 0x68 }, /* GREEK SMALL LETTER ETA # eta */ + { 0x03B8, 0x71 }, /* GREEK SMALL LETTER THETA # theta */ + { 0x03B9, 0x69 }, /* GREEK SMALL LETTER IOTA # iota */ + { 0x03BA, 0x6B }, /* GREEK SMALL LETTER KAPPA # kappa */ + { 0x03BB, 0x6C }, /* GREEK SMALL LETTER LAMDA # lambda */ + { 0x03BC, 0x6D }, /* GREEK SMALL LETTER MU # mu */ + { 0x03BD, 0x6E }, /* GREEK SMALL LETTER NU # nu */ + { 0x03BE, 0x78 }, /* GREEK SMALL LETTER XI # xi */ + { 0x03BF, 0x6F }, /* GREEK SMALL LETTER OMICRON # omicron */ + { 0x03C0, 0x70 }, /* GREEK SMALL LETTER PI # pi */ + { 0x03C1, 0x72 }, /* GREEK SMALL LETTER RHO # rho */ + { 0x03C2, 0x56 }, /* GREEK SMALL LETTER FINAL SIGMA # sigma1 */ + { 0x03C3, 0x73 }, /* GREEK SMALL LETTER SIGMA # sigma */ + { 0x03C4, 0x74 }, /* GREEK SMALL LETTER TAU # tau */ + { 0x03C5, 0x75 }, /* GREEK SMALL LETTER UPSILON # upsilon */ + { 0x03C6, 0x66 }, /* GREEK SMALL LETTER PHI # phi */ + { 0x03C7, 0x63 }, /* GREEK SMALL LETTER CHI # chi */ + { 0x03C8, 0x79 }, /* GREEK SMALL LETTER PSI # psi */ + { 0x03C9, 0x77 }, /* GREEK SMALL LETTER OMEGA # omega */ + { 0x03D1, 0x4A }, /* GREEK THETA SYMBOL # theta1 */ + { 0x03D2, 0xA1 }, /* GREEK UPSILON WITH HOOK SYMBOL # Upsilon1 */ + { 0x03D5, 0x6A }, /* GREEK PHI SYMBOL # phi1 */ + { 0x03D6, 0x76 }, /* GREEK PI SYMBOL # omega1 */ + { 0x2022, 0xB7 }, /* BULLET # bullet */ + { 0x2026, 0xBC }, /* HORIZONTAL ELLIPSIS # ellipsis */ + { 0x2032, 0xA2 }, /* PRIME # minute */ + { 0x2033, 0xB2 }, /* DOUBLE PRIME # second */ + { 0x2044, 0xA4 }, /* FRACTION SLASH # fraction */ + { 0x20AC, 0xA0 }, /* EURO SIGN # Euro */ + { 0x2111, 0xC1 }, /* BLACK-LETTER CAPITAL I # Ifraktur */ + { 0x2118, 0xC3 }, /* SCRIPT CAPITAL P # weierstrass */ + { 0x211C, 0xC2 }, /* BLACK-LETTER CAPITAL R # Rfraktur */ + { 0x2126, 0x57 }, /* OHM SIGN # Omega */ + { 0x2135, 0xC0 }, /* ALEF SYMBOL # aleph */ + { 0x2190, 0xAC }, /* LEFTWARDS ARROW # arrowleft */ + { 0x2191, 0xAD }, /* UPWARDS ARROW # arrowup */ + { 0x2192, 0xAE }, /* RIGHTWARDS ARROW # arrowright */ + { 0x2193, 0xAF }, /* DOWNWARDS ARROW # arrowdown */ + { 0x2194, 0xAB }, /* LEFT RIGHT ARROW # arrowboth */ + { 0x21B5, 0xBF }, /* DOWNWARDS ARROW WITH CORNER LEFTWARDS # carriagereturn */ + { 0x21D0, 0xDC }, /* LEFTWARDS DOUBLE ARROW # arrowdblleft */ + { 0x21D1, 0xDD }, /* UPWARDS DOUBLE ARROW # arrowdblup */ + { 0x21D2, 0xDE }, /* RIGHTWARDS DOUBLE ARROW # arrowdblright */ + { 0x21D3, 0xDF }, /* DOWNWARDS DOUBLE ARROW # arrowdbldown */ + { 0x21D4, 0xDB }, /* LEFT RIGHT DOUBLE ARROW # arrowdblboth */ + { 0x2200, 0x22 }, /* FOR ALL # universal */ + { 0x2202, 0xB6 }, /* PARTIAL DIFFERENTIAL # partialdiff */ + { 0x2203, 0x24 }, /* THERE EXISTS # existential */ + { 0x2205, 0xC6 }, /* EMPTY SET # emptyset */ + { 0x2206, 0x44 }, /* INCREMENT # Delta */ + { 0x2207, 0xD1 }, /* NABLA # gradient */ + { 0x2208, 0xCE }, /* ELEMENT OF # element */ + { 0x2209, 0xCF }, /* NOT AN ELEMENT OF # notelement */ + { 0x220B, 0x27 }, /* CONTAINS AS MEMBER # suchthat */ + { 0x220F, 0xD5 }, /* N-ARY PRODUCT # product */ + { 0x2211, 0xE5 }, /* N-ARY SUMMATION # summation */ + { 0x2212, 0x2D }, /* MINUS SIGN # minus */ + { 0x2215, 0xA4 }, /* DIVISION SLASH # fraction */ + { 0x2217, 0x2A }, /* ASTERISK OPERATOR # asteriskmath */ + { 0x221A, 0xD6 }, /* SQUARE ROOT # radical */ + { 0x221D, 0xB5 }, /* PROPORTIONAL TO # proportional */ + { 0x221E, 0xA5 }, /* INFINITY # infinity */ + { 0x2220, 0xD0 }, /* ANGLE # angle */ + { 0x2227, 0xD9 }, /* LOGICAL AND # logicaland */ + { 0x2228, 0xDA }, /* LOGICAL OR # logicalor */ + { 0x2229, 0xC7 }, /* INTERSECTION # intersection */ + { 0x222A, 0xC8 }, /* UNION # union */ + { 0x222B, 0xF2 }, /* INTEGRAL # integral */ + { 0x2234, 0x5C }, /* THEREFORE # therefore */ + { 0x223C, 0x7E }, /* TILDE OPERATOR # similar */ + { 0x2245, 0x40 }, /* APPROXIMATELY EQUAL TO # congruent */ + { 0x2248, 0xBB }, /* ALMOST EQUAL TO # approxequal */ + { 0x2260, 0xB9 }, /* NOT EQUAL TO # notequal */ + { 0x2261, 0xBA }, /* IDENTICAL TO # equivalence */ + { 0x2264, 0xA3 }, /* LESS-THAN OR EQUAL TO # lessequal */ + { 0x2265, 0xB3 }, /* GREATER-THAN OR EQUAL TO # greaterequal */ + { 0x2282, 0xCC }, /* SUBSET OF # propersubset */ + { 0x2283, 0xC9 }, /* SUPERSET OF # propersuperset */ + { 0x2284, 0xCB }, /* NOT A SUBSET OF # notsubset */ + { 0x2286, 0xCD }, /* SUBSET OF OR EQUAL TO # reflexsubset */ + { 0x2287, 0xCA }, /* SUPERSET OF OR EQUAL TO # reflexsuperset */ + { 0x2295, 0xC5 }, /* CIRCLED PLUS # circleplus */ + { 0x2297, 0xC4 }, /* CIRCLED TIMES # circlemultiply */ + { 0x22A5, 0x5E }, /* UP TACK # perpendicular */ + { 0x22C5, 0xD7 }, /* DOT OPERATOR # dotmath */ + { 0x2320, 0xF3 }, /* TOP HALF INTEGRAL # integraltp */ + { 0x2321, 0xF5 }, /* BOTTOM HALF INTEGRAL # integralbt */ + { 0x2329, 0xE1 }, /* LEFT-POINTING ANGLE BRACKET # angleleft */ + { 0x232A, 0xF1 }, /* RIGHT-POINTING ANGLE BRACKET # angleright */ + { 0x25CA, 0xE0 }, /* LOZENGE # lozenge */ + { 0x2660, 0xAA }, /* BLACK SPADE SUIT # spade */ + { 0x2663, 0xA7 }, /* BLACK CLUB SUIT # club */ + { 0x2665, 0xA9 }, /* BLACK HEART SUIT # heart */ + { 0x2666, 0xA8 }, /* BLACK DIAMOND SUIT # diamond */ + { 0xF6D9, 0xD3 }, /* COPYRIGHT SIGN SERIF # copyrightserif (CUS) */ + { 0xF6DA, 0xD2 }, /* REGISTERED SIGN SERIF # registerserif (CUS) */ + { 0xF6DB, 0xD4 }, /* TRADE MARK SIGN SERIF # trademarkserif (CUS) */ + { 0xF8E5, 0x60 }, /* RADICAL EXTENDER # radicalex (CUS) */ + { 0xF8E6, 0xBD }, /* VERTICAL ARROW EXTENDER # arrowvertex (CUS) */ + { 0xF8E7, 0xBE }, /* HORIZONTAL ARROW EXTENDER # arrowhorizex (CUS) */ + { 0xF8E8, 0xE2 }, /* REGISTERED SIGN SANS SERIF # registersans (CUS) */ + { 0xF8E9, 0xE3 }, /* COPYRIGHT SIGN SANS SERIF # copyrightsans (CUS) */ + { 0xF8EA, 0xE4 }, /* TRADE MARK SIGN SANS SERIF # trademarksans (CUS) */ + { 0xF8EB, 0xE6 }, /* LEFT PAREN TOP # parenlefttp (CUS) */ + { 0xF8EC, 0xE7 }, /* LEFT PAREN EXTENDER # parenleftex (CUS) */ + { 0xF8ED, 0xE8 }, /* LEFT PAREN BOTTOM # parenleftbt (CUS) */ + { 0xF8EE, 0xE9 }, /* LEFT SQUARE BRACKET TOP # bracketlefttp (CUS) */ + { 0xF8EF, 0xEA }, /* LEFT SQUARE BRACKET EXTENDER # bracketleftex (CUS) */ + { 0xF8F0, 0xEB }, /* LEFT SQUARE BRACKET BOTTOM # bracketleftbt (CUS) */ + { 0xF8F1, 0xEC }, /* LEFT CURLY BRACKET TOP # bracelefttp (CUS) */ + { 0xF8F2, 0xED }, /* LEFT CURLY BRACKET MID # braceleftmid (CUS) */ + { 0xF8F3, 0xEE }, /* LEFT CURLY BRACKET BOTTOM # braceleftbt (CUS) */ + { 0xF8F4, 0xEF }, /* CURLY BRACKET EXTENDER # braceex (CUS) */ + { 0xF8F5, 0xF4 }, /* INTEGRAL EXTENDER # integralex (CUS) */ + { 0xF8F6, 0xF6 }, /* RIGHT PAREN TOP # parenrighttp (CUS) */ + { 0xF8F7, 0xF7 }, /* RIGHT PAREN EXTENDER # parenrightex (CUS) */ + { 0xF8F8, 0xF8 }, /* RIGHT PAREN BOTTOM # parenrightbt (CUS) */ + { 0xF8F9, 0xF9 }, /* RIGHT SQUARE BRACKET TOP # bracketrighttp (CUS) */ + { 0xF8FA, 0xFA }, /* RIGHT SQUARE BRACKET EXTENDER # bracketrightex (CUS) */ + { 0xF8FB, 0xFB }, /* RIGHT SQUARE BRACKET BOTTOM # bracketrightbt (CUS) */ + { 0xF8FC, 0xFC }, /* RIGHT CURLY BRACKET TOP # bracerighttp (CUS) */ + { 0xF8FD, 0xFD }, /* RIGHT CURLY BRACKET MID # bracerightmid (CUS) */ + { 0xF8FE, 0xFE }, /* RIGHT CURLY BRACKET BOTTOM # bracerightbt (CUS) */ +}; + +static const FcCharMap AdobeSymbol = { + AdobeSymbolEnt, + sizeof (AdobeSymbolEnt) / sizeof (AdobeSymbolEnt[0]), +}; + +static const FcFontDecode fcFontDecoders[] = { + { ft_encoding_unicode, 0, (1 << 21) - 1 }, + { ft_encoding_symbol, &AdobeSymbol, (1 << 16) - 1 }, + { ft_encoding_apple_roman, &AppleRoman, (1 << 16) - 1 }, +}; + +#define NUM_DECODE (int) (sizeof (fcFontDecoders) / sizeof (fcFontDecoders[0])) + +static const FcChar32 prefer_unicode[] = { + 0x20ac, /* EURO SIGN */ +}; + +#define NUM_PREFER_UNICODE (int) (sizeof (prefer_unicode) / sizeof (prefer_unicode[0])) + +FcChar32 +FcFreeTypeUcs4ToPrivate (FcChar32 ucs4, const FcCharMap *map) +{ + int low, high, mid; + FcChar16 bmp; + + low = 0; + high = map->nent - 1; + if (ucs4 < map->ent[low].bmp || map->ent[high].bmp < ucs4) + return ~0; + while (low <= high) + { + mid = (high + low) >> 1; + bmp = map->ent[mid].bmp; + if (ucs4 == bmp) + return (FT_ULong) map->ent[mid].encode; + if (ucs4 < bmp) + high = mid - 1; + else + low = mid + 1; + } + return ~0; +} + +FcChar32 +FcFreeTypePrivateToUcs4 (FcChar32 private, const FcCharMap *map) +{ + int i; + + for (i = 0; i < map->nent; i++) + if (map->ent[i].encode == private) + return (FcChar32) map->ent[i].bmp; + return ~0; +} + +const FcCharMap * +FcFreeTypeGetPrivateMap (FT_Encoding encoding) +{ + int i; + + for (i = 0; i < NUM_DECODE; i++) + if (fcFontDecoders[i].encoding == encoding) + return fcFontDecoders[i].map; + return 0; +} + +#include "../fc-glyphname/fcglyphname.h" + +static FcChar32 +FcHashGlyphName (const FcChar8 *name) +{ + FcChar32 h = 0; + FcChar8 c; + + while ((c = *name++)) + { + h = ((h << 1) | (h >> 31)) ^ c; + } + return h; +} + +#if HAVE_FT_HAS_PS_GLYPH_NAMES +/* + * Use Type1 glyph names for fonts which have reliable names + * and which export an Adobe Custom mapping + */ +static FcBool +FcFreeTypeUseNames (FT_Face face) +{ + FT_Int map; + + if (!FT_Has_PS_Glyph_Names (face)) + return FcFalse; + for (map = 0; map < face->num_charmaps; map++) + if (face->charmaps[map]->encoding == ft_encoding_adobe_custom) + return FcTrue; + return FcFalse; +} + +static const FcChar8 * +FcUcs4ToGlyphName (FcChar32 ucs4) +{ + int i = (int) (ucs4 % FC_GLYPHNAME_HASH); + int r = 0; + FcGlyphId gn; + + while ((gn = _fc_ucs_to_name[i]) != -1) + { + if (_fc_glyph_names[gn].ucs == ucs4) + return _fc_glyph_names[gn].name; + if (!r) + { + r = (int) (ucs4 % FC_GLYPHNAME_REHASH); + if (!r) + r = 1; + } + i += r; + if (i >= FC_GLYPHNAME_HASH) + i -= FC_GLYPHNAME_HASH; + } + return 0; +} + +static FcChar32 +FcGlyphNameToUcs4 (FcChar8 *name) +{ + FcChar32 h = FcHashGlyphName (name); + int i = (int) (h % FC_GLYPHNAME_HASH); + int r = 0; + FcGlyphId gn; + + while ((gn = _fc_name_to_ucs[i]) != -1) + { + if (!strcmp ((char *) name, (char *) _fc_glyph_names[gn].name)) + return _fc_glyph_names[gn].ucs; + if (!r) + { + r = (int) (h % FC_GLYPHNAME_REHASH); + if (!r) + r = 1; + } + i += r; + if (i >= FC_GLYPHNAME_HASH) + i -= FC_GLYPHNAME_HASH; + } + return 0xffff; +} + +/* + * Work around a bug in some FreeType versions which fail + * to correctly bounds check glyph name buffers and overwrite + * the stack. As Postscript names have a limit of 127 characters, + * this should be sufficient. + */ + +#if FC_GLYPHNAME_MAXLEN < 127 +# define FC_GLYPHNAME_BUFLEN 127 +#else +# define FC_GLYPHNAME_BUFLEN FC_GLYPHNAME_MAXLEN +#endif + +/* + * Search through a font for a glyph by name. This is + * currently a linear search as there doesn't appear to be + * any defined order within the font + */ +static FT_UInt +FcFreeTypeGlyphNameIndex (FT_Face face, const FcChar8 *name) +{ + FT_UInt gindex; + FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2]; + + for (gindex = 0; gindex < (FT_UInt) face->num_glyphs; gindex++) + { + if (FT_Get_Glyph_Name (face, gindex, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0) + if (!strcmp ((char *) name, (char *) name_buf)) + return gindex; + } + return 0; +} +#endif + +/* + * Map a UCS4 glyph to a glyph index. Use all available encoding + * tables to try and find one that works. This information is expected + * to be cached by higher levels, so performance isn't critical + */ + +FT_UInt +FcFreeTypeCharIndex (FT_Face face, FcChar32 ucs4) +{ + int initial, offset, decode; + FT_UInt glyphindex; + FcChar32 charcode; + int p; + + initial = 0; + + if (!face) + return 0; + + /* + * Find the current encoding + */ + if (face->charmap) + { + for (; initial < NUM_DECODE; initial++) + if (fcFontDecoders[initial].encoding == face->charmap->encoding) + break; + if (initial == NUM_DECODE) + initial = 0; + } + for (p = 0; p < NUM_PREFER_UNICODE; p++) + if (ucs4 == prefer_unicode[p]) + { + initial = 0; + break; + } + /* + * Check each encoding for the glyph, starting with the current one + */ + for (offset = 0; offset < NUM_DECODE; offset++) + { + decode = (initial + offset) % NUM_DECODE; + if (!face->charmap || face->charmap->encoding != fcFontDecoders[decode].encoding) + if (FT_Select_Charmap (face, fcFontDecoders[decode].encoding) != 0) + continue; + if (fcFontDecoders[decode].map) + { + charcode = FcFreeTypeUcs4ToPrivate (ucs4, fcFontDecoders[decode].map); + if (charcode == ~0U) + continue; + } + else + charcode = ucs4; + glyphindex = FT_Get_Char_Index (face, (FT_ULong) charcode); + if (glyphindex) + return glyphindex; + } +#if HAVE_FT_HAS_PS_GLYPH_NAMES + /* + * Check postscript name table if present + */ + if (FcFreeTypeUseNames (face)) + { + const FcChar8 *name = FcUcs4ToGlyphName (ucs4); + if (name) + { + glyphindex = FcFreeTypeGlyphNameIndex (face, name); + if (glyphindex) + return glyphindex; + } + } +#endif + return 0; +} + +static FcBool +FcFreeTypeCheckGlyph (FT_Face face, FcChar32 ucs4, + FT_UInt glyph, FcBlanks *blanks, + FT_Pos *advance, + FcBool using_strike) +{ + FT_Int load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + FT_GlyphSlot slot; + + if (using_strike) + load_flags &= ~FT_LOAD_NO_SCALE; + + /* + * When using scalable fonts, only report those glyphs + * which can be scaled; otherwise those fonts will + * only be available at some sizes, and never when + * transformed. Avoid this by simply reporting bitmap-only + * glyphs as missing + */ + if (face->face_flags & FT_FACE_FLAG_SCALABLE) + load_flags |= FT_LOAD_NO_BITMAP; + + if (FT_Load_Glyph (face, glyph, load_flags)) + return FcFalse; + + slot = face->glyph; + if (!glyph) + return FcFalse; + + *advance = slot->metrics.horiAdvance; + + switch (slot->format) { + case ft_glyph_format_bitmap: + /* + * Bitmaps are assumed to be reasonable; if + * this proves to be a rash assumption, this + * code can be easily modified + */ + return FcTrue; + case ft_glyph_format_outline: + /* + * Glyphs with contours are always OK + */ + if (slot->outline.n_contours != 0) + return FcTrue; + /* + * Glyphs with no contours are only OK if + * they're members of the Blanks set specified + * in the configuration. If blanks isn't set, + * then allow any glyph to be blank + */ + if (!blanks || FcBlanksIsMember (blanks, ucs4)) + return FcTrue; + /* fall through ... */ + default: + break; + } + return FcFalse; +} + +#define APPROXIMATELY_EQUAL(x,y) (FC_ABS ((x) - (y)) <= FC_MAX (FC_ABS (x), FC_ABS (y)) / 33) + +static FcCharSet * +FcFreeTypeCharSetAndSpacingForSize (FT_Face face, FcBlanks *blanks, int *spacing, FT_Int strike_index) +{ + FcChar32 page, off, ucs4; +#ifdef CHECK + FcChar32 font_max = 0; +#endif + FcCharSet *fcs; + FcCharLeaf *leaf; + const FcCharMap *map; + int o; + int i; + FT_UInt glyph; + FT_Pos advance, advance_one = 0, advance_two = 0; + FcBool has_advance = FcFalse, fixed_advance = FcTrue, dual_advance = FcFalse; + FcBool using_strike = FcFalse; + + fcs = FcCharSetCreate (); + if (!fcs) + goto bail0; + +#if HAVE_FT_SELECT_SIZE + if (strike_index >= 0) { + if (FT_Select_Size (face, strike_index) != FT_Err_Ok) + goto bail1; + using_strike = FcTrue; + } +#endif + +#ifdef CHECK + printf ("Family %s style %s\n", face->family_name, face->style_name); +#endif + for (o = 0; o < NUM_DECODE; o++) + { + if (FT_Select_Charmap (face, fcFontDecoders[o].encoding) != 0) + continue; + map = fcFontDecoders[o].map; + if (map) + { + /* + * Non-Unicode tables are easy; there's a list of all possible + * characters + */ + for (i = 0; i < map->nent; i++) + { + ucs4 = map->ent[i].bmp; + glyph = FT_Get_Char_Index (face, map->ent[i].encode); + if (glyph && + FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) + { + /* + * ignore glyphs with zero advance. They’re + * combining characters, and while their behaviour + * isn’t well defined for monospaced applications in + * Unicode, there are many fonts which include + * zero-width combining characters in otherwise + * monospaced fonts. + */ + if (advance) + { + if (!has_advance) + { + has_advance = FcTrue; + advance_one = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_one)) + { + if (fixed_advance) + { + dual_advance = FcTrue; + fixed_advance = FcFalse; + advance_two = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_two)) + dual_advance = FcFalse; + } + } + + leaf = FcCharSetFindLeafCreate (fcs, ucs4); + if (!leaf) + goto bail1; + leaf->map[(ucs4 & 0xff) >> 5] |= (1 << (ucs4 & 0x1f)); +#ifdef CHECK + if (ucs4 > font_max) + font_max = ucs4; +#endif + } + } + } + else + { + page = ~0; + leaf = NULL; + ucs4 = FT_Get_First_Char (face, &glyph); + while (glyph != 0) + { + if (FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) + { + if (advance) + { + if (!has_advance) + { + has_advance = FcTrue; + advance_one = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_one)) + { + if (fixed_advance) + { + dual_advance = FcTrue; + fixed_advance = FcFalse; + advance_two = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_two)) + dual_advance = FcFalse; + } + } + + if ((ucs4 >> 8) != page) + { + page = (ucs4 >> 8); + leaf = FcCharSetFindLeafCreate (fcs, ucs4); + if (!leaf) + goto bail1; + } + off = ucs4 & 0xff; + leaf->map[off >> 5] |= (1 << (off & 0x1f)); +#ifdef CHECK + if (ucs4 > font_max) + font_max = ucs4; +#endif + } + ucs4 = FT_Get_Next_Char (face, ucs4, &glyph); + } +#ifdef CHECK + for (ucs4 = 0; ucs4 < 0x10000; ucs4++) + { + FcBool FT_Has, FC_Has; + + FT_Has = FT_Get_Char_Index (face, ucs4) != 0; + FC_Has = FcCharSetHasChar (fcs, ucs4); + if (FT_Has != FC_Has) + { + printf ("0x%08x FT says %d FC says %d\n", ucs4, FT_Has, FC_Has); + } + } +#endif + } + } +#if HAVE_FT_HAS_PS_GLYPH_NAMES + /* + * Add mapping from PS glyph names if available + */ + if (FcFreeTypeUseNames (face)) + { + FcChar8 name_buf[FC_GLYPHNAME_BUFLEN + 2]; + + for (glyph = 0; glyph < (FT_UInt) face->num_glyphs; glyph++) + { + if (FT_Get_Glyph_Name (face, glyph, name_buf, FC_GLYPHNAME_BUFLEN+1) == 0) + { + ucs4 = FcGlyphNameToUcs4 (name_buf); + if (ucs4 != 0xffff && + FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) + { + if (advance) + { + if (!has_advance) + { + has_advance = FcTrue; + advance_one = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_one)) + { + if (fixed_advance) + { + dual_advance = FcTrue; + fixed_advance = FcFalse; + advance_two = advance; + } + else if (!APPROXIMATELY_EQUAL (advance, advance_two)) + dual_advance = FcFalse; + } + } + leaf = FcCharSetFindLeafCreate (fcs, ucs4); + if (!leaf) + goto bail1; + leaf->map[(ucs4 & 0xff) >> 5] |= (1 << (ucs4 & 0x1f)); +#ifdef CHECK + if (ucs4 > font_max) + font_max = ucs4; +#endif + } + } + } + } +#endif +#ifdef CHECK + printf ("%d glyphs %d encoded\n", (int) face->num_glyphs, FcCharSetCount (fcs)); + for (ucs4 = 0; ucs4 <= font_max; ucs4++) + { + FcBool has_char = (glyph = FcFreeTypeCharIndex (face, ucs4)) != 0; + FcBool has_bit = FcCharSetHasChar (fcs, ucs4); + + if (has_char && !has_bit) + { + if (!FcFreeTypeCheckGlyph (face, ucs4, glyph, blanks, &advance, using_strike)) + printf ("Bitmap missing broken char 0x%x\n", ucs4); + else + printf ("Bitmap missing char 0x%x\n", ucs4); + } + else if (!has_char && has_bit) + printf ("Bitmap extra char 0x%x\n", ucs4); + } +#endif + if (fixed_advance) + *spacing = FC_MONO; + else if (dual_advance && APPROXIMATELY_EQUAL (2 * FC_MIN (advance_one, advance_two), FC_MAX (advance_one, advance_two))) + *spacing = FC_DUAL; + else + *spacing = FC_PROPORTIONAL; + return fcs; +bail1: + FcCharSetDestroy (fcs); +bail0: + return 0; +} + +FcCharSet * +FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks, int *spacing) +{ + FcCharSet *cs; + + cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, -1); + /* + * Check for bitmap-only ttf fonts that are missing the glyf table. + * In that case, pick a size and look for glyphs in that size instead + */ + if (FcCharSetCount (cs) == 0) + { + /* Check for non-scalable TT fonts */ + if (!(face->face_flags & FT_FACE_FLAG_SCALABLE) && + face->num_fixed_sizes > 0 && + FT_Get_Sfnt_Table (face, ft_sfnt_head)) + { + FT_Int strike_index = 0; + int i; + + /* Select the face closest to 16 pixels tall */ + for (i = 1; i < face->num_fixed_sizes; i++) { + if (abs (face->available_sizes[i].height - 16) < + abs (face->available_sizes[strike_index].height - 16)) + strike_index = i; + } + FcCharSetDestroy (cs); + cs = FcFreeTypeCharSetAndSpacingForSize (face, blanks, spacing, strike_index); + } + } + return cs; +} + +FcCharSet * +FcFreeTypeCharSet (FT_Face face, FcBlanks *blanks) +{ + int spacing; + + return FcFreeTypeCharSetAndSpacing (face, blanks, &spacing); +} + + +#define TTAG_GPOS FT_MAKE_TAG( 'G', 'P', 'O', 'S' ) +#define TTAG_GSUB FT_MAKE_TAG( 'G', 'S', 'U', 'B' ) +#define TTAG_SILF FT_MAKE_TAG( 'S', 'i', 'l', 'f') + +#define OTLAYOUT_HEAD "otlayout:" +#define OTLAYOUT_HEAD_LEN 9 +#define OTLAYOUT_ID_LEN 4 +/* space + head + id */ +#define OTLAYOUT_LEN (1 + OTLAYOUT_HEAD_LEN + OTLAYOUT_ID_LEN) + +/* + * This is a bit generous; the registry has only lower case and space + * except for 'DFLT'. + */ +#define FcIsSpace(x) (040 == (x)) +#define FcIsValidScript(x) (FcIsLower(x) || FcIsUpper (x) || FcIsSpace(x)) + +static void +addtag(FcChar8 *complex_, FT_ULong tag) +{ + FcChar8 tagstring[OTLAYOUT_ID_LEN + 1]; + + tagstring[0] = (FcChar8)(tag >> 24), + tagstring[1] = (FcChar8)(tag >> 16), + tagstring[2] = (FcChar8)(tag >> 8), + tagstring[3] = (FcChar8)(tag); + tagstring[4] = '\0'; + + /* skip tags which aren't alphabetic, under the assumption that + * they're probably broken + */ + if (!FcIsValidScript(tagstring[0]) || + !FcIsValidScript(tagstring[1]) || + !FcIsValidScript(tagstring[2]) || + !FcIsValidScript(tagstring[3])) + return; + + if (*complex_ != '\0') + strcat ((char *) complex_, " "); + strcat ((char *) complex_, "otlayout:"); + strcat ((char *) complex_, (char *) tagstring); +} + +static int +compareulong (const void *a, const void *b) +{ + const FT_ULong *ua = (const FT_ULong *) a; + const FT_ULong *ub = (const FT_ULong *) b; + return *ua - *ub; +} + + +static int +GetScriptTags(FT_Face face, FT_ULong tabletag, FT_ULong **stags) +{ + FT_ULong cur_offset, new_offset, base_offset; + FT_Stream stream = face->stream; + FT_Error error; + FT_UShort n, p; + FT_Memory memory; + int script_count; + + if (!stream) + return 0; + + memory = stream->memory; + + if (( error = ftglue_face_goto_table( face, tabletag, stream ) )) + return 0; + + base_offset = ftglue_stream_pos ( stream ); + + /* skip version */ + + if ( ftglue_stream_seek ( stream, base_offset + 4L ) || ftglue_stream_frame_enter( stream, 2L ) ) + return 0; + + new_offset = GET_UShort() + base_offset; + + ftglue_stream_frame_exit( stream ); + + cur_offset = ftglue_stream_pos( stream ); + + if ( ftglue_stream_seek( stream, new_offset ) != FT_Err_Ok ) + return 0; + + base_offset = ftglue_stream_pos( stream ); + + if ( ftglue_stream_frame_enter( stream, 2L ) ) + return 0; + + script_count = GET_UShort (); + + ftglue_stream_frame_exit( stream ); + + *stags = malloc(script_count * sizeof (FT_ULong)); + if (!stags) + return 0; + + p = 0; + for ( n = 0; n < script_count; n++ ) + { + if ( ftglue_stream_frame_enter( stream, 6L ) ) + goto Fail; + + (*stags)[p] = GET_ULong (); + new_offset = GET_UShort () + base_offset; + + ftglue_stream_frame_exit( stream ); + + cur_offset = ftglue_stream_pos( stream ); + + error = ftglue_stream_seek( stream, new_offset ); + + if ( error == FT_Err_Ok ) + p++; + + (void)ftglue_stream_seek( stream, cur_offset ); + } + + if (!p) + goto Fail; + + /* sort the tag list before returning it */ + qsort(*stags, script_count, sizeof(FT_ULong), compareulong); + + return script_count; + +Fail: + free(*stags); + *stags = NULL; + return 0; +} + +static FcChar8 * +FcFontCapabilities(FT_Face face) +{ + FcBool issilgraphitefont = 0; + FT_Error err; + FT_ULong len = 0; + FT_ULong *gsubtags=NULL, *gpostags=NULL; + FT_UShort gsub_count=0, gpos_count=0; + FT_ULong maxsize; + FcChar8 *complex_ = NULL; + int indx1 = 0, indx2 = 0; + + err = FT_Load_Sfnt_Table(face, TTAG_SILF, 0, 0, &len); + issilgraphitefont = ( err == FT_Err_Ok); + + gpos_count = GetScriptTags(face, TTAG_GPOS, &gpostags); + gsub_count = GetScriptTags(face, TTAG_GSUB, &gsubtags); + + if (!issilgraphitefont && !gsub_count && !gpos_count) + goto bail; + + maxsize = (((FT_ULong) gpos_count + (FT_ULong) gsub_count) * OTLAYOUT_LEN + + (issilgraphitefont ? 13 : 0)); + complex_ = malloc (sizeof (FcChar8) * maxsize); + if (!complex_) + goto bail; + + complex_[0] = '\0'; + if (issilgraphitefont) + strcpy((char *) complex_, "ttable:Silf "); + + while ((indx1 < gsub_count) || (indx2 < gpos_count)) { + if (indx1 == gsub_count) { + addtag(complex_, gpostags[indx2]); + indx2++; + } else if ((indx2 == gpos_count) || (gsubtags[indx1] < gpostags[indx2])) { + addtag(complex_, gsubtags[indx1]); + indx1++; + } else if (gsubtags[indx1] == gpostags[indx2]) { + addtag(complex_, gsubtags[indx1]); + indx1++; + indx2++; + } else { + addtag(complex_, gpostags[indx2]); + indx2++; + } + } + if (FcDebug () & FC_DBG_SCANV) + printf("complex_ features in this font: %s\n", complex_); +bail: + free(gsubtags); + free(gpostags); + return complex_; +} + +#define __fcfreetype__ +#include "fcaliastail.h" +#include "fcftaliastail.h" +#undef __fcfreetype__ diff --git a/fontconfig/src/fcfs.c b/fontconfig/src/fcfs.c new file mode 100644 index 000000000..0e97501f8 --- /dev/null +++ b/fontconfig/src/fcfs.c @@ -0,0 +1,135 @@ +/* + * fontconfig/src/fcfs.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> + +FcFontSet * +FcFontSetCreate (void) +{ + FcFontSet *s; + + s = (FcFontSet *) malloc (sizeof (FcFontSet)); + if (!s) + return 0; + FcMemAlloc (FC_MEM_FONTSET, sizeof (FcFontSet)); + s->nfont = 0; + s->sfont = 0; + s->fonts = 0; + return s; +} + +void +FcFontSetDestroy (FcFontSet *s) +{ + int i; + + for (i = 0; i < s->nfont; i++) + FcPatternDestroy (s->fonts[i]); + if (s->fonts) + { + FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *)); + free (s->fonts); + } + FcMemFree (FC_MEM_FONTSET, sizeof (FcFontSet)); + free (s); +} + +FcBool +FcFontSetAdd (FcFontSet *s, FcPattern *font) +{ + FcPattern **f; + int sfont; + + if (s->nfont == s->sfont) + { + sfont = s->sfont + 32; + if (s->fonts) + f = (FcPattern **) realloc (s->fonts, sfont * sizeof (FcPattern *)); + else + f = (FcPattern **) malloc (sfont * sizeof (FcPattern *)); + if (!f) + return FcFalse; + if (s->sfont) + FcMemFree (FC_MEM_FONTPTR, s->sfont * sizeof (FcPattern *)); + FcMemAlloc (FC_MEM_FONTPTR, sfont * sizeof (FcPattern *)); + s->sfont = sfont; + s->fonts = f; + } + s->fonts[s->nfont++] = font; + return FcTrue; +} + +FcBool +FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s) +{ + int i; + + if (!FcSerializeAlloc (serialize, s, sizeof (FcFontSet))) + return FcFalse; + if (!FcSerializeAlloc (serialize, s->fonts, s->nfont * sizeof (FcPattern *))) + return FcFalse; + for (i = 0; i < s->nfont; i++) + { + if (!FcPatternSerializeAlloc (serialize, s->fonts[i])) + return FcFalse; + } + return FcTrue; +} + +FcFontSet * +FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s) +{ + int i; + FcFontSet *s_serialize; + FcPattern **fonts_serialize; + FcPattern *p_serialize; + + s_serialize = FcSerializePtr (serialize, s); + if (!s_serialize) + return NULL; + *s_serialize = *s; + s_serialize->sfont = s_serialize->nfont; + + fonts_serialize = FcSerializePtr (serialize, s->fonts); + if (!fonts_serialize) + return NULL; + s_serialize->fonts = FcPtrToEncodedOffset (s_serialize, + fonts_serialize, FcPattern *); + + for (i = 0; i < s->nfont; i++) + { + p_serialize = FcPatternSerialize (serialize, s->fonts[i]); + if (!p_serialize) + return NULL; + fonts_serialize[i] = FcPtrToEncodedOffset (s_serialize, + p_serialize, + FcPattern); + } + + return s_serialize; +} +#define __fcfs__ +#include "fcaliastail.h" +#undef __fcfs__ diff --git a/fontconfig/src/fcftint.h b/fontconfig/src/fcftint.h new file mode 100644 index 000000000..f32d87c8b --- /dev/null +++ b/fontconfig/src/fcftint.h @@ -0,0 +1,54 @@ +/* + * Copyright © 2007 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _FCFTINT_H_ +#define _FCFTINT_H_ + +#include <fontconfig/fcfreetype.h> + +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun) +#define FcPrivate __attribute__((__visibility__("hidden"))) +#define HAVE_GNUC_ATTRIBUTE 1 +#include "fcftalias.h" +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define FcPrivate __hidden +#else /* not gcc >= 3.3 and not Sun Studio >= 8 */ +#define FcPrivate +#endif + +/* fcfreetype.c */ +FcPrivate FcBool +FcFreeTypeIsExclusiveLang (const FcChar8 *lang); + +FcPrivate FcBool +FcFreeTypeHasLang (FcPattern *pattern, const FcChar8 *lang); + +FcPrivate FcChar32 +FcFreeTypeUcs4ToPrivate (FcChar32 ucs4, const FcCharMap *map); + +FcPrivate FcChar32 +FcFreeTypePrivateToUcs4 (FcChar32 private, const FcCharMap *map); + +FcPrivate const FcCharMap * +FcFreeTypeGetPrivateMap (FT_Encoding encoding); + +#endif /* _FCFTINT_H_ */ diff --git a/fontconfig/src/fcinit.c b/fontconfig/src/fcinit.c new file mode 100644 index 000000000..3789d67b5 --- /dev/null +++ b/fontconfig/src/fcinit.c @@ -0,0 +1,289 @@ +/* + * fontconfig/src/fcinit.c + * + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> + +static FcConfig * +FcInitFallbackConfig (void) +{ + FcConfig *config; + + config = FcConfigCreate (); + if (!config) + goto bail0; + if (!FcConfigAddDir (config, (FcChar8 *) FC_DEFAULT_FONTS)) + goto bail1; + if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR)) + goto bail1; + return config; + +bail1: + FcConfigDestroy (config); +bail0: + return 0; +} + +int +FcGetVersion (void) +{ + return FC_VERSION; +} + +/* + * Load the configuration files + */ +FcConfig * +FcInitLoadConfig (void) +{ + FcConfig *config; + + FcInitDebug (); + config = FcConfigCreate (); + if (!config) + return FcFalse; + + if (!FcConfigParseAndLoad (config, 0, FcTrue)) + { + FcConfigDestroy (config); + return FcInitFallbackConfig (); + } + + if (config->cacheDirs && config->cacheDirs->num == 0) + { + fprintf (stderr, + "Fontconfig warning: no <cachedir> elements found. Check configuration.\n"); + fprintf (stderr, + "Fontconfig warning: adding <cachedir>%s</cachedir>\n", + FC_CACHEDIR); + fprintf (stderr, + "Fontconfig warning: adding <cachedir>~/.fontconfig</cachedir>\n"); + if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) || + !FcConfigAddCacheDir (config, (FcChar8 *) "~/.fontconfig")) + { + fprintf (stderr, + "Fontconfig error: out of memory"); + FcConfigDestroy (config); + return FcInitFallbackConfig (); + } + } + + return config; +} + +/* + * Load the configuration files and scan for available fonts + */ +FcConfig * +FcInitLoadConfigAndFonts (void) +{ + FcConfig *config = FcInitLoadConfig (); + + FcInitDebug (); + if (!config) + return 0; + if (!FcConfigBuildFonts (config)) + { + FcConfigDestroy (config); + return 0; + } + return config; +} + +/* + * Initialize the default library configuration + */ +FcBool +FcInit (void) +{ + FcConfig *config; + + if (_fcConfig) + return FcTrue; + config = FcInitLoadConfigAndFonts (); + if (!config) + return FcFalse; + FcConfigSetCurrent (config); + if (FcDebug() & FC_DBG_MEMORY) + FcMemReport (); + return FcTrue; +} + +/* + * Free all library-allocated data structures. + */ +void +FcFini (void) +{ + if (_fcConfig) + FcConfigDestroy (_fcConfig); + + FcPatternFini (); + FcCacheFini (); + if (FcDebug() & FC_DBG_MEMORY) + FcMemReport (); +} + +/* + * Reread the configuration and available font lists + */ +FcBool +FcInitReinitialize (void) +{ + FcConfig *config; + + config = FcInitLoadConfigAndFonts (); + if (!config) + return FcFalse; + FcConfigSetCurrent (config); + return FcTrue; +} + +FcBool +FcInitBringUptoDate (void) +{ + FcConfig *config = FcConfigGetCurrent (); + time_t now; + + /* + * rescanInterval == 0 disables automatic up to date + */ + if (config->rescanInterval == 0) + return FcTrue; + /* + * Check no more often than rescanInterval seconds + */ + now = time (0); + if (config->rescanTime + config->rescanInterval - now > 0) + return FcTrue; + /* + * If up to date, don't reload configuration + */ + if (FcConfigUptoDate (0)) + return FcTrue; + return FcInitReinitialize (); +} + +static struct { + char name[16]; + int alloc_count; + int alloc_mem; + int free_count; + int free_mem; +} FcInUse[FC_MEM_NUM] = { + { "charset" }, + { "charleaf" }, + { "fontset" }, + { "fontptr" }, + { "objectset" }, + { "objectptr" }, + { "matrix" }, + { "pattern" }, + { "patelt" }, + { "vallist" }, + { "substate" }, + { "string" }, + { "listbuck" }, + { "strset" }, + { "strlist" }, + { "config" }, + { "langset" }, + { "atomic" }, + { "blanks" }, + { "cache" }, + { "strbuf" }, + { "subst" }, + { "objecttype" }, + { "constant" }, + { "test" }, + { "expr" }, + { "vstack" }, + { "attr" }, + { "pstack" }, + { "staticstr" }, +}; + +static int FcAllocCount, FcAllocMem; +static int FcFreeCount, FcFreeMem; + +static int FcMemNotice = 1*1024*1024; + +static int FcAllocNotify, FcFreeNotify; + +void +FcMemReport (void) +{ + int i; + printf ("Fc Memory Usage:\n"); + printf ("\t Which Alloc Free Active\n"); + printf ("\t count bytes count bytes count bytes\n"); + for (i = 0; i < FC_MEM_NUM; i++) + printf ("%16.16s%8d%8d%8d%8d%8d%8d\n", + FcInUse[i].name, + FcInUse[i].alloc_count, FcInUse[i].alloc_mem, + FcInUse[i].free_count, FcInUse[i].free_mem, + FcInUse[i].alloc_count - FcInUse[i].free_count, + FcInUse[i].alloc_mem - FcInUse[i].free_mem); + printf ("%16.16s%8d%8d%8d%8d%8d%8d\n", + "Total", + FcAllocCount, FcAllocMem, + FcFreeCount, FcFreeMem, + FcAllocCount - FcFreeCount, + FcAllocMem - FcFreeMem); + FcAllocNotify = 0; + FcFreeNotify = 0; +} + +void +FcMemAlloc (int kind, int size) +{ + if (FcDebug() & FC_DBG_MEMORY) + { + FcInUse[kind].alloc_count++; + FcInUse[kind].alloc_mem += size; + FcAllocCount++; + FcAllocMem += size; + FcAllocNotify += size; + if (FcAllocNotify > FcMemNotice) + FcMemReport (); + } +} + +void +FcMemFree (int kind, int size) +{ + if (FcDebug() & FC_DBG_MEMORY) + { + FcInUse[kind].free_count++; + FcInUse[kind].free_mem += size; + FcFreeCount++; + FcFreeMem += size; + FcFreeNotify += size; + if (FcFreeNotify > FcMemNotice) + FcMemReport (); + } +} +#define __fcinit__ +#include "fcaliastail.h" +#undef __fcinit__ diff --git a/fontconfig/src/fcint.h b/fontconfig/src/fcint.h new file mode 100644 index 000000000..233b4c302 --- /dev/null +++ b/fontconfig/src/fcint.h @@ -0,0 +1,1031 @@ +/* + * fontconfig/src/fcint.h + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _FCINT_H_ +#define _FCINT_H_ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdlib.h> +#include <stdio.h> +#ifdef HAVE_INTTYPES_H +#include <inttypes.h> +#elif defined(HAVE_STDINT_H) +#include <stdint.h> +#else +#error missing C99 integer data types +#endif +#include <string.h> +#include <ctype.h> +#include <errno.h> +#include <unistd.h> +#include <stddef.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <time.h> +#include <fontconfig/fontconfig.h> +#include <fontconfig/fcprivate.h> +#include "fcdeprecate.h" + +#ifndef FC_CONFIG_PATH +#define FC_CONFIG_PATH "fonts.conf" +#endif + +#ifdef _WIN32 +#define FC_SEARCH_PATH_SEPARATOR ';' +#else +#define FC_SEARCH_PATH_SEPARATOR ':' +#endif + +#define FC_DBG_MATCH 1 +#define FC_DBG_MATCHV 2 +#define FC_DBG_EDIT 4 +#define FC_DBG_FONTSET 8 +#define FC_DBG_CACHE 16 +#define FC_DBG_CACHEV 32 +#define FC_DBG_PARSE 64 +#define FC_DBG_SCAN 128 +#define FC_DBG_SCANV 256 +#define FC_DBG_MEMORY 512 +#define FC_DBG_CONFIG 1024 +#define FC_DBG_LANGSET 2048 +#define FC_DBG_OBJTYPES 4096 + +#define FC_MEM_CHARSET 0 +#define FC_MEM_CHARLEAF 1 +#define FC_MEM_FONTSET 2 +#define FC_MEM_FONTPTR 3 +#define FC_MEM_OBJECTSET 4 +#define FC_MEM_OBJECTPTR 5 +#define FC_MEM_MATRIX 6 +#define FC_MEM_PATTERN 7 +#define FC_MEM_PATELT 8 +#define FC_MEM_VALLIST 9 +#define FC_MEM_SUBSTATE 10 +#define FC_MEM_STRING 11 +#define FC_MEM_LISTBUCK 12 +#define FC_MEM_STRSET 13 +#define FC_MEM_STRLIST 14 +#define FC_MEM_CONFIG 15 +#define FC_MEM_LANGSET 16 +#define FC_MEM_ATOMIC 17 +#define FC_MEM_BLANKS 18 +#define FC_MEM_CACHE 19 +#define FC_MEM_STRBUF 20 +#define FC_MEM_SUBST 21 +#define FC_MEM_OBJECTTYPE 22 +#define FC_MEM_CONSTANT 23 +#define FC_MEM_TEST 24 +#define FC_MEM_EXPR 25 +#define FC_MEM_VSTACK 26 +#define FC_MEM_ATTR 27 +#define FC_MEM_PSTACK 28 +#define FC_MEM_STATICSTR 29 + +#define FC_MEM_NUM 30 + +#define FC_MIN(a,b) ((a) < (b) ? (a) : (b)) +#define FC_MAX(a,b) ((a) > (b) ? (a) : (b)) +#define FC_ABS(a) ((a) < 0 ? -(a) : (a)) + +/* slim_internal.h */ +#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun) +#define FcPrivate __attribute__((__visibility__("hidden"))) +#define HAVE_GNUC_ATTRIBUTE 1 +#include "fcalias.h" +#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550) +#define FcPrivate __hidden +#else /* not gcc >= 3.3 and not Sun Studio >= 8 */ +#define FcPrivate +#endif + +typedef enum _FcValueBinding { + FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame +} FcValueBinding; + +/* + * Serialized data structures use only offsets instead of pointers + * A low bit of 1 indicates an offset. + */ + +/* Is the provided pointer actually an offset? */ +#define FcIsEncodedOffset(p) ((((intptr_t) (p)) & 1) != 0) + +/* Encode offset in a pointer of type t */ +#define FcOffsetEncode(o,t) ((t *) ((o) | 1)) + +/* Decode a pointer into an offset */ +#define FcOffsetDecode(p) (((intptr_t) (p)) & ~1) + +/* Compute pointer offset */ +#define FcPtrToOffset(b,p) ((intptr_t) (p) - (intptr_t) (b)) + +/* Given base address, offset and type, return a pointer */ +#define FcOffsetToPtr(b,o,t) ((t *) ((intptr_t) (b) + (o))) + +/* Given base address, encoded offset and type, return a pointer */ +#define FcEncodedOffsetToPtr(b,p,t) FcOffsetToPtr(b,FcOffsetDecode(p),t) + +/* Given base address, pointer and type, return an encoded offset */ +#define FcPtrToEncodedOffset(b,p,t) FcOffsetEncode(FcPtrToOffset(b,p),t) + +/* Given a structure, offset member and type, return pointer */ +#define FcOffsetMember(s,m,t) FcOffsetToPtr(s,(s)->m,t) + +/* Given a structure, encoded offset member and type, return pointer to member */ +#define FcEncodedOffsetMember(s,m,t) FcOffsetToPtr(s,FcOffsetDecode((s)->m), t) + +/* Given a structure, member and type, convert the member to a pointer */ +#define FcPointerMember(s,m,t) (FcIsEncodedOffset((s)->m) ? \ + FcEncodedOffsetMember (s,m,t) : \ + (s)->m) + +/* + * Serialized values may hold strings, charsets and langsets as pointers, + * unfortunately FcValue is an exposed type so we can't just always use + * offsets + */ +#define FcValueString(v) FcPointerMember(v,u.s,FcChar8) +#define FcValueCharSet(v) FcPointerMember(v,u.c,const FcCharSet) +#define FcValueLangSet(v) FcPointerMember(v,u.l,const FcLangSet) + +typedef struct _FcValueList *FcValueListPtr; + +typedef struct _FcValueList { + struct _FcValueList *next; + FcValue value; + FcValueBinding binding; +} FcValueList; + +#define FcValueListNext(vl) FcPointerMember(vl,next,FcValueList) + +typedef int FcObject; + +typedef struct _FcPatternElt *FcPatternEltPtr; + +/* + * Pattern elts are stuck in a structure connected to the pattern, + * so they get moved around when the pattern is resized. Hence, the + * values field must be a pointer/offset instead of just an offset + */ +typedef struct _FcPatternElt { + FcObject object; + FcValueList *values; +} FcPatternElt; + +#define FcPatternEltValues(pe) FcPointerMember(pe,values,FcValueList) + +struct _FcPattern { + int num; + int size; + intptr_t elts_offset; + int ref; +}; + +#define FcPatternElts(p) FcOffsetMember(p,elts_offset,FcPatternElt) + +#define FcFontSetFonts(fs) FcPointerMember(fs,fonts,FcPattern *) + +#define FcFontSetFont(fs,i) (FcIsEncodedOffset((fs)->fonts) ? \ + FcEncodedOffsetToPtr(fs, \ + FcFontSetFonts(fs)[i], \ + FcPattern) : \ + fs->fonts[i]) + +typedef enum _FcOp { + FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpBool, FcOpCharSet, + FcOpNil, + FcOpField, FcOpConst, + FcOpAssign, FcOpAssignReplace, + FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast, + FcOpQuest, + FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, + FcOpContains, FcOpListing, FcOpNotContains, + FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual, + FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide, + FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc, + FcOpInvalid +} FcOp; + +typedef struct _FcExpr { + FcOp op; + union { + int ival; + double dval; + FcChar8 *sval; + FcMatrix *mval; + FcBool bval; + FcCharSet *cval; + FcObject object; + FcChar8 *constant; + struct { + struct _FcExpr *left, *right; + } tree; + } u; +} FcExpr; + +typedef struct _FcExprPage FcExprPage; + +struct _FcExprPage { + FcExprPage *next_page; + FcExpr *next; + FcExpr exprs[(1024 - 2/* two pointers */ - 2/* malloc overhead */) * sizeof (void *) / sizeof (FcExpr)]; + FcExpr end[0]; +}; + +typedef enum _FcQual { + FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst +} FcQual; + +#define FcMatchDefault ((FcMatchKind) -1) + +typedef struct _FcTest { + struct _FcTest *next; + FcMatchKind kind; + FcQual qual; + FcObject object; + FcOp op; + FcExpr *expr; +} FcTest; + +typedef struct _FcEdit { + struct _FcEdit *next; + FcObject object; + FcOp op; + FcExpr *expr; + FcValueBinding binding; +} FcEdit; + +typedef struct _FcSubst { + struct _FcSubst *next; + FcTest *test; + FcEdit *edit; +} FcSubst; + +typedef struct _FcCharLeaf { + FcChar32 map[256/32]; +} FcCharLeaf; + +#define FC_REF_CONSTANT -1 + +struct _FcCharSet { + int ref; /* reference count */ + int num; /* size of leaves and numbers arrays */ + intptr_t leaves_offset; + intptr_t numbers_offset; +}; + +#define FcCharSetLeaves(c) FcOffsetMember(c,leaves_offset,intptr_t) +#define FcCharSetLeaf(c,i) (FcOffsetToPtr(FcCharSetLeaves(c), \ + FcCharSetLeaves(c)[i], \ + FcCharLeaf)) +#define FcCharSetNumbers(c) FcOffsetMember(c,numbers_offset,FcChar16) + +struct _FcStrSet { + int ref; /* reference count */ + int num; + int size; + FcChar8 **strs; +}; + +struct _FcStrList { + FcStrSet *set; + int n; +}; + +typedef struct _FcStrBuf { + FcChar8 *buf; + FcBool allocated; + FcBool failed; + int len; + int size; + FcChar8 buf_static[16 * sizeof (void *)]; +} FcStrBuf; + +struct _FcCache { + int magic; /* FC_CACHE_MAGIC_MMAP or FC_CACHE_ALLOC */ + int version; /* FC_CACHE_CONTENT_VERSION */ + intptr_t size; /* size of file */ + intptr_t dir; /* offset to dir name */ + intptr_t dirs; /* offset to subdirs */ + int dirs_count; /* number of subdir strings */ + intptr_t set; /* offset to font set */ + int mtime; /* low bits of directory mtime */ +}; + +#undef FcCacheDir +#undef FcCacheSubdir +#define FcCacheDir(c) FcOffsetMember(c,dir,FcChar8) +#define FcCacheDirs(c) FcOffsetMember(c,dirs,intptr_t) +#define FcCacheSet(c) FcOffsetMember(c,set,FcFontSet) +#define FcCacheSubdir(c,i) FcOffsetToPtr (FcCacheDirs(c),\ + FcCacheDirs(c)[i], \ + FcChar8) + +/* + * Used while constructing a directory cache object + */ + +#define FC_SERIALIZE_HASH_SIZE 8191 + +typedef union _FcAlign { + double d; + int i; + intptr_t ip; + FcBool b; + void *p; +} FcAlign; + +typedef struct _FcSerializeBucket { + struct _FcSerializeBucket *next; + const void *object; + intptr_t offset; +} FcSerializeBucket; + +typedef struct _FcCharSetFreezer FcCharSetFreezer; + +typedef struct _FcSerialize { + intptr_t size; + FcCharSetFreezer *cs_freezer; + void *linear; + FcSerializeBucket *buckets[FC_SERIALIZE_HASH_SIZE]; +} FcSerialize; + +/* + * To map adobe glyph names to unicode values, a precomputed hash + * table is used + */ + +typedef struct _FcGlyphName { + FcChar32 ucs; /* unicode value */ + FcChar8 name[1]; /* name extends beyond struct */ +} FcGlyphName; + +/* + * To perform case-insensitive string comparisons, a table + * is used which holds three different kinds of folding data. + * + * The first is a range of upper case values mapping to a range + * of their lower case equivalents. Within each range, the offset + * between upper and lower case is constant. + * + * The second is a range of upper case values which are interleaved + * with their lower case equivalents. + * + * The third is a set of raw unicode values mapping to a list + * of unicode values for comparison purposes. This allows conversion + * of ß to "ss" so that SS, ss and ß all match. A separate array + * holds the list of unicode values for each entry. + * + * These are packed into a single table. Using a binary search, + * the appropriate entry can be located. + */ + +#define FC_CASE_FOLD_RANGE 0 +#define FC_CASE_FOLD_EVEN_ODD 1 +#define FC_CASE_FOLD_FULL 2 + +typedef struct _FcCaseFold { + FcChar32 upper; + FcChar16 method : 2; + FcChar16 count : 14; + short offset; /* lower - upper for RANGE, table id for FULL */ +} FcCaseFold; + +#define FC_MAX_FILE_LEN 4096 + +#define FC_CACHE_MAGIC_MMAP 0xFC02FC04 +#define FC_CACHE_MAGIC_ALLOC 0xFC02FC05 +#define FC_CACHE_CONTENT_VERSION 3 /* also check FC_CACHE_VERSION */ + +struct _FcAtomic { + FcChar8 *file; /* original file name */ + FcChar8 *new; /* temp file name -- write data here */ + FcChar8 *lck; /* lockfile name (used for locking) */ + FcChar8 *tmp; /* tmpfile name (used for locking) */ +}; + +struct _FcBlanks { + int nblank; + int sblank; + FcChar32 *blanks; +}; + +struct _FcConfig { + /* + * File names loaded from the configuration -- saved here as the + * cache file must be consulted before the directories are scanned, + * and those directives may occur in any order + */ + FcStrSet *configDirs; /* directories to scan for fonts */ + /* + * Set of allowed blank chars -- used to + * trim fonts of bogus glyphs + */ + FcBlanks *blanks; + /* + * List of directories containing fonts, + * built by recursively scanning the set + * of configured directories + */ + FcStrSet *fontDirs; + /* + * List of directories containing cache files. + */ + FcStrSet *cacheDirs; + /* + * Names of all of the configuration files used + * to create this configuration + */ + FcStrSet *configFiles; /* config files loaded */ + /* + * Substitution instructions for patterns and fonts; + * maxObjects is used to allocate appropriate intermediate storage + * while performing a whole set of substitutions + */ + FcSubst *substPattern; /* substitutions for patterns */ + FcSubst *substFont; /* substitutions for fonts */ + FcSubst *substScan; /* substitutions for scanned fonts */ + int maxObjects; /* maximum number of tests in all substs */ + /* + * List of patterns used to control font file selection + */ + FcStrSet *acceptGlobs; + FcStrSet *rejectGlobs; + FcFontSet *acceptPatterns; + FcFontSet *rejectPatterns; + /* + * The set of fonts loaded from the listed directories; the + * order within the set does not determine the font selection, + * except in the case of identical matches in which case earlier fonts + * match preferrentially + */ + FcFontSet *fonts[FcSetApplication + 1]; + /* + * Fontconfig can periodically rescan the system configuration + * and font directories. This rescanning occurs when font + * listing requests are made, but no more often than rescanInterval + * seconds apart. + */ + time_t rescanTime; /* last time information was scanned */ + int rescanInterval; /* interval between scans */ + + int ref; /* reference count */ + + FcExprPage *expr_pool; /* pool of FcExpr's */ +}; + +extern FcPrivate FcConfig *_fcConfig; + +typedef struct _FcFileTime { + time_t time; + FcBool set; +} FcFileTime; + +typedef struct _FcCharMap FcCharMap; + +/* fcblanks.c */ + +/* fccache.c */ + +FcPrivate FcCache * +FcDirCacheScan (const FcChar8 *dir, FcConfig *config); + +FcPrivate FcCache * +FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs); + +FcPrivate FcBool +FcDirCacheWrite (FcCache *cache, FcConfig *config); + +FcPrivate void +FcCacheObjectReference (void *object); + +FcPrivate void +FcCacheObjectDereference (void *object); + +FcPrivate void +FcCacheFini (void); + +FcPrivate void +FcDirCacheReference (FcCache *cache, int nref); + +#ifdef _WIN32 +FcPrivate int +FcStat (const char *file, struct stat *statb); +#else +#define FcStat stat +#endif + +/* fccfg.c */ + +FcPrivate FcExpr * +FcConfigAllocExpr (FcConfig *config); + +FcPrivate FcBool +FcConfigAddConfigDir (FcConfig *config, + const FcChar8 *d); + +FcPrivate FcBool +FcConfigAddFontDir (FcConfig *config, + const FcChar8 *d); + +FcPrivate FcBool +FcConfigAddDir (FcConfig *config, + const FcChar8 *d); + +FcPrivate FcBool +FcConfigAddCacheDir (FcConfig *config, + const FcChar8 *d); + +FcPrivate FcBool +FcConfigAddConfigFile (FcConfig *config, + const FcChar8 *f); + +FcPrivate FcBool +FcConfigAddBlank (FcConfig *config, + FcChar32 blank); + +FcPrivate FcBool +FcConfigAddEdit (FcConfig *config, + FcTest *test, + FcEdit *edit, + FcMatchKind kind); + +FcPrivate void +FcConfigSetFonts (FcConfig *config, + FcFontSet *fonts, + FcSetName set); + +FcPrivate FcBool +FcConfigCompareValue (const FcValue *m, + FcOp op, + const FcValue *v); + +FcPrivate FcBool +FcConfigGlobAdd (FcConfig *config, + const FcChar8 *glob, + FcBool accept); + +FcPrivate FcBool +FcConfigAcceptFilename (FcConfig *config, + const FcChar8 *filename); + +FcPrivate FcBool +FcConfigPatternsAdd (FcConfig *config, + FcPattern *pattern, + FcBool accept); + +FcPrivate FcBool +FcConfigAcceptFont (FcConfig *config, + const FcPattern *font); + +FcPrivate FcFileTime +FcConfigModifiedTime (FcConfig *config); + +FcPrivate FcBool +FcConfigAddCache (FcConfig *config, FcCache *cache, + FcSetName set, FcStrSet *dirSet); + +/* fcserialize.c */ +FcPrivate intptr_t +FcAlignSize (intptr_t size); + +FcPrivate FcSerialize * +FcSerializeCreate (void); + +FcPrivate void +FcSerializeDestroy (FcSerialize *serialize); + +FcPrivate FcBool +FcSerializeAlloc (FcSerialize *serialize, const void *object, int size); + +FcPrivate intptr_t +FcSerializeReserve (FcSerialize *serialize, int size); + +FcPrivate intptr_t +FcSerializeOffset (FcSerialize *serialize, const void *object); + +FcPrivate void * +FcSerializePtr (FcSerialize *serialize, const void *object); + +FcPrivate FcBool +FcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l); + +FcPrivate FcLangSet * +FcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l); + +/* fccharset.c */ +FcPrivate void +FcLangCharSetPopulate (void); + +FcPrivate FcCharSetFreezer * +FcCharSetFreezerCreate (void); + +FcPrivate const FcCharSet * +FcCharSetFreeze (FcCharSetFreezer *freezer, const FcCharSet *fcs); + +FcPrivate void +FcCharSetFreezerDestroy (FcCharSetFreezer *freezer); + +FcPrivate FcBool +FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c); + +FcPrivate FcCharSet * +FcNameParseCharSet (FcChar8 *string); + +FcPrivate FcBool +FcNameUnparseValue (FcStrBuf *buf, + FcValue *v0, + FcChar8 *escape); + +FcPrivate FcBool +FcNameUnparseValueList (FcStrBuf *buf, + FcValueListPtr v, + FcChar8 *escape); + +FcPrivate FcCharLeaf * +FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4); + +FcPrivate FcBool +FcCharSetSerializeAlloc(FcSerialize *serialize, const FcCharSet *cs); + +FcPrivate FcCharSet * +FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs); + +FcPrivate FcChar16 * +FcCharSetGetNumbers(const FcCharSet *c); + +/* fcdbg.c */ +FcPrivate void +FcValueListPrint (const FcValueListPtr l); + +FcPrivate void +FcLangSetPrint (const FcLangSet *ls); + +FcPrivate void +FcOpPrint (FcOp op); + +FcPrivate void +FcTestPrint (const FcTest *test); + +FcPrivate void +FcExprPrint (const FcExpr *expr); + +FcPrivate void +FcEditPrint (const FcEdit *edit); + +FcPrivate void +FcSubstPrint (const FcSubst *subst); + +FcPrivate void +FcCharSetPrint (const FcCharSet *c); + +extern FcPrivate int FcDebugVal; + +#define FcDebug() (FcDebugVal) + +FcPrivate void +FcInitDebug (void); + +/* fcdefault.c */ +FcPrivate FcChar8 * +FcGetDefaultLang (void); + +/* fcdir.c */ + +FcPrivate FcBool +FcFileScanConfig (FcFontSet *set, + FcStrSet *dirs, + FcBlanks *blanks, + const FcChar8 *file, + FcConfig *config); + +FcPrivate FcBool +FcDirScanConfig (FcFontSet *set, + FcStrSet *dirs, + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force, + FcConfig *config); + +/* fcfont.c */ +FcPrivate int +FcFontDebug (void); + +/* fcfs.c */ + +FcPrivate FcBool +FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s); + +FcPrivate FcFontSet * +FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s); + +/* fcxml.c */ +FcPrivate void +FcTestDestroy (FcTest *test); + +FcPrivate void +FcEditDestroy (FcEdit *e); + +/* fcinit.c */ + +FcPrivate void +FcMemReport (void); + +FcPrivate void +FcMemAlloc (int kind, int size); + +FcPrivate void +FcMemFree (int kind, int size); + +/* fclang.c */ +FcPrivate FcLangSet * +FcFreeTypeLangSet (const FcCharSet *charset, + const FcChar8 *exclusiveLang); + +FcPrivate FcLangResult +FcLangCompare (const FcChar8 *s1, const FcChar8 *s2); + +FcPrivate FcLangSet * +FcLangSetPromote (const FcChar8 *lang); + +FcPrivate FcLangSet * +FcNameParseLangSet (const FcChar8 *string); + +FcPrivate FcBool +FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls); + +FcPrivate FcChar8 * +FcNameUnparseEscaped (FcPattern *pat, FcBool escape); + +/* fclist.c */ + +FcPrivate FcBool +FcListPatternMatchAny (const FcPattern *p, + const FcPattern *font); + +/* fcmatch.c */ + +/* fcname.c */ + +/* + * NOTE -- this ordering is part of the cache file format. + * It must also match the ordering in fcname.c + */ + +#define FC_FAMILY_OBJECT 1 +#define FC_FAMILYLANG_OBJECT 2 +#define FC_STYLE_OBJECT 3 +#define FC_STYLELANG_OBJECT 4 +#define FC_FULLNAME_OBJECT 5 +#define FC_FULLNAMELANG_OBJECT 6 +#define FC_SLANT_OBJECT 7 +#define FC_WEIGHT_OBJECT 8 +#define FC_WIDTH_OBJECT 9 +#define FC_SIZE_OBJECT 10 +#define FC_ASPECT_OBJECT 11 +#define FC_PIXEL_SIZE_OBJECT 12 +#define FC_SPACING_OBJECT 13 +#define FC_FOUNDRY_OBJECT 14 +#define FC_ANTIALIAS_OBJECT 15 +#define FC_HINT_STYLE_OBJECT 16 +#define FC_HINTING_OBJECT 17 +#define FC_VERTICAL_LAYOUT_OBJECT 18 +#define FC_AUTOHINT_OBJECT 19 +#define FC_GLOBAL_ADVANCE_OBJECT 20 +#define FC_FILE_OBJECT 21 +#define FC_INDEX_OBJECT 22 +#define FC_RASTERIZER_OBJECT 23 +#define FC_OUTLINE_OBJECT 24 +#define FC_SCALABLE_OBJECT 25 +#define FC_DPI_OBJECT 26 +#define FC_RGBA_OBJECT 27 +#define FC_SCALE_OBJECT 28 +#define FC_MINSPACE_OBJECT 29 +#define FC_CHAR_WIDTH_OBJECT 30 +#define FC_CHAR_HEIGHT_OBJECT 31 +#define FC_MATRIX_OBJECT 32 +#define FC_CHARSET_OBJECT 33 +#define FC_LANG_OBJECT 34 +#define FC_FONTVERSION_OBJECT 35 +#define FC_CAPABILITY_OBJECT 36 +#define FC_FONTFORMAT_OBJECT 37 +#define FC_EMBOLDEN_OBJECT 38 +#define FC_EMBEDDED_BITMAP_OBJECT 39 +#define FC_DECORATIVE_OBJECT 40 +#define FC_LCD_FILTER_OBJECT 41 +#define FC_MAX_BASE_OBJECT FC_LCD_FILTER_OBJECT + +FcPrivate FcBool +FcNameBool (const FcChar8 *v, FcBool *result); + +FcPrivate FcBool +FcObjectValidType (FcObject object, FcType type); + +FcPrivate FcObject +FcObjectFromName (const char * name); + +FcPrivate const char * +FcObjectName (FcObject object); + +FcPrivate FcObjectSet * +FcObjectGetSet (void); + +FcPrivate FcBool +FcObjectInit (void); + +FcPrivate void +FcObjectFini (void); + +#define FcObjectCompare(a, b) ((int) a - (int) b) + +/* fcpat.c */ + +FcPrivate FcValue +FcValueCanonicalize (const FcValue *v); + +FcPrivate void +FcValueListDestroy (FcValueListPtr l); + +FcPrivate FcPatternElt * +FcPatternObjectFindElt (const FcPattern *p, FcObject object); + +FcPrivate FcPatternElt * +FcPatternObjectInsertElt (FcPattern *p, FcObject object); + +FcPrivate FcBool +FcPatternObjectAddWithBinding (FcPattern *p, + FcObject object, + FcValue value, + FcValueBinding binding, + FcBool append); + +FcPrivate FcBool +FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append); + +FcPrivate FcBool +FcPatternObjectAddWeak (FcPattern *p, FcObject object, FcValue value, FcBool append); + +FcPrivate FcResult +FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v); + +FcPrivate FcBool +FcPatternObjectDel (FcPattern *p, FcObject object); + +FcPrivate FcBool +FcPatternObjectRemove (FcPattern *p, FcObject object, int id); + +FcPrivate FcBool +FcPatternObjectAddInteger (FcPattern *p, FcObject object, int i); + +FcPrivate FcBool +FcPatternObjectAddDouble (FcPattern *p, FcObject object, double d); + +FcPrivate FcBool +FcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s); + +FcPrivate FcBool +FcPatternObjectAddMatrix (FcPattern *p, FcObject object, const FcMatrix *s); + +FcPrivate FcBool +FcPatternObjectAddCharSet (FcPattern *p, FcObject object, const FcCharSet *c); + +FcPrivate FcBool +FcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b); + +FcPrivate FcBool +FcPatternObjectAddLangSet (FcPattern *p, FcObject object, const FcLangSet *ls); + +FcPrivate FcResult +FcPatternObjectGetInteger (const FcPattern *p, FcObject object, int n, int *i); + +FcPrivate FcResult +FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int n, double *d); + +FcPrivate FcResult +FcPatternObjectGetString (const FcPattern *p, FcObject object, int n, FcChar8 ** s); + +FcPrivate FcResult +FcPatternObjectGetMatrix (const FcPattern *p, FcObject object, int n, FcMatrix **s); + +FcPrivate FcResult +FcPatternObjectGetCharSet (const FcPattern *p, FcObject object, int n, FcCharSet **c); + +FcPrivate FcResult +FcPatternObjectGetBool (const FcPattern *p, FcObject object, int n, FcBool *b); + +FcPrivate FcResult +FcPatternObjectGetLangSet (const FcPattern *p, FcObject object, int n, FcLangSet **ls); + +FcPrivate void +FcPatternFini (void); + +FcPrivate FcBool +FcPatternAppend (FcPattern *p, FcPattern *s); + +FcPrivate const FcChar8 * +FcStrStaticName (const FcChar8 *name); + +FcPrivate FcChar32 +FcStringHash (const FcChar8 *s); + +FcPrivate FcBool +FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat); + +FcPrivate FcPattern * +FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat); + +FcPrivate FcBool +FcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *pat); + +FcPrivate FcValueList * +FcValueListSerialize (FcSerialize *serialize, const FcValueList *pat); + +/* fcrender.c */ + +/* fcmatrix.c */ + +extern FcPrivate const FcMatrix FcIdentityMatrix; + +FcPrivate void +FcMatrixFree (FcMatrix *mat); + +/* fcstr.c */ +FcPrivate void +FcStrSetSort (FcStrSet * set); + +FcPrivate void +FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size); + +FcPrivate void +FcStrBufDestroy (FcStrBuf *buf); + +FcPrivate FcChar8 * +FcStrBufDone (FcStrBuf *buf); + +FcPrivate FcChar8 * +FcStrBufDoneStatic (FcStrBuf *buf); + +FcPrivate FcBool +FcStrBufChar (FcStrBuf *buf, FcChar8 c); + +FcPrivate FcBool +FcStrBufString (FcStrBuf *buf, const FcChar8 *s); + +FcPrivate FcBool +FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len); + +FcPrivate int +FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2); + +FcPrivate const FcChar8 * +FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2); + +FcPrivate const FcChar8 * +FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2); + +FcPrivate const FcChar8 * +FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2); + +FcPrivate FcBool +FcStrUsesHome (const FcChar8 *s); + +FcPrivate FcChar8 * +FcStrLastSlash (const FcChar8 *path); + +FcPrivate FcChar32 +FcStrHashIgnoreCase (const FcChar8 *s); + +FcPrivate FcChar8 * +FcStrCanonFilename (const FcChar8 *s); + +FcPrivate FcBool +FcStrSerializeAlloc (FcSerialize *serialize, const FcChar8 *str); + +FcPrivate FcChar8 * +FcStrSerialize (FcSerialize *serialize, const FcChar8 *str); + +#endif /* _FC_INT_H_ */ diff --git a/fontconfig/src/fclang.c b/fontconfig/src/fclang.c new file mode 100644 index 000000000..1d62c4e3f --- /dev/null +++ b/fontconfig/src/fclang.c @@ -0,0 +1,822 @@ +/* + * fontconfig/src/fclang.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include "fcftint.h" + +typedef struct { + const FcChar8 lang[8]; + const FcCharSet charset; +} FcLangCharSet; + +typedef struct { + int begin; + int end; +} FcLangCharSetRange; + +#include "../fc-lang/fclang.h" + +struct _FcLangSet { + FcStrSet *extra; + FcChar32 map_size; + FcChar32 map[NUM_LANG_SET_MAP]; +}; + +static void +FcLangSetBitSet (FcLangSet *ls, + unsigned int id) +{ + int bucket; + + id = fcLangCharSetIndices[id]; + bucket = id >> 5; + if (bucket >= ls->map_size) + return; /* shouldn't happen really */ + + ls->map[bucket] |= ((FcChar32) 1 << (id & 0x1f)); +} + +static FcBool +FcLangSetBitGet (const FcLangSet *ls, + unsigned int id) +{ + int bucket; + + id = fcLangCharSetIndices[id]; + bucket = id >> 5; + if (bucket >= ls->map_size) + return FcFalse; + + return ((ls->map[bucket] >> (id & 0x1f)) & 1) ? FcTrue : FcFalse; +} + +FcLangSet * +FcFreeTypeLangSet (const FcCharSet *charset, + const FcChar8 *exclusiveLang) +{ + int i, j; + FcChar32 missing; + const FcCharSet *exclusiveCharset = 0; + FcLangSet *ls; + + if (exclusiveLang) + exclusiveCharset = FcLangGetCharSet (exclusiveLang); + ls = FcLangSetCreate (); + if (!ls) + return 0; + if (FcDebug() & FC_DBG_LANGSET) + { + printf ("font charset"); + FcCharSetPrint (charset); + printf ("\n"); + } + for (i = 0; i < NUM_LANG_CHAR_SET; i++) + { + if (FcDebug() & FC_DBG_LANGSET) + { + printf ("%s charset", fcLangCharSets[i].lang); + FcCharSetPrint (&fcLangCharSets[i].charset); + printf ("\n"); + } + + /* + * Check for Han charsets to make fonts + * which advertise support for a single language + * not support other Han languages + */ + if (exclusiveCharset && + FcFreeTypeIsExclusiveLang (fcLangCharSets[i].lang)) + { + if (fcLangCharSets[i].charset.num != exclusiveCharset->num) + continue; + + for (j = 0; j < fcLangCharSets[i].charset.num; j++) + if (FcCharSetLeaf(&fcLangCharSets[i].charset, j) != + FcCharSetLeaf(exclusiveCharset, j)) + continue; + } + missing = FcCharSetSubtractCount (&fcLangCharSets[i].charset, charset); + if (FcDebug() & FC_DBG_SCANV) + { + if (missing && missing < 10) + { + FcCharSet *missed = FcCharSetSubtract (&fcLangCharSets[i].charset, + charset); + FcChar32 ucs4; + FcChar32 map[FC_CHARSET_MAP_SIZE]; + FcChar32 next; + + printf ("\n%s(%u) ", fcLangCharSets[i].lang, missing); + printf ("{"); + for (ucs4 = FcCharSetFirstPage (missed, map, &next); + ucs4 != FC_CHARSET_DONE; + ucs4 = FcCharSetNextPage (missed, map, &next)) + { + int i, j; + for (i = 0; i < FC_CHARSET_MAP_SIZE; i++) + if (map[i]) + { + for (j = 0; j < 32; j++) + if (map[i] & (1 << j)) + printf (" %04x", ucs4 + i * 32 + j); + } + } + printf (" }\n\t"); + FcCharSetDestroy (missed); + } + else + printf ("%s(%u) ", fcLangCharSets[i].lang, missing); + } + if (!missing) + FcLangSetBitSet (ls, i); + } + + if (FcDebug() & FC_DBG_SCANV) + printf ("\n"); + + + return ls; +} + +#define FcLangEnd(c) ((c) == '-' || (c) == '\0') + +FcLangResult +FcLangCompare (const FcChar8 *s1, const FcChar8 *s2) +{ + FcChar8 c1, c2; + FcLangResult result = FcLangDifferentLang; + + for (;;) + { + c1 = *s1++; + c2 = *s2++; + + c1 = FcToLower (c1); + c2 = FcToLower (c2); + if (c1 != c2) + { + if (FcLangEnd (c1) && FcLangEnd (c2)) + result = FcLangDifferentTerritory; + return result; + } + else if (!c1) + return FcLangEqual; + else if (c1 == '-') + result = FcLangDifferentTerritory; + } +} + +/* + * Return FcTrue when super contains sub. + * + * super contains sub if super and sub have the same + * language and either the same country or one + * is missing the country + */ + +static FcBool +FcLangContains (const FcChar8 *super, const FcChar8 *sub) +{ + FcChar8 c1, c2; + + for (;;) + { + c1 = *super++; + c2 = *sub++; + + c1 = FcToLower (c1); + c2 = FcToLower (c2); + if (c1 != c2) + { + /* see if super has a country while sub is mising one */ + if (c1 == '-' && c2 == '\0') + return FcTrue; + /* see if sub has a country while super is mising one */ + if (c1 == '\0' && c2 == '-') + return FcTrue; + return FcFalse; + } + else if (!c1) + return FcTrue; + } +} + +const FcCharSet * +FcLangGetCharSet (const FcChar8 *lang) +{ + int i; + int country = -1; + + for (i = 0; i < NUM_LANG_CHAR_SET; i++) + { + switch (FcLangCompare (lang, fcLangCharSets[i].lang)) { + case FcLangEqual: + return &fcLangCharSets[i].charset; + case FcLangDifferentTerritory: + if (country == -1) + country = i; + case FcLangDifferentLang: + default: + break; + } + } + if (country == -1) + return 0; + return &fcLangCharSets[country].charset; +} + +FcStrSet * +FcGetLangs (void) +{ + FcStrSet *langs; + int i; + + langs = FcStrSetCreate(); + if (!langs) + return 0; + + for (i = 0; i < NUM_LANG_CHAR_SET; i++) + FcStrSetAdd (langs, fcLangCharSets[i].lang); + + return langs; +} + +FcLangSet * +FcLangSetCreate (void) +{ + FcLangSet *ls; + + ls = malloc (sizeof (FcLangSet)); + if (!ls) + return 0; + FcMemAlloc (FC_MEM_LANGSET, sizeof (FcLangSet)); + memset (ls->map, '\0', sizeof (ls->map)); + ls->map_size = NUM_LANG_SET_MAP; + ls->extra = 0; + return ls; +} + +void +FcLangSetDestroy (FcLangSet *ls) +{ + if (ls->extra) + FcStrSetDestroy (ls->extra); + FcMemFree (FC_MEM_LANGSET, sizeof (FcLangSet)); + free (ls); +} + +FcLangSet * +FcLangSetCopy (const FcLangSet *ls) +{ + FcLangSet *new; + + new = FcLangSetCreate (); + if (!new) + goto bail0; + memset (new->map, '\0', sizeof (new->map)); + memcpy (new->map, ls->map, FC_MIN (sizeof (new->map), ls->map_size * sizeof (ls->map[0]))); + if (ls->extra) + { + FcStrList *list; + FcChar8 *extra; + + new->extra = FcStrSetCreate (); + if (!new->extra) + goto bail1; + + list = FcStrListCreate (ls->extra); + if (!list) + goto bail1; + + while ((extra = FcStrListNext (list))) + if (!FcStrSetAdd (new->extra, extra)) + { + FcStrListDone (list); + goto bail1; + } + FcStrListDone (list); + } + return new; +bail1: + FcLangSetDestroy (new); +bail0: + return 0; +} + +static int +FcLangSetIndex (const FcChar8 *lang) +{ + int low, high, mid = 0; + int cmp = 0; + FcChar8 firstChar = FcToLower(lang[0]); + FcChar8 secondChar = firstChar ? FcToLower(lang[1]) : '\0'; + + if (firstChar < 'a') + { + low = 0; + high = fcLangCharSetRanges[0].begin; + } + else if(firstChar > 'z') + { + low = fcLangCharSetRanges[25].begin; + high = NUM_LANG_CHAR_SET - 1; + } + else + { + low = fcLangCharSetRanges[firstChar - 'a'].begin; + high = fcLangCharSetRanges[firstChar - 'a'].end; + /* no matches */ + if (low > high) + return -low; /* next entry after where it would be */ + } + + while (low <= high) + { + mid = (high + low) >> 1; + if(fcLangCharSets[mid].lang[0] != firstChar) + cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang, lang); + else + { /* fast path for resolving 2-letter languages (by far the most common) after + * finding the first char (probably already true because of the hash table) */ + cmp = fcLangCharSets[mid].lang[1] - secondChar; + if (cmp == 0 && + (fcLangCharSets[mid].lang[2] != '\0' || + lang[2] != '\0')) + { + cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2, + lang+2); + } + } + if (cmp == 0) + return mid; + if (cmp < 0) + low = mid + 1; + else + high = mid - 1; + } + if (cmp < 0) + mid++; + return -(mid + 1); +} + +FcBool +FcLangSetAdd (FcLangSet *ls, const FcChar8 *lang) +{ + int id; + + id = FcLangSetIndex (lang); + if (id >= 0) + { + FcLangSetBitSet (ls, id); + return FcTrue; + } + if (!ls->extra) + { + ls->extra = FcStrSetCreate (); + if (!ls->extra) + return FcFalse; + } + return FcStrSetAdd (ls->extra, lang); +} + +FcLangResult +FcLangSetHasLang (const FcLangSet *ls, const FcChar8 *lang) +{ + int id; + FcLangResult best, r; + int i; + + id = FcLangSetIndex (lang); + if (id < 0) + id = -id - 1; + else if (FcLangSetBitGet (ls, id)) + return FcLangEqual; + best = FcLangDifferentLang; + for (i = id - 1; i >= 0; i--) + { + r = FcLangCompare (lang, fcLangCharSets[i].lang); + if (r == FcLangDifferentLang) + break; + if (FcLangSetBitGet (ls, i) && r < best) + best = r; + } + for (i = id; i < NUM_LANG_CHAR_SET; i++) + { + r = FcLangCompare (lang, fcLangCharSets[i].lang); + if (r == FcLangDifferentLang) + break; + if (FcLangSetBitGet (ls, i) && r < best) + best = r; + } + if (ls->extra) + { + FcStrList *list = FcStrListCreate (ls->extra); + FcChar8 *extra; + + if (list) + { + while (best > FcLangEqual && (extra = FcStrListNext (list))) + { + r = FcLangCompare (lang, extra); + if (r < best) + best = r; + } + FcStrListDone (list); + } + } + return best; +} + +static FcLangResult +FcLangSetCompareStrSet (const FcLangSet *ls, FcStrSet *set) +{ + FcStrList *list = FcStrListCreate (set); + FcLangResult r, best = FcLangDifferentLang; + FcChar8 *extra; + + if (list) + { + while (best > FcLangEqual && (extra = FcStrListNext (list))) + { + r = FcLangSetHasLang (ls, extra); + if (r < best) + best = r; + } + FcStrListDone (list); + } + return best; +} + +FcLangResult +FcLangSetCompare (const FcLangSet *lsa, const FcLangSet *lsb) +{ + int i, j, count; + FcLangResult best, r; + + count = FC_MIN (lsa->map_size, lsb->map_size); + count = FC_MIN (NUM_LANG_SET_MAP, count); + for (i = 0; i < count; i++) + if (lsa->map[i] & lsb->map[i]) + return FcLangEqual; + best = FcLangDifferentLang; + for (j = 0; j < NUM_COUNTRY_SET; j++) + for (i = 0; i < count; i++) + if ((lsa->map[i] & fcLangCountrySets[j][i]) && + (lsb->map[i] & fcLangCountrySets[j][i])) + { + best = FcLangDifferentTerritory; + break; + } + if (lsa->extra) + { + r = FcLangSetCompareStrSet (lsb, lsa->extra); + if (r < best) + best = r; + } + if (best > FcLangEqual && lsb->extra) + { + r = FcLangSetCompareStrSet (lsa, lsb->extra); + if (r < best) + best = r; + } + return best; +} + +/* + * Used in computing values -- mustn't allocate any storage + */ +FcLangSet * +FcLangSetPromote (const FcChar8 *lang) +{ + static FcLangSet ls; + static FcStrSet strs; + static FcChar8 *str; + int id; + + memset (ls.map, '\0', sizeof (ls.map)); + ls.extra = 0; + id = FcLangSetIndex (lang); + if (id > 0) + { + FcLangSetBitSet (&ls, id); + } + else + { + ls.extra = &strs; + strs.num = 1; + strs.size = 1; + strs.strs = &str; + strs.ref = 1; + str = (FcChar8 *) lang; + } + return &ls; +} + +FcChar32 +FcLangSetHash (const FcLangSet *ls) +{ + FcChar32 h = 0; + int i, count; + + count = FC_MIN (ls->map_size, NUM_LANG_SET_MAP); + for (i = 0; i < count; i++) + h ^= ls->map[i]; + if (ls->extra) + h ^= ls->extra->num; + return h; +} + +FcLangSet * +FcNameParseLangSet (const FcChar8 *string) +{ + FcChar8 lang[32], c = 0; + int i; + FcLangSet *ls; + + ls = FcLangSetCreate (); + if (!ls) + goto bail0; + + for(;;) + { + for(i = 0; i < 31;i++) + { + c = *string++; + if(c == '\0' || c == '|') + break; /* end of this code */ + lang[i] = c; + } + lang[i] = '\0'; + if (!FcLangSetAdd (ls, lang)) + goto bail1; + if(c == '\0') + break; + } + return ls; +bail1: + FcLangSetDestroy (ls); +bail0: + return 0; +} + +FcBool +FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls) +{ + int i, bit, count; + FcChar32 bits; + FcBool first = FcTrue; + + count = FC_MIN (ls->map_size, NUM_LANG_SET_MAP); + for (i = 0; i < count; i++) + { + if ((bits = ls->map[i])) + { + for (bit = 0; bit <= 31; bit++) + if (bits & (1 << bit)) + { + int id = (i << 5) | bit; + if (!first) + if (!FcStrBufChar (buf, '|')) + return FcFalse; + if (!FcStrBufString (buf, fcLangCharSets[fcLangCharSetIndicesInv[id]].lang)) + return FcFalse; + first = FcFalse; + } + } + } + if (ls->extra) + { + FcStrList *list = FcStrListCreate (ls->extra); + FcChar8 *extra; + + if (!list) + return FcFalse; + while ((extra = FcStrListNext (list))) + { + if (!first) + if (!FcStrBufChar (buf, '|')) + { + FcStrListDone (list); + return FcFalse; + } + if (!FcStrBufString (buf, extra)) + { + FcStrListDone (list); + return FcFalse; + } + first = FcFalse; + } + FcStrListDone (list); + } + return FcTrue; +} + +FcBool +FcLangSetEqual (const FcLangSet *lsa, const FcLangSet *lsb) +{ + int i, count; + + count = FC_MIN (lsa->map_size, lsb->map_size); + count = FC_MIN (NUM_LANG_SET_MAP, count); + for (i = 0; i < count; i++) + { + if (lsa->map[i] != lsb->map[i]) + return FcFalse; + } + if (!lsa->extra && !lsb->extra) + return FcTrue; + if (lsa->extra && lsb->extra) + return FcStrSetEqual (lsa->extra, lsb->extra); + return FcFalse; +} + +static FcBool +FcLangSetContainsLang (const FcLangSet *ls, const FcChar8 *lang) +{ + int id; + int i; + + id = FcLangSetIndex (lang); + if (id < 0) + id = -id - 1; + else if (FcLangSetBitGet (ls, id)) + return FcTrue; + /* + * search up and down among equal languages for a match + */ + for (i = id - 1; i >= 0; i--) + { + if (FcLangCompare (fcLangCharSets[i].lang, lang) == FcLangDifferentLang) + break; + if (FcLangSetBitGet (ls, i) && + FcLangContains (fcLangCharSets[i].lang, lang)) + return FcTrue; + } + for (i = id; i < NUM_LANG_CHAR_SET; i++) + { + if (FcLangCompare (fcLangCharSets[i].lang, lang) == FcLangDifferentLang) + break; + if (FcLangSetBitGet (ls, i) && + FcLangContains (fcLangCharSets[i].lang, lang)) + return FcTrue; + } + if (ls->extra) + { + FcStrList *list = FcStrListCreate (ls->extra); + FcChar8 *extra; + + if (list) + { + while ((extra = FcStrListNext (list))) + { + if (FcLangContains (extra, lang)) + break; + } + FcStrListDone (list); + if (extra) + return FcTrue; + } + } + return FcFalse; +} + +/* + * return FcTrue if lsa contains every language in lsb + */ +FcBool +FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb) +{ + int i, j, count; + FcChar32 missing; + + if (FcDebug() & FC_DBG_MATCHV) + { + printf ("FcLangSet "); FcLangSetPrint (lsa); + printf (" contains "); FcLangSetPrint (lsb); + printf ("\n"); + } + /* + * check bitmaps for missing language support + */ + count = FC_MIN (lsa->map_size, lsb->map_size); + count = FC_MIN (NUM_LANG_SET_MAP, count); + for (i = 0; i < count; i++) + { + missing = lsb->map[i] & ~lsa->map[i]; + if (missing) + { + for (j = 0; j < 32; j++) + if (missing & (1 << j)) + { + if (!FcLangSetContainsLang (lsa, + fcLangCharSets[fcLangCharSetIndicesInv[i*32 + j]].lang)) + { + if (FcDebug() & FC_DBG_MATCHV) + printf ("\tMissing bitmap %s\n", fcLangCharSets[fcLangCharSetIndicesInv[i*32+j]].lang); + return FcFalse; + } + } + } + } + if (lsb->extra) + { + FcStrList *list = FcStrListCreate (lsb->extra); + FcChar8 *extra; + + if (list) + { + while ((extra = FcStrListNext (list))) + { + if (!FcLangSetContainsLang (lsa, extra)) + { + if (FcDebug() & FC_DBG_MATCHV) + printf ("\tMissing string %s\n", extra); + break; + } + } + FcStrListDone (list); + if (extra) + return FcFalse; + } + } + return FcTrue; +} + +FcBool +FcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l) +{ + if (!FcSerializeAlloc (serialize, l, sizeof (FcLangSet))) + return FcFalse; + return FcTrue; +} + +FcLangSet * +FcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l) +{ + FcLangSet *l_serialize = FcSerializePtr (serialize, l); + + if (!l_serialize) + return NULL; + memset (l_serialize->map, '\0', sizeof (l_serialize->map)); + memcpy (l_serialize->map, l->map, FC_MIN (sizeof (l_serialize->map), l->map_size * sizeof (l->map[0]))); + l_serialize->map_size = NUM_LANG_SET_MAP; + l_serialize->extra = NULL; /* We don't serialize ls->extra */ + return l_serialize; +} + +FcStrSet * +FcLangSetGetLangs (const FcLangSet *ls) +{ + FcStrSet *langs; + int i; + + langs = FcStrSetCreate(); + if (!langs) + return 0; + + for (i = 0; i < NUM_LANG_CHAR_SET; i++) + if (FcLangSetBitGet (ls, i)) + FcStrSetAdd (langs, fcLangCharSets[i].lang); + + if (ls->extra) + { + FcStrList *list = FcStrListCreate (ls->extra); + FcChar8 *extra; + + if (list) + { + while ((extra = FcStrListNext (list))) + FcStrSetAdd (langs, extra); + + FcStrListDone (list); + } + } + + return langs; +} + +#define __fclang__ +#include "fcaliastail.h" +#include "fcftaliastail.h" +#undef __fclang__ diff --git a/fontconfig/src/fclist.c b/fontconfig/src/fclist.c new file mode 100644 index 000000000..d804c1503 --- /dev/null +++ b/fontconfig/src/fclist.c @@ -0,0 +1,577 @@ +/* + * fontconfig/src/fclist.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> + +FcObjectSet * +FcObjectSetCreate (void) +{ + FcObjectSet *os; + + os = (FcObjectSet *) malloc (sizeof (FcObjectSet)); + if (!os) + return 0; + FcMemAlloc (FC_MEM_OBJECTSET, sizeof (FcObjectSet)); + os->nobject = 0; + os->sobject = 0; + os->objects = 0; + return os; +} + +FcBool +FcObjectSetAdd (FcObjectSet *os, const char *object) +{ + int s; + const char **objects; + int high, low, mid, c; + + if (os->nobject == os->sobject) + { + s = os->sobject + 4; + if (os->objects) + objects = (const char **) realloc ((void *) os->objects, + s * sizeof (const char *)); + else + objects = (const char **) malloc (s * sizeof (const char *)); + if (!objects) + return FcFalse; + if (os->sobject) + FcMemFree (FC_MEM_OBJECTPTR, os->sobject * sizeof (const char *)); + FcMemAlloc (FC_MEM_OBJECTPTR, s * sizeof (const char *)); + os->objects = objects; + os->sobject = s; + } + high = os->nobject - 1; + low = 0; + mid = 0; + c = 1; + object = (char *)FcStrStaticName ((FcChar8 *)object); + while (low <= high) + { + mid = (low + high) >> 1; + c = os->objects[mid] - object; + if (c == 0) + return FcTrue; + if (c < 0) + low = mid + 1; + else + high = mid - 1; + } + if (c < 0) + mid++; + memmove (os->objects + mid + 1, os->objects + mid, + (os->nobject - mid) * sizeof (const char *)); + os->objects[mid] = object; + os->nobject++; + return FcTrue; +} + +void +FcObjectSetDestroy (FcObjectSet *os) +{ + if (os->objects) + { + FcMemFree (FC_MEM_OBJECTPTR, os->sobject * sizeof (const char *)); + free ((void *) os->objects); + } + FcMemFree (FC_MEM_OBJECTSET, sizeof (FcObjectSet)); + free (os); +} + +FcObjectSet * +FcObjectSetVaBuild (const char *first, va_list va) +{ + FcObjectSet *ret; + + FcObjectSetVapBuild (ret, first, va); + return ret; +} + +FcObjectSet * +FcObjectSetBuild (const char *first, ...) +{ + va_list va; + FcObjectSet *os; + + va_start (va, first); + FcObjectSetVapBuild (os, first, va); + va_end (va); + return os; +} + +/* + * Font must have a containing value for every value in the pattern + */ +static FcBool +FcListValueListMatchAny (FcValueListPtr patOrig, /* pattern */ + FcValueListPtr fntOrig) /* font */ +{ + FcValueListPtr pat, fnt; + + for (pat = patOrig; pat != NULL; pat = FcValueListNext(pat)) + { + for (fnt = fntOrig; fnt != NULL; fnt = FcValueListNext(fnt)) + { + /* + * make sure the font 'contains' the pattern. + * (OpListing is OpContains except for strings + * where it requires an exact match) + */ + if (FcConfigCompareValue (&fnt->value, + FcOpListing, + &pat->value)) + break; + } + if (fnt == NULL) + return FcFalse; + } + return FcTrue; +} + +static FcBool +FcListValueListEqual (FcValueListPtr v1orig, + FcValueListPtr v2orig) +{ + FcValueListPtr v1, v2; + + for (v1 = v1orig; v1 != NULL; v1 = FcValueListNext(v1)) + { + for (v2 = v2orig; v2 != NULL; v2 = FcValueListNext(v2)) + if (FcValueEqual (FcValueCanonicalize(&(v1)->value), + FcValueCanonicalize(&(v2)->value))) + break; + if (v2 == NULL) + return FcFalse; + } + for (v2 = v2orig; v2 != NULL; v2 = FcValueListNext(v2)) + { + for (v1 = v1orig; v1 != NULL; v1 = FcValueListNext(v1)) + if (FcValueEqual (FcValueCanonicalize(&v1->value), + FcValueCanonicalize(&v2->value))) + break; + if (v1 == NULL) + return FcFalse; + } + return FcTrue; +} + +static FcBool +FcListPatternEqual (FcPattern *p1, + FcPattern *p2, + FcObjectSet *os) +{ + int i; + FcPatternElt *e1, *e2; + + for (i = 0; i < os->nobject; i++) + { + e1 = FcPatternObjectFindElt (p1, FcObjectFromName (os->objects[i])); + e2 = FcPatternObjectFindElt (p2, FcObjectFromName (os->objects[i])); + if (!e1 && !e2) + continue; + if (!e1 || !e2) + return FcFalse; + if (!FcListValueListEqual (FcPatternEltValues(e1), + FcPatternEltValues(e2))) + return FcFalse; + } + return FcTrue; +} + +/* + * FcTrue iff all objects in "p" match "font" + */ + +FcBool +FcListPatternMatchAny (const FcPattern *p, + const FcPattern *font) +{ + int i; + + for (i = 0; i < p->num; i++) + { + FcPatternElt *pe = &FcPatternElts(p)[i]; + FcPatternElt *fe = FcPatternObjectFindElt (font, pe->object); + if (!fe) + return FcFalse; + if (!FcListValueListMatchAny (FcPatternEltValues(pe), /* pat elts */ + FcPatternEltValues(fe))) /* font elts */ + return FcFalse; + } + return FcTrue; +} + +static FcChar32 +FcListMatrixHash (const FcMatrix *m) +{ + int xx = (int) (m->xx * 100), + xy = (int) (m->xy * 100), + yx = (int) (m->yx * 100), + yy = (int) (m->yy * 100); + + return ((FcChar32) xx) ^ ((FcChar32) xy) ^ ((FcChar32) yx) ^ ((FcChar32) yy); +} + +static FcChar32 +FcListValueHash (FcValue *value) +{ + FcValue v = FcValueCanonicalize(value); + switch (v.type) { + case FcTypeVoid: + return 0; + case FcTypeInteger: + return (FcChar32) v.u.i; + case FcTypeDouble: + return (FcChar32) (int) v.u.d; + case FcTypeString: + return FcStrHashIgnoreCase (v.u.s); + case FcTypeBool: + return (FcChar32) v.u.b; + case FcTypeMatrix: + return FcListMatrixHash (v.u.m); + case FcTypeCharSet: + return FcCharSetCount (v.u.c); + case FcTypeFTFace: + return (long) v.u.f; + case FcTypeLangSet: + return FcLangSetHash (v.u.l); + } + return 0; +} + +static FcChar32 +FcListValueListHash (FcValueListPtr list) +{ + FcChar32 h = 0; + + while (list != NULL) + { + h = h ^ FcListValueHash (&list->value); + list = FcValueListNext(list); + } + return h; +} + +static FcChar32 +FcListPatternHash (FcPattern *font, + FcObjectSet *os) +{ + int n; + FcPatternElt *e; + FcChar32 h = 0; + + for (n = 0; n < os->nobject; n++) + { + e = FcPatternObjectFindElt (font, FcObjectFromName (os->objects[n])); + if (e) + h = h ^ FcListValueListHash (FcPatternEltValues(e)); + } + return h; +} + +typedef struct _FcListBucket { + struct _FcListBucket *next; + FcChar32 hash; + FcPattern *pattern; +} FcListBucket; + +#define FC_LIST_HASH_SIZE 4099 + +typedef struct _FcListHashTable { + int entries; + FcListBucket *buckets[FC_LIST_HASH_SIZE]; +} FcListHashTable; + +static void +FcListHashTableInit (FcListHashTable *table) +{ + table->entries = 0; + memset (table->buckets, '\0', sizeof (table->buckets)); +} + +static void +FcListHashTableCleanup (FcListHashTable *table) +{ + int i; + FcListBucket *bucket, *next; + + for (i = 0; i < FC_LIST_HASH_SIZE; i++) + { + for (bucket = table->buckets[i]; bucket; bucket = next) + { + next = bucket->next; + FcPatternDestroy (bucket->pattern); + FcMemFree (FC_MEM_LISTBUCK, sizeof (FcListBucket)); + free (bucket); + } + table->buckets[i] = 0; + } + table->entries = 0; +} + +static int +FcGetDefaultObjectLangIndex (FcPattern *font, FcObject object) +{ + FcChar8 *lang = FcGetDefaultLang (); + FcPatternElt *e = FcPatternObjectFindElt (font, object); + FcValueListPtr v; + FcValue value; + int idx = -1; + int i; + + if (e) + { + for (v = FcPatternEltValues(e), i = 0; v; v = FcValueListNext(v), ++i) + { + value = FcValueCanonicalize (&v->value); + + if (value.type == FcTypeString) + { + FcLangResult res = FcLangCompare (value.u.s, lang); + if (res == FcLangEqual) + return i; + + if (res == FcLangDifferentCountry && idx < 0) + idx = i; + } + } + } + + return (idx > 0) ? idx : 0; +} + +static FcBool +FcListAppend (FcListHashTable *table, + FcPattern *font, + FcObjectSet *os) +{ + int o; + FcPatternElt *e; + FcValueListPtr v; + FcChar32 hash; + FcListBucket **prev, *bucket; + int familyidx = -1; + int fullnameidx = -1; + int styleidx = -1; + int defidx = 0; + int idx; + + hash = FcListPatternHash (font, os); + for (prev = &table->buckets[hash % FC_LIST_HASH_SIZE]; + (bucket = *prev); prev = &(bucket->next)) + { + if (bucket->hash == hash && + FcListPatternEqual (bucket->pattern, font, os)) + return FcTrue; + } + bucket = (FcListBucket *) malloc (sizeof (FcListBucket)); + if (!bucket) + goto bail0; + FcMemAlloc (FC_MEM_LISTBUCK, sizeof (FcListBucket)); + bucket->next = 0; + bucket->hash = hash; + bucket->pattern = FcPatternCreate (); + if (!bucket->pattern) + goto bail1; + + for (o = 0; o < os->nobject; o++) + { + if (!strcmp (os->objects[o], FC_FAMILY) || !strcmp (os->objects[o], FC_FAMILYLANG)) + { + if (familyidx < 0) + familyidx = FcGetDefaultObjectLangIndex (font, FC_FAMILYLANG_OBJECT); + defidx = familyidx; + } + else if (!strcmp (os->objects[o], FC_FULLNAME) || !strcmp (os->objects[o], FC_FULLNAMELANG)) + { + if (fullnameidx < 0) + fullnameidx = FcGetDefaultObjectLangIndex (font, FC_FULLNAMELANG_OBJECT); + defidx = fullnameidx; + } + else if (!strcmp (os->objects[o], FC_STYLE) || !strcmp (os->objects[o], FC_STYLELANG)) + { + if (styleidx < 0) + styleidx = FcGetDefaultObjectLangIndex (font, FC_STYLELANG_OBJECT); + defidx = styleidx; + } + else + defidx = 0; + + e = FcPatternObjectFindElt (font, FcObjectFromName (os->objects[o])); + if (e) + { + for (v = FcPatternEltValues(e), idx = 0; v; + v = FcValueListNext(v), ++idx) + { + if (!FcPatternAdd (bucket->pattern, + os->objects[o], + FcValueCanonicalize(&v->value), defidx != idx)) + goto bail2; + } + } + } + *prev = bucket; + ++table->entries; + + return FcTrue; + +bail2: + FcPatternDestroy (bucket->pattern); +bail1: + FcMemFree (FC_MEM_LISTBUCK, sizeof (FcListBucket)); + free (bucket); +bail0: + return FcFalse; +} + +FcFontSet * +FcFontSetList (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcObjectSet *os) +{ + FcFontSet *ret; + FcFontSet *s; + int f; + int set; + FcListHashTable table; + int i; + FcListBucket *bucket; + int destroy_os = 0; + + if (!config) + { + if (!FcInitBringUptoDate ()) + goto bail0; + + config = FcConfigGetCurrent (); + if (!config) + goto bail0; + } + FcListHashTableInit (&table); + + if (!os) + { + os = FcObjectGetSet (); + destroy_os = 1; + } + + /* + * Walk all available fonts adding those that + * match to the hash table + */ + for (set = 0; set < nsets; set++) + { + s = sets[set]; + if (!s) + continue; + for (f = 0; f < s->nfont; f++) + if (FcListPatternMatchAny (p, /* pattern */ + s->fonts[f])) /* font */ + if (!FcListAppend (&table, s->fonts[f], os)) + goto bail1; + } +#if 0 + { + int max = 0; + int full = 0; + int ents = 0; + int len; + for (i = 0; i < FC_LIST_HASH_SIZE; i++) + { + if ((bucket = table.buckets[i])) + { + len = 0; + for (; bucket; bucket = bucket->next) + { + ents++; + len++; + } + if (len > max) + max = len; + full++; + } + } + printf ("used: %d max: %d avg: %g\n", full, max, + (double) ents / FC_LIST_HASH_SIZE); + } +#endif + /* + * Walk the hash table and build + * a font set + */ + ret = FcFontSetCreate (); + if (!ret) + goto bail0; + for (i = 0; i < FC_LIST_HASH_SIZE; i++) + while ((bucket = table.buckets[i])) + { + if (!FcFontSetAdd (ret, bucket->pattern)) + goto bail2; + table.buckets[i] = bucket->next; + FcMemFree (FC_MEM_LISTBUCK, sizeof (FcListBucket)); + free (bucket); + } + + return ret; + +bail2: + FcFontSetDestroy (ret); +bail1: + FcListHashTableCleanup (&table); +bail0: + if (destroy_os) + FcObjectSetDestroy (os); + return 0; +} + +FcFontSet * +FcFontList (FcConfig *config, + FcPattern *p, + FcObjectSet *os) +{ + FcFontSet *sets[2]; + int nsets; + + if (!config) + { + if (!FcInitBringUptoDate ()) + return 0; + + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + nsets = 0; + if (config->fonts[FcSetSystem]) + sets[nsets++] = config->fonts[FcSetSystem]; + if (config->fonts[FcSetApplication]) + sets[nsets++] = config->fonts[FcSetApplication]; + return FcFontSetList (config, sets, nsets, p, os); +} +#define __fclist__ +#include "fcaliastail.h" +#undef __fclist__ diff --git a/fontconfig/src/fcmatch.c b/fontconfig/src/fcmatch.c new file mode 100644 index 000000000..aa84eda83 --- /dev/null +++ b/fontconfig/src/fcmatch.c @@ -0,0 +1,840 @@ +/* + * fontconfig/src/fcmatch.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <string.h> +#include <ctype.h> +#include <stdio.h> + +static double +FcCompareNumber (FcValue *value1, FcValue *value2) +{ + double v1, v2, v; + + switch (value1->type) { + case FcTypeInteger: + v1 = (double) value1->u.i; + break; + case FcTypeDouble: + v1 = value1->u.d; + break; + default: + return -1.0; + } + switch (value2->type) { + case FcTypeInteger: + v2 = (double) value2->u.i; + break; + case FcTypeDouble: + v2 = value2->u.d; + break; + default: + return -1.0; + } + v = v2 - v1; + if (v < 0) + v = -v; + return v; +} + +static double +FcCompareString (FcValue *v1, FcValue *v2) +{ + return (double) FcStrCmpIgnoreCase (FcValueString(v1), FcValueString(v2)) != 0; +} + +static double +FcCompareFamily (FcValue *v1, FcValue *v2) +{ + /* rely on the guarantee in FcPatternAddWithBinding that + * families are always FcTypeString. */ + const FcChar8* v1_string = FcValueString(v1); + const FcChar8* v2_string = FcValueString(v2); + + if (FcToLower(*v1_string) != FcToLower(*v2_string) && + *v1_string != ' ' && *v2_string != ' ') + return 1.0; + + return (double) FcStrCmpIgnoreBlanksAndCase (v1_string, v2_string) != 0; +} + +static double +FcCompareLang (FcValue *v1, FcValue *v2) +{ + FcLangResult result; + FcValue value1 = FcValueCanonicalize(v1), value2 = FcValueCanonicalize(v2); + + switch (value1.type) { + case FcTypeLangSet: + switch (value2.type) { + case FcTypeLangSet: + result = FcLangSetCompare (value1.u.l, value2.u.l); + break; + case FcTypeString: + result = FcLangSetHasLang (value1.u.l, + value2.u.s); + break; + default: + return -1.0; + } + break; + case FcTypeString: + switch (value2.type) { + case FcTypeLangSet: + result = FcLangSetHasLang (value2.u.l, value1.u.s); + break; + case FcTypeString: + result = FcLangCompare (value1.u.s, + value2.u.s); + break; + default: + return -1.0; + } + break; + default: + return -1.0; + } + switch (result) { + case FcLangEqual: + return 0; + case FcLangDifferentCountry: + return 1; + case FcLangDifferentLang: + default: + return 2; + } +} + +static double +FcCompareBool (FcValue *v1, FcValue *v2) +{ + if (v2->type != FcTypeBool || v1->type != FcTypeBool) + return -1.0; + return (double) v2->u.b != v1->u.b; +} + +static double +FcCompareCharSet (FcValue *v1, FcValue *v2) +{ + return (double) FcCharSetSubtractCount (FcValueCharSet(v1), FcValueCharSet(v2)); +} + +static double +FcCompareSize (FcValue *value1, FcValue *value2) +{ + double v1, v2, v; + + switch (value1->type) { + case FcTypeInteger: + v1 = value1->u.i; + break; + case FcTypeDouble: + v1 = value1->u.d; + break; + default: + return -1; + } + switch (value2->type) { + case FcTypeInteger: + v2 = value2->u.i; + break; + case FcTypeDouble: + v2 = value2->u.d; + break; + default: + return -1; + } + if (v2 == 0) + return 0; + v = v2 - v1; + if (v < 0) + v = -v; + return v; +} + +typedef struct _FcMatcher { + FcObject object; + double (*compare) (FcValue *value1, FcValue *value2); + int strong, weak; +} FcMatcher; + +/* + * Order is significant, it defines the precedence of + * each value, earlier values are more significant than + * later values + */ +static const FcMatcher _FcMatchers [] = { + { FC_FOUNDRY_OBJECT, FcCompareString, 0, 0 }, +#define MATCH_FOUNDRY 0 + { FC_CHARSET_OBJECT, FcCompareCharSet, 1, 1 }, +#define MATCH_CHARSET 1 + { FC_FAMILY_OBJECT, FcCompareFamily, 2, 4 }, +#define MATCH_FAMILY 2 + { FC_LANG_OBJECT, FcCompareLang, 3, 3 }, +#define MATCH_LANG 3 +#define MATCH_LANG_INDEX 3 + { FC_SPACING_OBJECT, FcCompareNumber, 5, 5 }, +#define MATCH_SPACING 4 + { FC_PIXEL_SIZE_OBJECT, FcCompareSize, 6, 6 }, +#define MATCH_PIXEL_SIZE 5 + { FC_STYLE_OBJECT, FcCompareString, 7, 7 }, +#define MATCH_STYLE 6 + { FC_SLANT_OBJECT, FcCompareNumber, 8, 8 }, +#define MATCH_SLANT 7 + { FC_WEIGHT_OBJECT, FcCompareNumber, 9, 9 }, +#define MATCH_WEIGHT 8 + { FC_WIDTH_OBJECT, FcCompareNumber, 10, 10 }, +#define MATCH_WIDTH 9 + { FC_DECORATIVE_OBJECT, FcCompareBool, 11, 11 }, +#define MATCH_DECORATIVE 10 + { FC_ANTIALIAS_OBJECT, FcCompareBool, 12, 12 }, +#define MATCH_ANTIALIAS 11 + { FC_RASTERIZER_OBJECT, FcCompareString, 13, 13 }, +#define MATCH_RASTERIZER 12 + { FC_OUTLINE_OBJECT, FcCompareBool, 14, 14 }, +#define MATCH_OUTLINE 13 + { FC_FONTVERSION_OBJECT, FcCompareNumber, 15, 15 }, +#define MATCH_FONTVERSION 14 +}; + +#define NUM_MATCH_VALUES 16 + +static const FcMatcher* +FcObjectToMatcher (FcObject object) +{ + int i; + + i = -1; + switch (object) { + case FC_FOUNDRY_OBJECT: + i = MATCH_FOUNDRY; break; + case FC_FONTVERSION_OBJECT: + i = MATCH_FONTVERSION; break; + case FC_FAMILY_OBJECT: + i = MATCH_FAMILY; break; + case FC_CHARSET_OBJECT: + i = MATCH_CHARSET; break; + case FC_ANTIALIAS_OBJECT: + i = MATCH_ANTIALIAS; break; + case FC_LANG_OBJECT: + i = MATCH_LANG; break; + case FC_SPACING_OBJECT: + i = MATCH_SPACING; break; + case FC_STYLE_OBJECT: + i = MATCH_STYLE; break; + case FC_SLANT_OBJECT: + i = MATCH_SLANT; break; + case FC_PIXEL_SIZE_OBJECT: + i = MATCH_PIXEL_SIZE; break; + case FC_WIDTH_OBJECT: + i = MATCH_WIDTH; break; + case FC_WEIGHT_OBJECT: + i = MATCH_WEIGHT; break; + case FC_RASTERIZER_OBJECT: + i = MATCH_RASTERIZER; break; + case FC_OUTLINE_OBJECT: + i = MATCH_OUTLINE; break; + case FC_DECORATIVE_OBJECT: + i = MATCH_DECORATIVE; break; + } + + if (i < 0) + return NULL; + + return _FcMatchers+i; +} + +static FcBool +FcCompareValueList (FcObject object, + FcValueListPtr v1orig, /* pattern */ + FcValueListPtr v2orig, /* target */ + FcValue *bestValue, + double *value, + FcResult *result) +{ + FcValueListPtr v1, v2; + double v, best, bestStrong, bestWeak; + int j; + const FcMatcher *match = FcObjectToMatcher(object); + + if (!match) + { + if (bestValue) + *bestValue = FcValueCanonicalize(&v2orig->value); + return FcTrue; + } + + best = 1e99; + bestStrong = 1e99; + bestWeak = 1e99; + j = 1; + for (v1 = v1orig; v1; v1 = FcValueListNext(v1)) + { + for (v2 = v2orig; v2; v2 = FcValueListNext(v2)) + { + v = (match->compare) (&v1->value, &v2->value); + if (v < 0) + { + *result = FcResultTypeMismatch; + return FcFalse; + } + v = v * 1000 + j; + if (v < best) + { + if (bestValue) + *bestValue = FcValueCanonicalize(&v2->value); + best = v; + } + if (v1->binding == FcValueBindingStrong) + { + if (v < bestStrong) + bestStrong = v; + } + else + { + if (v < bestWeak) + bestWeak = v; + } + } + j++; + } + if (FcDebug () & FC_DBG_MATCHV) + { + printf (" %s: %g ", FcObjectName (object), best); + FcValueListPrint (v1orig); + printf (", "); + FcValueListPrint (v2orig); + printf ("\n"); + } + if (value) + { + int weak = match->weak; + int strong = match->strong; + if (weak == strong) + value[strong] += best; + else + { + value[weak] += bestWeak; + value[strong] += bestStrong; + } + } + return FcTrue; +} + +/* + * Return a value indicating the distance between the two lists of + * values + */ + +static FcBool +FcCompare (FcPattern *pat, + FcPattern *fnt, + double *value, + FcResult *result) +{ + int i, i1, i2; + + for (i = 0; i < NUM_MATCH_VALUES; i++) + value[i] = 0.0; + + i1 = 0; + i2 = 0; + while (i1 < pat->num && i2 < fnt->num) + { + FcPatternElt *elt_i1 = &FcPatternElts(pat)[i1]; + FcPatternElt *elt_i2 = &FcPatternElts(fnt)[i2]; + + i = FcObjectCompare(elt_i1->object, elt_i2->object); + if (i > 0) + i2++; + else if (i < 0) + i1++; + else + { + if (!FcCompareValueList (elt_i1->object, + FcPatternEltValues(elt_i1), + FcPatternEltValues(elt_i2), + 0, value, result)) + return FcFalse; + i1++; + i2++; + } + } + return FcTrue; +} + +FcPattern * +FcFontRenderPrepare (FcConfig *config, + FcPattern *pat, + FcPattern *font) +{ + FcPattern *new; + int i; + FcPatternElt *fe, *pe; + FcValue v; + FcResult result; + + new = FcPatternCreate (); + if (!new) + return 0; + for (i = 0; i < font->num; i++) + { + fe = &FcPatternElts(font)[i]; + pe = FcPatternObjectFindElt (pat, fe->object); + if (pe) + { + if (!FcCompareValueList (pe->object, FcPatternEltValues(pe), + FcPatternEltValues(fe), &v, 0, &result)) + { + FcPatternDestroy (new); + return 0; + } + } + else + v = FcValueCanonicalize(&FcPatternEltValues (fe)->value); + FcPatternObjectAdd (new, fe->object, v, FcFalse); + } + for (i = 0; i < pat->num; i++) + { + pe = &FcPatternElts(pat)[i]; + fe = FcPatternObjectFindElt (font, pe->object); + if (!fe) + { + v = FcValueCanonicalize(&FcPatternEltValues(pe)->value); + FcPatternObjectAdd (new, pe->object, v, FcTrue); + } + } + + FcConfigSubstituteWithPat (config, new, pat, FcMatchFont); + return new; +} + +static FcPattern * +FcFontSetMatchInternal (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcResult *result) +{ + double score[NUM_MATCH_VALUES], bestscore[NUM_MATCH_VALUES]; + int f; + FcFontSet *s; + FcPattern *best; + int i; + int set; + + for (i = 0; i < NUM_MATCH_VALUES; i++) + bestscore[i] = 0; + best = 0; + if (FcDebug () & FC_DBG_MATCH) + { + printf ("Match "); + FcPatternPrint (p); + } + for (set = 0; set < nsets; set++) + { + s = sets[set]; + if (!s) + continue; + for (f = 0; f < s->nfont; f++) + { + if (FcDebug () & FC_DBG_MATCHV) + { + printf ("Font %d ", f); + FcPatternPrint (s->fonts[f]); + } + if (!FcCompare (p, s->fonts[f], score, result)) + return 0; + if (FcDebug () & FC_DBG_MATCHV) + { + printf ("Score"); + for (i = 0; i < NUM_MATCH_VALUES; i++) + { + printf (" %g", score[i]); + } + printf ("\n"); + } + for (i = 0; i < NUM_MATCH_VALUES; i++) + { + if (best && bestscore[i] < score[i]) + break; + if (!best || score[i] < bestscore[i]) + { + for (i = 0; i < NUM_MATCH_VALUES; i++) + bestscore[i] = score[i]; + best = s->fonts[f]; + break; + } + } + } + } + if (FcDebug () & FC_DBG_MATCH) + { + printf ("Best score"); + for (i = 0; i < NUM_MATCH_VALUES; i++) + printf (" %g", bestscore[i]); + printf ("\n"); + FcPatternPrint (best); + } + if (!best) + { + *result = FcResultNoMatch; + return 0; + } + return best; +} + +FcPattern * +FcFontSetMatch (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcResult *result) +{ + FcPattern *best; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + best = FcFontSetMatchInternal (config, sets, nsets, p, result); + if (best) + return FcFontRenderPrepare (config, p, best); + else + return NULL; +} + +FcPattern * +FcFontMatch (FcConfig *config, + FcPattern *p, + FcResult *result) +{ + FcFontSet *sets[2]; + int nsets; + FcPattern *best; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + nsets = 0; + if (config->fonts[FcSetSystem]) + sets[nsets++] = config->fonts[FcSetSystem]; + if (config->fonts[FcSetApplication]) + sets[nsets++] = config->fonts[FcSetApplication]; + + best = FcFontSetMatchInternal (config, sets, nsets, p, result); + if (best) + return FcFontRenderPrepare (config, p, best); + else + return NULL; +} + +typedef struct _FcSortNode { + FcPattern *pattern; + double score[NUM_MATCH_VALUES]; +} FcSortNode; + +static int +FcSortCompare (const void *aa, const void *ab) +{ + FcSortNode *a = *(FcSortNode **) aa; + FcSortNode *b = *(FcSortNode **) ab; + double *as = &a->score[0]; + double *bs = &b->score[0]; + double ad = 0, bd = 0; + int i; + + i = NUM_MATCH_VALUES; + while (i-- && (ad = *as++) == (bd = *bs++)) + ; + return ad < bd ? -1 : ad > bd ? 1 : 0; +} + +static FcBool +FcSortWalk (FcSortNode **n, int nnode, FcFontSet *fs, FcCharSet **csp, FcBool trim) +{ + FcBool ret = FcFalse; + FcCharSet *cs; + + cs = 0; + if (trim || csp) + { + cs = FcCharSetCreate (); + if (cs == NULL) + goto bail; + } + + while (nnode--) + { + FcSortNode *node = *n++; + FcBool adds_chars = FcFalse; + + /* + * Only fetch node charset if we'd need it + */ + if (cs) + { + FcCharSet *ncs; + + if (FcPatternGetCharSet (node->pattern, FC_CHARSET, 0, &ncs) != + FcResultMatch) + continue; + + if (!FcCharSetMerge (cs, ncs, &adds_chars)) + goto bail; + } + + /* + * If this font isn't a subset of the previous fonts, + * add it to the list + */ + if (!trim || adds_chars) + { + FcPatternReference (node->pattern); + if (FcDebug () & FC_DBG_MATCHV) + { + printf ("Add "); + FcPatternPrint (node->pattern); + } + if (!FcFontSetAdd (fs, node->pattern)) + { + FcPatternDestroy (node->pattern); + goto bail; + } + } + } + if (csp) + { + *csp = cs; + cs = 0; + } + + ret = FcTrue; + +bail: + if (cs) + FcCharSetDestroy (cs); + + return ret; +} + +void +FcFontSetSortDestroy (FcFontSet *fs) +{ + FcFontSetDestroy (fs); +} + +FcFontSet * +FcFontSetSort (FcConfig *config, + FcFontSet **sets, + int nsets, + FcPattern *p, + FcBool trim, + FcCharSet **csp, + FcResult *result) +{ + FcFontSet *ret; + FcFontSet *s; + FcSortNode *nodes; + FcSortNode **nodeps, **nodep; + int nnodes; + FcSortNode *new; + int set; + int f; + int i; + int nPatternLang; + FcBool *patternLangSat; + FcValue patternLang; + + if (FcDebug () & FC_DBG_MATCH) + { + printf ("Sort "); + FcPatternPrint (p); + } + nnodes = 0; + for (set = 0; set < nsets; set++) + { + s = sets[set]; + if (!s) + continue; + nnodes += s->nfont; + } + if (!nnodes) + goto bail0; + + for (nPatternLang = 0; + FcPatternGet (p, FC_LANG, nPatternLang, &patternLang) == FcResultMatch; + nPatternLang++) + ; + + /* freed below */ + nodes = malloc (nnodes * sizeof (FcSortNode) + + nnodes * sizeof (FcSortNode *) + + nPatternLang * sizeof (FcBool)); + if (!nodes) + goto bail0; + nodeps = (FcSortNode **) (nodes + nnodes); + patternLangSat = (FcBool *) (nodeps + nnodes); + + new = nodes; + nodep = nodeps; + for (set = 0; set < nsets; set++) + { + s = sets[set]; + if (!s) + continue; + for (f = 0; f < s->nfont; f++) + { + if (FcDebug () & FC_DBG_MATCHV) + { + printf ("Font %d ", f); + FcPatternPrint (s->fonts[f]); + } + new->pattern = s->fonts[f]; + if (!FcCompare (p, new->pattern, new->score, result)) + goto bail1; + if (FcDebug () & FC_DBG_MATCHV) + { + printf ("Score"); + for (i = 0; i < NUM_MATCH_VALUES; i++) + { + printf (" %g", new->score[i]); + } + printf ("\n"); + } + *nodep = new; + new++; + nodep++; + } + } + + nnodes = new - nodes; + + qsort (nodeps, nnodes, sizeof (FcSortNode *), + FcSortCompare); + + for (i = 0; i < nPatternLang; i++) + patternLangSat[i] = FcFalse; + + for (f = 0; f < nnodes; f++) + { + FcBool satisfies = FcFalse; + /* + * If this node matches any language, go check + * which ones and satisfy those entries + */ + if (nodeps[f]->score[MATCH_LANG_INDEX] < 200) + { + for (i = 0; i < nPatternLang; i++) + { + FcValue nodeLang; + + if (!patternLangSat[i] && + FcPatternGet (p, FC_LANG, i, &patternLang) == FcResultMatch && + FcPatternGet (nodeps[f]->pattern, FC_LANG, 0, &nodeLang) == FcResultMatch) + { + double compare = FcCompareLang (&patternLang, &nodeLang); + if (compare >= 0 && compare < 2) + { + if (FcDebug () & FC_DBG_MATCHV) + { + FcChar8 *family; + FcChar8 *style; + + if (FcPatternGetString (nodeps[f]->pattern, FC_FAMILY, 0, &family) == FcResultMatch && + FcPatternGetString (nodeps[f]->pattern, FC_STYLE, 0, &style) == FcResultMatch) + printf ("Font %s:%s matches language %d\n", family, style, i); + } + patternLangSat[i] = FcTrue; + satisfies = FcTrue; + break; + } + } + } + } + if (!satisfies) + nodeps[f]->score[MATCH_LANG_INDEX] = 10000.0; + } + + /* + * Re-sort once the language issues have been settled + */ + qsort (nodeps, nnodes, sizeof (FcSortNode *), + FcSortCompare); + + ret = FcFontSetCreate (); + if (!ret) + goto bail1; + + if (!FcSortWalk (nodeps, nnodes, ret, csp, trim)) + goto bail2; + + free (nodes); + + if (FcDebug() & FC_DBG_MATCH) + { + printf ("First font "); + FcPatternPrint (ret->fonts[0]); + } + return ret; + +bail2: + FcFontSetDestroy (ret); +bail1: + free (nodes); +bail0: + return 0; +} + +FcFontSet * +FcFontSort (FcConfig *config, + FcPattern *p, + FcBool trim, + FcCharSet **csp, + FcResult *result) +{ + FcFontSet *sets[2]; + int nsets; + + if (!config) + { + config = FcConfigGetCurrent (); + if (!config) + return 0; + } + nsets = 0; + if (config->fonts[FcSetSystem]) + sets[nsets++] = config->fonts[FcSetSystem]; + if (config->fonts[FcSetApplication]) + sets[nsets++] = config->fonts[FcSetApplication]; + return FcFontSetSort (config, sets, nsets, p, trim, csp, result); +} +#define __fcmatch__ +#include "fcaliastail.h" +#undef __fcmatch__ diff --git a/fontconfig/src/fcmatrix.c b/fontconfig/src/fcmatrix.c new file mode 100644 index 000000000..1d6e2f6b0 --- /dev/null +++ b/fontconfig/src/fcmatrix.c @@ -0,0 +1,120 @@ +/* + * fontconfig/src/fcmatrix.c + * + * Copyright © 2000 Tuomas J. Lukka + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Tuomas Lukka not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Tuomas Lukka makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * TUOMAS LUKKA DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL TUOMAS LUKKA BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <math.h> +#include <stdlib.h> +#include <ctype.h> + +const FcMatrix FcIdentityMatrix = { 1, 0, 0, 1 }; + +FcMatrix * +FcMatrixCopy (const FcMatrix *mat) +{ + FcMatrix *r; + if(!mat) + return 0; + r = (FcMatrix *) malloc (sizeof (*r) ); + if (!r) + return 0; + FcMemAlloc (FC_MEM_MATRIX, sizeof (FcMatrix)); + *r = *mat; + return r; +} + +void +FcMatrixFree (FcMatrix *mat) +{ + if (mat != &FcIdentityMatrix) + { + FcMemFree (FC_MEM_MATRIX, sizeof (FcMatrix)); + free (mat); + } +} + +FcBool +FcMatrixEqual (const FcMatrix *mat1, const FcMatrix *mat2) +{ + if(mat1 == mat2) return FcTrue; + if(mat1 == 0 || mat2 == 0) return FcFalse; + return mat1->xx == mat2->xx && + mat1->xy == mat2->xy && + mat1->yx == mat2->yx && + mat1->yy == mat2->yy; +} + +void +FcMatrixMultiply (FcMatrix *result, const FcMatrix *a, const FcMatrix *b) +{ + FcMatrix r; + + r.xx = a->xx * b->xx + a->xy * b->yx; + r.xy = a->xx * b->xy + a->xy * b->yy; + r.yx = a->yx * b->xx + a->yy * b->yx; + r.yy = a->yx * b->xy + a->yy * b->yy; + *result = r; +} + +void +FcMatrixRotate (FcMatrix *m, double c, double s) +{ + FcMatrix r; + + /* + * X Coordinate system is upside down, swap to make + * rotations counterclockwise + */ + r.xx = c; + r.xy = -s; + r.yx = s; + r.yy = c; + FcMatrixMultiply (m, &r, m); +} + +void +FcMatrixScale (FcMatrix *m, double sx, double sy) +{ + FcMatrix r; + + r.xx = sx; + r.xy = 0; + r.yx = 0; + r.yy = sy; + FcMatrixMultiply (m, &r, m); +} + +void +FcMatrixShear (FcMatrix *m, double sh, double sv) +{ + FcMatrix r; + + r.xx = 1; + r.xy = sh; + r.yx = sv; + r.yy = 1; + FcMatrixMultiply (m, &r, m); +} +#define __fcmatrix__ +#include "fcaliastail.h" +#undef __fcmatrix__ diff --git a/fontconfig/src/fcname.c b/fontconfig/src/fcname.c new file mode 100644 index 000000000..b4ce94421 --- /dev/null +++ b/fontconfig/src/fcname.c @@ -0,0 +1,903 @@ +/* + * fontconfig/src/fcname.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +/* + * Please do not change this list, it is used to initialize the object + * list in this order to match the FC_foo_OBJECT constants. Those + * constants are written into cache files. + */ + +static const FcObjectType _FcBaseObjectTypes[] = { + { FC_FAMILY, FcTypeString, }, /* 1 */ + { FC_FAMILYLANG, FcTypeString, }, + { FC_STYLE, FcTypeString, }, + { FC_STYLELANG, FcTypeString, }, + { FC_FULLNAME, FcTypeString, }, + { FC_FULLNAMELANG, FcTypeString, }, + { FC_SLANT, FcTypeInteger, }, + { FC_WEIGHT, FcTypeInteger, }, + { FC_WIDTH, FcTypeInteger, }, + { FC_SIZE, FcTypeDouble, }, + { FC_ASPECT, FcTypeDouble, }, + { FC_PIXEL_SIZE, FcTypeDouble, }, + { FC_SPACING, FcTypeInteger, }, + { FC_FOUNDRY, FcTypeString, }, + { FC_ANTIALIAS, FcTypeBool, }, + { FC_HINT_STYLE, FcTypeInteger, }, + { FC_HINTING, FcTypeBool, }, + { FC_VERTICAL_LAYOUT, FcTypeBool, }, + { FC_AUTOHINT, FcTypeBool, }, + { FC_GLOBAL_ADVANCE, FcTypeBool, }, + { FC_FILE, FcTypeString, }, + { FC_INDEX, FcTypeInteger, }, + { FC_RASTERIZER, FcTypeString, }, + { FC_OUTLINE, FcTypeBool, }, + { FC_SCALABLE, FcTypeBool, }, + { FC_DPI, FcTypeDouble }, + { FC_RGBA, FcTypeInteger, }, + { FC_SCALE, FcTypeDouble, }, + { FC_MINSPACE, FcTypeBool, }, + { FC_CHAR_WIDTH, FcTypeInteger }, + { FC_CHAR_HEIGHT, FcTypeInteger }, + { FC_MATRIX, FcTypeMatrix }, + { FC_CHARSET, FcTypeCharSet }, + { FC_LANG, FcTypeLangSet }, + { FC_FONTVERSION, FcTypeInteger }, + { FC_CAPABILITY, FcTypeString }, + { FC_FONTFORMAT, FcTypeString }, + { FC_EMBOLDEN, FcTypeBool }, + { FC_EMBEDDED_BITMAP, FcTypeBool }, + { FC_DECORATIVE, FcTypeBool }, + { FC_LCD_FILTER, FcTypeInteger }, /* 41 */ +}; + +#define NUM_OBJECT_TYPES (sizeof _FcBaseObjectTypes / sizeof _FcBaseObjectTypes[0]) + +typedef struct _FcObjectTypeList FcObjectTypeList; + +struct _FcObjectTypeList { + const FcObjectTypeList *next; + const FcObjectType *types; + int ntypes; +}; + +static const FcObjectTypeList _FcBaseObjectTypesList = { + 0, + _FcBaseObjectTypes, + NUM_OBJECT_TYPES, +}; + +static const FcObjectTypeList *_FcObjectTypes = &_FcBaseObjectTypesList; + +#define OBJECT_HASH_SIZE 31 + +typedef struct _FcObjectBucket { + struct _FcObjectBucket *next; + FcChar32 hash; + FcObject id; +} FcObjectBucket; + +static FcObjectBucket *FcObjectBuckets[OBJECT_HASH_SIZE]; + +static FcObjectType *FcObjects = (FcObjectType *) _FcBaseObjectTypes; +static int FcObjectsNumber = NUM_OBJECT_TYPES; +static int FcObjectsSize = 0; +static FcBool FcObjectsInited; + +static FcObjectType * +FcObjectInsert (const char *name, FcType type) +{ + FcObjectType *o; + if (FcObjectsNumber >= FcObjectsSize) + { + int newsize = FcObjectsNumber * 2; + FcObjectType *newobjects; + + if (FcObjectsSize) + newobjects = realloc (FcObjects, newsize * sizeof (FcObjectType)); + else + { + newobjects = malloc (newsize * sizeof (FcObjectType)); + if (newobjects) + memcpy (newobjects, FcObjects, + FcObjectsNumber * sizeof (FcObjectType)); + } + if (!newobjects) + return NULL; + FcObjects = newobjects; + FcObjectsSize = newsize; + } + o = &FcObjects[FcObjectsNumber]; + o->object = name; + o->type = type; + ++FcObjectsNumber; + return o; +} + +static FcObject +FcObjectId (FcObjectType *o) +{ + return o - FcObjects + 1; +} + +static FcObjectType * +FcObjectFindByName (const char *object, FcBool insert) +{ + FcChar32 hash = FcStringHash ((const FcChar8 *) object); + FcObjectBucket **p; + FcObjectBucket *b; + FcObjectType *o; + + if (!FcObjectsInited) + FcObjectInit (); + for (p = &FcObjectBuckets[hash%OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + { + o = FcObjects + b->id - 1; + if (b->hash == hash && !strcmp (object, (o->object))) + return o; + } + if (!insert) + return NULL; + /* + * Hook it into the hash chain + */ + b = malloc (sizeof(FcObjectBucket)); + if (!b) + return NULL; + object = (const char *) FcStrCopy ((FcChar8 *) object); + if (!object) { + free (b); + return NULL; + } + o = FcObjectInsert (object, -1); + b->next = NULL; + b->hash = hash; + b->id = FcObjectId (o); + *p = b; + return o; +} + +static FcObjectType * +FcObjectFindById (FcObject object) +{ + if (1 <= object && object <= FcObjectsNumber) + return FcObjects + object - 1; + return NULL; +} + +static FcBool +FcObjectHashInsert (const FcObjectType *object, FcBool copy) +{ + FcChar32 hash = FcStringHash ((const FcChar8 *) object->object); + FcObjectBucket **p; + FcObjectBucket *b; + FcObjectType *o; + + if (!FcObjectsInited) + FcObjectInit (); + for (p = &FcObjectBuckets[hash%OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + { + o = FcObjects + b->id - 1; + if (b->hash == hash && !strcmp (object->object, o->object)) + return FcFalse; + } + /* + * Hook it into the hash chain + */ + b = malloc (sizeof(FcObjectBucket)); + if (!b) + return FcFalse; + if (copy) + { + o = FcObjectInsert (object->object, object->type); + if (!o) + { + free (b); + return FcFalse; + } + } + else + o = (FcObjectType *) object; + b->next = NULL; + b->hash = hash; + b->id = FcObjectId (o); + *p = b; + return FcTrue; +} + +static void +FcObjectHashRemove (const FcObjectType *object, FcBool cleanobj) +{ + FcChar32 hash = FcStringHash ((const FcChar8 *) object->object); + FcObjectBucket **p; + FcObjectBucket *b; + FcObjectType *o; + + if (!FcObjectsInited) + FcObjectInit (); + for (p = &FcObjectBuckets[hash%OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + { + o = FcObjects + b->id - 1; + if (b->hash == hash && !strcmp (object->object, o->object)) + { + *p = b->next; + free (b); + if (cleanobj) + { + /* Clean up object array */ + o->object = NULL; + o->type = -1; + while (FcObjects[FcObjectsNumber-1].object == NULL) + --FcObjectsNumber; + } + break; + } + } +} + +FcBool +FcNameRegisterObjectTypes (const FcObjectType *types, int ntypes) +{ + int i; + + for (i = 0; i < ntypes; i++) + if (!FcObjectHashInsert (&types[i], FcTrue)) + return FcFalse; + return FcTrue; +} + +FcBool +FcNameUnregisterObjectTypes (const FcObjectType *types, int ntypes) +{ + int i; + + for (i = 0; i < ntypes; i++) + FcObjectHashRemove (&types[i], FcTrue); + return FcTrue; +} + +const FcObjectType * +FcNameGetObjectType (const char *object) +{ + return FcObjectFindByName (object, FcFalse); +} + +FcBool +FcObjectValidType (FcObject object, FcType type) +{ + FcObjectType *t = FcObjectFindById (object); + + if (t) { + switch (t->type) { + case -1: + return FcTrue; + case FcTypeDouble: + case FcTypeInteger: + if (type == FcTypeDouble || type == FcTypeInteger) + return FcTrue; + break; + case FcTypeLangSet: + if (type == FcTypeLangSet || type == FcTypeString) + return FcTrue; + break; + default: + if (type == t->type) + return FcTrue; + break; + } + return FcFalse; + } + return FcTrue; +} + +FcObject +FcObjectFromName (const char * name) +{ + FcObjectType *o = FcObjectFindByName (name, FcTrue); + + if (o) + return FcObjectId (o); + return 0; +} + +FcObjectSet * +FcObjectGetSet (void) +{ + int i; + FcObjectSet *os = NULL; + + + os = FcObjectSetCreate (); + for (i = 0; i < FcObjectsNumber; i++) + FcObjectSetAdd (os, FcObjects[i].object); + + return os; +} + +FcBool +FcObjectInit (void) +{ + int i; + + if (FcObjectsInited) + return FcTrue; + + FcObjectsInited = FcTrue; + for (i = 0; i < NUM_OBJECT_TYPES; i++) + if (!FcObjectHashInsert (&_FcBaseObjectTypes[i], FcFalse)) + return FcFalse; + return FcTrue; +} + +void +FcObjectFini (void) +{ + int i; + FcObjectBucket *b, *next; + + for (i = 0; i < OBJECT_HASH_SIZE; i++) + { + for (b = FcObjectBuckets[i]; b; b = next) + { + next = b->next; + free (b); + } + FcObjectBuckets[i] = 0; + } + for (i = 0; i < FcObjectsNumber; i++) + if (FcObjects[i].type == -1) + free ((void*) FcObjects[i].object); + if (FcObjects != _FcBaseObjectTypes) + free (FcObjects); + FcObjects = (FcObjectType *) _FcBaseObjectTypes; + FcObjectsNumber = NUM_OBJECT_TYPES; + FcObjectsSize = 0; + FcObjectsInited = FcFalse; +} + +const char * +FcObjectName (FcObject object) +{ + FcObjectType *o = FcObjectFindById (object); + + if (o) + return o->object; + return NULL; +} + +static const FcConstant _FcBaseConstants[] = { + { (FcChar8 *) "thin", "weight", FC_WEIGHT_THIN, }, + { (FcChar8 *) "extralight", "weight", FC_WEIGHT_EXTRALIGHT, }, + { (FcChar8 *) "ultralight", "weight", FC_WEIGHT_EXTRALIGHT, }, + { (FcChar8 *) "light", "weight", FC_WEIGHT_LIGHT, }, + { (FcChar8 *) "book", "weight", FC_WEIGHT_BOOK, }, + { (FcChar8 *) "regular", "weight", FC_WEIGHT_REGULAR, }, + { (FcChar8 *) "medium", "weight", FC_WEIGHT_MEDIUM, }, + { (FcChar8 *) "demibold", "weight", FC_WEIGHT_DEMIBOLD, }, + { (FcChar8 *) "semibold", "weight", FC_WEIGHT_DEMIBOLD, }, + { (FcChar8 *) "bold", "weight", FC_WEIGHT_BOLD, }, + { (FcChar8 *) "extrabold", "weight", FC_WEIGHT_EXTRABOLD, }, + { (FcChar8 *) "ultrabold", "weight", FC_WEIGHT_EXTRABOLD, }, + { (FcChar8 *) "black", "weight", FC_WEIGHT_BLACK, }, + { (FcChar8 *) "heavy", "weight", FC_WEIGHT_HEAVY, }, + + { (FcChar8 *) "roman", "slant", FC_SLANT_ROMAN, }, + { (FcChar8 *) "italic", "slant", FC_SLANT_ITALIC, }, + { (FcChar8 *) "oblique", "slant", FC_SLANT_OBLIQUE, }, + + { (FcChar8 *) "ultracondensed", "width", FC_WIDTH_ULTRACONDENSED }, + { (FcChar8 *) "extracondensed", "width", FC_WIDTH_EXTRACONDENSED }, + { (FcChar8 *) "condensed", "width", FC_WIDTH_CONDENSED }, + { (FcChar8 *) "semicondensed", "width", FC_WIDTH_SEMICONDENSED }, + { (FcChar8 *) "normal", "width", FC_WIDTH_NORMAL }, + { (FcChar8 *) "semiexpanded", "width", FC_WIDTH_SEMIEXPANDED }, + { (FcChar8 *) "expanded", "width", FC_WIDTH_EXPANDED }, + { (FcChar8 *) "extraexpanded", "width", FC_WIDTH_EXTRAEXPANDED }, + { (FcChar8 *) "ultraexpanded", "width", FC_WIDTH_ULTRAEXPANDED }, + + { (FcChar8 *) "proportional", "spacing", FC_PROPORTIONAL, }, + { (FcChar8 *) "dual", "spacing", FC_DUAL, }, + { (FcChar8 *) "mono", "spacing", FC_MONO, }, + { (FcChar8 *) "charcell", "spacing", FC_CHARCELL, }, + + { (FcChar8 *) "unknown", "rgba", FC_RGBA_UNKNOWN }, + { (FcChar8 *) "rgb", "rgba", FC_RGBA_RGB, }, + { (FcChar8 *) "bgr", "rgba", FC_RGBA_BGR, }, + { (FcChar8 *) "vrgb", "rgba", FC_RGBA_VRGB }, + { (FcChar8 *) "vbgr", "rgba", FC_RGBA_VBGR }, + { (FcChar8 *) "none", "rgba", FC_RGBA_NONE }, + + { (FcChar8 *) "hintnone", "hintstyle", FC_HINT_NONE }, + { (FcChar8 *) "hintslight", "hintstyle", FC_HINT_SLIGHT }, + { (FcChar8 *) "hintmedium", "hintstyle", FC_HINT_MEDIUM }, + { (FcChar8 *) "hintfull", "hintstyle", FC_HINT_FULL }, + + { (FcChar8 *) "antialias", "antialias", FcTrue }, + { (FcChar8 *) "hinting", "hinting", FcTrue }, + { (FcChar8 *) "verticallayout", "verticallayout", FcTrue }, + { (FcChar8 *) "autohint", "autohint", FcTrue }, + { (FcChar8 *) "globaladvance", "globaladvance", FcTrue }, + { (FcChar8 *) "outline", "outline", FcTrue }, + { (FcChar8 *) "scalable", "scalable", FcTrue }, + { (FcChar8 *) "minspace", "minspace", FcTrue }, + { (FcChar8 *) "embolden", "embolden", FcTrue }, + { (FcChar8 *) "embeddedbitmap", "embeddedbitmap", FcTrue }, + { (FcChar8 *) "decorative", "decorative", FcTrue }, + { (FcChar8 *) "lcdnone", "lcdfilter", FC_LCD_NONE }, + { (FcChar8 *) "lcddefault", "lcdfilter", FC_LCD_DEFAULT }, + { (FcChar8 *) "lcdlight", "lcdfilter", FC_LCD_LIGHT }, + { (FcChar8 *) "lcdlegacy", "lcdfilter", FC_LCD_LEGACY }, +}; + +#define NUM_FC_CONSTANTS (sizeof _FcBaseConstants/sizeof _FcBaseConstants[0]) + +typedef struct _FcConstantList FcConstantList; + +struct _FcConstantList { + const FcConstantList *next; + const FcConstant *consts; + int nconsts; +}; + +static const FcConstantList _FcBaseConstantList = { + 0, + _FcBaseConstants, + NUM_FC_CONSTANTS +}; + +static const FcConstantList *_FcConstants = &_FcBaseConstantList; + +FcBool +FcNameRegisterConstants (const FcConstant *consts, int nconsts) +{ + FcConstantList *l; + + l = (FcConstantList *) malloc (sizeof (FcConstantList)); + if (!l) + return FcFalse; + FcMemAlloc (FC_MEM_CONSTANT, sizeof (FcConstantList)); + l->consts = consts; + l->nconsts = nconsts; + l->next = _FcConstants; + _FcConstants = l; + return FcTrue; +} + +FcBool +FcNameUnregisterConstants (const FcConstant *consts, int nconsts) +{ + const FcConstantList *l, **prev; + + for (prev = &_FcConstants; + (l = *prev); + prev = (const FcConstantList **) &(l->next)) + { + if (l->consts == consts && l->nconsts == nconsts) + { + *prev = l->next; + FcMemFree (FC_MEM_CONSTANT, sizeof (FcConstantList)); + free ((void *) l); + return FcTrue; + } + } + return FcFalse; +} + +const FcConstant * +FcNameGetConstant (FcChar8 *string) +{ + const FcConstantList *l; + int i; + + for (l = _FcConstants; l; l = l->next) + { + for (i = 0; i < l->nconsts; i++) + if (!FcStrCmpIgnoreCase (string, l->consts[i].name)) + return &l->consts[i]; + } + return 0; +} + +FcBool +FcNameConstant (FcChar8 *string, int *result) +{ + const FcConstant *c; + + if ((c = FcNameGetConstant(string))) + { + *result = c->value; + return FcTrue; + } + return FcFalse; +} + +FcBool +FcNameBool (const FcChar8 *v, FcBool *result) +{ + char c0, c1; + + c0 = *v; + c0 = FcToLower (c0); + if (c0 == 't' || c0 == 'y' || c0 == '1') + { + *result = FcTrue; + return FcTrue; + } + if (c0 == 'f' || c0 == 'n' || c0 == '0') + { + *result = FcFalse; + return FcTrue; + } + if (c0 == 'o') + { + c1 = v[1]; + c1 = FcToLower (c1); + if (c1 == 'n') + { + *result = FcTrue; + return FcTrue; + } + if (c1 == 'f') + { + *result = FcFalse; + return FcTrue; + } + } + return FcFalse; +} + +static FcValue +FcNameConvert (FcType type, FcChar8 *string, FcMatrix *m) +{ + FcValue v; + + v.type = type; + switch (v.type) { + case FcTypeInteger: + if (!FcNameConstant (string, &v.u.i)) + v.u.i = atoi ((char *) string); + break; + case FcTypeString: + v.u.s = FcStrStaticName(string); + if (!v.u.s) + v.type = FcTypeVoid; + break; + case FcTypeBool: + if (!FcNameBool (string, &v.u.b)) + v.u.b = FcFalse; + break; + case FcTypeDouble: + v.u.d = strtod ((char *) string, 0); + break; + case FcTypeMatrix: + v.u.m = m; + sscanf ((char *) string, "%lg %lg %lg %lg", &m->xx, &m->xy, &m->yx, &m->yy); + break; + case FcTypeCharSet: + v.u.c = FcNameParseCharSet (string); + if (!v.u.c) + v.type = FcTypeVoid; + break; + case FcTypeLangSet: + v.u.l = FcNameParseLangSet (string); + if (!v.u.l) + v.type = FcTypeVoid; + break; + default: + break; + } + return v; +} + +static const FcChar8 * +FcNameFindNext (const FcChar8 *cur, const char *delim, FcChar8 *save, FcChar8 *last) +{ + FcChar8 c; + + while ((c = *cur)) + { + if (c == '\\') + { + ++cur; + if (!(c = *cur)) + break; + } + else if (strchr (delim, c)) + break; + ++cur; + *save++ = c; + } + *save = 0; + *last = *cur; + if (*cur) + cur++; + return cur; +} + +FcPattern * +FcNameParse (const FcChar8 *name) +{ + FcChar8 *save; + FcPattern *pat; + double d; + FcChar8 *e; + FcChar8 delim; + FcValue v; + FcMatrix m; + const FcObjectType *t; + const FcConstant *c; + + /* freed below */ + save = malloc (strlen ((char *) name) + 1); + if (!save) + goto bail0; + pat = FcPatternCreate (); + if (!pat) + goto bail1; + + for (;;) + { + name = FcNameFindNext (name, "-,:", save, &delim); + if (save[0]) + { + if (!FcPatternAddString (pat, FC_FAMILY, save)) + goto bail2; + } + if (delim != ',') + break; + } + if (delim == '-') + { + for (;;) + { + name = FcNameFindNext (name, "-,:", save, &delim); + d = strtod ((char *) save, (char **) &e); + if (e != save) + { + if (!FcPatternAddDouble (pat, FC_SIZE, d)) + goto bail2; + } + if (delim != ',') + break; + } + } + while (delim == ':') + { + name = FcNameFindNext (name, "=_:", save, &delim); + if (save[0]) + { + if (delim == '=' || delim == '_') + { + t = FcNameGetObjectType ((char *) save); + for (;;) + { + name = FcNameFindNext (name, ":,", save, &delim); + if (t) + { + v = FcNameConvert (t->type, save, &m); + if (!FcPatternAdd (pat, t->object, v, FcTrue)) + { + switch (v.type) { + case FcTypeCharSet: + FcCharSetDestroy ((FcCharSet *) v.u.c); + break; + case FcTypeLangSet: + FcLangSetDestroy ((FcLangSet *) v.u.l); + break; + default: + break; + } + goto bail2; + } + switch (v.type) { + case FcTypeCharSet: + FcCharSetDestroy ((FcCharSet *) v.u.c); + break; + case FcTypeLangSet: + FcLangSetDestroy ((FcLangSet *) v.u.l); + break; + default: + break; + } + } + if (delim != ',') + break; + } + } + else + { + if ((c = FcNameGetConstant (save))) + { + t = FcNameGetObjectType ((char *) c->object); + switch (t->type) { + case FcTypeInteger: + case FcTypeDouble: + if (!FcPatternAddInteger (pat, c->object, c->value)) + goto bail2; + break; + case FcTypeBool: + if (!FcPatternAddBool (pat, c->object, c->value)) + goto bail2; + break; + default: + break; + } + } + } + } + } + + free (save); + return pat; + +bail2: + FcPatternDestroy (pat); +bail1: + free (save); +bail0: + return 0; +} +static FcBool +FcNameUnparseString (FcStrBuf *buf, + const FcChar8 *string, + const FcChar8 *escape) +{ + FcChar8 c; + while ((c = *string++)) + { + if (escape && strchr ((char *) escape, (char) c)) + { + if (!FcStrBufChar (buf, escape[0])) + return FcFalse; + } + if (!FcStrBufChar (buf, c)) + return FcFalse; + } + return FcTrue; +} + +FcBool +FcNameUnparseValue (FcStrBuf *buf, + FcValue *v0, + FcChar8 *escape) +{ + FcChar8 temp[1024]; + FcValue v = FcValueCanonicalize(v0); + + switch (v.type) { + case FcTypeVoid: + return FcTrue; + case FcTypeInteger: + sprintf ((char *) temp, "%d", v.u.i); + return FcNameUnparseString (buf, temp, 0); + case FcTypeDouble: + sprintf ((char *) temp, "%g", v.u.d); + return FcNameUnparseString (buf, temp, 0); + case FcTypeString: + return FcNameUnparseString (buf, v.u.s, escape); + case FcTypeBool: + return FcNameUnparseString (buf, v.u.b ? (FcChar8 *) "True" : (FcChar8 *) "False", 0); + case FcTypeMatrix: + sprintf ((char *) temp, "%g %g %g %g", + v.u.m->xx, v.u.m->xy, v.u.m->yx, v.u.m->yy); + return FcNameUnparseString (buf, temp, 0); + case FcTypeCharSet: + return FcNameUnparseCharSet (buf, v.u.c); + case FcTypeLangSet: + return FcNameUnparseLangSet (buf, v.u.l); + case FcTypeFTFace: + return FcTrue; + } + return FcFalse; +} + +FcBool +FcNameUnparseValueList (FcStrBuf *buf, + FcValueListPtr v, + FcChar8 *escape) +{ + while (v) + { + if (!FcNameUnparseValue (buf, &v->value, escape)) + return FcFalse; + if ((v = FcValueListNext(v)) != NULL) + if (!FcNameUnparseString (buf, (FcChar8 *) ",", 0)) + return FcFalse; + } + return FcTrue; +} + +#define FC_ESCAPE_FIXED "\\-:," +#define FC_ESCAPE_VARIABLE "\\=_:," + +FcChar8 * +FcNameUnparse (FcPattern *pat) +{ + return FcNameUnparseEscaped (pat, FcTrue); +} + +FcChar8 * +FcNameUnparseEscaped (FcPattern *pat, FcBool escape) +{ + FcStrBuf buf; + FcChar8 buf_static[8192]; + int i; + FcPatternElt *e; + const FcObjectTypeList *l; + const FcObjectType *o; + + FcStrBufInit (&buf, buf_static, sizeof (buf_static)); + e = FcPatternObjectFindElt (pat, FC_FAMILY_OBJECT); + if (e) + { + if (!FcNameUnparseValueList (&buf, FcPatternEltValues(e), escape ? (FcChar8 *) FC_ESCAPE_FIXED : 0)) + goto bail0; + } + e = FcPatternObjectFindElt (pat, FC_SIZE_OBJECT); + if (e) + { + if (!FcNameUnparseString (&buf, (FcChar8 *) "-", 0)) + goto bail0; + if (!FcNameUnparseValueList (&buf, FcPatternEltValues(e), escape ? (FcChar8 *) FC_ESCAPE_FIXED : 0)) + goto bail0; + } + for (l = _FcObjectTypes; l; l = l->next) + { + for (i = 0; i < l->ntypes; i++) + { + o = &l->types[i]; + if (!strcmp (o->object, FC_FAMILY) || + !strcmp (o->object, FC_SIZE) || + !strcmp (o->object, FC_FILE)) + continue; + + e = FcPatternObjectFindElt (pat, FcObjectFromName (o->object)); + if (e) + { + if (!FcNameUnparseString (&buf, (FcChar8 *) ":", 0)) + goto bail0; + if (!FcNameUnparseString (&buf, (FcChar8 *) o->object, escape ? (FcChar8 *) FC_ESCAPE_VARIABLE : 0)) + goto bail0; + if (!FcNameUnparseString (&buf, (FcChar8 *) "=", 0)) + goto bail0; + if (!FcNameUnparseValueList (&buf, FcPatternEltValues(e), escape ? + (FcChar8 *) FC_ESCAPE_VARIABLE : 0)) + goto bail0; + } + } + } + return FcStrBufDone (&buf); +bail0: + FcStrBufDestroy (&buf); + return 0; +} +#define __fcname__ +#include "fcaliastail.h" +#undef __fcname__ diff --git a/fontconfig/src/fcpat.c b/fontconfig/src/fcpat.c new file mode 100644 index 000000000..76263b655 --- /dev/null +++ b/fontconfig/src/fcpat.c @@ -0,0 +1,1263 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include "fcftint.h" +#include <stdlib.h> +#include <string.h> +#include <assert.h> + +static FcBool +FcHashOwnsName(const FcChar8 *name); + +FcPattern * +FcPatternCreate (void) +{ + FcPattern *p; + + p = (FcPattern *) malloc (sizeof (FcPattern)); + if (!p) + return 0; + FcMemAlloc (FC_MEM_PATTERN, sizeof (FcPattern)); + p->num = 0; + p->size = 0; + p->elts_offset = FcPtrToOffset (p, NULL); + p->ref = 1; + return p; +} + +void +FcValueDestroy (FcValue v) +{ + switch (v.type) { + case FcTypeString: + if (!FcHashOwnsName(v.u.s)) + FcStrFree ((FcChar8 *) v.u.s); + break; + case FcTypeMatrix: + FcMatrixFree ((FcMatrix *) v.u.m); + break; + case FcTypeCharSet: + FcCharSetDestroy ((FcCharSet *) v.u.c); + break; + case FcTypeLangSet: + FcLangSetDestroy ((FcLangSet *) v.u.l); + break; + default: + break; + } +} + +FcValue +FcValueCanonicalize (const FcValue *v) +{ + FcValue new; + + switch (v->type) + { + case FcTypeString: + new.u.s = FcValueString(v); + new.type = FcTypeString; + break; + case FcTypeCharSet: + new.u.c = FcValueCharSet(v); + new.type = FcTypeCharSet; + break; + case FcTypeLangSet: + new.u.l = FcValueLangSet(v); + new.type = FcTypeLangSet; + break; + default: + new = *v; + break; + } + return new; +} + +FcValue +FcValueSave (FcValue v) +{ + switch (v.type) { + case FcTypeString: + v.u.s = FcStrStaticName (v.u.s); + if (!v.u.s) + v.type = FcTypeVoid; + break; + case FcTypeMatrix: + v.u.m = FcMatrixCopy (v.u.m); + if (!v.u.m) + v.type = FcTypeVoid; + break; + case FcTypeCharSet: + v.u.c = FcCharSetCopy ((FcCharSet *) v.u.c); + if (!v.u.c) + v.type = FcTypeVoid; + break; + case FcTypeLangSet: + v.u.l = FcLangSetCopy (v.u.l); + if (!v.u.l) + v.type = FcTypeVoid; + break; + default: + break; + } + return v; +} + +void +FcValueListDestroy (FcValueListPtr l) +{ + FcValueListPtr next; + for (; l; l = next) + { + switch (l->value.type) { + case FcTypeString: + if (!FcHashOwnsName((FcChar8 *)l->value.u.s)) + FcStrFree ((FcChar8 *)l->value.u.s); + break; + case FcTypeMatrix: + FcMatrixFree ((FcMatrix *)l->value.u.m); + break; + case FcTypeCharSet: + FcCharSetDestroy + ((FcCharSet *) (l->value.u.c)); + break; + case FcTypeLangSet: + FcLangSetDestroy + ((FcLangSet *) (l->value.u.l)); + break; + default: + break; + } + next = FcValueListNext(l); + FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList)); + free(l); + } +} + +FcBool +FcValueEqual (FcValue va, FcValue vb) +{ + if (va.type != vb.type) + { + if (va.type == FcTypeInteger) + { + va.type = FcTypeDouble; + va.u.d = va.u.i; + } + if (vb.type == FcTypeInteger) + { + vb.type = FcTypeDouble; + vb.u.d = vb.u.i; + } + if (va.type != vb.type) + return FcFalse; + } + switch (va.type) { + case FcTypeVoid: + return FcTrue; + case FcTypeInteger: + return va.u.i == vb.u.i; + case FcTypeDouble: + return va.u.d == vb.u.d; + case FcTypeString: + return FcStrCmpIgnoreCase (va.u.s, vb.u.s) == 0; + case FcTypeBool: + return va.u.b == vb.u.b; + case FcTypeMatrix: + return FcMatrixEqual (va.u.m, vb.u.m); + case FcTypeCharSet: + return FcCharSetEqual (va.u.c, vb.u.c); + case FcTypeFTFace: + return va.u.f == vb.u.f; + case FcTypeLangSet: + return FcLangSetEqual (va.u.l, vb.u.l); + } + return FcFalse; +} + +static FcChar32 +FcDoubleHash (double d) +{ + if (d < 0) + d = -d; + if (d > 0xffffffff) + d = 0xffffffff; + return (FcChar32) d; +} + +FcChar32 +FcStringHash (const FcChar8 *s) +{ + FcChar8 c; + FcChar32 h = 0; + + if (s) + while ((c = *s++)) + h = ((h << 1) | (h >> 31)) ^ c; + return h; +} + +static FcChar32 +FcValueHash (const FcValue *v) +{ + switch (v->type) { + case FcTypeVoid: + return 0; + case FcTypeInteger: + return (FcChar32) v->u.i; + case FcTypeDouble: + return FcDoubleHash (v->u.d); + case FcTypeString: + return FcStringHash (FcValueString(v)); + case FcTypeBool: + return (FcChar32) v->u.b; + case FcTypeMatrix: + return (FcDoubleHash (v->u.m->xx) ^ + FcDoubleHash (v->u.m->xy) ^ + FcDoubleHash (v->u.m->yx) ^ + FcDoubleHash (v->u.m->yy)); + case FcTypeCharSet: + return (FcChar32) FcValueCharSet(v)->num; + case FcTypeFTFace: + return FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->family_name) ^ + FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->style_name); + case FcTypeLangSet: + return FcLangSetHash (FcValueLangSet(v)); + } + return FcFalse; +} + +static FcBool +FcValueListEqual (FcValueListPtr la, FcValueListPtr lb) +{ + if (la == lb) + return FcTrue; + + while (la && lb) + { + if (!FcValueEqual (la->value, lb->value)) + return FcFalse; + la = FcValueListNext(la); + lb = FcValueListNext(lb); + } + if (la || lb) + return FcFalse; + return FcTrue; +} + +static FcChar32 +FcValueListHash (FcValueListPtr l) +{ + FcChar32 hash = 0; + + for (; l; l = FcValueListNext(l)) + { + hash = ((hash << 1) | (hash >> 31)) ^ FcValueHash (&l->value); + } + return hash; +} + +void +FcPatternDestroy (FcPattern *p) +{ + int i; + FcPatternElt *elts; + + if (p->ref == FC_REF_CONSTANT) + { + FcCacheObjectDereference (p); + return; + } + + if (--p->ref > 0) + return; + + elts = FcPatternElts (p); + for (i = 0; i < p->num; i++) + FcValueListDestroy (FcPatternEltValues(&elts[i])); + + FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt)); + free (elts); + FcMemFree (FC_MEM_PATTERN, sizeof (FcPattern)); + free (p); +} + +static int +FcPatternObjectPosition (const FcPattern *p, FcObject object) +{ + int low, high, mid, c; + FcPatternElt *elts = FcPatternElts(p); + + low = 0; + high = p->num - 1; + c = 1; + mid = 0; + while (low <= high) + { + mid = (low + high) >> 1; + c = elts[mid].object - object; + if (c == 0) + return mid; + if (c < 0) + low = mid + 1; + else + high = mid - 1; + } + if (c < 0) + mid++; + return -(mid + 1); +} + +FcPatternElt * +FcPatternObjectFindElt (const FcPattern *p, FcObject object) +{ + int i = FcPatternObjectPosition (p, object); + if (i < 0) + return 0; + return &FcPatternElts(p)[i]; +} + +FcPatternElt * +FcPatternObjectInsertElt (FcPattern *p, FcObject object) +{ + int i; + FcPatternElt *e; + + i = FcPatternObjectPosition (p, object); + if (i < 0) + { + i = -i - 1; + + /* reallocate array */ + if (p->num + 1 >= p->size) + { + int s = p->size + 16; + if (p->size) + { + FcPatternElt *e0 = FcPatternElts(p); + e = (FcPatternElt *) realloc (e0, s * sizeof (FcPatternElt)); + if (!e) /* maybe it was mmapped */ + { + e = malloc(s * sizeof (FcPatternElt)); + if (e) + memcpy(e, e0, p->num * sizeof (FcPatternElt)); + } + } + else + e = (FcPatternElt *) malloc (s * sizeof (FcPatternElt)); + if (!e) + return FcFalse; + p->elts_offset = FcPtrToOffset (p, e); + if (p->size) + FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt)); + FcMemAlloc (FC_MEM_PATELT, s * sizeof (FcPatternElt)); + while (p->size < s) + { + e[p->size].object = 0; + e[p->size].values = NULL; + p->size++; + } + } + + e = FcPatternElts(p); + /* move elts up */ + memmove (e + i + 1, + e + i, + sizeof (FcPatternElt) * + (p->num - i)); + + /* bump count */ + p->num++; + + e[i].object = object; + e[i].values = NULL; + } + + return FcPatternElts(p) + i; +} + +FcBool +FcPatternEqual (const FcPattern *pa, const FcPattern *pb) +{ + int i; + FcPatternElt *pae, *pbe; + + if (pa == pb) + return FcTrue; + + if (pa->num != pb->num) + return FcFalse; + pae = FcPatternElts(pa); + pbe = FcPatternElts(pb); + for (i = 0; i < pa->num; i++) + { + if (pae[i].object != pbe[i].object) + return FcFalse; + if (!FcValueListEqual (FcPatternEltValues(&pae[i]), + FcPatternEltValues(&pbe[i]))) + return FcFalse; + } + return FcTrue; +} + +FcChar32 +FcPatternHash (const FcPattern *p) +{ + int i; + FcChar32 h = 0; + FcPatternElt *pe = FcPatternElts(p); + + for (i = 0; i < p->num; i++) + { + h = (((h << 1) | (h >> 31)) ^ + pe[i].object ^ + FcValueListHash (FcPatternEltValues(&pe[i]))); + } + return h; +} + +FcBool +FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObjectSet *os) +{ + FcPatternElt *ea, *eb; + int i; + + for (i = 0; i < os->nobject; i++) + { + FcObject object = FcObjectFromName (os->objects[i]); + ea = FcPatternObjectFindElt (pai, object); + eb = FcPatternObjectFindElt (pbi, object); + if (ea) + { + if (!eb) + return FcFalse; + if (!FcValueListEqual (FcPatternEltValues(ea), FcPatternEltValues(eb))) + return FcFalse; + } + else + { + if (eb) + return FcFalse; + } + } + return FcTrue; +} + +FcBool +FcPatternObjectAddWithBinding (FcPattern *p, + FcObject object, + FcValue value, + FcValueBinding binding, + FcBool append) +{ + FcPatternElt *e; + FcValueListPtr new, *prev; + + if (p->ref == FC_REF_CONSTANT) + goto bail0; + + new = malloc (sizeof (FcValueList)); + if (!new) + goto bail0; + + memset(new, 0, sizeof (FcValueList)); + FcMemAlloc (FC_MEM_VALLIST, sizeof (FcValueList)); + value = FcValueSave (value); + if (value.type == FcTypeVoid) + goto bail1; + + /* + * Make sure the stored type is valid for built-in objects + */ + if (!FcObjectValidType (object, value.type)) + { + if (FcDebug() & FC_DBG_OBJTYPES) + { + printf ("FcPattern object %s does not accept value ", + FcObjectName (object)); + FcValuePrint (value); + } + goto bail1; + } + + new->value = value; + new->binding = binding; + new->next = NULL; + + e = FcPatternObjectInsertElt (p, object); + if (!e) + goto bail2; + + if (append) + { + for (prev = &e->values; *prev; prev = &(*prev)->next) + ; + *prev = new; + } + else + { + new->next = e->values; + e->values = new; + } + + return FcTrue; + +bail2: + FcValueDestroy (value); +bail1: + FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList)); + free (new); +bail0: + return FcFalse; +} + +FcBool +FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append) +{ + return FcPatternObjectAddWithBinding (p, object, + value, FcValueBindingStrong, append); +} + +FcBool +FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append) +{ + return FcPatternObjectAddWithBinding (p, FcObjectFromName (object), + value, FcValueBindingStrong, append); +} + +FcBool +FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append) +{ + return FcPatternObjectAddWithBinding (p, FcObjectFromName (object), + value, FcValueBindingWeak, append); +} + +FcBool +FcPatternObjectDel (FcPattern *p, FcObject object) +{ + FcPatternElt *e; + + e = FcPatternObjectFindElt (p, object); + if (!e) + return FcFalse; + + /* destroy value */ + FcValueListDestroy (e->values); + + /* shuffle existing ones down */ + memmove (e, e+1, + (FcPatternElts(p) + p->num - (e + 1)) * + sizeof (FcPatternElt)); + p->num--; + e = FcPatternElts(p) + p->num; + e->object = 0; + e->values = NULL; + return FcTrue; +} + +FcBool +FcPatternDel (FcPattern *p, const char *object) +{ + return FcPatternObjectDel (p, FcObjectFromName (object)); +} + +FcBool +FcPatternRemove (FcPattern *p, const char *object, int id) +{ + FcPatternElt *e; + FcValueListPtr *prev, l; + + e = FcPatternObjectFindElt (p, FcObjectFromName (object)); + if (!e) + return FcFalse; + for (prev = &e->values; (l = *prev); prev = &l->next) + { + if (!id) + { + *prev = l->next; + l->next = NULL; + FcValueListDestroy (l); + if (!e->values) + FcPatternDel (p, object); + return FcTrue; + } + id--; + } + return FcFalse; +} + +FcBool +FcPatternObjectAddInteger (FcPattern *p, FcObject object, int i) +{ + FcValue v; + + v.type = FcTypeInteger; + v.u.i = i; + return FcPatternObjectAdd (p, object, v, FcTrue); +} + +FcBool +FcPatternAddInteger (FcPattern *p, const char *object, int i) +{ + return FcPatternObjectAddInteger (p, FcObjectFromName (object), i); +} + +FcBool +FcPatternObjectAddDouble (FcPattern *p, FcObject object, double d) +{ + FcValue v; + + v.type = FcTypeDouble; + v.u.d = d; + return FcPatternObjectAdd (p, object, v, FcTrue); +} + + +FcBool +FcPatternAddDouble (FcPattern *p, const char *object, double d) +{ + return FcPatternObjectAddDouble (p, FcObjectFromName (object), d); +} + +FcBool +FcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s) +{ + FcValue v; + + if (!s) + { + v.type = FcTypeVoid; + v.u.s = 0; + return FcPatternObjectAdd (p, object, v, FcTrue); + } + + v.type = FcTypeString; + v.u.s = FcStrStaticName(s); + return FcPatternObjectAdd (p, object, v, FcTrue); +} + +FcBool +FcPatternAddString (FcPattern *p, const char *object, const FcChar8 *s) +{ + return FcPatternObjectAddString (p, FcObjectFromName (object), s); +} + +FcBool +FcPatternAddMatrix (FcPattern *p, const char *object, const FcMatrix *s) +{ + FcValue v; + + v.type = FcTypeMatrix; + v.u.m = s; + return FcPatternAdd (p, object, v, FcTrue); +} + + +FcBool +FcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b) +{ + FcValue v; + + v.type = FcTypeBool; + v.u.b = b; + return FcPatternObjectAdd (p, object, v, FcTrue); +} + +FcBool +FcPatternAddBool (FcPattern *p, const char *object, FcBool b) +{ + return FcPatternObjectAddBool (p, FcObjectFromName (object), b); +} + +FcBool +FcPatternAddCharSet (FcPattern *p, const char *object, const FcCharSet *c) +{ + FcValue v; + + v.type = FcTypeCharSet; + v.u.c = (FcCharSet *)c; + return FcPatternAdd (p, object, v, FcTrue); +} + +FcBool +FcPatternAddFTFace (FcPattern *p, const char *object, const FT_Face f) +{ + FcValue v; + + v.type = FcTypeFTFace; + v.u.f = (void *) f; + return FcPatternAdd (p, object, v, FcTrue); +} + +FcBool +FcPatternAddLangSet (FcPattern *p, const char *object, const FcLangSet *ls) +{ + FcValue v; + + v.type = FcTypeLangSet; + v.u.l = (FcLangSet *)ls; + return FcPatternAdd (p, object, v, FcTrue); +} + +FcResult +FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v) +{ + FcPatternElt *e; + FcValueListPtr l; + + e = FcPatternObjectFindElt (p, object); + if (!e) + return FcResultNoMatch; + for (l = FcPatternEltValues(e); l; l = FcValueListNext(l)) + { + if (!id) + { + *v = FcValueCanonicalize(&l->value); + return FcResultMatch; + } + id--; + } + return FcResultNoId; +} + +FcResult +FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v) +{ + return FcPatternObjectGet (p, FcObjectFromName (object), id, v); +} + +FcResult +FcPatternObjectGetInteger (const FcPattern *p, FcObject object, int id, int *i) +{ + FcValue v; + FcResult r; + + r = FcPatternObjectGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + switch (v.type) { + case FcTypeDouble: + *i = (int) v.u.d; + break; + case FcTypeInteger: + *i = v.u.i; + break; + default: + return FcResultTypeMismatch; + } + return FcResultMatch; +} + +FcResult +FcPatternGetInteger (const FcPattern *p, const char *object, int id, int *i) +{ + return FcPatternObjectGetInteger (p, FcObjectFromName (object), id, i); +} + + +FcResult +FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int id, double *d) +{ + FcValue v; + FcResult r; + + r = FcPatternObjectGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + switch (v.type) { + case FcTypeDouble: + *d = v.u.d; + break; + case FcTypeInteger: + *d = (double) v.u.i; + break; + default: + return FcResultTypeMismatch; + } + return FcResultMatch; +} + +FcResult +FcPatternGetDouble (const FcPattern *p, const char *object, int id, double *d) +{ + return FcPatternObjectGetDouble (p, FcObjectFromName (object), id, d); +} + +FcResult +FcPatternObjectGetString (const FcPattern *p, FcObject object, int id, FcChar8 ** s) +{ + FcValue v; + FcResult r; + + r = FcPatternObjectGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeString) + return FcResultTypeMismatch; + + *s = (FcChar8 *) v.u.s; + return FcResultMatch; +} + +FcResult +FcPatternGetString (const FcPattern *p, const char *object, int id, FcChar8 ** s) +{ + return FcPatternObjectGetString (p, FcObjectFromName (object), id, s); +} + +FcResult +FcPatternGetMatrix(const FcPattern *p, const char *object, int id, FcMatrix **m) +{ + FcValue v; + FcResult r; + + r = FcPatternGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeMatrix) + return FcResultTypeMismatch; + *m = (FcMatrix *)v.u.m; + return FcResultMatch; +} + + +FcResult +FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b) +{ + FcValue v; + FcResult r; + + r = FcPatternGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeBool) + return FcResultTypeMismatch; + *b = v.u.b; + return FcResultMatch; +} + +FcResult +FcPatternGetCharSet(const FcPattern *p, const char *object, int id, FcCharSet **c) +{ + FcValue v; + FcResult r; + + r = FcPatternGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeCharSet) + return FcResultTypeMismatch; + *c = (FcCharSet *)v.u.c; + return FcResultMatch; +} + +FcResult +FcPatternGetFTFace(const FcPattern *p, const char *object, int id, FT_Face *f) +{ + FcValue v; + FcResult r; + + r = FcPatternGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeFTFace) + return FcResultTypeMismatch; + *f = (FT_Face) v.u.f; + return FcResultMatch; +} + +FcResult +FcPatternGetLangSet(const FcPattern *p, const char *object, int id, FcLangSet **ls) +{ + FcValue v; + FcResult r; + + r = FcPatternGet (p, object, id, &v); + if (r != FcResultMatch) + return r; + if (v.type != FcTypeLangSet) + return FcResultTypeMismatch; + *ls = (FcLangSet *)v.u.l; + return FcResultMatch; +} + +FcPattern * +FcPatternDuplicate (const FcPattern *orig) +{ + FcPattern *new; + FcPatternElt *e; + int i; + FcValueListPtr l; + + new = FcPatternCreate (); + if (!new) + goto bail0; + + e = FcPatternElts(orig); + + for (i = 0; i < orig->num; i++) + { + for (l = FcPatternEltValues(e + i); l; l = FcValueListNext(l)) + { + if (!FcPatternObjectAddWithBinding (new, e[i].object, + FcValueCanonicalize(&l->value), + l->binding, + FcTrue)) + goto bail1; + + } + } + + return new; + +bail1: + FcPatternDestroy (new); +bail0: + return 0; +} + +void +FcPatternReference (FcPattern *p) +{ + if (p->ref != FC_REF_CONSTANT) + p->ref++; + else + FcCacheObjectReference (p); +} + +FcPattern * +FcPatternVaBuild (FcPattern *p, va_list va) +{ + FcPattern *ret; + + FcPatternVapBuild (ret, p, va); + return ret; +} + +FcPattern * +FcPatternBuild (FcPattern *p, ...) +{ + va_list va; + + va_start (va, p); + FcPatternVapBuild (p, p, va); + va_end (va); + return p; +} + +/* + * Add all of the elements in 's' to 'p' + */ +FcBool +FcPatternAppend (FcPattern *p, FcPattern *s) +{ + int i; + FcPatternElt *e; + FcValueListPtr v; + + for (i = 0; i < s->num; i++) + { + e = FcPatternElts(s)+i; + for (v = FcPatternEltValues(e); v; v = FcValueListNext(v)) + { + if (!FcPatternObjectAddWithBinding (p, e->object, + FcValueCanonicalize(&v->value), + v->binding, FcTrue)) + return FcFalse; + } + } + return FcTrue; +} + +FcPattern * +FcPatternFilter (FcPattern *p, const FcObjectSet *os) +{ + int i; + FcPattern *ret; + FcPatternElt *e; + FcValueListPtr v; + + if (!os) + return FcPatternDuplicate (p); + + ret = FcPatternCreate (); + if (!ret) + return NULL; + + for (i = 0; i < os->nobject; i++) + { + FcObject object = FcObjectFromName (os->objects[i]); + e = FcPatternObjectFindElt (p, object); + if (e) + { + for (v = FcPatternEltValues(e); v; v = FcValueListNext(v)) + { + if (!FcPatternObjectAddWithBinding (ret, e->object, + FcValueCanonicalize(&v->value), + v->binding, FcTrue)) + goto bail0; + } + } + } + return ret; + +bail0: + FcPatternDestroy (ret); + return NULL; +} + +#define OBJECT_HASH_SIZE 31 +static struct objectBucket { + struct objectBucket *next; + FcChar32 hash; +} *FcObjectBuckets[OBJECT_HASH_SIZE]; + +static FcBool +FcHashOwnsName (const FcChar8 *name) +{ + FcChar32 hash = FcStringHash (name); + struct objectBucket **p; + struct objectBucket *b; + + for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + if (b->hash == hash && ((char *)name == (char *) (b + 1))) + return FcTrue; + return FcFalse; +} + +const FcChar8 * +FcStrStaticName (const FcChar8 *name) +{ + FcChar32 hash = FcStringHash (name); + struct objectBucket **p; + struct objectBucket *b; + int size; + + for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next)) + if (b->hash == hash && !strcmp ((char *)name, (char *) (b + 1))) + return (FcChar8 *) (b + 1); + size = sizeof (struct objectBucket) + strlen ((char *)name) + 1; + b = malloc (size + sizeof (int)); + /* workaround glibc bug which reads strlen in groups of 4 */ + FcMemAlloc (FC_MEM_STATICSTR, size + sizeof (int)); + if (!b) + return NULL; + b->next = 0; + b->hash = hash; + strcpy ((char *) (b + 1), (char *)name); + *p = b; + return (FcChar8 *) (b + 1); +} + +static void +FcStrStaticNameFini (void) +{ + int i, size; + struct objectBucket *b, *next; + char *name; + + for (i = 0; i < OBJECT_HASH_SIZE; i++) + { + for (b = FcObjectBuckets[i]; b; b = next) + { + next = b->next; + name = (char *) (b + 1); + size = sizeof (struct objectBucket) + strlen (name) + 1; + FcMemFree (FC_MEM_STATICSTR, size + sizeof (int)); + free (b); + } + FcObjectBuckets[i] = 0; + } +} + +void +FcPatternFini (void) +{ + FcStrStaticNameFini (); + FcObjectFini (); +} + +FcBool +FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat) +{ + int i; + FcPatternElt *elts = FcPatternElts(pat); + + if (!FcSerializeAlloc (serialize, pat, sizeof (FcPattern))) + return FcFalse; + if (!FcSerializeAlloc (serialize, elts, pat->num * sizeof (FcPatternElt))) + return FcFalse; + for (i = 0; i < pat->num; i++) + if (!FcValueListSerializeAlloc (serialize, FcPatternEltValues(elts+i))) + return FcFalse; + return FcTrue; +} + +FcPattern * +FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat) +{ + FcPattern *pat_serialized; + FcPatternElt *elts = FcPatternElts (pat); + FcPatternElt *elts_serialized; + FcValueList *values_serialized; + int i; + + pat_serialized = FcSerializePtr (serialize, pat); + if (!pat_serialized) + return NULL; + *pat_serialized = *pat; + pat_serialized->size = pat->num; + pat_serialized->ref = FC_REF_CONSTANT; + + elts_serialized = FcSerializePtr (serialize, elts); + if (!elts_serialized) + return NULL; + + pat_serialized->elts_offset = FcPtrToOffset (pat_serialized, + elts_serialized); + + for (i = 0; i < pat->num; i++) + { + values_serialized = FcValueListSerialize (serialize, FcPatternEltValues (elts+i)); + if (!values_serialized) + return NULL; + elts_serialized[i].object = elts[i].object; + elts_serialized[i].values = FcPtrToEncodedOffset (&elts_serialized[i], + values_serialized, + FcValueList); + } + if (FcDebug() & FC_DBG_CACHEV) { + printf ("Raw pattern:\n"); + FcPatternPrint (pat); + printf ("Serialized pattern:\n"); + FcPatternPrint (pat_serialized); + printf ("\n"); + } + return pat_serialized; +} + +FcBool +FcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *vl) +{ + while (vl) + { + if (!FcSerializeAlloc (serialize, vl, sizeof (FcValueList))) + return FcFalse; + switch (vl->value.type) { + case FcTypeString: + if (!FcStrSerializeAlloc (serialize, vl->value.u.s)) + return FcFalse; + break; + case FcTypeCharSet: + if (!FcCharSetSerializeAlloc (serialize, vl->value.u.c)) + return FcFalse; + break; + case FcTypeLangSet: + if (!FcLangSetSerializeAlloc (serialize, vl->value.u.l)) + return FcFalse; + break; + default: + break; + } + vl = vl->next; + } + return FcTrue; +} + +FcValueList * +FcValueListSerialize (FcSerialize *serialize, const FcValueList *vl) +{ + FcValueList *vl_serialized; + FcChar8 *s_serialized; + FcCharSet *c_serialized; + FcLangSet *l_serialized; + FcValueList *head_serialized = NULL; + FcValueList *prev_serialized = NULL; + + while (vl) + { + vl_serialized = FcSerializePtr (serialize, vl); + if (!vl_serialized) + return NULL; + + if (prev_serialized) + prev_serialized->next = FcPtrToEncodedOffset (prev_serialized, + vl_serialized, + FcValueList); + else + head_serialized = vl_serialized; + + vl_serialized->next = NULL; + vl_serialized->value.type = vl->value.type; + switch (vl->value.type) { + case FcTypeInteger: + vl_serialized->value.u.i = vl->value.u.i; + break; + case FcTypeDouble: + vl_serialized->value.u.d = vl->value.u.d; + break; + case FcTypeString: + s_serialized = FcStrSerialize (serialize, vl->value.u.s); + if (!s_serialized) + return NULL; + vl_serialized->value.u.s = FcPtrToEncodedOffset (&vl_serialized->value, + s_serialized, + FcChar8); + break; + case FcTypeBool: + vl_serialized->value.u.b = vl->value.u.b; + break; + case FcTypeMatrix: + /* can't happen */ + break; + case FcTypeCharSet: + c_serialized = FcCharSetSerialize (serialize, vl->value.u.c); + if (!c_serialized) + return NULL; + vl_serialized->value.u.c = FcPtrToEncodedOffset (&vl_serialized->value, + c_serialized, + FcCharSet); + break; + case FcTypeFTFace: + /* can't happen */ + break; + case FcTypeLangSet: + l_serialized = FcLangSetSerialize (serialize, vl->value.u.l); + if (!l_serialized) + return NULL; + vl_serialized->value.u.l = FcPtrToEncodedOffset (&vl_serialized->value, + l_serialized, + FcLangSet); + break; + default: + break; + } + prev_serialized = vl_serialized; + vl = vl->next; + } + return head_serialized; +} +#define __fcpat__ +#include "fcaliastail.h" +#include "fcftaliastail.h" +#undef __fcpat__ diff --git a/fontconfig/src/fcserialize.c b/fontconfig/src/fcserialize.c new file mode 100644 index 000000000..e5ec90bde --- /dev/null +++ b/fontconfig/src/fcserialize.c @@ -0,0 +1,156 @@ +/* + * Copyright © 2006 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that copyright + * notice and this permission notice appear in supporting documentation, and + * that the name of the copyright holders not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. The copyright holders make no representations + * about the suitability of this software for any purpose. It is provided "as + * is" without express or implied warranty. + * + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#include "fcint.h" + +intptr_t +FcAlignSize (intptr_t size) +{ + intptr_t rem = size % sizeof (FcAlign); + if (rem) + size += sizeof (FcAlign) - rem; + return size; +} + +/* + * Serialization helper object -- allocate space in the + * yet-to-be-created linear array for a serialized font set + */ + +FcSerialize * +FcSerializeCreate (void) +{ + FcSerialize *serialize; + + serialize = malloc (sizeof (FcSerialize)); + if (!serialize) + return NULL; + serialize->size = 0; + serialize->linear = NULL; + serialize->cs_freezer = NULL; + memset (serialize->buckets, '\0', sizeof (serialize->buckets)); + return serialize; +} + +void +FcSerializeDestroy (FcSerialize *serialize) +{ + uintptr_t bucket; + + for (bucket = 0; bucket < FC_SERIALIZE_HASH_SIZE; bucket++) + { + FcSerializeBucket *buck, *next; + + for (buck = serialize->buckets[bucket]; buck; buck = next) { + next = buck->next; + free (buck); + } + } + if (serialize->cs_freezer) + FcCharSetFreezerDestroy (serialize->cs_freezer); + free (serialize); +} + +/* + * Allocate space for an object in the serialized array. Keep track + * of where the object is placed and only allocate one copy of each object + */ + +FcBool +FcSerializeAlloc (FcSerialize *serialize, const void *object, int size) +{ + uintptr_t bucket = ((uintptr_t) object) % FC_SERIALIZE_HASH_SIZE; + FcSerializeBucket *buck; + + for (buck = serialize->buckets[bucket]; buck; buck = buck->next) + if (buck->object == object) + return FcTrue; + buck = malloc (sizeof (FcSerializeBucket)); + if (!buck) + return FcFalse; + buck->object = object; + buck->offset = serialize->size; + buck->next = serialize->buckets[bucket]; + serialize->buckets[bucket] = buck; + serialize->size += FcAlignSize (size); + return FcTrue; +} + +/* + * Reserve space in the serialization array + */ +intptr_t +FcSerializeReserve (FcSerialize *serialize, int size) +{ + intptr_t offset = serialize->size; + serialize->size += FcAlignSize (size); + return offset; +} + +/* + * Given an object, return the offset in the serialized array where + * the serialized copy of the object is stored + */ +intptr_t +FcSerializeOffset (FcSerialize *serialize, const void *object) +{ + uintptr_t bucket = ((uintptr_t) object) % FC_SERIALIZE_HASH_SIZE; + FcSerializeBucket *buck; + + for (buck = serialize->buckets[bucket]; buck; buck = buck->next) + if (buck->object == object) + return buck->offset; + return 0; +} + +/* + * Given a cache and an object, return a pointer to where + * the serialized copy of the object is stored + */ +void * +FcSerializePtr (FcSerialize *serialize, const void *object) +{ + intptr_t offset = FcSerializeOffset (serialize, object); + + if (!offset) + return NULL; + return (void *) ((char *) serialize->linear + offset); +} + +FcBool +FcStrSerializeAlloc (FcSerialize *serialize, const FcChar8 *str) +{ + return FcSerializeAlloc (serialize, str, strlen ((const char *) str) + 1); +} + +FcChar8 * +FcStrSerialize (FcSerialize *serialize, const FcChar8 *str) +{ + FcChar8 *str_serialize = FcSerializePtr (serialize, str); + if (!str_serialize) + return NULL; + strcpy ((char *) str_serialize, (const char *) str); + return str_serialize; +} +#define __fcserialize__ +#include "fcaliastail.h" +#undef __fcserialize__ diff --git a/fontconfig/src/fcstr.c b/fontconfig/src/fcstr.c new file mode 100644 index 000000000..ea7c376c2 --- /dev/null +++ b/fontconfig/src/fcstr.c @@ -0,0 +1,1198 @@ +/* + * fontconfig/src/fcstr.c + * + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <stdlib.h> +#include <ctype.h> +#include <string.h> +#ifdef _WIN32 +#include <windows.h> +#endif + +FcChar8 * +FcStrCopy (const FcChar8 *s) +{ + int len; + FcChar8 *r; + + if (!s) + return 0; + len = strlen ((char *) s) + 1; + r = (FcChar8 *) malloc (len); + if (!r) + return 0; + FcMemAlloc (FC_MEM_STRING, len); + memcpy (r, s, len); + return r; +} + +FcChar8 * +FcStrPlus (const FcChar8 *s1, const FcChar8 *s2) +{ + int l = strlen ((char *)s1) + strlen ((char *) s2) + 1; + FcChar8 *s = malloc (l); + + if (!s) + return 0; + FcMemAlloc (FC_MEM_STRING, l); + strcpy ((char *) s, (char *) s1); + strcat ((char *) s, (char *) s2); + return s; +} + +void +FcStrFree (FcChar8 *s) +{ + FcMemFree (FC_MEM_STRING, strlen ((char *) s) + 1); + free (s); +} + + +#include "../fc-case/fccase.h" + +#define FcCaseFoldUpperCount(cf) \ + ((cf)->method == FC_CASE_FOLD_FULL ? 1 : (cf)->count) + +#define FC_STR_CANON_BUF_LEN 1024 + +typedef struct _FcCaseWalker { + const FcChar8 *read; + const FcChar8 *src; + FcChar8 utf8[FC_MAX_CASE_FOLD_CHARS + 1]; +} FcCaseWalker; + +static void +FcStrCaseWalkerInit (const FcChar8 *src, FcCaseWalker *w) +{ + w->src = src; + w->read = 0; +} + +static FcChar8 +FcStrCaseWalkerLong (FcCaseWalker *w, FcChar8 r) +{ + FcChar32 ucs4; + int slen; + int len = strlen((char*)w->src); + + slen = FcUtf8ToUcs4 (w->src - 1, &ucs4, len + 1); + if (slen <= 0) + return r; + if (FC_MIN_FOLD_CHAR <= ucs4 && ucs4 <= FC_MAX_FOLD_CHAR) + { + int min = 0; + int max = FC_NUM_CASE_FOLD; + + while (min <= max) + { + int mid = (min + max) >> 1; + FcChar32 low = fcCaseFold[mid].upper; + FcChar32 high = low + FcCaseFoldUpperCount (&fcCaseFold[mid]); + + if (high <= ucs4) + min = mid + 1; + else if (ucs4 < low) + max = mid - 1; + else + { + const FcCaseFold *fold = &fcCaseFold[mid]; + int dlen; + + switch (fold->method) { + case FC_CASE_FOLD_EVEN_ODD: + if ((ucs4 & 1) != (fold->upper & 1)) + return r; + /* fall through ... */ + default: + dlen = FcUcs4ToUtf8 (ucs4 + fold->offset, w->utf8); + break; + case FC_CASE_FOLD_FULL: + dlen = fold->count; + memcpy (w->utf8, fcCaseFoldChars + fold->offset, dlen); + break; + } + + /* consume rest of src utf-8 bytes */ + w->src += slen - 1; + + /* read from temp buffer */ + w->utf8[dlen] = '\0'; + w->read = w->utf8; + return *w->read++; + } + } + } + return r; +} + +static FcChar8 +FcStrCaseWalkerNext (FcCaseWalker *w) +{ + FcChar8 r; + + if (w->read) + { + if ((r = *w->read++)) + return r; + w->read = 0; + } + r = *w->src++; + + if ((r & 0xc0) == 0xc0) + return FcStrCaseWalkerLong (w, r); + if ('A' <= r && r <= 'Z') + r = r - 'A' + 'a'; + return r; +} + +static FcChar8 +FcStrCaseWalkerNextIgnoreBlanks (FcCaseWalker *w) +{ + FcChar8 r; + + if (w->read) + { + if ((r = *w->read++)) + return r; + w->read = 0; + } + do + { + r = *w->src++; + } while (r == ' '); + + if ((r & 0xc0) == 0xc0) + return FcStrCaseWalkerLong (w, r); + if ('A' <= r && r <= 'Z') + r = r - 'A' + 'a'; + return r; +} + +FcChar8 * +FcStrDowncase (const FcChar8 *s) +{ + FcCaseWalker w; + int len = 0; + FcChar8 *dst, *d; + + FcStrCaseWalkerInit (s, &w); + while (FcStrCaseWalkerNext (&w)) + len++; + d = dst = malloc (len + 1); + if (!d) + return 0; + FcMemAlloc (FC_MEM_STRING, len + 1); + FcStrCaseWalkerInit (s, &w); + while ((*d++ = FcStrCaseWalkerNext (&w))); + return dst; +} + +int +FcStrCmpIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) +{ + FcCaseWalker w1, w2; + FcChar8 c1, c2; + + if (s1 == s2) return 0; + + FcStrCaseWalkerInit (s1, &w1); + FcStrCaseWalkerInit (s2, &w2); + + for (;;) + { + c1 = FcStrCaseWalkerNext (&w1); + c2 = FcStrCaseWalkerNext (&w2); + if (!c1 || (c1 != c2)) + break; + } + return (int) c1 - (int) c2; +} + +int +FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2) +{ + FcCaseWalker w1, w2; + FcChar8 c1, c2; + + if (s1 == s2) return 0; + + FcStrCaseWalkerInit (s1, &w1); + FcStrCaseWalkerInit (s2, &w2); + + for (;;) + { + c1 = FcStrCaseWalkerNextIgnoreBlanks (&w1); + c2 = FcStrCaseWalkerNextIgnoreBlanks (&w2); + if (!c1 || (c1 != c2)) + break; + } + return (int) c1 - (int) c2; +} + +int +FcStrCmp (const FcChar8 *s1, const FcChar8 *s2) +{ + FcChar8 c1, c2; + + if (s1 == s2) + return 0; + for (;;) + { + c1 = *s1++; + c2 = *s2++; + if (!c1 || c1 != c2) + break; + } + return (int) c1 - (int) c2; +} + +/* + * Return a hash value for a string + */ + +FcChar32 +FcStrHashIgnoreCase (const FcChar8 *s) +{ + FcChar32 h = 0; + FcCaseWalker w; + FcChar8 c; + + FcStrCaseWalkerInit (s, &w); + while ((c = FcStrCaseWalkerNext (&w))) + h = ((h << 3) ^ (h >> 3)) ^ c; + return h; +} + +/* + * Is the head of s1 equal to s2? + */ + +static FcBool +FcStrIsAtIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2) +{ + FcCaseWalker w1, w2; + FcChar8 c1, c2; + + FcStrCaseWalkerInit (s1, &w1); + FcStrCaseWalkerInit (s2, &w2); + + for (;;) + { + c1 = FcStrCaseWalkerNextIgnoreBlanks (&w1); + c2 = FcStrCaseWalkerNextIgnoreBlanks (&w2); + if (!c1 || (c1 != c2)) + break; + } + return c1 == c2 || !c2; +} + +/* + * Does s1 contain an instance of s2 (ignoring blanks and case)? + */ + +const FcChar8 * +FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2) +{ + while (*s1) + { + if (FcStrIsAtIgnoreBlanksAndCase (s1, s2)) + return s1; + s1++; + } + return 0; +} + +static FcBool +FcCharIsPunct (const FcChar8 c) +{ + if (c < '0') + return FcTrue; + if (c <= '9') + return FcFalse; + if (c < 'A') + return FcTrue; + if (c <= 'Z') + return FcFalse; + if (c < 'a') + return FcTrue; + if (c <= 'z') + return FcFalse; + if (c <= '~') + return FcTrue; + return FcFalse; +} + +/* + * Is the head of s1 equal to s2? + */ + +static FcBool +FcStrIsAtIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) +{ + FcCaseWalker w1, w2; + FcChar8 c1, c2; + + FcStrCaseWalkerInit (s1, &w1); + FcStrCaseWalkerInit (s2, &w2); + + for (;;) + { + c1 = FcStrCaseWalkerNext (&w1); + c2 = FcStrCaseWalkerNext (&w2); + if (!c1 || (c1 != c2)) + break; + } + return c1 == c2 || !c2; +} + +/* + * Does s1 contain an instance of s2 (ignoring blanks and case)? + */ + +const FcChar8 * +FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) +{ + while (*s1) + { + if (FcStrIsAtIgnoreCase (s1, s2)) + return s1; + s1++; + } + return 0; +} + +/* + * Does s1 contain an instance of s2 on a word boundary (ignoring case)? + */ + +const FcChar8 * +FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2) +{ + FcBool wordStart = FcTrue; + int s1len = strlen ((char *) s1); + int s2len = strlen ((char *) s2); + + while (s1len >= s2len) + { + if (wordStart && + FcStrIsAtIgnoreCase (s1, s2) && + (s1len == s2len || FcCharIsPunct (s1[s2len]))) + { + return s1; + } + wordStart = FcFalse; + if (FcCharIsPunct (*s1)) + wordStart = FcTrue; + s1++; + s1len--; + } + return 0; +} + +const FcChar8 * +FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) +{ + FcCaseWalker w1, w2; + FcChar8 c1, c2; + const FcChar8 *cur; + + if (!s1 || !s2) + return 0; + + if (s1 == s2) + return s1; + + FcStrCaseWalkerInit (s1, &w1); + FcStrCaseWalkerInit (s2, &w2); + + c2 = FcStrCaseWalkerNext (&w2); + + for (;;) + { + cur = w1.src; + c1 = FcStrCaseWalkerNext (&w1); + if (!c1) + break; + if (c1 == c2) + { + FcCaseWalker w1t = w1; + FcCaseWalker w2t = w2; + FcChar8 c1t, c2t; + + for (;;) + { + c1t = FcStrCaseWalkerNext (&w1t); + c2t = FcStrCaseWalkerNext (&w2t); + + if (!c2t) + return cur; + if (c2t != c1t) + break; + } + } + } + return 0; +} + +const FcChar8 * +FcStrStr (const FcChar8 *s1, const FcChar8 *s2) +{ + FcChar8 c1, c2; + const FcChar8 * p = s1; + const FcChar8 * b = s2; + + if (!s1 || !s2) + return 0; + + if (s1 == s2) + return s1; + +again: + c2 = *s2++; + + if (!c2) + return 0; + + for (;;) + { + p = s1; + c1 = *s1++; + if (!c1 || c1 == c2) + break; + } + + if (c1 != c2) + return 0; + + for (;;) + { + c1 = *s1; + c2 = *s2; + if (c1 && c2 && c1 != c2) + { + s1 = p + 1; + s2 = b; + goto again; + } + if (!c2) + return p; + if (!c1) + return 0; + ++ s1; + ++ s2; + } + /* never reached. */ +} + +int +FcUtf8ToUcs4 (const FcChar8 *src_orig, + FcChar32 *dst, + int len) +{ + const FcChar8 *src = src_orig; + FcChar8 s; + int extra; + FcChar32 result; + + if (len == 0) + return 0; + + s = *src++; + len--; + + if (!(s & 0x80)) + { + result = s; + extra = 0; + } + else if (!(s & 0x40)) + { + return -1; + } + else if (!(s & 0x20)) + { + result = s & 0x1f; + extra = 1; + } + else if (!(s & 0x10)) + { + result = s & 0xf; + extra = 2; + } + else if (!(s & 0x08)) + { + result = s & 0x07; + extra = 3; + } + else if (!(s & 0x04)) + { + result = s & 0x03; + extra = 4; + } + else if ( ! (s & 0x02)) + { + result = s & 0x01; + extra = 5; + } + else + { + return -1; + } + if (extra > len) + return -1; + + while (extra--) + { + result <<= 6; + s = *src++; + + if ((s & 0xc0) != 0x80) + return -1; + + result |= s & 0x3f; + } + *dst = result; + return src - src_orig; +} + +FcBool +FcUtf8Len (const FcChar8 *string, + int len, + int *nchar, + int *wchar) +{ + int n; + int clen; + FcChar32 c; + FcChar32 max; + + n = 0; + max = 0; + while (len) + { + clen = FcUtf8ToUcs4 (string, &c, len); + if (clen <= 0) /* malformed UTF8 string */ + return FcFalse; + if (c > max) + max = c; + string += clen; + len -= clen; + n++; + } + *nchar = n; + if (max >= 0x10000) + *wchar = 4; + else if (max > 0x100) + *wchar = 2; + else + *wchar = 1; + return FcTrue; +} + +int +FcUcs4ToUtf8 (FcChar32 ucs4, + FcChar8 dest[FC_UTF8_MAX_LEN]) +{ + int bits; + FcChar8 *d = dest; + + if (ucs4 < 0x80) { *d++= ucs4; bits= -6; } + else if (ucs4 < 0x800) { *d++= ((ucs4 >> 6) & 0x1F) | 0xC0; bits= 0; } + else if (ucs4 < 0x10000) { *d++= ((ucs4 >> 12) & 0x0F) | 0xE0; bits= 6; } + else if (ucs4 < 0x200000) { *d++= ((ucs4 >> 18) & 0x07) | 0xF0; bits= 12; } + else if (ucs4 < 0x4000000) { *d++= ((ucs4 >> 24) & 0x03) | 0xF8; bits= 18; } + else if (ucs4 < 0x80000000) { *d++= ((ucs4 >> 30) & 0x01) | 0xFC; bits= 24; } + else return 0; + + for ( ; bits >= 0; bits-= 6) { + *d++= ((ucs4 >> bits) & 0x3F) | 0x80; + } + return d - dest; +} + +#define GetUtf16(src,endian) \ + ((FcChar16) ((src)[endian == FcEndianBig ? 0 : 1] << 8) | \ + (FcChar16) ((src)[endian == FcEndianBig ? 1 : 0])) + +int +FcUtf16ToUcs4 (const FcChar8 *src_orig, + FcEndian endian, + FcChar32 *dst, + int len) /* in bytes */ +{ + const FcChar8 *src = src_orig; + FcChar16 a, b; + FcChar32 result; + + if (len < 2) + return 0; + + a = GetUtf16 (src, endian); src += 2; len -= 2; + + /* + * Check for surrogate + */ + if ((a & 0xfc00) == 0xd800) + { + if (len < 2) + return 0; + b = GetUtf16 (src, endian); src += 2; len -= 2; + /* + * Check for invalid surrogate sequence + */ + if ((b & 0xfc00) != 0xdc00) + return 0; + result = ((((FcChar32) a & 0x3ff) << 10) | + ((FcChar32) b & 0x3ff)) + 0x10000; + } + else + result = a; + *dst = result; + return src - src_orig; +} + +FcBool +FcUtf16Len (const FcChar8 *string, + FcEndian endian, + int len, /* in bytes */ + int *nchar, + int *wchar) +{ + int n; + int clen; + FcChar32 c; + FcChar32 max; + + n = 0; + max = 0; + while (len) + { + clen = FcUtf16ToUcs4 (string, endian, &c, len); + if (clen <= 0) /* malformed UTF8 string */ + return FcFalse; + if (c > max) + max = c; + string += clen; + len -= clen; + n++; + } + *nchar = n; + if (max >= 0x10000) + *wchar = 4; + else if (max > 0x100) + *wchar = 2; + else + *wchar = 1; + return FcTrue; +} + +void +FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size) +{ + if (init) + { + buf->buf = init; + buf->size = size; + } else + { + buf->buf = buf->buf_static; + buf->size = sizeof (buf->buf_static); + } + buf->allocated = FcFalse; + buf->failed = FcFalse; + buf->len = 0; +} + +void +FcStrBufDestroy (FcStrBuf *buf) +{ + if (buf->allocated) + { + FcMemFree (FC_MEM_STRBUF, buf->size); + free (buf->buf); + FcStrBufInit (buf, 0, 0); + } +} + +FcChar8 * +FcStrBufDone (FcStrBuf *buf) +{ + FcChar8 *ret; + + if (buf->failed) + ret = NULL; + else + ret = malloc (buf->len + 1); + if (ret) + { + FcMemAlloc (FC_MEM_STRING, buf->len + 1); + memcpy (ret, buf->buf, buf->len); + ret[buf->len] = '\0'; + } + FcStrBufDestroy (buf); + return ret; +} + +FcChar8 * +FcStrBufDoneStatic (FcStrBuf *buf) +{ + FcStrBufChar (buf, '\0'); + + if (buf->failed) + return NULL; + + return buf->buf; +} + +FcBool +FcStrBufChar (FcStrBuf *buf, FcChar8 c) +{ + if (buf->len == buf->size) + { + FcChar8 *new; + int size; + + if (buf->failed) + return FcFalse; + + if (buf->allocated) + { + size = buf->size * 2; + new = realloc (buf->buf, size); + } + else + { + size = buf->size + 64; + new = malloc (size); + if (new) + { + buf->allocated = FcTrue; + memcpy (new, buf->buf, buf->len); + } + } + if (!new) + { + buf->failed = FcTrue; + return FcFalse; + } + if (buf->size) + FcMemFree (FC_MEM_STRBUF, buf->size); + FcMemAlloc (FC_MEM_STRBUF, size); + buf->size = size; + buf->buf = new; + } + buf->buf[buf->len++] = c; + return FcTrue; +} + +FcBool +FcStrBufString (FcStrBuf *buf, const FcChar8 *s) +{ + FcChar8 c; + while ((c = *s++)) + if (!FcStrBufChar (buf, c)) + return FcFalse; + return FcTrue; +} + +FcBool +FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len) +{ + while (len-- > 0) + if (!FcStrBufChar (buf, *s++)) + return FcFalse; + return FcTrue; +} + +FcBool +FcStrUsesHome (const FcChar8 *s) +{ + return *s == '~'; +} + +FcChar8 * +FcStrCopyFilename (const FcChar8 *s) +{ + FcChar8 *new; + + if (*s == '~') + { + FcChar8 *home = FcConfigHome (); + FcChar8 *full; + int size; + if (!home) + return 0; + size = strlen ((char *) home) + strlen ((char *) s); + full = (FcChar8 *) malloc (size); + if (!full) + return 0; + strcpy ((char *) full, (char *) home); + strcat ((char *) full, (char *) s + 1); + new = FcStrCanonFilename (full); + free (full); + } + else + new = FcStrCanonFilename (s); + return new; +} + +FcChar8 * +FcStrLastSlash (const FcChar8 *path) +{ + FcChar8 *slash; + + slash = (FcChar8 *) strrchr ((const char *) path, '/'); +#ifdef _WIN32 + { + FcChar8 *backslash; + + backslash = (FcChar8 *) strrchr ((const char *) path, '\\'); + if (!slash || (backslash && backslash > slash)) + slash = backslash; + } +#endif + + return slash; +} + +FcChar8 * +FcStrDirname (const FcChar8 *file) +{ + FcChar8 *slash; + FcChar8 *dir; + + slash = FcStrLastSlash (file); + if (!slash) + return FcStrCopy ((FcChar8 *) "."); + dir = malloc ((slash - file) + 1); + if (!dir) + return 0; + FcMemAlloc (FC_MEM_STRING, (slash - file) + 1); + strncpy ((char *) dir, (const char *) file, slash - file); + dir[slash - file] = '\0'; + return dir; +} + +FcChar8 * +FcStrBasename (const FcChar8 *file) +{ + FcChar8 *slash; + + slash = FcStrLastSlash (file); + if (!slash) + return FcStrCopy (file); + return FcStrCopy (slash + 1); +} + +static FcChar8 * +FcStrCanonAbsoluteFilename (const FcChar8 *s) +{ + FcChar8 *file; + FcChar8 *f; + const FcChar8 *slash; + int size; + + size = strlen ((char *) s) + 1; + file = malloc (size); + if (!file) + return NULL; + FcMemAlloc (FC_MEM_STRING, size); + slash = NULL; + f = file; + for (;;) { + if (*s == '/' || *s == '\0') + { + if (slash) + { + switch (s - slash) { + case 1: + f -= 1; /* squash // and trim final / from file */ + break; + case 2: + if (!strncmp ((char *) slash, "/.", 2)) + { + f -= 2; /* trim /. from file */ + } + break; + case 3: + if (!strncmp ((char *) slash, "/..", 3)) + { + f -= 3; /* trim /.. from file */ + while (f > file) { + if (*--f == '/') + break; + } + } + break; + } + } + slash = s; + } + if (!(*f++ = *s++)) + break; + } + return file; +} + +#ifdef _WIN32 +/* + * Convert '\\' to '/' , remove double '/' + */ +static void +FcConvertDosPath (char *str) +{ + size_t len = strlen (str); + char *p = str; + char *dest = str; + char *end = str + len; + char last = 0; + + if (*p == '\\') + { + *p = '/'; + p++; + dest++; + } + while (p < end) + { + if (*p == '\\') + *p = '/'; + + if (*p != '/' + || last != '/') + { + *dest++ = *p; + } + + last = *p; + p++; + } + + *dest = 0; +} +#endif + +FcChar8 * +FcStrCanonFilename (const FcChar8 *s) +{ +#ifdef _WIN32 + FcChar8 full[FC_MAX_FILE_LEN + 2]; + int size = GetFullPathName (s, sizeof (full) -1, + full, NULL); + + if (size == 0) + perror ("GetFullPathName"); + + FcConvertDosPath (full); + return FcStrCanonAbsoluteFilename (full); +#else + if (s[0] == '/') + return FcStrCanonAbsoluteFilename (s); + else + { + FcChar8 *full; + FcChar8 *file; + + FcChar8 cwd[FC_MAX_FILE_LEN + 2]; + if (getcwd ((char *) cwd, FC_MAX_FILE_LEN) == NULL) + return NULL; + strcat ((char *) cwd, "/"); + full = FcStrPlus (cwd, s); + file = FcStrCanonAbsoluteFilename (full); + FcStrFree (full); + return file; + } +#endif +} + + +FcStrSet * +FcStrSetCreate (void) +{ + FcStrSet *set = malloc (sizeof (FcStrSet)); + if (!set) + return 0; + FcMemAlloc (FC_MEM_STRSET, sizeof (FcStrSet)); + set->ref = 1; + set->num = 0; + set->size = 0; + set->strs = 0; + return set; +} + +static FcBool +_FcStrSetAppend (FcStrSet *set, FcChar8 *s) +{ + if (FcStrSetMember (set, s)) + { + FcStrFree (s); + return FcTrue; + } + if (set->num == set->size) + { + FcChar8 **strs = malloc ((set->size + 2) * sizeof (FcChar8 *)); + + if (!strs) + return FcFalse; + FcMemAlloc (FC_MEM_STRSET, (set->size + 2) * sizeof (FcChar8 *)); + if (set->num) + memcpy (strs, set->strs, set->num * sizeof (FcChar8 *)); + if (set->strs) + { + FcMemFree (FC_MEM_STRSET, (set->size + 1) * sizeof (FcChar8 *)); + free (set->strs); + } + set->size = set->size + 1; + set->strs = strs; + } + set->strs[set->num++] = s; + set->strs[set->num] = 0; + return FcTrue; +} + +FcBool +FcStrSetMember (FcStrSet *set, const FcChar8 *s) +{ + int i; + + for (i = 0; i < set->num; i++) + if (!FcStrCmp (set->strs[i], s)) + return FcTrue; + return FcFalse; +} + +FcBool +FcStrSetEqual (FcStrSet *sa, FcStrSet *sb) +{ + int i; + if (sa->num != sb->num) + return FcFalse; + for (i = 0; i < sa->num; i++) + if (!FcStrSetMember (sb, sa->strs[i])) + return FcFalse; + return FcTrue; +} + +FcBool +FcStrSetAdd (FcStrSet *set, const FcChar8 *s) +{ + FcChar8 *new = FcStrCopy (s); + if (!new) + return FcFalse; + if (!_FcStrSetAppend (set, new)) + { + FcStrFree (new); + return FcFalse; + } + return FcTrue; +} + +FcBool +FcStrSetAddFilename (FcStrSet *set, const FcChar8 *s) +{ + FcChar8 *new = FcStrCopyFilename (s); + if (!new) + return FcFalse; + if (!_FcStrSetAppend (set, new)) + { + FcStrFree (new); + return FcFalse; + } + return FcTrue; +} + +FcBool +FcStrSetDel (FcStrSet *set, const FcChar8 *s) +{ + int i; + + for (i = 0; i < set->num; i++) + if (!FcStrCmp (set->strs[i], s)) + { + FcStrFree (set->strs[i]); + /* + * copy remaining string pointers and trailing + * NULL + */ + memmove (&set->strs[i], &set->strs[i+1], + (set->num - i) * sizeof (FcChar8 *)); + set->num--; + return FcTrue; + } + return FcFalse; +} + +void +FcStrSetDestroy (FcStrSet *set) +{ + if (--set->ref == 0) + { + int i; + + for (i = 0; i < set->num; i++) + FcStrFree (set->strs[i]); + if (set->strs) + { + FcMemFree (FC_MEM_STRSET, (set->size + 1) * sizeof (FcChar8 *)); + free (set->strs); + } + FcMemFree (FC_MEM_STRSET, sizeof (FcStrSet)); + free (set); + } +} + +FcStrList * +FcStrListCreate (FcStrSet *set) +{ + FcStrList *list; + + list = malloc (sizeof (FcStrList)); + if (!list) + return 0; + FcMemAlloc (FC_MEM_STRLIST, sizeof (FcStrList)); + list->set = set; + set->ref++; + list->n = 0; + return list; +} + +FcChar8 * +FcStrListNext (FcStrList *list) +{ + if (list->n >= list->set->num) + return 0; + return list->set->strs[list->n++]; +} + +void +FcStrListDone (FcStrList *list) +{ + FcStrSetDestroy (list->set); + FcMemFree (FC_MEM_STRLIST, sizeof (FcStrList)); + free (list); +} + +#define __fcstr__ +#include "fcaliastail.h" +#undef __fcstr__ diff --git a/fontconfig/src/fcxml.c b/fontconfig/src/fcxml.c new file mode 100644 index 000000000..9428468a4 --- /dev/null +++ b/fontconfig/src/fcxml.c @@ -0,0 +1,2570 @@ +/* + * fontconfig/src/fcxml.c + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "fcint.h" +#include <fcntl.h> +#include <stdarg.h> +#include <dirent.h> + +#ifdef ENABLE_LIBXML2 + +#include <libxml/parser.h> + +#define XML_Char xmlChar +#define XML_Parser xmlParserCtxtPtr +#define XML_ParserFree xmlFreeParserCtxt +#define XML_GetCurrentLineNumber xmlSAX2GetLineNumber +#define XML_GetErrorCode xmlCtxtGetLastError +#define XML_ErrorString(Error) (Error)->message + +#else /* ENABLE_LIBXML2 */ + +#ifndef HAVE_XMLPARSE_H +#define HAVE_XMLPARSE_H 0 +#endif + +#if HAVE_XMLPARSE_H +#include <xmlparse.h> +#else +#include <expat.h> +#endif + +#endif /* ENABLE_LIBXML2 */ + +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#define STRICT +#include <windows.h> +#undef STRICT +#include <mbstring.h> +#endif + +static void +FcExprDestroy (FcExpr *e); + +void +FcTestDestroy (FcTest *test) +{ + if (test->next) + FcTestDestroy (test->next); + FcExprDestroy (test->expr); + FcMemFree (FC_MEM_TEST, sizeof (FcTest)); + free (test); +} + +static FcExpr * +FcExprCreateInteger (FcConfig *config, int i) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpInteger; + e->u.ival = i; + } + return e; +} + +static FcExpr * +FcExprCreateDouble (FcConfig *config, double d) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpDouble; + e->u.dval = d; + } + return e; +} + +static FcExpr * +FcExprCreateString (FcConfig *config, const FcChar8 *s) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpString; + e->u.sval = FcStrStaticName (s); + } + return e; +} + +static FcExpr * +FcExprCreateMatrix (FcConfig *config, const FcMatrix *m) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpMatrix; + e->u.mval = FcMatrixCopy (m); + } + return e; +} + +static FcExpr * +FcExprCreateBool (FcConfig *config, FcBool b) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpBool; + e->u.bval = b; + } + return e; +} + +static FcExpr * +FcExprCreateField (FcConfig *config, const char *field) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpField; + e->u.object = FcObjectFromName (field); + } + return e; +} + +static FcExpr * +FcExprCreateConst (FcConfig *config, const FcChar8 *constant) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = FcOpConst; + e->u.constant = FcStrStaticName (constant); + } + return e; +} + +static FcExpr * +FcExprCreateOp (FcConfig *config, FcExpr *left, FcOp op, FcExpr *right) +{ + FcExpr *e = FcConfigAllocExpr (config); + if (e) + { + e->op = op; + e->u.tree.left = left; + e->u.tree.right = right; + } + return e; +} + +static void +FcExprDestroy (FcExpr *e) +{ + if (!e) + return; + switch (e->op) { + case FcOpInteger: + break; + case FcOpDouble: + break; + case FcOpString: + break; + case FcOpMatrix: + FcMatrixFree (e->u.mval); + break; + case FcOpCharSet: + FcCharSetDestroy (e->u.cval); + break; + case FcOpBool: + break; + case FcOpField: + break; + case FcOpConst: + break; + case FcOpAssign: + case FcOpAssignReplace: + case FcOpPrepend: + case FcOpPrependFirst: + case FcOpAppend: + case FcOpAppendLast: + break; + case FcOpOr: + case FcOpAnd: + case FcOpEqual: + case FcOpNotEqual: + case FcOpLess: + case FcOpLessEqual: + case FcOpMore: + case FcOpMoreEqual: + case FcOpContains: + case FcOpListing: + case FcOpNotContains: + case FcOpPlus: + case FcOpMinus: + case FcOpTimes: + case FcOpDivide: + case FcOpQuest: + case FcOpComma: + FcExprDestroy (e->u.tree.right); + /* fall through */ + case FcOpNot: + case FcOpFloor: + case FcOpCeil: + case FcOpRound: + case FcOpTrunc: + FcExprDestroy (e->u.tree.left); + break; + case FcOpNil: + case FcOpInvalid: + break; + } + + e->op = FcOpNil; +} + +void +FcEditDestroy (FcEdit *e) +{ + if (e->next) + FcEditDestroy (e->next); + if (e->expr) + FcExprDestroy (e->expr); + free (e); +} + +typedef enum _FcElement { + FcElementNone, + FcElementFontconfig, + FcElementDir, + FcElementCacheDir, + FcElementCache, + FcElementInclude, + FcElementConfig, + FcElementMatch, + FcElementAlias, + + FcElementBlank, + FcElementRescan, + + FcElementPrefer, + FcElementAccept, + FcElementDefault, + FcElementFamily, + + FcElementSelectfont, + FcElementAcceptfont, + FcElementRejectfont, + FcElementGlob, + FcElementPattern, + FcElementPatelt, + + FcElementTest, + FcElementEdit, + FcElementInt, + FcElementDouble, + FcElementString, + FcElementMatrix, + FcElementBool, + FcElementCharset, + FcElementName, + FcElementConst, + FcElementOr, + FcElementAnd, + FcElementEq, + FcElementNotEq, + FcElementLess, + FcElementLessEq, + FcElementMore, + FcElementMoreEq, + FcElementContains, + FcElementNotContains, + FcElementPlus, + FcElementMinus, + FcElementTimes, + FcElementDivide, + FcElementNot, + FcElementIf, + FcElementFloor, + FcElementCeil, + FcElementRound, + FcElementTrunc, + FcElementUnknown +} FcElement; + +static const struct { + const char name[16]; + FcElement element; +} fcElementMap[] = { + { "fontconfig", FcElementFontconfig }, + { "dir", FcElementDir }, + { "cachedir", FcElementCacheDir }, + { "cache", FcElementCache }, + { "include", FcElementInclude }, + { "config", FcElementConfig }, + { "match", FcElementMatch }, + { "alias", FcElementAlias }, + + { "blank", FcElementBlank }, + { "rescan", FcElementRescan }, + + { "prefer", FcElementPrefer }, + { "accept", FcElementAccept }, + { "default", FcElementDefault }, + { "family", FcElementFamily }, + + { "selectfont", FcElementSelectfont }, + { "acceptfont", FcElementAcceptfont }, + { "rejectfont", FcElementRejectfont }, + { "glob", FcElementGlob }, + { "pattern", FcElementPattern }, + { "patelt", FcElementPatelt }, + + { "test", FcElementTest }, + { "edit", FcElementEdit }, + { "int", FcElementInt }, + { "double", FcElementDouble }, + { "string", FcElementString }, + { "matrix", FcElementMatrix }, + { "bool", FcElementBool }, + { "charset", FcElementCharset }, + { "name", FcElementName }, + { "const", FcElementConst }, + { "or", FcElementOr }, + { "and", FcElementAnd }, + { "eq", FcElementEq }, + { "not_eq", FcElementNotEq }, + { "less", FcElementLess }, + { "less_eq", FcElementLessEq }, + { "more", FcElementMore }, + { "more_eq", FcElementMoreEq }, + { "contains", FcElementContains }, + { "not_contains", FcElementNotContains }, + { "plus", FcElementPlus }, + { "minus", FcElementMinus }, + { "times", FcElementTimes }, + { "divide", FcElementDivide }, + { "not", FcElementNot }, + { "if", FcElementIf }, + { "floor", FcElementFloor }, + { "ceil", FcElementCeil }, + { "round", FcElementRound }, + { "trunc", FcElementTrunc }, +}; +#define NUM_ELEMENT_MAPS (int) (sizeof fcElementMap / sizeof fcElementMap[0]) + +static FcElement +FcElementMap (const XML_Char *name) +{ + + int i; + for (i = 0; i < NUM_ELEMENT_MAPS; i++) + if (!strcmp ((char *) name, fcElementMap[i].name)) + return fcElementMap[i].element; + return FcElementUnknown; +} + +typedef struct _FcPStack { + struct _FcPStack *prev; + FcElement element; + FcChar8 **attr; + FcStrBuf str; + FcChar8 *attr_buf_static[16]; +} FcPStack; + +typedef enum _FcVStackTag { + FcVStackNone, + + FcVStackString, + FcVStackFamily, + FcVStackField, + FcVStackConstant, + FcVStackGlob, + FcVStackPattern, + + FcVStackPrefer, + FcVStackAccept, + FcVStackDefault, + + FcVStackInteger, + FcVStackDouble, + FcVStackMatrix, + FcVStackBool, + + FcVStackTest, + FcVStackExpr, + FcVStackEdit +} FcVStackTag; + +typedef struct _FcVStack { + struct _FcVStack *prev; + FcPStack *pstack; /* related parse element */ + FcVStackTag tag; + union { + FcChar8 *string; + + int integer; + double _double; + FcMatrix *matrix; + FcBool bool_; + + FcTest *test; + FcQual qual; + FcOp op; + FcExpr *expr; + FcEdit *edit; + + FcPattern *pattern; + } u; +} FcVStack; + +typedef struct _FcConfigParse { + FcPStack *pstack; + FcVStack *vstack; + FcBool error; + const FcChar8 *name; + FcConfig *config; + XML_Parser parser; + int pstack_static_used; + FcPStack pstack_static[8]; + int vstack_static_used; + FcVStack vstack_static[64]; +} FcConfigParse; + +typedef enum _FcConfigSeverity { + FcSevereInfo, FcSevereWarning, FcSevereError +} FcConfigSeverity; + +static void +FcConfigMessage (FcConfigParse *parse, FcConfigSeverity severe, const char *fmt, ...) +{ + const char *s = "unknown"; + va_list args; + + va_start (args, fmt); + + switch (severe) { + case FcSevereInfo: s = "info"; break; + case FcSevereWarning: s = "warning"; break; + case FcSevereError: s = "error"; break; + } + if (parse) + { + if (parse->name) + fprintf (stderr, "Fontconfig %s: \"%s\", line %d: ", s, + parse->name, (int)XML_GetCurrentLineNumber (parse->parser)); + else + fprintf (stderr, "Fontconfig %s: line %d: ", s, + (int)XML_GetCurrentLineNumber (parse->parser)); + if (severe >= FcSevereError) + parse->error = FcTrue; + } + else + fprintf (stderr, "Fontconfig %s: ", s); + vfprintf (stderr, fmt, args); + fprintf (stderr, "\n"); + va_end (args); +} + + +static const char * +FcTypeName (FcType type) +{ + switch (type) { + case FcTypeVoid: + return "void"; + case FcTypeInteger: + case FcTypeDouble: + return "number"; + case FcTypeString: + return "string"; + case FcTypeBool: + return "bool"; + case FcTypeMatrix: + return "matrix"; + case FcTypeCharSet: + return "charset"; + case FcTypeFTFace: + return "FT_Face"; + case FcTypeLangSet: + return "langset"; + default: + return "unknown"; + } +} + +static void +FcTypecheckValue (FcConfigParse *parse, FcType value, FcType type) +{ + if (value == FcTypeInteger) + value = FcTypeDouble; + if (type == FcTypeInteger) + type = FcTypeDouble; + if (value != type) + { + if ((value == FcTypeLangSet && type == FcTypeString) || + (value == FcTypeString && type == FcTypeLangSet)) + return; + if (type == (FcType) -1) + return; + FcConfigMessage (parse, FcSevereWarning, "saw %s, expected %s", + FcTypeName (value), FcTypeName (type)); + } +} + +static void +FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type) +{ + const FcObjectType *o; + const FcConstant *c; + + /* If parsing the expression failed, some nodes may be NULL */ + if (!expr) + return; + + switch (expr->op) { + case FcOpInteger: + case FcOpDouble: + FcTypecheckValue (parse, FcTypeDouble, type); + break; + case FcOpString: + FcTypecheckValue (parse, FcTypeString, type); + break; + case FcOpMatrix: + FcTypecheckValue (parse, FcTypeMatrix, type); + break; + case FcOpBool: + FcTypecheckValue (parse, FcTypeBool, type); + break; + case FcOpCharSet: + FcTypecheckValue (parse, FcTypeCharSet, type); + break; + case FcOpNil: + break; + case FcOpField: + o = FcNameGetObjectType (FcObjectName (expr->u.object)); + if (o) + FcTypecheckValue (parse, o->type, type); + break; + case FcOpConst: + c = FcNameGetConstant (expr->u.constant); + if (c) + { + o = FcNameGetObjectType (c->object); + if (o) + FcTypecheckValue (parse, o->type, type); + } + else + FcConfigMessage (parse, FcSevereWarning, + "invalid constant used : %s", + expr->u.constant); + break; + case FcOpQuest: + FcTypecheckExpr (parse, expr->u.tree.left, FcTypeBool); + FcTypecheckExpr (parse, expr->u.tree.right->u.tree.left, type); + FcTypecheckExpr (parse, expr->u.tree.right->u.tree.right, type); + break; + case FcOpAssign: + case FcOpAssignReplace: + break; + case FcOpEqual: + case FcOpNotEqual: + case FcOpLess: + case FcOpLessEqual: + case FcOpMore: + case FcOpMoreEqual: + case FcOpContains: + case FcOpNotContains: + case FcOpListing: + FcTypecheckValue (parse, FcTypeBool, type); + break; + case FcOpComma: + case FcOpOr: + case FcOpAnd: + case FcOpPlus: + case FcOpMinus: + case FcOpTimes: + case FcOpDivide: + FcTypecheckExpr (parse, expr->u.tree.left, type); + FcTypecheckExpr (parse, expr->u.tree.right, type); + break; + case FcOpNot: + FcTypecheckValue (parse, FcTypeBool, type); + FcTypecheckExpr (parse, expr->u.tree.left, FcTypeBool); + break; + case FcOpFloor: + case FcOpCeil: + case FcOpRound: + case FcOpTrunc: + FcTypecheckValue (parse, FcTypeDouble, type); + FcTypecheckExpr (parse, expr->u.tree.left, FcTypeDouble); + break; + default: + break; + } +} + +static FcTest * +FcTestCreate (FcConfigParse *parse, + FcMatchKind kind, + FcQual qual, + const FcChar8 *field, + FcOp compare, + FcExpr *expr) +{ + FcTest *test = (FcTest *) malloc (sizeof (FcTest)); + + if (test) + { + const FcObjectType *o; + + FcMemAlloc (FC_MEM_TEST, sizeof (FcTest)); + test->next = 0; + test->kind = kind; + test->qual = qual; + test->object = FcObjectFromName ((const char *) field); + test->op = compare; + test->expr = expr; + o = FcNameGetObjectType (FcObjectName (test->object)); + if (o) + FcTypecheckExpr (parse, expr, o->type); + } + return test; +} + +static FcEdit * +FcEditCreate (FcConfigParse *parse, + FcObject object, + FcOp op, + FcExpr *expr, + FcValueBinding binding) +{ + FcEdit *e = (FcEdit *) malloc (sizeof (FcEdit)); + + if (e) + { + const FcObjectType *o; + + e->next = 0; + e->object = object; + e->op = op; + e->expr = expr; + e->binding = binding; + o = FcNameGetObjectType (FcObjectName (e->object)); + if (o) + FcTypecheckExpr (parse, expr, o->type); + } + return e; +} + +static FcVStack * +FcVStackCreateAndPush (FcConfigParse *parse) +{ + FcVStack *new; + + if (parse->vstack_static_used < sizeof (parse->vstack_static) / sizeof (parse->vstack_static[0])) + new = &parse->vstack_static[parse->vstack_static_used++]; + else + { + new = malloc (sizeof (FcVStack)); + if (!new) + return 0; + FcMemAlloc (FC_MEM_VSTACK, sizeof (FcVStack)); + } + new->tag = FcVStackNone; + new->prev = 0; + + new->prev = parse->vstack; + new->pstack = parse->pstack ? parse->pstack->prev : 0; + parse->vstack = new; + + return new; +} + +static FcBool +FcVStackPushString (FcConfigParse *parse, FcVStackTag tag, FcChar8 *string) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.string = string; + vstack->tag = tag; + return FcTrue; +} + +static FcBool +FcVStackPushInteger (FcConfigParse *parse, int integer) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.integer = integer; + vstack->tag = FcVStackInteger; + return FcTrue; +} + +static FcBool +FcVStackPushDouble (FcConfigParse *parse, double _double) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u._double = _double; + vstack->tag = FcVStackDouble; + return FcTrue; +} + +static FcBool +FcVStackPushMatrix (FcConfigParse *parse, FcMatrix *matrix) +{ + FcVStack *vstack; + matrix = FcMatrixCopy (matrix); + if (!matrix) + return FcFalse; + vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.matrix = matrix; + vstack->tag = FcVStackMatrix; + return FcTrue; +} + +static FcBool +FcVStackPushBool (FcConfigParse *parse, FcBool bool_) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.bool_ = bool_; + vstack->tag = FcVStackBool; + return FcTrue; +} + +static FcBool +FcVStackPushTest (FcConfigParse *parse, FcTest *test) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.test = test; + vstack->tag = FcVStackTest; + return FcTrue; +} + +static FcBool +FcVStackPushExpr (FcConfigParse *parse, FcVStackTag tag, FcExpr *expr) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.expr = expr; + vstack->tag = tag; + return FcTrue; +} + +static FcBool +FcVStackPushEdit (FcConfigParse *parse, FcEdit *edit) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.edit = edit; + vstack->tag = FcVStackEdit; + return FcTrue; +} + +static FcBool +FcVStackPushPattern (FcConfigParse *parse, FcPattern *pattern) +{ + FcVStack *vstack = FcVStackCreateAndPush (parse); + if (!vstack) + return FcFalse; + vstack->u.pattern = pattern; + vstack->tag = FcVStackPattern; + return FcTrue; +} + +static FcVStack * +FcVStackFetch (FcConfigParse *parse, int off) +{ + FcVStack *vstack; + + for (vstack = parse->vstack; vstack && off-- > 0; vstack = vstack->prev); + return vstack; +} + +static FcVStack * +FcVStackPeek (FcConfigParse *parse) +{ + FcVStack *vstack = parse->vstack; + + return vstack && vstack->pstack == parse->pstack ? vstack : 0; +} + +static void +FcVStackPopAndDestroy (FcConfigParse *parse) +{ + FcVStack *vstack = parse->vstack; + + if (!vstack || vstack->pstack != parse->pstack) + return; + + parse->vstack = vstack->prev; + + switch (vstack->tag) { + case FcVStackNone: + break; + case FcVStackFamily: + break; + case FcVStackString: + case FcVStackField: + case FcVStackConstant: + case FcVStackGlob: + FcStrFree (vstack->u.string); + break; + case FcVStackPattern: + FcPatternDestroy (vstack->u.pattern); + break; + case FcVStackInteger: + case FcVStackDouble: + break; + case FcVStackMatrix: + FcMatrixFree (vstack->u.matrix); + break; + case FcVStackBool: + break; + case FcVStackTest: + FcTestDestroy (vstack->u.test); + break; + case FcVStackExpr: + case FcVStackPrefer: + case FcVStackAccept: + case FcVStackDefault: + FcExprDestroy (vstack->u.expr); + break; + case FcVStackEdit: + FcEditDestroy (vstack->u.edit); + break; + } + + if (vstack == &parse->vstack_static[parse->vstack_static_used - 1]) + parse->vstack_static_used--; + else + { + FcMemFree (FC_MEM_VSTACK, sizeof (FcVStack)); + free (vstack); + } +} + +static void +FcVStackClear (FcConfigParse *parse) +{ + while (FcVStackPeek (parse)) + FcVStackPopAndDestroy (parse); +} + +static int +FcVStackElements (FcConfigParse *parse) +{ + int h = 0; + FcVStack *vstack = parse->vstack; + while (vstack && vstack->pstack == parse->pstack) + { + h++; + vstack = vstack->prev; + } + return h; +} + +static FcChar8 ** +FcConfigSaveAttr (const XML_Char **attr, FcChar8 **buf, int size_bytes) +{ + int slen; + int i; + FcChar8 **new; + FcChar8 *s; + + if (!attr) + return 0; + slen = 0; + for (i = 0; attr[i]; i++) + slen += strlen ((char *) attr[i]) + 1; + if (i == 0) + return 0; + slen += (i + 1) * sizeof (FcChar8 *); + if (slen <= size_bytes) + new = buf; + else + { + new = malloc (slen); + if (!new) + { + FcConfigMessage (0, FcSevereError, "out of memory"); + return 0; + } + FcMemAlloc (FC_MEM_ATTR, 1); /* size is too expensive */ + } + s = (FcChar8 *) (new + (i + 1)); + for (i = 0; attr[i]; i++) + { + new[i] = s; + strcpy ((char *) s, (char *) attr[i]); + s += strlen ((char *) s) + 1; + } + new[i] = 0; + return new; +} + +static FcBool +FcPStackPush (FcConfigParse *parse, FcElement element, const XML_Char **attr) +{ + FcPStack *new; + + if (parse->pstack_static_used < sizeof (parse->pstack_static) / sizeof (parse->pstack_static[0])) + new = &parse->pstack_static[parse->pstack_static_used++]; + else + { + new = malloc (sizeof (FcPStack)); + if (!new) + return FcFalse; + FcMemAlloc (FC_MEM_PSTACK, sizeof (FcPStack)); + } + + new->prev = parse->pstack; + new->element = element; + new->attr = FcConfigSaveAttr (attr, new->attr_buf_static, sizeof (new->attr_buf_static)); + FcStrBufInit (&new->str, 0, 0); + parse->pstack = new; + return FcTrue; +} + +static FcBool +FcPStackPop (FcConfigParse *parse) +{ + FcPStack *old; + + if (!parse->pstack) + { + FcConfigMessage (parse, FcSevereError, "mismatching element"); + return FcFalse; + } + FcVStackClear (parse); + old = parse->pstack; + parse->pstack = old->prev; + FcStrBufDestroy (&old->str); + if (old->attr && old->attr != old->attr_buf_static) + { + FcMemFree (FC_MEM_ATTR, 1); /* size is to expensive */ + free (old->attr); + } + + if (old == &parse->pstack_static[parse->pstack_static_used - 1]) + parse->pstack_static_used--; + else + { + FcMemFree (FC_MEM_PSTACK, sizeof (FcPStack)); + free (old); + } + return FcTrue; +} + +static FcBool +FcConfigInit (FcConfigParse *parse, const FcChar8 *name, FcConfig *config, XML_Parser parser) +{ + parse->pstack = 0; + parse->pstack_static_used = 0; + parse->vstack = 0; + parse->vstack_static_used = 0; + parse->error = FcFalse; + parse->name = name; + parse->config = config; + parse->parser = parser; + return FcTrue; +} + +static void +FcConfigCleanup (FcConfigParse *parse) +{ + while (parse->pstack) + FcPStackPop (parse); +} + +static const FcChar8 * +FcConfigGetAttribute (FcConfigParse *parse, const char *attr) +{ + FcChar8 **attrs; + if (!parse->pstack) + return 0; + + attrs = parse->pstack->attr; + if (!attrs) + return 0; + + while (*attrs) + { + if (!strcmp ((char *) *attrs, attr)) + return attrs[1]; + attrs += 2; + } + return 0; +} + +static void +FcStartElement(void *userData, const XML_Char *name, const XML_Char **attr) +{ + FcConfigParse *parse = userData; + FcElement element; + + element = FcElementMap (name); + if (element == FcElementUnknown) + FcConfigMessage (parse, FcSevereWarning, "unknown element \"%s\"", name); + + if (!FcPStackPush (parse, element, attr)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + return; +} + +static void +FcParseBlank (FcConfigParse *parse) +{ + int n = FcVStackElements (parse); + while (n-- > 0) + { + FcVStack *v = FcVStackFetch (parse, n); + if (v->tag != FcVStackInteger) + FcConfigMessage (parse, FcSevereError, "non-integer blank"); + else + { + if (!parse->config->blanks) + { + parse->config->blanks = FcBlanksCreate (); + if (!parse->config->blanks) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } + } + if (!FcBlanksAdd (parse->config->blanks, v->u.integer)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } + } + } +} + +static void +FcParseRescan (FcConfigParse *parse) +{ + int n = FcVStackElements (parse); + while (n-- > 0) + { + FcVStack *v = FcVStackFetch (parse, n); + if (v->tag != FcVStackInteger) + FcConfigMessage (parse, FcSevereWarning, "non-integer rescan"); + else + parse->config->rescanInterval = v->u.integer; + } +} + +static void +FcParseInt (FcConfigParse *parse) +{ + FcChar8 *s, *end; + int l; + + if (!parse->pstack) + return; + s = FcStrBufDoneStatic (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + end = 0; + l = (int) strtol ((char *) s, (char **)&end, 0); + if (end != s + strlen ((char *) s)) + FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid integer", s); + else + FcVStackPushInteger (parse, l); + FcStrBufDestroy (&parse->pstack->str); +} + +/* + * idea copied from glib g_ascii_strtod with + * permission of the author (Alexander Larsson) + */ + +#include <locale.h> + +static double +FcStrtod (char *s, char **end) +{ + struct lconv *locale_data; + char *dot; + double v; + + /* + * Have to swap the decimal point to match the current locale + * if that locale doesn't use 0x2e + */ + if ((dot = strchr (s, 0x2e)) && + (locale_data = localeconv ()) && + (locale_data->decimal_point[0] != 0x2e || + locale_data->decimal_point[1] != 0)) + { + char buf[128]; + int slen = strlen (s); + int dlen = strlen (locale_data->decimal_point); + + if (slen + dlen > (int) sizeof (buf)) + { + if (end) + *end = s; + v = 0; + } + else + { + char *buf_end; + /* mantissa */ + strncpy (buf, s, dot - s); + /* decimal point */ + strcpy (buf + (dot - s), locale_data->decimal_point); + /* rest of number */ + strcpy (buf + (dot - s) + dlen, dot + 1); + buf_end = 0; + v = strtod (buf, &buf_end); + if (buf_end) { + buf_end = s + (buf_end - buf); + if (buf_end > dot) + buf_end -= dlen - 1; + } + if (end) + *end = buf_end; + } + } + else + v = strtod (s, end); + return v; +} + +static void +FcParseDouble (FcConfigParse *parse) +{ + FcChar8 *s, *end; + double d; + + if (!parse->pstack) + return; + s = FcStrBufDoneStatic (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + end = 0; + d = FcStrtod ((char *) s, (char **)&end); + if (end != s + strlen ((char *) s)) + FcConfigMessage (parse, FcSevereError, "\"%s\": not a valid double", s); + else + FcVStackPushDouble (parse, d); + FcStrBufDestroy (&parse->pstack->str); +} + +static void +FcParseString (FcConfigParse *parse, FcVStackTag tag) +{ + FcChar8 *s; + + if (!parse->pstack) + return; + s = FcStrBufDone (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + if (!FcVStackPushString (parse, tag, s)) + FcStrFree (s); +} + +static void +FcParseMatrix (FcConfigParse *parse) +{ + FcVStack *vstack; + enum { m_done, m_xx, m_xy, m_yx, m_yy } matrix_state = m_yy; + FcMatrix m; + + while ((vstack = FcVStackPeek (parse))) + { + double v; + switch (vstack->tag) { + case FcVStackInteger: + v = vstack->u.integer; + break; + case FcVStackDouble: + v = vstack->u._double; + break; + default: + FcConfigMessage (parse, FcSevereError, "non-double matrix element"); + v = 1.0; + break; + } + switch (matrix_state) { + case m_xx: m.xx = v; break; + case m_xy: m.xy = v; break; + case m_yx: m.yx = v; break; + case m_yy: m.yy = v; break; + default: break; + } + FcVStackPopAndDestroy (parse); + matrix_state--; + } + if (matrix_state != m_done) + FcConfigMessage (parse, FcSevereError, "wrong number of matrix elements"); + else + FcVStackPushMatrix (parse, &m); +} + +static FcBool +FcConfigLexBool (FcConfigParse *parse, const FcChar8 *bool_) +{ + FcBool result = FcFalse; + + if (!FcNameBool (bool_, &result)) + FcConfigMessage (parse, FcSevereWarning, "\"%s\" is not known boolean", + bool_); + return result; +} + +static void +FcParseBool (FcConfigParse *parse) +{ + FcChar8 *s; + + if (!parse->pstack) + return; + s = FcStrBufDoneStatic (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + FcVStackPushBool (parse, FcConfigLexBool (parse, s)); + FcStrBufDestroy (&parse->pstack->str); +} + +static FcBool +FcConfigLexBinding (FcConfigParse *parse, + const FcChar8 *binding_string, + FcValueBinding *binding_ret) +{ + FcValueBinding binding; + + if (!binding_string) + binding = FcValueBindingWeak; + else + { + if (!strcmp ((char *) binding_string, "weak")) + binding = FcValueBindingWeak; + else if (!strcmp ((char *) binding_string, "strong")) + binding = FcValueBindingStrong; + else if (!strcmp ((char *) binding_string, "same")) + binding = FcValueBindingSame; + else + { + FcConfigMessage (parse, FcSevereWarning, "invalid binding \"%s\"", binding_string); + return FcFalse; + } + } + *binding_ret = binding; + return FcTrue; +} + +static void +FcParseFamilies (FcConfigParse *parse, FcVStackTag tag) +{ + FcVStack *vstack; + FcExpr *left, *expr = 0, *new; + + while ((vstack = FcVStackPeek (parse))) + { + if (vstack->tag != FcVStackFamily) + { + FcConfigMessage (parse, FcSevereWarning, "non-family"); + FcVStackPopAndDestroy (parse); + continue; + } + left = vstack->u.expr; + vstack->tag = FcVStackNone; + FcVStackPopAndDestroy (parse); + if (expr) + { + new = FcExprCreateOp (parse->config, left, FcOpComma, expr); + if (!new) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcExprDestroy (left); + FcExprDestroy (expr); + break; + } + expr = new; + } + else + expr = left; + } + if (expr) + { + if (!FcVStackPushExpr (parse, tag, expr)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcExprDestroy (expr); + } + } +} + +static void +FcParseFamily (FcConfigParse *parse) +{ + FcChar8 *s; + FcExpr *expr; + + if (!parse->pstack) + return; + s = FcStrBufDoneStatic (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + expr = FcExprCreateString (parse->config, s); + FcStrBufDestroy (&parse->pstack->str); + if (expr) + FcVStackPushExpr (parse, FcVStackFamily, expr); +} + +static void +FcParseAlias (FcConfigParse *parse) +{ + FcExpr *family = 0, *accept = 0, *prefer = 0, *def = 0, *new = 0; + FcEdit *edit = 0, *next; + FcVStack *vstack; + FcTest *test; + FcValueBinding binding; + + if (!FcConfigLexBinding (parse, FcConfigGetAttribute (parse, "binding"), &binding)) + return; + while ((vstack = FcVStackPeek (parse))) + { + switch (vstack->tag) { + case FcVStackFamily: + if (family) + { + new = FcExprCreateOp (parse->config, vstack->u.expr, FcOpComma, family); + if (!new) + FcConfigMessage (parse, FcSevereError, "out of memory"); + else + family = new; + } + else + new = vstack->u.expr; + if (new) + { + family = new; + vstack->tag = FcVStackNone; + } + break; + case FcVStackPrefer: + if (prefer) + FcExprDestroy (prefer); + prefer = vstack->u.expr; + vstack->tag = FcVStackNone; + break; + case FcVStackAccept: + if (accept) + FcExprDestroy (accept); + accept = vstack->u.expr; + vstack->tag = FcVStackNone; + break; + case FcVStackDefault: + if (def) + FcExprDestroy (def); + def = vstack->u.expr; + vstack->tag = FcVStackNone; + break; + default: + FcConfigMessage (parse, FcSevereWarning, "bad alias"); + break; + } + FcVStackPopAndDestroy (parse); + } + if (!family) + { + FcConfigMessage (parse, FcSevereError, "missing family in alias"); + if (prefer) + FcExprDestroy (prefer); + if (accept) + FcExprDestroy (accept); + if (def) + FcExprDestroy (def); + return; + } + if (prefer) + { + edit = FcEditCreate (parse, + FC_FAMILY_OBJECT, + FcOpPrepend, + prefer, + binding); + if (edit) + edit->next = 0; + else + FcExprDestroy (prefer); + } + if (accept) + { + next = edit; + edit = FcEditCreate (parse, + FC_FAMILY_OBJECT, + FcOpAppend, + accept, + binding); + if (edit) + edit->next = next; + else + FcExprDestroy (accept); + } + if (def) + { + next = edit; + edit = FcEditCreate (parse, + FC_FAMILY_OBJECT, + FcOpAppendLast, + def, + binding); + if (edit) + edit->next = next; + else + FcExprDestroy (def); + } + if (edit) + { + test = FcTestCreate (parse, FcMatchPattern, + FcQualAny, + (FcChar8 *) FC_FAMILY, + FcOpEqual, + family); + if (test) + if (!FcConfigAddEdit (parse->config, test, edit, FcMatchPattern)) + FcTestDestroy (test); + } + else + FcExprDestroy (family); +} + +static FcExpr * +FcPopExpr (FcConfigParse *parse) +{ + FcVStack *vstack = FcVStackPeek (parse); + FcExpr *expr = 0; + if (!vstack) + return 0; + switch (vstack->tag) { + case FcVStackNone: + break; + case FcVStackString: + case FcVStackFamily: + expr = FcExprCreateString (parse->config, vstack->u.string); + break; + case FcVStackField: + expr = FcExprCreateField (parse->config, (char *) vstack->u.string); + break; + case FcVStackConstant: + expr = FcExprCreateConst (parse->config, vstack->u.string); + break; + case FcVStackGlob: + /* XXX: What's the correct action here? (CDW) */ + break; + case FcVStackPrefer: + case FcVStackAccept: + case FcVStackDefault: + expr = vstack->u.expr; + vstack->tag = FcVStackNone; + break; + case FcVStackInteger: + expr = FcExprCreateInteger (parse->config, vstack->u.integer); + break; + case FcVStackDouble: + expr = FcExprCreateDouble (parse->config, vstack->u._double); + break; + case FcVStackMatrix: + expr = FcExprCreateMatrix (parse->config, vstack->u.matrix); + break; + case FcVStackBool: + expr = FcExprCreateBool (parse->config, vstack->u.bool_); + break; + case FcVStackTest: + break; + case FcVStackExpr: + expr = vstack->u.expr; + vstack->tag = FcVStackNone; + break; + case FcVStackEdit: + break; + default: + break; + } + FcVStackPopAndDestroy (parse); + return expr; +} + +/* + * This builds a tree of binary operations. Note + * that every operator is defined so that if only + * a single operand is contained, the value of the + * whole expression is the value of the operand. + * + * This code reduces in that case to returning that + * operand. + */ +static FcExpr * +FcPopBinary (FcConfigParse *parse, FcOp op) +{ + FcExpr *left, *expr = 0, *new; + + while ((left = FcPopExpr (parse))) + { + if (expr) + { + new = FcExprCreateOp (parse->config, left, op, expr); + if (!new) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcExprDestroy (left); + FcExprDestroy (expr); + return 0; + } + expr = new; + } + else + expr = left; + } + return expr; +} + +static void +FcParseBinary (FcConfigParse *parse, FcOp op) +{ + FcExpr *expr = FcPopBinary (parse, op); + if (expr) + FcVStackPushExpr (parse, FcVStackExpr, expr); +} + +/* + * This builds a a unary operator, it consumes only + * a single operand + */ + +static FcExpr * +FcPopUnary (FcConfigParse *parse, FcOp op) +{ + FcExpr *operand, *new = 0; + + if ((operand = FcPopExpr (parse))) + { + new = FcExprCreateOp (parse->config, operand, op, 0); + if (!new) + { + FcExprDestroy (operand); + FcConfigMessage (parse, FcSevereError, "out of memory"); + } + } + return new; +} + +static void +FcParseUnary (FcConfigParse *parse, FcOp op) +{ + FcExpr *expr = FcPopUnary (parse, op); + if (expr) + FcVStackPushExpr (parse, FcVStackExpr, expr); +} + +static void +FcParseInclude (FcConfigParse *parse) +{ + FcChar8 *s; + const FcChar8 *i; + FcBool ignore_missing = FcFalse; + + s = FcStrBufDoneStatic (&parse->pstack->str); + if (!s) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + i = FcConfigGetAttribute (parse, "ignore_missing"); + if (i && FcConfigLexBool (parse, (FcChar8 *) i) == FcTrue) + ignore_missing = FcTrue; + if (!FcConfigParseAndLoad (parse->config, s, !ignore_missing)) + parse->error = FcTrue; + FcStrBufDestroy (&parse->pstack->str); +} + +typedef struct _FcOpMap { + char name[16]; + FcOp op; +} FcOpMap; + +static FcOp +FcConfigLexOp (const FcChar8 *op, const FcOpMap *map, int nmap) +{ + int i; + + for (i = 0; i < nmap; i++) + if (!strcmp ((char *) op, map[i].name)) + return map[i].op; + return FcOpInvalid; +} + +static const FcOpMap fcCompareOps[] = { + { "eq", FcOpEqual }, + { "not_eq", FcOpNotEqual }, + { "less", FcOpLess }, + { "less_eq", FcOpLessEqual }, + { "more", FcOpMore }, + { "more_eq", FcOpMoreEqual }, + { "contains", FcOpContains }, + { "not_contains", FcOpNotContains } +}; + +#define NUM_COMPARE_OPS (int) (sizeof fcCompareOps / sizeof fcCompareOps[0]) + +static FcOp +FcConfigLexCompare (const FcChar8 *compare) +{ + return FcConfigLexOp (compare, fcCompareOps, NUM_COMPARE_OPS); +} + +static void +FcParseTest (FcConfigParse *parse) +{ + const FcChar8 *kind_string; + FcMatchKind kind; + const FcChar8 *qual_string; + FcQual qual; + const FcChar8 *name; + const FcChar8 *compare_string; + FcOp compare; + FcExpr *expr; + FcTest *test; + + kind_string = FcConfigGetAttribute (parse, "target"); + if (!kind_string) + kind = FcMatchDefault; + else + { + if (!strcmp ((char *) kind_string, "pattern")) + kind = FcMatchPattern; + else if (!strcmp ((char *) kind_string, "font")) + kind = FcMatchFont; + else if (!strcmp ((char *) kind_string, "scan")) + kind = FcMatchScan; + else if (!strcmp ((char *) kind_string, "default")) + kind = FcMatchDefault; + else + { + FcConfigMessage (parse, FcSevereWarning, "invalid test target \"%s\"", kind_string); + return; + } + } + qual_string = FcConfigGetAttribute (parse, "qual"); + if (!qual_string) + qual = FcQualAny; + else + { + if (!strcmp ((char *) qual_string, "any")) + qual = FcQualAny; + else if (!strcmp ((char *) qual_string, "all")) + qual = FcQualAll; + else if (!strcmp ((char *) qual_string, "first")) + qual = FcQualFirst; + else if (!strcmp ((char *) qual_string, "not_first")) + qual = FcQualNotFirst; + else + { + FcConfigMessage (parse, FcSevereWarning, "invalid test qual \"%s\"", qual_string); + return; + } + } + name = FcConfigGetAttribute (parse, "name"); + if (!name) + { + FcConfigMessage (parse, FcSevereWarning, "missing test name"); + return; + } + compare_string = FcConfigGetAttribute (parse, "compare"); + if (!compare_string) + compare = FcOpEqual; + else + { + compare = FcConfigLexCompare (compare_string); + if (compare == FcOpInvalid) + { + FcConfigMessage (parse, FcSevereWarning, "invalid test compare \"%s\"", compare_string); + return; + } + } + expr = FcPopBinary (parse, FcOpComma); + if (!expr) + { + FcConfigMessage (parse, FcSevereWarning, "missing test expression"); + return; + } + test = FcTestCreate (parse, kind, qual, name, compare, expr); + if (!test) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + FcVStackPushTest (parse, test); +} + +static const FcOpMap fcModeOps[] = { + { "assign", FcOpAssign }, + { "assign_replace", FcOpAssignReplace }, + { "prepend", FcOpPrepend }, + { "prepend_first", FcOpPrependFirst }, + { "append", FcOpAppend }, + { "append_last", FcOpAppendLast }, +}; + +#define NUM_MODE_OPS (int) (sizeof fcModeOps / sizeof fcModeOps[0]) + +static FcOp +FcConfigLexMode (const FcChar8 *mode) +{ + return FcConfigLexOp (mode, fcModeOps, NUM_MODE_OPS); +} + +static void +FcParseEdit (FcConfigParse *parse) +{ + const FcChar8 *name; + const FcChar8 *mode_string; + FcOp mode; + FcValueBinding binding; + FcExpr *expr; + FcEdit *edit; + + name = FcConfigGetAttribute (parse, "name"); + if (!name) + { + FcConfigMessage (parse, FcSevereWarning, "missing edit name"); + return; + } + mode_string = FcConfigGetAttribute (parse, "mode"); + if (!mode_string) + mode = FcOpAssign; + else + { + mode = FcConfigLexMode (mode_string); + if (mode == FcOpInvalid) + { + FcConfigMessage (parse, FcSevereWarning, "invalid edit mode \"%s\"", mode_string); + return; + } + } + if (!FcConfigLexBinding (parse, FcConfigGetAttribute (parse, "binding"), &binding)) + return; + + expr = FcPopBinary (parse, FcOpComma); + edit = FcEditCreate (parse, FcObjectFromName ((char *) name), + mode, expr, binding); + if (!edit) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcExprDestroy (expr); + return; + } + if (!FcVStackPushEdit (parse, edit)) + FcEditDestroy (edit); +} + +static void +FcParseMatch (FcConfigParse *parse) +{ + const FcChar8 *kind_name; + FcMatchKind kind; + FcTest *test = 0; + FcEdit *edit = 0; + FcVStack *vstack; + + kind_name = FcConfigGetAttribute (parse, "target"); + if (!kind_name) + kind = FcMatchPattern; + else + { + if (!strcmp ((char *) kind_name, "pattern")) + kind = FcMatchPattern; + else if (!strcmp ((char *) kind_name, "font")) + kind = FcMatchFont; + else if (!strcmp ((char *) kind_name, "scan")) + kind = FcMatchScan; + else + { + FcConfigMessage (parse, FcSevereWarning, "invalid match target \"%s\"", kind_name); + return; + } + } + while ((vstack = FcVStackPeek (parse))) + { + switch (vstack->tag) { + case FcVStackTest: + vstack->u.test->next = test; + test = vstack->u.test; + vstack->tag = FcVStackNone; + break; + case FcVStackEdit: + vstack->u.edit->next = edit; + edit = vstack->u.edit; + vstack->tag = FcVStackNone; + if (kind == FcMatchScan && edit->object > FC_MAX_BASE_OBJECT) + { + FcConfigMessage (parse, FcSevereError, + "<match target=\"scan\"> cannot edit user-defined object \"%s\"", + FcObjectName(edit->object)); + } + break; + default: + FcConfigMessage (parse, FcSevereWarning, "invalid match element"); + break; + } + FcVStackPopAndDestroy (parse); + } + if (!FcConfigAddEdit (parse->config, test, edit, kind)) + FcConfigMessage (parse, FcSevereError, "out of memory"); +} + +static void +FcParseAcceptRejectFont (FcConfigParse *parse, FcElement element) +{ + FcVStack *vstack; + + while ((vstack = FcVStackPeek (parse))) + { + switch (vstack->tag) { + case FcVStackGlob: + if (!FcConfigGlobAdd (parse->config, + vstack->u.string, + element == FcElementAcceptfont)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + } + break; + case FcVStackPattern: + if (!FcConfigPatternsAdd (parse->config, + vstack->u.pattern, + element == FcElementAcceptfont)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + } + else + vstack->tag = FcVStackNone; + break; + default: + FcConfigMessage (parse, FcSevereWarning, "bad font selector"); + break; + } + FcVStackPopAndDestroy (parse); + } +} + + +static FcValue +FcPopValue (FcConfigParse *parse) +{ + FcVStack *vstack = FcVStackPeek (parse); + FcValue value; + + value.type = FcTypeVoid; + + if (!vstack) + return value; + + switch (vstack->tag) { + case FcVStackString: + value.u.s = FcStrStaticName (vstack->u.string); + if (value.u.s) + value.type = FcTypeString; + break; + case FcVStackConstant: + if (FcNameConstant (vstack->u.string, &value.u.i)) + value.type = FcTypeInteger; + break; + case FcVStackInteger: + value.u.i = vstack->u.integer; + value.type = FcTypeInteger; + break; + case FcVStackDouble: + value.u.d = vstack->u._double; + value.type = FcTypeInteger; + break; + case FcVStackMatrix: + value.u.m = FcMatrixCopy (vstack->u.matrix); + if (value.u.m) + value.type = FcTypeMatrix; + break; + case FcVStackBool: + value.u.b = vstack->u.bool_; + value.type = FcTypeBool; + break; + default: + FcConfigMessage (parse, FcSevereWarning, "unknown pattern element %d", + vstack->tag); + break; + } + FcVStackPopAndDestroy (parse); + + return value; +} + +static void +FcParsePatelt (FcConfigParse *parse) +{ + FcValue value; + FcPattern *pattern = FcPatternCreate (); + const char *name; + + if (!pattern) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + + name = (char *) FcConfigGetAttribute (parse, "name"); + if (!name) + { + FcConfigMessage (parse, FcSevereWarning, "missing pattern element name"); + FcPatternDestroy (pattern); + return; + } + + for (;;) + { + value = FcPopValue (parse); + if (value.type == FcTypeVoid) + break; + if (!FcPatternAdd (pattern, name, value, FcTrue)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcValueDestroy(value); + break; + } + FcValueDestroy(value); + } + + FcVStackPushPattern (parse, pattern); +} + +static void +FcParsePattern (FcConfigParse *parse) +{ + FcVStack *vstack; + FcPattern *pattern = FcPatternCreate (); + + if (!pattern) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + return; + } + + while ((vstack = FcVStackPeek (parse))) + { + switch (vstack->tag) { + case FcVStackPattern: + if (!FcPatternAppend (pattern, vstack->u.pattern)) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + FcPatternDestroy (pattern); + return; + } + break; + default: + FcConfigMessage (parse, FcSevereWarning, "unknown pattern element"); + break; + } + FcVStackPopAndDestroy (parse); + } + + FcVStackPushPattern (parse, pattern); +} + +static void +FcEndElement(void *userData, const XML_Char *name) +{ + FcConfigParse *parse = userData; + FcChar8 *data; +#ifdef _WIN32 + FcChar8 buffer[1000]; +#endif + + if (!parse->pstack) + return; + switch (parse->pstack->element) { + case FcElementNone: + break; + case FcElementFontconfig: + break; + case FcElementDir: + data = FcStrBufDoneStatic (&parse->pstack->str); + if (!data) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } +#ifdef _WIN32 + if (strcmp (data, "CUSTOMFONTDIR") == 0) + { + char *p; + data = buffer; + if (!GetModuleFileName (NULL, buffer, sizeof (buffer) - 20)) + { + FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); + break; + } + /* + * Must use the multi-byte aware function to search + * for backslash because East Asian double-byte code + * pages have characters with backslash as the second + * byte. + */ + p = _mbsrchr (data, '\\'); + if (p) *p = '\0'; + strcat (data, "\\fonts"); + } + else if (strcmp (data, "APPSHAREFONTDIR") == 0) + { + char *p; + data = buffer; + if (!GetModuleFileName (NULL, buffer, sizeof (buffer) - 20)) + { + FcConfigMessage (parse, FcSevereError, "GetModuleFileName failed"); + break; + } + p = _mbsrchr (data, '\\'); + if (p) *p = '\0'; + strcat (data, "\\..\\share\\fonts"); + } + else if (strcmp (data, "WINDOWSFONTDIR") == 0) + { + int rc; + data = buffer; +#if _WIN32_WINNT >= 0x0500 + rc = GetSystemWindowsDirectory (buffer, sizeof (buffer) - 20); +#else + rc = GetWindowsDirectory (buffer, sizeof (buffer) - 20); +#endif + if (rc == 0 || rc > sizeof (buffer) - 20) + { + FcConfigMessage (parse, FcSevereError, "GetSystemWindowsDirectory failed"); + break; + } + if (data [strlen (data) - 1] != '\\') + strcat (data, "\\"); + strcat (data, "fonts"); + } +#endif + if (strlen ((char *) data) == 0) + FcConfigMessage (parse, FcSevereWarning, "empty font directory name ignored"); + else if (!FcStrUsesHome (data) || FcConfigHome ()) + { + if (!FcConfigAddDir (parse->config, data)) + FcConfigMessage (parse, FcSevereError, "out of memory; cannot add directory %s", data); + } + FcStrBufDestroy (&parse->pstack->str); + break; + case FcElementCacheDir: + data = FcStrBufDone (&parse->pstack->str); + if (!data) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } +#ifdef _WIN32 + if (strcmp (data, "WINDOWSTEMPDIR_FONTCONFIG_CACHE") == 0) + { + int rc; + FcStrFree (data); + data = malloc (1000); + if (!data) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } + FcMemAlloc (FC_MEM_STRING, 1000); + rc = GetTempPath (800, data); + if (rc == 0 || rc > 800) + { + FcConfigMessage (parse, FcSevereError, "GetTempPath failed"); + FcStrFree (data); + break; + } + if (data [strlen (data) - 1] != '\\') + strcat (data, "\\"); + strcat (data, "fontconfig\\cache"); + } +#endif + if (!FcStrUsesHome (data) || FcConfigHome ()) + { + if (!FcConfigAddCacheDir (parse->config, data)) + FcConfigMessage (parse, FcSevereError, "out of memory; cannot add cache directory %s", data); + } + FcStrFree (data); + break; + + case FcElementCache: + data = FcStrBufDoneStatic (&parse->pstack->str); + if (!data) + { + FcConfigMessage (parse, FcSevereError, "out of memory"); + break; + } + /* discard this data; no longer used */ + FcStrBufDestroy (&parse->pstack->str); + break; + case FcElementInclude: + FcParseInclude (parse); + break; + case FcElementConfig: + break; + case FcElementMatch: + FcParseMatch (parse); + break; + case FcElementAlias: + FcParseAlias (parse); + break; + + case FcElementBlank: + FcParseBlank (parse); + break; + case FcElementRescan: + FcParseRescan (parse); + break; + + case FcElementPrefer: + FcParseFamilies (parse, FcVStackPrefer); + break; + case FcElementAccept: + FcParseFamilies (parse, FcVStackAccept); + break; + case FcElementDefault: + FcParseFamilies (parse, FcVStackDefault); + break; + case FcElementFamily: + FcParseFamily (parse); + break; + + case FcElementTest: + FcParseTest (parse); + break; + case FcElementEdit: + FcParseEdit (parse); + break; + + case FcElementInt: + FcParseInt (parse); + break; + case FcElementDouble: + FcParseDouble (parse); + break; + case FcElementString: + FcParseString (parse, FcVStackString); + break; + case FcElementMatrix: + FcParseMatrix (parse); + break; + case FcElementBool: + FcParseBool (parse); + break; + case FcElementCharset: +/* FcParseCharset (parse); */ + break; + case FcElementSelectfont: + break; + case FcElementAcceptfont: + case FcElementRejectfont: + FcParseAcceptRejectFont (parse, parse->pstack->element); + break; + case FcElementGlob: + FcParseString (parse, FcVStackGlob); + break; + case FcElementPattern: + FcParsePattern (parse); + break; + case FcElementPatelt: + FcParsePatelt (parse); + break; + case FcElementName: + FcParseString (parse, FcVStackField); + break; + case FcElementConst: + FcParseString (parse, FcVStackConstant); + break; + case FcElementOr: + FcParseBinary (parse, FcOpOr); + break; + case FcElementAnd: + FcParseBinary (parse, FcOpAnd); + break; + case FcElementEq: + FcParseBinary (parse, FcOpEqual); + break; + case FcElementNotEq: + FcParseBinary (parse, FcOpNotEqual); + break; + case FcElementLess: + FcParseBinary (parse, FcOpLess); + break; + case FcElementLessEq: + FcParseBinary (parse, FcOpLessEqual); + break; + case FcElementMore: + FcParseBinary (parse, FcOpMore); + break; + case FcElementMoreEq: + FcParseBinary (parse, FcOpMoreEqual); + break; + case FcElementContains: + FcParseBinary (parse, FcOpContains); + break; + case FcElementNotContains: + FcParseBinary (parse, FcOpNotContains); + break; + case FcElementPlus: + FcParseBinary (parse, FcOpPlus); + break; + case FcElementMinus: + FcParseBinary (parse, FcOpMinus); + break; + case FcElementTimes: + FcParseBinary (parse, FcOpTimes); + break; + case FcElementDivide: + FcParseBinary (parse, FcOpDivide); + break; + case FcElementNot: + FcParseUnary (parse, FcOpNot); + break; + case FcElementIf: + FcParseBinary (parse, FcOpQuest); + break; + case FcElementFloor: + FcParseUnary (parse, FcOpFloor); + break; + case FcElementCeil: + FcParseUnary (parse, FcOpCeil); + break; + case FcElementRound: + FcParseUnary (parse, FcOpRound); + break; + case FcElementTrunc: + FcParseUnary (parse, FcOpTrunc); + break; + case FcElementUnknown: + break; + } + (void) FcPStackPop (parse); +} + +static void +FcCharacterData (void *userData, const XML_Char *s, int len) +{ + FcConfigParse *parse = userData; + + if (!parse->pstack) + return; + if (!FcStrBufData (&parse->pstack->str, (FcChar8 *) s, len)) + FcConfigMessage (parse, FcSevereError, "out of memory"); +} + +static void +FcStartDoctypeDecl (void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset) +{ + FcConfigParse *parse = userData; + + if (strcmp ((char *) doctypeName, "fontconfig") != 0) + FcConfigMessage (parse, FcSevereError, "invalid doctype \"%s\"", doctypeName); +} + +#ifdef ENABLE_LIBXML2 + +static void +FcInternalSubsetDecl (void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid) +{ + FcStartDoctypeDecl (userData, doctypeName, sysid, pubid, 1); +} + +static void +FcExternalSubsetDecl (void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid) +{ + FcStartDoctypeDecl (userData, doctypeName, sysid, pubid, 0); +} + +#else /* ENABLE_LIBXML2 */ + +static void +FcEndDoctypeDecl (void *userData) +{ +} + +#endif /* ENABLE_LIBXML2 */ + +static int +FcSortCmpStr (const void *a, const void *b) +{ + const FcChar8 *as = *((FcChar8 **) a); + const FcChar8 *bs = *((FcChar8 **) b); + return FcStrCmp (as, bs); +} + +static FcBool +FcConfigParseAndLoadDir (FcConfig *config, + const FcChar8 *name, + const FcChar8 *dir, + FcBool complain) +{ + DIR *d; + struct dirent *e; + FcBool ret = FcTrue; + FcChar8 *file; + FcChar8 *base; + FcStrSet *files; + + d = opendir ((char *) dir); + if (!d) + { + if (complain) + FcConfigMessage (0, FcSevereError, "Cannot open config dir \"%s\"", + name); + ret = FcFalse; + goto bail0; + } + /* freed below */ + file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1); + if (!file) + { + ret = FcFalse; + goto bail1; + } + + strcpy ((char *) file, (char *) dir); + strcat ((char *) file, "/"); + base = file + strlen ((char *) file); + + files = FcStrSetCreate (); + if (!files) + { + ret = FcFalse; + goto bail2; + } + + if (FcDebug () & FC_DBG_CONFIG) + printf ("\tScanning config dir %s\n", dir); + + while (ret && (e = readdir (d))) + { + int d_len; +#define TAIL ".conf" +#define TAIL_LEN 5 + /* + * Add all files of the form [0-9]*.conf + */ + if ('0' <= e->d_name[0] && e->d_name[0] <= '9' && + (d_len = strlen (e->d_name)) < FC_MAX_FILE_LEN && + d_len > TAIL_LEN && + strcmp (e->d_name + d_len - TAIL_LEN, TAIL) == 0) + { + strcpy ((char *) base, (char *) e->d_name); + if (!FcStrSetAdd (files, file)) + { + ret = FcFalse; + goto bail3; + } + } + } + if (ret) + { + int i; + qsort (files->strs, files->num, sizeof (FcChar8 *), + (int (*)(const void *, const void *)) FcSortCmpStr); + for (i = 0; ret && i < files->num; i++) + ret = FcConfigParseAndLoad (config, files->strs[i], complain); + } +bail3: + FcStrSetDestroy (files); +bail2: + free (file); +bail1: + closedir (d); +bail0: + return ret || !complain; +} + +FcBool +FcConfigParseAndLoad (FcConfig *config, + const FcChar8 *name, + FcBool complain) +{ + + XML_Parser p; + FcChar8 *filename; + int fd; + int len; + FcConfigParse parse; + FcBool error = FcTrue; + +#ifdef ENABLE_LIBXML2 + xmlSAXHandler sax; + char buf[BUFSIZ]; +#else + void *buf; +#endif + + filename = FcConfigFilename (name); + if (!filename) + goto bail0; + + if (FcStrSetMember (config->configFiles, filename)) + { + FcStrFree (filename); + return FcTrue; + } + + if (!FcStrSetAdd (config->configFiles, filename)) + { + FcStrFree (filename); + goto bail0; + } + + if (FcFileIsDir (filename)) + { + FcBool ret = FcConfigParseAndLoadDir (config, name, filename, complain); + FcStrFree (filename); + return ret; + } + + if (FcDebug () & FC_DBG_CONFIG) + printf ("\tLoading config file %s\n", filename); + + fd = open ((char *) filename, O_RDONLY); + if (fd == -1) { + FcStrFree (filename); + goto bail0; + } + +#ifdef ENABLE_LIBXML2 + memset(&sax, 0, sizeof(sax)); + + sax.internalSubset = FcInternalSubsetDecl; + sax.externalSubset = FcExternalSubsetDecl; + sax.startElement = FcStartElement; + sax.endElement = FcEndElement; + sax.characters = FcCharacterData; + + p = xmlCreatePushParserCtxt (&sax, &parse, NULL, 0, (const char *) filename); +#else + p = XML_ParserCreate ("UTF-8"); +#endif + FcStrFree (filename); + + if (!p) + goto bail1; + + if (!FcConfigInit (&parse, name, config, p)) + goto bail2; + +#ifndef ENABLE_LIBXML2 + + XML_SetUserData (p, &parse); + + XML_SetDoctypeDeclHandler (p, FcStartDoctypeDecl, FcEndDoctypeDecl); + XML_SetElementHandler (p, FcStartElement, FcEndElement); + XML_SetCharacterDataHandler (p, FcCharacterData); + +#endif /* ENABLE_LIBXML2 */ + + do { +#ifndef ENABLE_LIBXML2 + buf = XML_GetBuffer (p, BUFSIZ); + if (!buf) + { + FcConfigMessage (&parse, FcSevereError, "cannot get parse buffer"); + goto bail3; + } +#endif + len = read (fd, buf, BUFSIZ); + if (len < 0) + { + FcConfigMessage (&parse, FcSevereError, "failed reading config file"); + goto bail3; + } + +#ifdef ENABLE_LIBXML2 + if (xmlParseChunk (p, buf, len, len == 0)) +#else + if (!XML_ParseBuffer (p, len, len == 0)) +#endif + { + FcConfigMessage (&parse, FcSevereError, "%s", + XML_ErrorString (XML_GetErrorCode (p))); + goto bail3; + } + } while (len != 0); + error = parse.error; +bail3: + FcConfigCleanup (&parse); +bail2: + XML_ParserFree (p); +bail1: + close (fd); + fd = -1; +bail0: + if (error && complain) + { + if (name) + FcConfigMessage (0, FcSevereError, "Cannot load config file \"%s\"", name); + else + FcConfigMessage (0, FcSevereError, "Cannot load default config file"); + return FcFalse; + } + return FcTrue; +} +#define __fcxml__ +#include "fcaliastail.h" +#undef __fcxml__ diff --git a/fontconfig/src/ftglue.c b/fontconfig/src/ftglue.c new file mode 100644 index 000000000..1eca304cf --- /dev/null +++ b/fontconfig/src/ftglue.c @@ -0,0 +1,261 @@ +/* ftglue.c: Glue code for compiling the OpenType code from + * FreeType 1 using only the public API of FreeType 2 + * + * By David Turner, The FreeType Project (www.freetype.org) + * + * This code is explicitely put in the public domain + * + * See ftglue.h for more information. + */ + +#include "ftglue.h" + +#if 0 +#include <stdio.h> +#define LOG(x) ftglue_log x + +static void +ftglue_log( const char* format, ... ) +{ + va_list ap; + + va_start( ap, format ); + vfprintf( stderr, format, ap ); + va_end( ap ); +} + +#else +#define LOG(x) do {} while (0) +#endif + +/* only used internally */ +static FT_Pointer +ftglue_qalloc( FT_Memory memory, + FT_ULong size, + FT_Error *perror ) +{ + FT_Error error = 0; + FT_Pointer block = NULL; + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( !block ) + error = FT_Err_Out_Of_Memory; + } + + *perror = error; + return block; +} + +#undef QALLOC /* just in case */ +#define QALLOC(ptr,size) ( (ptr) = ftglue_qalloc( memory, (size), &error ), error != 0 ) +#define FREE(_ptr) \ + do { \ + if ( (_ptr) ) \ + { \ + ftglue_free( memory, _ptr ); \ + _ptr = NULL; \ + } \ + } while (0) + + +static void +ftglue_free( FT_Memory memory, + FT_Pointer block ) +{ + if ( block ) + memory->free( memory, block ); +} + +FTGLUE_APIDEF( FT_Long ) +ftglue_stream_pos( FT_Stream stream ) +{ + LOG(( "ftglue:stream:pos() -> %ld\n", stream->pos )); + return stream->pos; +} + + +FTGLUE_APIDEF( FT_Error ) +ftglue_stream_seek( FT_Stream stream, + FT_Long pos ) +{ + FT_Error error = 0; + + stream->pos = pos; + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + error = FT_Err_Invalid_Stream_Operation; + } + else if ( pos > stream->size ) + error = FT_Err_Invalid_Stream_Operation; + + LOG(( "ftglue:stream:seek(%ld) -> %d\n", pos, error )); + return error; +} + + +FTGLUE_APIDEF( FT_Error ) +ftglue_stream_frame_enter( FT_Stream stream, + FT_ULong count ) +{ + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + + + if ( QALLOC( stream->base, count ) ) + goto Exit; + + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FREE( stream->base ); + error = FT_Err_Invalid_Stream_Operation; + } + stream->cursor = stream->base; + stream->limit = stream->cursor + count; + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->pos + count > stream->size ) + { + error = FT_Err_Invalid_Stream_Operation; + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + +Exit: + LOG(( "ftglue:stream:frame_enter(%ld) -> %d\n", count, error )); + return error; +} + + +FTGLUE_APIDEF( void ) +ftglue_stream_frame_exit( FT_Stream stream ) +{ + if ( stream->read ) + { + FT_Memory memory = stream->memory; + + FREE( stream->base ); + } + stream->cursor = 0; + stream->limit = 0; + + LOG(( "ftglue:stream:frame_exit()\n" )); +} + + +FTGLUE_APIDEF( FT_Error ) +ftglue_face_goto_table( FT_Face face, + FT_ULong the_tag, + FT_Stream stream ) +{ + FT_Error error; + + LOG(( "ftglue_face_goto_table( %p, %c%c%c%c, %p )\n", + face, + (int)((the_tag >> 24) & 0xFF), + (int)((the_tag >> 16) & 0xFF), + (int)((the_tag >> 8) & 0xFF), + (int)(the_tag & 0xFF), + stream )); + + if ( !FT_IS_SFNT(face) ) + { + LOG(( "not a SFNT face !!\n" )); + error = FT_Err_Invalid_Face_Handle; + } + else + { + /* parse the directory table directly, without using + * FreeType's built-in data structures + */ + FT_ULong offset = 0, sig; + FT_UInt count, nn; + + if ( FILE_Seek( 0 ) || ACCESS_Frame( 4 ) ) + goto Exit; + + sig = GET_Tag4(); + + FORGET_Frame(); + + if ( sig == FT_MAKE_TAG( 't', 't', 'c', 'f' ) ) + { + /* deal with TrueType collections */ + + LOG(( ">> This is a TrueType Collection\n" )); + + if ( FILE_Seek( 12 + face->face_index*4 ) || + ACCESS_Frame( 4 ) ) + goto Exit; + + offset = GET_ULong(); + + FORGET_Frame(); + } + + LOG(( "TrueType offset = %ld\n", offset )); + + if ( FILE_Seek( offset+4 ) || + ACCESS_Frame( 2 ) ) + goto Exit; + + count = GET_UShort(); + + FORGET_Frame(); + + if ( FILE_Seek( offset+12 ) || + ACCESS_Frame( count*16 ) ) + goto Exit; + + for ( nn = 0; nn < count; nn++ ) + { + FT_ULong tag = GET_ULong(); + FT_ULong checksum = GET_ULong(); + FT_ULong start = GET_ULong(); + FT_ULong size = GET_ULong(); + + FT_UNUSED(checksum); + FT_UNUSED(size); + + if ( tag == the_tag ) + { + LOG(( "TrueType table (start: %ld) (size: %ld)\n", start, size )); + error = ftglue_stream_seek( stream, start ); + goto FoundIt; + } + } + error = FT_Err_Table_Missing; + + FoundIt: + FORGET_Frame(); + } + +Exit: + LOG(( "TrueType error=%d\n", error )); + + return error; +} + +#undef QALLOC +#define __ftglue__ +#include "fcaliastail.h" +#undef __ftglue__ diff --git a/fontconfig/src/ftglue.h b/fontconfig/src/ftglue.h new file mode 100644 index 000000000..e0fd1714e --- /dev/null +++ b/fontconfig/src/ftglue.h @@ -0,0 +1,111 @@ +/* ftglue.c: Glue code for compiling the OpenType code from + * FreeType 1 using only the public API of FreeType 2 + * + * By David Turner, The FreeType Project (www.freetype.org) + * + * This code is explicitely put in the public domain + * + * ========================================================================== + * + * the OpenType parser codes was originally written as an extension to + * FreeType 1.x. As such, its source code was embedded within the library, + * and used many internal FreeType functions to deal with memory and + * stream i/o. + * + * When it was 'salvaged' for Pango and Qt, the code was "ported" to FreeType 2, + * which basically means that some macro tricks were performed in order to + * directly access FT2 _internal_ functions. + * + * these functions were never part of FT2 public API, and _did_ change between + * various releases. This created chaos for many users: when they upgraded the + * FreeType library on their system, they couldn't run Gnome anymore since + * Pango refused to link. + * + * Very fortunately, it's possible to completely avoid this problem because + * the FT_StreamRec and FT_MemoryRec structure types, which describe how + * memory and stream implementations interface with the rest of the font + * library, have always been part of the public API, and never changed. + * + * What we do thus is re-implement, within the OpenType parser, the few + * functions that depend on them. This only adds one or two kilobytes of + * code, and ensures that the parser can work with _any_ version + * of FreeType installed on your system. How sweet... ! + * + * Note that we assume that Pango doesn't use any other internal functions + * from FreeType. It used to in old versions, but this should no longer + * be the case. (crossing my fingers). + * + * - David Turner + * - The FreeType Project (www.freetype.org) + * + * PS: This "glue" code is explicitely put in the public domain + */ +#ifndef __OPENTYPE_FTGLUE_H__ +#define __OPENTYPE_FTGLUE_H__ + +#include "fcint.h" + +#include <ft2build.h> +#include FT_FREETYPE_H + +FT_BEGIN_HEADER + + +#define SET_ERR(c) ( (error = (c)) != 0 ) + +#ifndef FTGLUE_API +#define FTGLUE_API(x) extern FcPrivate x +#endif + +#ifndef FTGLUE_APIDEF +#define FTGLUE_APIDEF(x) x +#endif + +/* stream macros used by the OpenType parser */ +#define FILE_Pos() ftglue_stream_pos( stream ) +#define FILE_Seek(pos) SET_ERR( ftglue_stream_seek( stream, pos ) ) +#define ACCESS_Frame(size) SET_ERR( ftglue_stream_frame_enter( stream, size ) ) +#define FORGET_Frame() ftglue_stream_frame_exit( stream ) + +#define GET_Byte() (*stream->cursor++) +#define GET_Short() (stream->cursor += 2, (FT_Short)( \ + (*(((FT_Byte*)stream->cursor)-2) << 8) | \ + *(((FT_Byte*)stream->cursor)-1) \ + )) +#define GET_Long() (stream->cursor += 4, (FT_Long)( \ + (*(((FT_Byte*)stream->cursor)-4) << 24) | \ + (*(((FT_Byte*)stream->cursor)-3) << 16) | \ + (*(((FT_Byte*)stream->cursor)-2) << 8) | \ + *(((FT_Byte*)stream->cursor)-1) \ + )) + +#define GET_Char() ((FT_Char)GET_Byte()) +#define GET_UShort() ((FT_UShort)GET_Short()) +#define GET_ULong() ((FT_ULong)GET_Long()) +#define GET_Tag4() GET_ULong() + +#define FT_SET_ERROR( expression ) \ + ( ( error = (expression) ) != 0 ) + +FTGLUE_API( FT_Long ) +ftglue_stream_pos( FT_Stream stream ); + +FTGLUE_API( FT_Error ) +ftglue_stream_seek( FT_Stream stream, + FT_Long pos ); + +FTGLUE_API( FT_Error ) +ftglue_stream_frame_enter( FT_Stream stream, + FT_ULong size ); + +FTGLUE_API( void ) +ftglue_stream_frame_exit( FT_Stream stream ); + +FTGLUE_API( FT_Error ) +ftglue_face_goto_table( FT_Face face, + FT_ULong tag, + FT_Stream stream ); + +FT_END_HEADER + +#endif /* __OPENTYPE_FTGLUE_H__ */ diff --git a/fontconfig/src/makealias b/fontconfig/src/makealias new file mode 100644 index 000000000..fd9c3fd1f --- /dev/null +++ b/fontconfig/src/makealias @@ -0,0 +1,28 @@ +#!/bin/sh +SRCDIR=$1 +shift +HEAD=$1 +shift +TAIL=$1 +shift +rm -f $HEAD $TAIL +echo "#if HAVE_GNUC_ATTRIBUTE" >> $TAIL +cat "$@" | grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$//' | +while read name; do + case $name in + FcCacheDir|FcCacheSubdir) + ;; + *) + alias="IA__$name" + hattr='__attribute((visibility("hidden")))' + echo "extern __typeof ($name) $alias $hattr;" >> $HEAD + echo "#define $name $alias" >> $HEAD + grep -l '^'$name'[ (]' "$SRCDIR"/*.c | sed -n 1p | sed -e 's/^.*\/\([^.]*\)\.c/#ifdef __\1__/' >> $TAIL + echo "#undef $name" >> $TAIL + cattr='__attribute((alias("'$alias'"), visibility("default")))' + echo "extern __typeof ($name) $name $cattr;" >> $TAIL + echo "#endif" >> $TAIL + ;; + esac +done +echo "#endif" >> $TAIL diff --git a/fontconfig/test/4x6.pcf b/fontconfig/test/4x6.pcf Binary files differnew file mode 100644 index 000000000..dc25510a6 --- /dev/null +++ b/fontconfig/test/4x6.pcf diff --git a/fontconfig/test/8x16.pcf b/fontconfig/test/8x16.pcf Binary files differnew file mode 100644 index 000000000..0babed164 --- /dev/null +++ b/fontconfig/test/8x16.pcf diff --git a/fontconfig/test/Makefile.am b/fontconfig/test/Makefile.am new file mode 100644 index 000000000..72da8d64a --- /dev/null +++ b/fontconfig/test/Makefile.am @@ -0,0 +1,9 @@ +check_SCRIPTS=run-test.sh +TESTS_ENVIRONMENT=src=${srcdir} sh +TESTS=run-test.sh + +TESTDATA=4x6.pcf 8x16.pcf out.expected fonts.conf.in + +EXTRA_DIST=$(check_SCRIPTS) $(TESTDATA) + +CLEANFILES= diff --git a/fontconfig/test/fonts.conf.in b/fontconfig/test/fonts.conf.in new file mode 100644 index 000000000..95def72d4 --- /dev/null +++ b/fontconfig/test/fonts.conf.in @@ -0,0 +1,4 @@ +<fontconfig> +<dir>@FONTDIR@</dir> +<cachedir>@CACHEDIR@</cachedir> +</fontconfig> diff --git a/fontconfig/test/out.expected b/fontconfig/test/out.expected new file mode 100644 index 000000000..39634c50a --- /dev/null +++ b/fontconfig/test/out.expected @@ -0,0 +1,8 @@ +Fixed:pixelsize=16 +Fixed:pixelsize=6 += +Fixed:pixelsize=16 +Fixed:pixelsize=6 += +Fixed:pixelsize=16 +Fixed:pixelsize=6 diff --git a/fontconfig/test/run-test.sh b/fontconfig/test/run-test.sh new file mode 100644 index 000000000..e7174b289 --- /dev/null +++ b/fontconfig/test/run-test.sh @@ -0,0 +1,92 @@ +#!/bin/sh +TESTDIR=${srcdir-`pwd`} + +FONTDIR=`pwd`/fonts +CACHEDIR=`pwd`/cache.dir + +ECHO=true + +FCLIST=../fc-list/fc-list +FCCACHE=../fc-cache/fc-cache + +FONT1=$TESTDIR/4x6.pcf +FONT2=$TESTDIR/8x16.pcf + +check () { + $FCLIST - family pixelsize | sort > out + echo "=" >> out + $FCLIST - family pixelsize | sort >> out + echo "=" >> out + $FCLIST - family pixelsize | sort >> out + tr -d '\015' <out >out.tmp; mv out.tmp out + if cmp out $TESTDIR/out.expected > /dev/null ; then : ; else + echo "*** Test failed: $TEST" + echo "*** output is in 'out', expected output in 'out.expected'" + exit 1 + fi + rm out +} + +prep() { + rm -rf $CACHEDIR + rm -rf $FONTDIR + mkdir $FONTDIR +} + +dotest () { + TEST=$1 + test x$VERBOSE = x || echo Running: $TEST +} + +sed "s!@FONTDIR@!$FONTDIR! +s!@CACHEDIR@!$CACHEDIR!" < $TESTDIR/fonts.conf.in > fonts.conf + +FONTCONFIG_FILE=`pwd`/fonts.conf +export FONTCONFIG_FILE + +dotest "Basic check" +prep +cp $FONT1 $FONT2 $FONTDIR +check + +dotest "With a subdir" +prep +cp $FONT1 $FONT2 $FONTDIR +$FCCACHE $FONTDIR +check + +dotest "Subdir with a cache file" +prep +mkdir $FONTDIR/a +cp $FONT1 $FONT2 $FONTDIR/a +$FCCACHE $FONTDIR/a +check + +dotest "Complicated directory structure" +prep +mkdir $FONTDIR/a +mkdir $FONTDIR/a/a +mkdir $FONTDIR/b +mkdir $FONTDIR/b/a +cp $FONT1 $FONTDIR/a +cp $FONT2 $FONTDIR/b/a +check + +dotest "Subdir with an out-of-date cache file" +prep +mkdir $FONTDIR/a +$FCCACHE $FONTDIR/a +sleep 1 +cp $FONT1 $FONT2 $FONTDIR/a +check + +dotest "Dir with an out-of-date cache file" +prep +cp $FONT1 $FONTDIR +$FCCACHE $FONTDIR +sleep 1 +mkdir $FONTDIR/a +cp $FONT2 $FONTDIR/a +check + +rm -rf $FONTDIR $CACHEFILE $CACHEDIR $FONTCONFIG_FILE out diff --git a/libXft/.gitignore b/libXft/.gitignore new file mode 100644 index 000000000..467810868 --- /dev/null +++ b/libXft/.gitignore @@ -0,0 +1,78 @@ +# +# X.Org module default exclusion patterns +# The next section if for module specific patterns +# +# Do not edit the following section +# GNU Build System (Autotools) +aclocal.m4 +autom4te.cache/ +autoscan.log +ChangeLog +compile +config.guess +config.h +config.h.in +config.log +config-ml.in +config.py +config.status +config.status.lineno +config.sub +configure +configure.scan +depcomp +.deps/ +INSTALL +install-sh +.libs/ +libtool +libtool.m4 +ltmain.sh +lt~obsolete.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +Makefile +Makefile.in +mdate-sh +missing +mkinstalldirs +*.pc +py-compile +stamp-h? +symlink-tree +texinfo.tex +ylwrap + +# Do not edit the following section +# Edit Compile Debug Document Distribute +*~ +*.[0-9] +*.[0-9]x +*.bak +*.bin +core +*.dll +*.exe +*-ISO*.bdf +*-JIS*.bdf +*-KOI8*.bdf +*.kld +*.ko +*.ko.cmd +*.lai +*.l[oa] +*.[oa] +*.obj +*.patch +*.so +*.pcf.gz +*.pdb +*.tar.bz2 +*.tar.gz +# +# Add & Override patterns for libXft +# +# Edit the following section as needed +# For example, !report.pc overrides *.pc. See 'man gitignore' +# diff --git a/libXft/AUTHORS b/libXft/AUTHORS new file mode 100644 index 000000000..2fe754d23 --- /dev/null +++ b/libXft/AUTHORS @@ -0,0 +1,10 @@ +Keith Packard, of SuSE and HP + +Automake work by Noah Levitt +Frank Giessler - OS/2 +Jungshik Shin - UTF-16 api's +Ralf Habacker, Suhaib Siddiqi - Cygwin port +Marc La France - Sun port +David Dawes - bug fixes, maintenance. + +Our apologies if we've overlooked someone. diff --git a/libXft/COPYING b/libXft/COPYING new file mode 100644 index 000000000..e506314ae --- /dev/null +++ b/libXft/COPYING @@ -0,0 +1,21 @@ + +Copyright © 2001,2003 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + diff --git a/libXft/Makefile.am b/libXft/Makefile.am new file mode 100644 index 000000000..aeacfe6f5 --- /dev/null +++ b/libXft/Makefile.am @@ -0,0 +1,37 @@ +# +# Copyright © 2003 Keith Packard, Noah Levitt +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +SUBDIRS = man src + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = xft.pc + +MAINTAINERCLEANFILES = ChangeLog INSTALL + +.PHONY: ChangeLog INSTALL + +INSTALL: + $(INSTALL_CMD) + +ChangeLog: + $(CHANGELOG_CMD) + +dist-hook: ChangeLog INSTALL diff --git a/libXft/NEWS b/libXft/NEWS new file mode 100644 index 000000000..01e6dbe28 --- /dev/null +++ b/libXft/NEWS @@ -0,0 +1,61 @@ + Xft + X FreeType library + Version 2.2.0 + 2010-10-29 + +Xft version 2.1 is the first stand alone release of Xft, a library that +connects X applications with the FreeType font rasterization library. Xft +uses fontconfig to locate fonts so it has no configuration files. + +Version 2.2.0 + +Dropped xft-config, now that pkg-config is well established. + +Version 2.1.14 + +Added fake bold support (#1579, Novell #38202/223682). + +Version 2.1.13 + +Fix hashing in 64-bit versions. Register objects with freetype. +Fix XftDrawRect when Render not supported. + +Version 2.1.12 + +Fix exporting of XftNameUnparse function. + +Version 2.1.9 + +Stop exporting unnecessary symbols. + +Version 2.1.7 + +Change FC_CHARCELL and FC_MONO interpretation. FC_MONO no longer clips +glyphs to charcell, you must specify FC_CHARCELL for that. + +Add support for FT_GlyphSlot_Embolden where it exists (which it usually +doesn't). + +Avoid crashing when using FT_Face objects. + +Version 2.1.6 + +Deal with broken FreeType 2.1.7 BDF/PCF loaders by trying both y_ppem/x_ppem +and width/height values. + +Version 2.1.5 + +Left some #warnings from testing in the 2.1.4 release. Spin again. + +Version 2.1.4 + +Work with older versions of Fontconfig by using various pattern elements +only when defined. + +Version 2.1.3 + +Change Freetype includes to new syntax. + +Search for nearest bitmap for bitmap-only fonts. + +Support fontconfig 2.2 release which doesn't include FC_HINT_STYLE. diff --git a/libXft/README b/libXft/README new file mode 100644 index 000000000..b1097eb44 --- /dev/null +++ b/libXft/README @@ -0,0 +1,52 @@ + Xft + X FreeType library + +Xft version 2.1 is the first stand alone release of Xft, a library that +connects X applications with the FreeType font rasterization library. Xft +uses fontconfig to locate fonts so it has no configuration files. + +Before building Xft you will need to have installed: + freetype http://freetype.org/ + fontconfig http://fontconfig.org/ + libX11, libXext, & libXrender http://x.org/ + +All questions regarding this software should be directed at the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +Please submit bug reports to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/xorg/lib/libXft + + http://cgit.freedesktop.org/xorg/lib/libXft + +For patch submission instructions, see: + + http://www.x.org/wiki/Development/Documentation/SubmittingPatches + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage + +To release a version of this library: + + 1. Update the version number in configure.ac + 2. Fix the NEWS file + Change version number + Set the date + add highlights + 3. Commit those changes + 4. rebuild the configuration files with autogen.sh + sh autogen.sh --sysconfdir=/etc --prefix=/usr --mandir=/usr/share/man + 5. Follow the steps listed in + http://xorg.freedesktop.org/wiki/Development/Documentation/ReleaseHOWTO + +Keith Packard +keithp@keithp.com + + diff --git a/libXft/autogen.sh b/libXft/autogen.sh new file mode 100644 index 000000000..904cd6746 --- /dev/null +++ b/libXft/autogen.sh @@ -0,0 +1,12 @@ +#! /bin/sh + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir + +autoreconf -v --install || exit 1 +cd $ORIGDIR || exit $? + +$srcdir/configure --enable-maintainer-mode "$@" diff --git a/libXft/configure.ac b/libXft/configure.ac new file mode 100644 index 000000000..f35eb9109 --- /dev/null +++ b/libXft/configure.ac @@ -0,0 +1,155 @@ +dnl +dnl Copyright © 2003 Keith Packard, Noah Levitt +dnl +dnl Permission to use, copy, modify, distribute, and sell this software and its +dnl documentation for any purpose is hereby granted without fee, provided that +dnl the above copyright notice appear in all copies and that both that +dnl copyright notice and this permission notice appear in supporting +dnl documentation, and that the name of Keith Packard not be used in +dnl advertising or publicity pertaining to distribution of the software without +dnl specific, written prior permission. Keith Packard makes no +dnl representations about the suitability of this software for any purpose. It +dnl is provided "as is" without express or implied warranty. +dnl +dnl KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +dnl EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +dnl PERFORMANCE OF THIS SOFTWARE. +dnl +dnl Process this file with autoconf to create configure. + +AC_PREREQ([2.60]) + +dnl +dnl This is the package version number, not the shared library +dnl version. This version number will be substituted into Xft.h +dnl Please bump the minor library number at each release as well. +dnl +AC_INIT([libXft], [2.2.0], + [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [libXft]) +AC_CONFIG_AUX_DIR(.) + +AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_MAINTAINER_MODE + +# Require X.Org macros 1.8 or later for MAN_SUBSTS set by XORG_MANPAGE_SECTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.8 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.8) +XORG_DEFAULT_OPTIONS +AM_CONFIG_HEADER(config.h) + +# checks for progs +AC_PROG_CC +AC_PROG_LIBTOOL +AC_PROG_SED + +# Set library version for Xft.h from package version set in AC_INIT +# copied from PACKAGE_VERSION_* settings in XORG_VERSION +AC_CONFIG_HEADERS([include/X11/Xft/Xft.h]) +AC_DEFINE_UNQUOTED([XFT_MAJOR], + [`echo $PACKAGE_VERSION | cut -d . -f 1`], + [Major version of Xft]) +AC_DEFINE_UNQUOTED([XFT_MINOR], + [`echo $PACKAGE_VERSION | cut -d . -f 2 | cut -d - -f 1`], + [Minor version of Xft]) +AC_DEFINE_UNQUOTED([XFT_REVISION], + [`echo $PACKAGE_VERSION | cut -d . -f 3 | cut -d - -f 1`], + [Micro revision of Xft]) + +XFT_LT_VERSION=`echo $PACKAGE_VERSION | tr '.' ':'` +AC_SUBST([XFT_LT_VERSION]) + +# +# Check for Xrender +# +PKG_CHECK_MODULES(XRENDER, xrender >= 0.8.2, [xrender_found_with_pkgconfig=yes], + [xrender_found_with_pkgconfig=no]) +case "$xrender_found_with_pkgconfig" in +no) + PKG_CHECK_MODULES(XRENDER, xrender >= 0, [old_xrender_found_with_pkgconfig=yes], + [old_xrender_found_with_pkgconfig=no]) + case "$old_xrender_found_with_pkgconfig" in + yes) + XRENDER_LIBS="$XRENDER_LIBS -lXext -lX11" + ;; + *) + # checks for X + AC_PATH_X + + XRENDER_CFLAGS="-I$x_includes" + XRENDER_LIBS="-L$x_libraries -lXrender -lXext -lX11" + + saved_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $XRENDER_CFLAGS" + AC_CHECK_HEADERS([X11/extensions/Xrender.h], [], [AC_MSG_ERROR([Xrender.h not found.])]) + CPPFLAGS="$saved_CPPFLAGS" + + saved_LIBS="$LIBS" + LIBS="$LIBS $XRENDER_LIBS" + AC_CHECK_FUNCS([XRenderFindStandardFormat], [], [AC_MSG_ERROR([libXrender not found or too old.])]) + LIBS="$saved_LIBS" + ;; + esac + ;; +esac + +# Check freetype configuration +AC_ARG_WITH(freetype-config, [ --with-freetype-config=PROG Use FreeType configuration program PROG], freetype_config=$withval, freetype_config=auto) + +if test "$freetype_config" = "auto"; then + PKG_CHECK_MODULES(FREETYPE, freetype2, + freetype_config=no, freetype_config=yes) +fi + +if test "$freetype_config" = "yes"; then + AC_PATH_PROG(ft_config,freetype-config,no) + if test "$ft_config" = "no"; then + AC_MSG_ERROR([You must have freetype installed; see http://www.freetype.org/]) + fi +else + ft_config="$freetype_config" +fi + +if test "$freetype_config" != "no"; then + FREETYPE_CFLAGS="`$ft_config --cflags`" + FREETYPE_LIBS="`$ft_config --libs`" +fi + +# Check fontconfig configuration +PKG_CHECK_MODULES(FONTCONFIG, fontconfig >= 2.2) + +AC_SUBST(XRENDER_CFLAGS) +AC_SUBST(XRENDER_LIBS) +AC_SUBST(FREETYPE_CFLAGS) +AC_SUBST(FREETYPE_LIBS) +AC_SUBST(FONTCONFIG_CFLAGS) +AC_SUBST(FONTCONFIG_LIBS) + +fontconfig_save_libs="$LIBS" +fontconfig_save_cflags="$CFLAGS" +LIBS="$LIBS $FREETYPE_LIBS" +CFLAGS="$CFLAGS $FREETYPE_CFLAGS" +AC_CHECK_FUNCS(FT_Get_Next_Char FT_Get_BDF_Property FT_Get_PS_Font_Info FT_Has_PS_Glyph_Names FT_GlyphSlot_Embolden) +AC_CHECK_MEMBER(FT_Bitmap_Size.y_ppem, + HAVE_FT_BITMAP_SIZE_Y_PPEM=1, + HAVE_FT_BITMAP_SIZE_Y_PPEM=0, +[#include <ft2build.h> +#include FT_FREETYPE_H]) +AC_DEFINE_UNQUOTED(HAVE_FT_BITMAP_SIZE_Y_PPEM,$HAVE_FT_BITMAP_SIZE_Y_PPEM, + [FT_Bitmap_Size structure includes y_ppem field]) + +LIBS="$fontconfig_save_libs" +CFLAGS="$fontconfig_save_cflags" + +if test "$VERSION" = "" ; then + VERSION=$PACKAGE_VERSION; +fi + +AC_OUTPUT([Makefile + xft.pc + src/Makefile + man/Makefile]) diff --git a/libXft/include/X11/Xft/.gitignore b/libXft/include/X11/Xft/.gitignore new file mode 100644 index 000000000..2aa4925cb --- /dev/null +++ b/libXft/include/X11/Xft/.gitignore @@ -0,0 +1,2 @@ +# Add & Override for this directory and it's subdirectories +Xft.h diff --git a/libXft/include/X11/Xft/Xft.h.in b/libXft/include/X11/Xft/Xft.h.in new file mode 100644 index 000000000..490945fc5 --- /dev/null +++ b/libXft/include/X11/Xft/Xft.h.in @@ -0,0 +1,617 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _XFT_H_ +#define _XFT_H_ + +/* + * Current Xft version number, set from version in the Xft configure.ac file. + */ +/* #undef will be substituted by configure */ +#undef XFT_MAJOR +#undef XFT_MINOR +#undef XFT_REVISION + +#define XFT_VERSION ((XFT_MAJOR * 10000) + (XFT_MINOR * 100) + (XFT_REVISION)) +#define XftVersion XFT_VERSION + +#include <stdarg.h> +#include <ft2build.h> +#include FT_FREETYPE_H +#include <fontconfig/fontconfig.h> +#include <X11/extensions/Xrender.h> + +#include <X11/Xfuncproto.h> +/* #include <X11/Xosdefs.h>*/ +#ifndef _X_SENTINEL +# define _X_SENTINEL(x) +#endif + +#ifndef _XFT_NO_COMPAT_ +#include <X11/Xft/XftCompat.h> +#endif + +#define XFT_CORE "core" +#define XFT_RENDER "render" +#define XFT_XLFD "xlfd" +#define XFT_MAX_GLYPH_MEMORY "maxglyphmemory" +#define XFT_MAX_UNREF_FONTS "maxunreffonts" + +extern FT_Library _XftFTlibrary; + +typedef struct _XftFontInfo XftFontInfo; + +typedef struct _XftFont { + int ascent; + int descent; + int height; + int max_advance_width; + FcCharSet *charset; + FcPattern *pattern; +} XftFont; + +typedef struct _XftDraw XftDraw; + +typedef struct _XftColor { + unsigned long pixel; + XRenderColor color; +} XftColor; + +typedef struct _XftCharSpec { + FcChar32 ucs4; + short x; + short y; +} XftCharSpec; + +typedef struct _XftCharFontSpec { + XftFont *font; + FcChar32 ucs4; + short x; + short y; +} XftCharFontSpec; + +typedef struct _XftGlyphSpec { + FT_UInt glyph; + short x; + short y; +} XftGlyphSpec; + +typedef struct _XftGlyphFontSpec { + XftFont *font; + FT_UInt glyph; + short x; + short y; +} XftGlyphFontSpec; + +_XFUNCPROTOBEGIN + + +/* xftcolor.c */ +Bool +XftColorAllocName (Display *dpy, + _Xconst Visual *visual, + Colormap cmap, + _Xconst char *name, + XftColor *result); + +Bool +XftColorAllocValue (Display *dpy, + Visual *visual, + Colormap cmap, + _Xconst XRenderColor *color, + XftColor *result); + +void +XftColorFree (Display *dpy, + Visual *visual, + Colormap cmap, + XftColor *color); + +/* xftdpy.c */ +Bool +XftDefaultHasRender (Display *dpy); + +Bool +XftDefaultSet (Display *dpy, FcPattern *defaults); + +void +XftDefaultSubstitute (Display *dpy, int screen, FcPattern *pattern); + +/* xftdraw.c */ + +XftDraw * +XftDrawCreate (Display *dpy, + Drawable drawable, + Visual *visual, + Colormap colormap); + +XftDraw * +XftDrawCreateBitmap (Display *dpy, + Pixmap bitmap); + +XftDraw * +XftDrawCreateAlpha (Display *dpy, + Pixmap pixmap, + int depth); + +void +XftDrawChange (XftDraw *draw, + Drawable drawable); + +Display * +XftDrawDisplay (XftDraw *draw); + +Drawable +XftDrawDrawable (XftDraw *draw); + +Colormap +XftDrawColormap (XftDraw *draw); + +Visual * +XftDrawVisual (XftDraw *draw); + +void +XftDrawDestroy (XftDraw *draw); + +Picture +XftDrawPicture (XftDraw *draw); + +Picture +XftDrawSrcPicture (XftDraw *draw, _Xconst XftColor *color); + +void +XftDrawGlyphs (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs); + +void +XftDrawString8 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftDrawString16 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar16 *string, + int len); + +void +XftDrawString32 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar32 *string, + int len); + +void +XftDrawStringUtf8 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftDrawStringUtf16 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len); + +void +XftDrawCharSpec (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + _Xconst XftCharSpec *chars, + int len); + +void +XftDrawCharFontSpec (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftCharFontSpec *chars, + int len); + +void +XftDrawGlyphSpec (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + _Xconst XftGlyphSpec *glyphs, + int len); + +void +XftDrawGlyphFontSpec (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftGlyphFontSpec *glyphs, + int len); + +void +XftDrawRect (XftDraw *draw, + _Xconst XftColor *color, + int x, + int y, + unsigned int width, + unsigned int height); + + +Bool +XftDrawSetClip (XftDraw *draw, + Region r); + + +Bool +XftDrawSetClipRectangles (XftDraw *draw, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n); + +void +XftDrawSetSubwindowMode (XftDraw *draw, + int mode); + +/* xftextent.c */ + +void +XftGlyphExtents (Display *dpy, + XftFont *pub, + _Xconst FT_UInt *glyphs, + int nglyphs, + XGlyphInfo *extents); + +void +XftTextExtents8 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + int len, + XGlyphInfo *extents); + +void +XftTextExtents16 (Display *dpy, + XftFont *pub, + _Xconst FcChar16 *string, + int len, + XGlyphInfo *extents); + +void +XftTextExtents32 (Display *dpy, + XftFont *pub, + _Xconst FcChar32 *string, + int len, + XGlyphInfo *extents); + +void +XftTextExtentsUtf8 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + int len, + XGlyphInfo *extents); + +void +XftTextExtentsUtf16 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + FcEndian endian, + int len, + XGlyphInfo *extents); + +/* xftfont.c */ +FcPattern * +XftFontMatch (Display *dpy, + int screen, + _Xconst FcPattern *pattern, + FcResult *result); + +XftFont * +XftFontOpen (Display *dpy, int screen, ...) _X_SENTINEL(0); + +XftFont * +XftFontOpenName (Display *dpy, int screen, _Xconst char *name); + +XftFont * +XftFontOpenXlfd (Display *dpy, int screen, _Xconst char *xlfd); + +/* xftfreetype.c */ + +FT_Face +XftLockFace (XftFont *pub); + +void +XftUnlockFace (XftFont *pub); + +XftFontInfo * +XftFontInfoCreate (Display *dpy, _Xconst FcPattern *pattern); + +void +XftFontInfoDestroy (Display *dpy, XftFontInfo *fi); + +FcChar32 +XftFontInfoHash (_Xconst XftFontInfo *fi); + +FcBool +XftFontInfoEqual (_Xconst XftFontInfo *a, _Xconst XftFontInfo *b); + +XftFont * +XftFontOpenInfo (Display *dpy, + FcPattern *pattern, + XftFontInfo *fi); + +XftFont * +XftFontOpenPattern (Display *dpy, FcPattern *pattern); + +XftFont * +XftFontCopy (Display *dpy, XftFont *pub); + +void +XftFontClose (Display *dpy, XftFont *pub); + +FcBool +XftInitFtLibrary(void); + +/* xftglyphs.c */ +void +XftFontLoadGlyphs (Display *dpy, + XftFont *pub, + FcBool need_bitmaps, + _Xconst FT_UInt *glyphs, + int nglyph); + +void +XftFontUnloadGlyphs (Display *dpy, + XftFont *pub, + _Xconst FT_UInt *glyphs, + int nglyph); + +#define XFT_NMISSING 256 + +FcBool +XftFontCheckGlyph (Display *dpy, + XftFont *pub, + FcBool need_bitmaps, + FT_UInt glyph, + FT_UInt *missing, + int *nmissing); + +FcBool +XftCharExists (Display *dpy, + XftFont *pub, + FcChar32 ucs4); + +FT_UInt +XftCharIndex (Display *dpy, + XftFont *pub, + FcChar32 ucs4); + +/* xftinit.c */ +FcBool +XftInit (_Xconst char *config); + +int +XftGetVersion (void); + +/* xftlist.c */ + +FcFontSet * +XftListFonts (Display *dpy, + int screen, + ...) _X_SENTINEL(0); + +/* xftname.c */ +FcPattern +*XftNameParse (_Xconst char *name); + +/* xftrender.c */ +void +XftGlyphRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs); + +void +XftGlyphSpecRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + _Xconst XftGlyphSpec *glyphs, + int nglyphs); + +void +XftCharSpecRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + _Xconst XftCharSpec *chars, + int len); + +void +XftGlyphFontSpecRender (Display *dpy, + int op, + Picture src, + Picture dst, + int srcx, + int srcy, + _Xconst XftGlyphFontSpec *glyphs, + int nglyphs); + +void +XftCharFontSpecRender (Display *dpy, + int op, + Picture src, + Picture dst, + int srcx, + int srcy, + _Xconst XftCharFontSpec *chars, + int len); + +void +XftTextRender8 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRender16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar16 *string, + int len); + +void +XftTextRender16BE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRender16LE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRender32 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar32 *string, + int len); + +void +XftTextRender32BE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRender32LE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRenderUtf8 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len); + +void +XftTextRenderUtf16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len); + +/* xftxlfd.c */ +FcPattern * +XftXlfdParse (_Xconst char *xlfd_orig, Bool ignore_scalable, Bool complete); + +_XFUNCPROTOEND + +#endif /* _XFT_H_ */ diff --git a/libXft/include/X11/Xft/XftCompat.h b/libXft/include/X11/Xft/XftCompat.h new file mode 100644 index 000000000..0fced03a5 --- /dev/null +++ b/libXft/include/X11/Xft/XftCompat.h @@ -0,0 +1,163 @@ +/* + * Copyright © 2001 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _XFTCOMPAT_H_ +#define _XFTCOMPAT_H_ +#include <X11/Xfuncproto.h> + +/* + * Compatibility definitions -- map Fc names to Xft names + */ + +typedef FcChar8 XftChar8; +typedef FcChar16 XftChar16; +typedef FcChar32 XftChar32; + +#define XFT_FAMILY FC_FAMILY +#define XFT_STYLE FC_STYLE +#define XFT_SLANT FC_SLANT +#define XFT_WEIGHT FC_WEIGHT +#define XFT_SIZE FC_SIZE +#define XFT_PIXEL_SIZE FC_PIXEL_SIZE +#define XFT_SPACING FC_SPACING +#define XFT_FOUNDRY FC_FOUNDRY +#define XFT_ANTIALIAS FC_ANTIALIAS +#define XFT_FILE FC_FILE +#define XFT_INDEX FC_INDEX +#define XFT_RASTERIZER FC_RASTERIZER +#define XFT_OUTLINE FC_OUTLINE +#define XFT_SCALABLE FC_SCALABLE +#define XFT_RGBA FC_RGBA + +/* defaults from resources */ +#define XFT_SCALE FC_SCALE +#define XFT_MINSPACE FC_MINSPACE +#define XFT_DPI FC_DPI + +/* specific to FreeType rasterizer */ +#define XFT_CHAR_WIDTH FC_CHAR_WIDTH +#define XFT_CHAR_HEIGHT FC_CHAR_HEIGHT +#define XFT_MATRIX FC_MATRIX + +#define XFT_WEIGHT_LIGHT FC_WEIGHT_LIGHT +#define XFT_WEIGHT_MEDIUM FC_WEIGHT_MEDIUM +#define XFT_WEIGHT_DEMIBOLD FC_WEIGHT_DEMIBOLD +#define XFT_WEIGHT_BOLD FC_WEIGHT_BOLD +#define XFT_WEIGHT_BLACK FC_WEIGHT_BLACK + +#define XFT_SLANT_ROMAN FC_SLANT_ROMAN +#define XFT_SLANT_ITALIC FC_SLANT_ITALIC +#define XFT_SLANT_OBLIQUE FC_SLANT_OBLIQUE + +#define XFT_PROPORTIONAL FC_PROPORTIONAL +#define XFT_MONO FC_MONO +#define XFT_CHARCELL FC_CHARCELL + +#define XFT_RGBA_UNKNOWN FC_RGBA_UNKNOWN +#define XFT_RGBA_RGB FC_RGBA_RGB +#define XFT_RGBA_BGR FC_RGBA_BGR +#define XFT_RGBA_VRGB FC_RGBA_VRGB +#define XFT_RGBA_VBGR FC_RGBA_VBGR +#define XFT_RGBA_NONE FC_RGBA_NONE + +/* + * Old constants + */ +#define XFT_ENCODING "encoding" + +typedef FcType XftType; + +typedef FcMatrix XftMatrix; + +#define XftMatrixInit(m) FcMatrixInit(m) + +typedef FcResult XftResult; + +#define XftResultMatch FcResultMatch +#define XftResultNoMatch FcResultNoMatch +#define XftResultTypeMismatch FcResultTypeMismatch +#define XftResultNoId FcResultNoId + +typedef FcValue XftValue; +typedef FcPattern XftPattern; +typedef FcFontSet XftFontSet; +typedef FcObjectSet XftObjectSet; + +#define XftGlyphExists XftCharExists + +#define XftObjectSetCreate FcObjectSetCreate +#define XftObjectSetAdd FcObjectSetAdd +#define XftObjectSetDestroy FcObjectSetDestroy +#define XftObjectSetVaBuild FcObjectSetVaBuild +#define XftObjectSetBuild FcObjectSetBuild + +#define XftFontSetMatch FcFontSetMatch +#define XftFontSetDestroy FcFontSetDestroy + +#define XftMatrixEqual FcMatrixEqual +#define XftMatrixMultiply FcMatrixMultiply +#define XftMatrixRotate FcMatrixRotate +#define XftMatrixScale FcMatrixScale +#define XftMatrixShear FcMatrixShear + +#define XftPatternCreate FcPatternCreate +#define XftPatternDuplicate FcPatternDuplicate +#define XftValueDestroy FcValueDestroy +#define XftValueListDestroy FcValueListDestroy +#define XftPatternDestroy FcPatternDestroy +#define XftPatternFind FcPatternFind +#define XftPatternAdd FcPatternAdd +#define XftPatternGet FcPatternGet +#define XftPatternDel FcPatternDel +#define XftPatternAddInteger FcPatternAddInteger +#define XftPatternAddDouble FcPatternAddDouble +#define XftPatternAddString(p,e,s) FcPatternAddString(p,e,(FcChar8 *)(s)) +#define XftPatternAddMatrix FcPatternAddMatrix +#define XftPatternAddBool FcPatternAddBool +#define XftPatternGetInteger FcPatternGetInteger +#define XftPatternGetDouble FcPatternGetDouble +#define XftPatternGetString(p,e,i,n) FcPatternGetString(p,e,i,(FcChar8 **) (n)) +#define XftPatternGetMatrix FcPatternGetMatrix +#define XftPatternGetBool FcPatternGetBool +#define XftPatternVaBuild FcPatternVaBuild +#define XftPatternBuild FcPatternBuild + +#define XftUtf8ToUcs4 FcUtf8ToUcs4 +#define XftUtf8Len FcUtf8Len + +#define XftTypeVoid FcTypeVoid +#define XftTypeInteger FcTypeInteger +#define XftTypeDouble FcTypeDouble +#define XftTypeString FcTypeString +#define XftTypeBool FcTypeBool +#define XftTypeMatrix FcTypeMatrix + +#define XftConfigSubstitute(p) FcConfigSubstitute (0, p, FcMatchPattern) + +_XFUNCPROTOBEGIN + +FcBool +XftNameUnparse (XftPattern *pat, char *dest, int len); + +_XFUNCPROTOEND + +#endif /* _XFTCOMPAT_H_ */ diff --git a/libXft/man/Makefile.am b/libXft/man/Makefile.am new file mode 100644 index 000000000..24e78d819 --- /dev/null +++ b/libXft/man/Makefile.am @@ -0,0 +1,11 @@ +libman_PRE = Xft.man +libmandir = $(LIB_MAN_DIR) +libman_DATA = $(libman_PRE:man=$(LIB_MAN_SUFFIX)) + +EXTRA_DIST = $(libman_PRE) +CLEANFILES = $(libman_DATA) +SUFFIXES = .$(LIB_MAN_SUFFIX) .man + +# String replacements in MAN_SUBSTS now come from xorg-macros.m4 via configure +.man.$(LIB_MAN_SUFFIX): + $(AM_V_GEN)$(SED) $(MAN_SUBSTS) < $< > $@ diff --git a/libXft/man/Xft.man b/libXft/man/Xft.man new file mode 100644 index 000000000..4ed2742d2 --- /dev/null +++ b/libXft/man/Xft.man @@ -0,0 +1,845 @@ +.\" +.\" Copyright © 2000 Keith Packard +.\" +.\" Permission to use, copy, modify, distribute, and sell this software and its +.\" documentation for any purpose is hereby granted without fee, provided that +.\" the above copyright notice appear in all copies and that both that +.\" copyright notice and this permission notice appear in supporting +.\" documentation, and that the name of Keith Packard not be used in +.\" advertising or publicity pertaining to distribution of the software without +.\" specific, written prior permission. Keith Packard makes no +.\" representations about the suitability of this software for any purpose. It +.\" is provided "as is" without express or implied warranty. +.\" +.\" KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +.\" INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +.\" EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +.\" CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +.\" DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +.\" TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +.\" PERFORMANCE OF THIS SOFTWARE. +.\" +.TH Xft __libmansuffix__ __vendorversion__ +.SH NAME + Xft \- X FreeType interface library +.SH DESCRIPTION +.B Xft +is a simple library designed to interface the FreeType rasterizer with the X +Rendering Extension. +This manual page barely scratches the surface of this library. +.SH "HEADER FILE" +.B #include <X11/Xft/Xft.h> +.SH CONSTANTS +.TP +.B XFT_MAJOR +is the major version number of +.BR Xft . +.TP +.B XFT_MINOR +is the minor version number of +.BR Xft . +.TP +.B XFT_REVISION +is the revision number of +.BR Xft . +.TP +.B XFT_VERSION +is +.B XFT_MAJOR +times 10000 (ten thousand), plus +.B XFT_MINOR +times 100, plus +.BR XFT_REVISION . +.TP +.B XftVersion +is an alias for +.BR XFT_VERSION . +.PP +The following example illustrates how +.BR Xft 's +version constants might be used: +.nf + #if (XFT_VERSION >= 20107) + (void) puts("Version 2.1.7 or later of the Xft library is in" + " use."); + #else + (void) printf("Insufficient version of Xft (%d.%d.%d) installed; + " need at least version 2.1.7.\(rsn", XFT_MAJOR, + XFT_MINOR, + XFT_REVISION); + #endif +.fi +.\" I don't understand what these are for. -- BR, 2005-04-02 +.\" XFT_CORE used in xftname.c +.\" XFT_RENDER used in xftdpy.c, xftfreetype.c, xftname.c +.\" XFT_XLFD used in xftname.c, xftxlfd.c +.\" XFT_MAX_GLYPH_MEMORY used in xftdpy.c, xftfreetype.c +.\" XFT_MAX_UNREF_FONTS used in xftdpy.c +.\" XFT_NMISSING used in xftcore.c, xftextent.c, xftglyphs.c, +.\" xftrender.c +.SH "DATA TYPES" +.TP +.B XftFont +.nf +typedef struct _XftFont { + int ascent; + int descent; + int height; + int max_advance_width; + FcCharSet *charset; + FcPattern *pattern; +} XftFont; +.fi +An +.B XftFont +is the primary data structure of interest to programmers using +.BR Xft ; +it contains general font metrics and pointers to the Fontconfig +character set and pattern associated with the font. +The +.B FcCharSet +and +.B FcPattern +data types are defined by the Fontconfig library. +.TP +.B "" +.BR XftFont s +are populated with any of +.BR XftFontOpen (), +.BR XftFontOpenName (), +.BR XftFontOpenXlfd (), +.BR XftFontOpenInfo (), +or +.BR XftFontOpenPattern (). +.BR XftFontCopy () +is used to duplicate +.BR XftFont s, +and +.BR XftFontClose () +is used to mark an +.B XftFont +as unused. +.BR XftFont s +are internally allocated, reference-counted, and freed by +.BR Xft ; +the programmer does not ordinarily need to allocate or free storage +for them. +.TP +.B "" +.BR XftDrawGlyphs (), +the +.BR XftDrawString *() +family, +.BR XftDrawCharSpec (), +and +.BR XftDrawGlyphSpec () +use +.BR XftFont s +to render text to an +.B XftDraw +object, which may correspond to either a core X drawable or an X +Rendering Extension drawable. +.TP +.B "" +.BR XftGlyphExtents () +and the +.BR XftTextExtents *() +family are used to determine the extents (maximum dimensions) of an +.BR XftFont . +.TP +.B "" +An +.BR XftFont 's +glyph or character coverage can be determined with +.BR XftFontCheckGlyph () +or +.BR XftCharExists (). +.BR XftCharIndex () +returns the +.BR XftFont -specific +character index corresponding to a given Unicode codepoint. +.TP +.B "" +.BR XftGlyphRender (), +.BR XftGlyphSpecRender (), +.BR XftCharSpecRender (), +and the +.BR XftTextRender *() +family use +.BR XftFont s +to draw into X Rendering Extension +.B Picture +structures. +.B Note: +.BR XftDrawGlyphs (), +the +.BR XftDrawString *() +family, +.BR XftDrawCharSpec (), +and +.BR XftDrawGlyphSpec () +provide a means of rendering fonts that is independent of the +availability of the X Rendering Extension on the X server. +.\" I'm not sure what these are for; they're used internally, but why +.\" would any external users want them? -- BR, 2005-04-02 +.\" .BR XftLockFace() +.\" .BR XftUnlockFace() +.TP +.B XftFontInfo +is an opaque object that stores information about a font. +.B XftFontInfo +structures are created with +.BR XftFontInfoCreate (), +freed with +.BR XftFontInfoDestroy (), +and compared with +.BR XftFontInfoEqual (). +.B XftFontInfo +objects are internally allocated and freed by +.BR Xft ; +the programmer does not ordinarily need to allocate or free storage +for them. +.TP +.B "" +Each +.B XftFontInfo +structure in use is associated with a unique identifier, which can be +retrieved with +.BR XftFontInfoHash (). +An +.B XftFont +can be opened based on +.B XftFontInfo +data with +.BR XftFontOpenInfo (). +.TP +.B XftColor +.nf +typedef struct _XftColor { + unsigned long pixel; + XRenderColor color; +} XftColor; +.fi +An +.B XftColor +object permits text and other items to be rendered in a particular +color (or the closest approximation offered by the X visual in use). +The +.B XRenderColor +data type is defined by the X Render Extension library. +.TP +.B "" +.BR XftColorAllocName () +and +.BR XftColorAllocValue () +request a color allocation from the X server (if necessary) and +initialize the members of +.BR XftColor . +.BR XftColorFree () +instructs the X server to free the color currently allocated for an +.BR XftColor . +.TP +.B "" +One an +.B XftColor +has been initialized, +.BR XftDrawSrcPicture (), +.BR XftDrawGlyphs (), +the +.BR XftDrawString *() +family, +.BR XftDrawCharSpec (), +.BR XftDrawCharFontSpec (), +.BR XftDrawGlyphSpec (), +.BR XftDrawGlyphFontSpec (), +and +.BR XftDrawRect () +may be used to draw various objects using it. +.TP +.B XftDraw +is an opaque object which holds information used to render to an X drawable +using either the core protocol or the X Rendering extension. +.TP +.B "" +.B XftDraw +objects are created with any of +.BR XftDrawCreate () +(which associates an +.B XftDraw +with an existing X drawable), +.BR XftDrawCreateBitmap (), +or +.BR XftDrawCreateAlpha (), +and destroyed with +.BR XftDrawDestroy (). +The X drawable associated with an +.B XftDraw +can be changed with +.BR XftDrawChange (). +.BR XftDraw s +are internally allocated and freed by +.BR Xft ; +the programmer does not ordinarily need to allocate or free storage +for them. +.TP +.B "" +The X +.BR Display , +.BR Drawable , +.BR Colormap , +and +.BR Visual +of an +.B XftDraw +can be queried with +.BR XftDrawDisplay (), +.BR XftDrawDrawable (), +.BR XftDrawColormap (), +and +.BR XftDrawVisual (), +respectively. +The X Rendering Extension +.B Picture +associated with an +.B XftDraw +is returned by +.BR XftDrawPicture (). +.\" XftDrawSrcPicture +.\" XftDrawGlyphs +.\" XftDrawString* +.\" XftDrawCharSpec +.\" XftDrawCharFontSpec +.\" XftDrawGlyphSpec +.\" XftDrawGlyphFontSpec +.\" XftDrawRect +.\" XftDrawSetClip +.\" XftDrawSetClipRectangles +.\" XftDrawSetSubwindowMode +.TP +.B XftCharSpec +.nf +typedef struct _XftCharSpec { + FcChar32 ucs4; + short x; + short y; +} XftCharSpec; +.fi +.TP +.B "" +The +.B FcChar32 +data type is defined by the Fontconfig library. +.\" XftDrawCharSpec +.\" XftCharSpecRender +.TP +.B XftCharFontSpec +.nf +typedef struct _XftCharFontSpec { + XftFont *font; + FcChar32 ucs4; + short x; + short y; +} XftCharFontSpec; +.fi +.TP +.B "" +The +.B FcChar32 +data type is defined by the Fontconfig library. +.\" XftDrawCharFontSpec +.\" XftCharFontSpecRender +.TP +.B XftGlyphSpec +.nf +typedef struct _XftGlyphSpec { + FT_UInt glyph; + short x; + short y; +} XftGlyphSpec; +.fi +.TP +.B "" +The +.B FT_UInt +data type is defined by the FreeType library. +.\" XftDrawGlyphSpec +.\" XftGlyphSpecRender +.TP +.B XftGlyphFontSpec +.nf +typedef struct _XftGlyphFontSpec { + XftFont *font; + FT_UInt glyph; + short x; + short y; +} XftGlyphFontSpec; +.fi +.TP +.B "" +The +.B FT_UInt +data type is defined by the FreeType library. +.\" XftDrawGlyphFontSpec +.\" XftGlyphFontSpecRender +.SH FUNCTIONS +.SS "Opening and Matching Fonts" +.nf +\fBXftFont *\fR +\fBXftFontOpen (Display *\fIdpy\fB,\fR +\fB int \fIscreen\fB,\fR +\fB ...);\fR\fR +.fi +.B XftFontOpen +takes a list of pattern element triples of the form +.IR field , " type" , " value" +(terminated with a NULL), matches that pattern against the available fonts, +and opens the matching font, sizing it correctly for screen number +.I screen +on display +.IR dpy . +The +.B Display +data type is defined by the X11 library. +Returns NULL if no match is found. +.PP +Example: +.nf + font = XftFontOpen (dpy, screen, + XFT_FAMILY, XftTypeString, "charter", + XFT_SIZE, XftTypeDouble, 12.0, + NULL); +.fi +This opens the \(lqcharter\(rq font at 12 points. +The point size is automatically converted to the correct pixel size based +on the resolution of the monitor. +.PP +.nf +\fBXftFont *\fR +\fBXftFontOpenName (Display *\fIdpy\fB,\fR +\fB int \fIscreen\fB,\fR +\fB unsigned char *\fIname\fB);\fR +.fi +.B XftFontOpenName +behaves as +.B XftFontOpen +does, except that it takes a Fontconfig pattern string (which is passed to +the Fontconfig library's +.BR FcNameParse () +function). +.PP +.nf +\fBXftFont *\fR +\fBXftFontOpenXlfd (Display *\fIdpy\fB,\fR +\fB int \fIscreen\fB,\fR +\fB unsigned char *\fIxlfd\fB)\fR +.fi +.B XftFontOpenXlfd +behaves as +.B XftFontOpen +does, except that it takes a string containing an X Logical Font +Description (XLFD). +.PP +.nf +\fBFcPattern *\fR +\fBXftFontMatch (Display *\fIdpy\fB,\fR +\fB int \fIscreen\fB,\fR +\fB FcPattern *\fIpattern\fB,\fR +\fB FcResult *\fIresult\fB);\fR +.fi +Also used internally by the +.BR XftFontOpen * +functions, +.B XftFontMatch +can also be used directly to determine the Fontconfig font pattern +resulting from an Xft font open request. +The +.B FcPattern +and +.B FcResult +data types are defined by the Fontconfig library. +.SS "Determining the Pixel Extents of a Text String" +.nf +\fBvoid\fR +\fBXftTextExtents8 (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FcChar8 *\fIstring\fB,\fR +\fB int \fIlen\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +.B XftTextExtents8 +computes the pixel extents on display +.I dpy +of no more than +.I len +glyphs of a +.I string +consisting of eight-bit characters when drawn with +.IR font , +storing them in +.IR extents . +The +.B FcChar8 +data type is defined by the Fontconfig library, and the +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftTextExtents16 (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FcChar16 *\fIstring\fB,\fR +\fB int \fIlen\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +.B XftTextExtents16 +computes the pixel extents on display +.I dpy +of no more than +.I len +glyphs of a +.I string +consisting of sixteen-bit characters when drawn with +.IR font , +storing them in +.IR extents . +The +.B FcChar16 +data type is defined by the Fontconfig library, and the +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftTextExtents32 (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FcChar32 *\fIstring\fB,\fR +\fB int \fIlen\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +.B XftTextExtents32 +computes the pixel extents on display +.I dpy +of no more than +.I len +glyphs of a +.I string +consisting of thirty-two-bit characters when drawn with +.IR font , +storing them in +.IR extents . +The +.B FcChar32 +data type is defined by the Fontconfig library, and the +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftTextExtentsUtf8 (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FcChar8 *\fIstring\fB,\fR +\fB int \fIlen\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +.B XftTextExtentsUtf8 +computes the pixel extents on display +.I dpy +of no more than +.I len +bytes of a UTF-8 encoded +.I string +when drawn with +.IR font , +storing them in +.IR extents . +The +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftTextExtentsUtf16 (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FcChar8 *\fIstring\fB,\fR +\fB FcEndian \fIendian\fB,\fR +\fB int \fIlen\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +.B XftTextExtentsUtf16 +computes the pixel extents on display +.I dpy +of no more than +.I len +bytes of a UTF-16LE- or UTF-16BE-encoded +.I string +when drawn with +.IR font , +storing them in +.IR extents . +The endianness of +.I string +must be specified in +.IR endian . +The +.B FcEndian +data type is defined by the Fontconfig library, and the +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftGlyphExtents (Display *\fIdpy\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB FT_UInt *\fIglyphs\fB,\fR +\fB int \fInglyphs\fB,\fR +\fB XGlyphInfo *\fIextents\fB);\fR +.fi +Also used internally by the +.BR XftTextExtents * +functions, +.B XftGlyphExtents +computes the pixel extents on display +.I dpy +of no more than +.I nglyphs +in the array +.I glyphs +drawn with +.IR font , +storing them in +.IR extents . +The +.B FT_UInt +data type is defined by the FreeType library, and the +.B XGlyphInfo +data type is defined by the X Rendering Extension library. +.SS "Drawing Strings (and Other Things)" +.nf +\fBXftDraw *\fR +\fBXftDrawCreate (Display *\fIdpy\fB,\fR +\fB Drawable \fIdrawable\fB,\fR +\fB Visual *\fIvisual\fB,\fR +\fB Colormap \fIcolormap\fB);\fR +.fi +.B XftDrawCreate +creates a structure that can be used to render text and rectangles using +the specified +.IR drawable , +.IR visual , +and +.I colormap +on +.IR display . +The +.BR Drawable , +.BR Visual , +and +.B Colormap +data types are defined by the X11 library. +.PP +.nf +\fBXftDraw *\fR +\fBXftDrawCreateBitmap (Display *\fIdpy\fB,\fR +\fB Pixmap \fIbitmap\fB);\fR +.fi +.B XftDrawCreateBitmap +behaves as +.BR XftDrawCreate , +except it uses an X pixmap of color depth 1 instead of an X drawable. +The +.B Pixmap +data type is defined by the X11 library. +.PP +.nf +\fBXftDraw *\fR +\fBXftDrawCreateAlpha (Display *\fIdpy\fB,\fR +\fB Pixmap \fIpixmap\fB,\fR +\fB int \fIdepth\fB);\fR +.fi +.B XftDrawCreateAlpha +behaves as +.BR XftDrawCreate , +except it uses an X pixmap of color depth +.I depth +instead of an X drawable. +The +.B Pixmap +data type is defined by the X11 library. +.PP +.nf +\fBvoid\fR +\fBXftDrawChange (XftDraw *\fIdraw\fB,\fR +\fB Drawable \fIdrawable\fB);\fR +.fi +.B XftDrawChange +changes the X drawable association of the existing Xft draw object +.I draw +from its current value to +.IR drawable . +.PP +.nf +\fBDisplay *\fR +\fBXftDrawDisplay (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawDisplay +returns a pointer to the display associated with the Xft draw object +.IR draw . +.PP +.nf +\fBDrawable\fR +\fBXftDrawDrawable (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawDrawable +returns the X drawable associated with the Xft draw object +.IR draw . +.PP +.nf +\fBColormap\fR +\fBXftDrawColormap (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawColormap +returns the colormap associatied with the Xft draw object +.IR draw . +.PP +.nf +\fBVisual *\fR +\fBXftDrawVisual (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawVisual +returns a pointer to the visual associated with the Xft draw object +.IR draw . +.PP +.nf +\fBPicture\fR +\fBXftDrawPicture (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawPicture +returns the picture associated with the Xft draw object +.IR draw . +If the the X server does not support the X Rendering Extension, 0 is +returned. +.PP +.nf +\fBPicture\fR +\fBXftDrawSrcPicture (XftDraw *\fIdraw\fB,\fR +\fB XftColor *\fIcolor\fB);\fR +.fi +.\" Unfortunately, I'm not quite sure what this does. I think it is the gizmo +.\" that is used to create an Xrender Picture object so that glyphs can be +.\" drawn in the XftDraw object +.\" .I draw +.\" using the specified +.\" .IR color . +.\" -- BR, 2005-04-02 +This function is never called if the X server doesn't support the X +Rendering Extension; instead, +.B XftGlyphCore +is used. +.PP +.nf +\fBvoid\fR +\fBXftDrawDestroy (XftDraw *\fIdraw\fB);\fR +.fi +.B XftDrawDestroy +destroys +.I draw +(created by one of the +.B XftCreate +functions) and frees the memory that was allocated for it. +.PP +.nf +\fBvoid\fR +\fBXftDrawString8 (XftDraw *\fId\fB,\fR +\fB XRenderColor *\fIcolor\fB,\fR +\fB XftFont *\fIfont\fB,\fR +\fB int \fIx\fB,\fR +\fB int \fIy\fB,\fR +\fB unsigned char *\fIstring\fB,\fR +\fB int \fIlen\fB);\fR +.fi +.B XftDrawString8 +draws no more than +.I len +glyphs of +.I string +to Xft drawable +.I d +using +.I font +in +.I color +at position +.IR x , " y" . +The +.B XRenderColor +data type is defined by the X Rendering Extension library. +.PP +.nf +\fBvoid\fR +\fBXftDrawRect (XftDraw *\fId\fB,\fR +\fB XRenderColor *\fIcolor\fB,\fR +\fB int \fIx\fB,\fR +\fB int \fIy\fB,\fR +\fB unsigned int \fIwidth\fB,\fR +\fB unsigned int \fIheight\fB);\fR +.fi +.B XftDrawRect +draws a solid rectangle of the specified +.IR color , +.IR width , +and +.I height +at position +.IR x , " y" +to Xft drawable +.IR d . +.SH COMPATIBILITY +As of version 2, +.B Xft +has become relatively stable and is expected to retain source and binary +compatibility in future releases. +.PP +.B Xft +does provide a compatibility interface to its previous major version, +Xft +.RI 1. x , +described below. +.SS "Xft 1.x Compatibility Header File" +.B #include <X11/Xft/XftCompat.h> +.\" .SS "Xft 1.x Compatibility Constants" +.SS "Xft 1.x Compatibility Data Types" +.TP +.B XftPattern +holds a set of names with associated value lists; each name refers to a +property of a font. +.BR XftPattern s +are used as inputs to the matching code as well as holding information +about specific fonts. +.TP +.B XftFontSet +contains a list of +.BR XftPattern s. +Internally, +.B Xft +uses this data structure to hold sets of fonts. +Externally, +.B Xft +returns the results of listing fonts in this format. +.TP +.B XftObjectSet +holds a set of names and is used to specify which fields from fonts are +placed in the the list of returned patterns when listing fonts. +.\" .SS "Xft 1.x Compatibility Functions" +.SH AUTHOR +Keith Packard +.SH "SEE ALSO" +.I Fontconfig Developers Reference +.br +.I FreeType API Reference +.br +.I Xlib \- C Language Interface +.\" Set Vim modeline; textwidth is 70 to account for the extra margin +.\" padding that man (on Debian GNU/Linux) does for output to +.\" terminals (7 spaces on the left, 2 on the right), so that we don't +.\" go past 80 columns total, particularly in .nf/.fi regions. +.\" vim:set ai et sts=4 sw=4 tw=70: diff --git a/libXft/src/Makefile.am b/libXft/src/Makefile.am new file mode 100644 index 000000000..d9604a02c --- /dev/null +++ b/libXft/src/Makefile.am @@ -0,0 +1,32 @@ +AM_CFLAGS = $(FONTCONFIG_CFLAGS) $(FREETYPE_CFLAGS) $(XRENDER_CFLAGS) \ + $(CWARNFLAGS) -I$(top_builddir)/include/X11/Xft + +lib_LTLIBRARIES = libXft.la + +libXft_la_SOURCES = xftint.h \ + xftcolor.c \ + xftcore.c \ + xftdbg.c \ + xftdpy.c \ + xftdraw.c \ + xftextent.c \ + xftfont.c \ + xftfreetype.c \ + xftglyphs.c \ + xftinit.c \ + xftlist.c \ + xftname.c \ + xftrender.c \ + xftstr.c \ + xftswap.c \ + xftxlfd.c + +libXft_la_LIBADD = @FONTCONFIG_LIBS@ @FREETYPE_LIBS@ @XRENDER_LIBS@ + +# -version-number requires libtool >= 1.5 +libXft_la_LDFLAGS = -version-number $(XFT_LT_VERSION) -no-undefined + +libXftincludedir = $(includedir)/X11/Xft +libXftinclude_HEADERS = \ + $(top_builddir)/include/X11/Xft/Xft.h \ + $(top_srcdir)/include/X11/Xft/XftCompat.h diff --git a/libXft/src/xftcolor.c b/libXft/src/xftcolor.c new file mode 100644 index 000000000..77872efa4 --- /dev/null +++ b/libXft/src/xftcolor.c @@ -0,0 +1,123 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_EXPORT Bool +XftColorAllocName (Display *dpy, + _Xconst Visual *visual, + Colormap cmap, + _Xconst char *name, + XftColor *result) +{ + XColor screen, exact; + + if (!XAllocNamedColor (dpy, cmap, name, &screen, &exact)) + { + /* XXX stick standard colormap stuff here */ + return False; + } + + result->pixel = screen.pixel; + result->color.red = exact.red; + result->color.green = exact.green; + result->color.blue = exact.blue; + result->color.alpha = 0xffff; + return True; +} + +static short +maskbase (unsigned long m) +{ + short i; + + if (!m) + return 0; + i = 0; + while (!(m&1)) + { + m>>=1; + i++; + } + return i; +} + +static short +masklen (unsigned long m) +{ + unsigned long y; + + y = (m >> 1) &033333333333; + y = m - y - ((y >>1) & 033333333333); + return (short) (((y + (y >> 3)) & 030707070707) % 077); +} + +_X_EXPORT Bool +XftColorAllocValue (Display *dpy, + Visual *visual, + Colormap cmap, + _Xconst XRenderColor *color, + XftColor *result) +{ + if (visual->class == TrueColor) + { + int red_shift, red_len; + int green_shift, green_len; + int blue_shift, blue_len; + + red_shift = maskbase (visual->red_mask); + red_len = masklen (visual->red_mask); + green_shift = maskbase (visual->green_mask); + green_len = masklen (visual->green_mask); + blue_shift = maskbase (visual->blue_mask); + blue_len = masklen (visual->blue_mask); + result->pixel = (((color->red >> (16 - red_len)) << red_shift) | + ((color->green >> (16 - green_len)) << green_shift) | + ((color->blue >> (16 - blue_len)) << blue_shift)); + } + else + { + XColor xcolor; + + xcolor.red = color->red; + xcolor.green = color->green; + xcolor.blue = color->blue; + if (!XAllocColor (dpy, cmap, &xcolor)) + return False; + result->pixel = xcolor.pixel; + } + result->color.red = color->red; + result->color.green = color->green; + result->color.blue = color->blue; + result->color.alpha = color->alpha; + return True; +} + +_X_EXPORT void +XftColorFree (Display *dpy, + Visual *visual, + Colormap cmap, + XftColor *color) +{ + if (visual->class != TrueColor) + XFreeColors (dpy, cmap, &color->pixel, 1, 0); +} diff --git a/libXft/src/xftcore.c b/libXft/src/xftcore.c new file mode 100644 index 000000000..3f8710929 --- /dev/null +++ b/libXft/src/xftcore.c @@ -0,0 +1,1373 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN void +XftRectCore (XftDraw *draw, + _Xconst XftColor *color, + int x, + int y, + unsigned int width, + unsigned int height) +{ + if (color->color.alpha >= 0x8000) + { + XSetForeground (draw->dpy, draw->core.gc, color->pixel); + XFillRectangle (draw->dpy, draw->drawable, draw->core.gc, + x, y, width, height); + } +} + +/* + * Use the core protocol to draw the glyphs + */ + +static void +_XftSharpGlyphMono (XftDraw *draw, + XftGlyph *glyph, + int x, + int y) +{ + unsigned char *srcLine = glyph->bitmap, *src; + unsigned char bits, bitsMask; + int width = glyph->metrics.width; + int stride = ((width + 31) & ~31) >> 3; + int height = glyph->metrics.height; + int w; + int xspan, lenspan; + + x -= glyph->metrics.x; + y -= glyph->metrics.y; + while (height--) + { + src = srcLine; + srcLine += stride; + w = width; + + bitsMask = 0x80; /* FreeType is always MSB first */ + bits = *src++; + + xspan = x; + while (w) + { + if (bits & bitsMask) + { + lenspan = 0; + do + { + lenspan++; + if (lenspan == w) + break; + bitsMask = bitsMask >> 1; + if (!bitsMask) + { + bits = *src++; + bitsMask = 0x80; + } + } while (bits & bitsMask); + XFillRectangle (draw->dpy, draw->drawable, + draw->core.gc, xspan, y, lenspan, 1); + xspan += lenspan; + w -= lenspan; + } + else + { + do + { + w--; + xspan++; + if (!w) + break; + bitsMask = bitsMask >> 1; + if (!bitsMask) + { + bits = *src++; + bitsMask = 0x80; + } + } while (!(bits & bitsMask)); + } + } + y++; + } +} + +/* + * Draw solid color text from an anti-aliased bitmap. This is a + * fallback for cases where a particular drawable has no AA code + */ +static void +_XftSharpGlyphGray (XftDraw *draw, + XftGlyph *glyph, + int x, + int y) +{ + unsigned char *srcLine = glyph->bitmap, *src, bits; + int width = glyph->metrics.width; + int stride = ((width + 3) & ~3); + int height = glyph->metrics.height; + int w; + int xspan, lenspan; + + x -= glyph->metrics.x; + y -= glyph->metrics.y; + while (height--) + { + src = srcLine; + srcLine += stride; + w = width; + + bits = *src++; + xspan = x; + while (w) + { + if (bits >= 0x80) + { + lenspan = 0; + do + { + lenspan++; + if (lenspan == w) + break; + bits = *src++; + } while (bits >= 0x80); + XFillRectangle (draw->dpy, draw->drawable, + draw->core.gc, xspan, y, lenspan, 1); + xspan += lenspan; + w -= lenspan; + } + else + { + do + { + w--; + xspan++; + if (!w) + break; + bits = *src++; + } while (bits < 0x80); + } + } + y++; + } +} + +static void +_XftSharpGlyphRgba (XftDraw *draw, + XftGlyph *glyph, + int x, + int y) +{ + CARD32 *srcLine = glyph->bitmap, *src, bits; + int width = glyph->metrics.width; + int stride = ((width + 3) & ~3); + int height = glyph->metrics.height; + int w; + int xspan, lenspan; + + x -= glyph->metrics.x; + y -= glyph->metrics.y; + while (height--) + { + src = srcLine; + srcLine += stride; + w = width; + + bits = *src++; + xspan = x; + while (w) + { + if (bits >= 0x80000000) + { + lenspan = 0; + do + { + lenspan++; + if (lenspan == w) + break; + bits = *src++; + } while (bits >= 0x80000000); + XFillRectangle (draw->dpy, draw->drawable, + draw->core.gc, xspan, y, lenspan, 1); + xspan += lenspan; + w -= lenspan; + } + else + { + do + { + w--; + xspan++; + if (!w) + break; + bits = *src++; + } while (bits < 0x80000000); + } + } + y++; + } +} + +typedef void (*XftSharpGlyph) (XftDraw *draw, + XftGlyph *glyph, + int x, + int y); + +static XftSharpGlyph +_XftSharpGlyphFind (XftDraw *draw, XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + + if (!font->info.antialias) + return _XftSharpGlyphMono; + else switch (font->info.rgba) { + case FC_RGBA_RGB: + case FC_RGBA_BGR: + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: + return _XftSharpGlyphRgba; + default: + return _XftSharpGlyphGray; + } +} + +/* + * Draw glyphs to a target that supports anti-aliasing + */ + +/* + * Primitives for converting between RGB values and TrueColor pixels + */ + +static void +_XftExamineBitfield (unsigned long mask, int *shift, int *len) +{ + int s, l; + + s = 0; + while ((mask & 1) == 0) + { + mask >>= 1; + s++; + } + l = 0; + while ((mask & 1) == 1) + { + mask >>= 1; + l++; + } + *shift = s; + *len = l; +} + +static CARD32 +_XftGetField (unsigned long l_pixel, int shift, int len) +{ + CARD32 pixel = (CARD32) l_pixel; + + pixel = pixel & (((1 << (len)) - 1) << shift); + pixel = pixel << (32 - (shift + len)) >> 24; + while (len < 8) + { + pixel |= (pixel >> len); + len <<= 1; + } + return pixel; +} + +static unsigned long +_XftPutField (CARD32 pixel, int shift, int len) +{ + unsigned long l_pixel = (unsigned long) pixel; + + shift = shift - (8 - len); + if (len <= 8) + l_pixel &= (((1 << len) - 1) << (8 - len)); + if (shift < 0) + l_pixel >>= -shift; + else + l_pixel <<= shift; + return l_pixel; +} + +/* + * This is used when doing XftCharFontSpec/XftGlyphFontSpec where + * some of the fonts are bitmaps and some are anti-aliased to handle + * the bitmap portions + */ +static void +_XftSmoothGlyphMono (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + unsigned char *srcLine = xftg->bitmap, *src; + unsigned char bits, bitsMask; + int width = xftg->metrics.width; + int stride = ((width + 31) & ~31) >> 3; + int height = xftg->metrics.height; + int w; + int xspan; + int r_shift, r_len; + int g_shift, g_len; + int b_shift, b_len; + unsigned long pixel; + + _XftExamineBitfield (image->red_mask, &r_shift, &r_len); + _XftExamineBitfield (image->green_mask, &g_shift, &g_len); + _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); + pixel = (_XftPutField (color->color.red >> 8, r_shift, r_len) | + _XftPutField (color->color.green >> 8, g_shift, g_len) | + _XftPutField (color->color.blue >> 8, b_shift, b_len)); + x -= xftg->metrics.x; + y -= xftg->metrics.y; + while (height--) + { + src = srcLine; + srcLine += stride; + w = width; + + bitsMask = 0x80; /* FreeType is always MSB first */ + bits = *src++; + + xspan = x; + while (w--) + { + if (bits & bitsMask) + XPutPixel (image, xspan, y, pixel); + bitsMask = bitsMask >> 1; + if (!bitsMask) + { + bits = *src++; + bitsMask = 0x80; + } + xspan++; + } + y++; + } +} + +/* + * As simple anti-aliasing is likely to be common, there are three + * optimized versions for the usual true color pixel formats (888, 565, 555). + * Other formats are handled by the general case + */ + +#define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ + (((s) >> 5) & 0x07e0) | \ + (((s) >> 8) & 0xf800)) + +#define cvt0565to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ + ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ + ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) + +#define cvt8888to0555(s) ((((s) >> 3) & 0x001f) | \ + (((s) >> 6) & 0x03e0) | \ + (((s) >> 7) & 0x7c00)) + +#define cvt0555to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ + ((((s) << 6) & 0xf800) | (((s) >> 0) & 0x300)) | \ + ((((s) << 9) & 0xf80000) | (((s) << 4) & 0x70000))) + + +#define XftIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) +#define XftIntDiv(a,b) (((CARD16) (a) * 255) / (b)) + +#define XftGet8(v,i) ((CARD16) (CARD8) ((v) >> i)) + +/* + * There are two ways of handling alpha -- either as a single unified value or + * a separate value for each component, hence each macro must have two + * versions. The unified alpha version has a 'U' at the end of the name, + * the component version has a 'C'. Similarly, functions which deal with + * this difference will have two versions using the same convention. + */ + +#define XftOverU(x,y,i,a,t) ((t) = XftIntMult(XftGet8(y,i),(a),(t)) + XftGet8(x,i),\ + (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) + +#define XftOverC(x,y,i,a,t) ((t) = XftIntMult(XftGet8(y,i),XftGet8(a,i),(t)) + XftGet8(x,i),\ + (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) + +#define XftInU(x,i,a,t) ((CARD32) XftIntMult(XftGet8(x,i),(a),(t)) << (i)) + +#define XftInC(x,i,a,t) ((CARD32) XftIntMult(XftGet8(x,i),XftGet8(a,i),(t)) << (i)) + +#define XftGen(x,y,i,ax,ay,t,u,v) ((t) = (XftIntMult(XftGet8(y,i),ay,(u)) + \ + XftIntMult(XftGet8(x,i),ax,(v))),\ + (CARD32) ((CARD8) ((t) | \ + (0 - ((t) >> 8)))) << (i)) + +#define XftAdd(x,y,i,t) ((t) = XftGet8(x,i) + XftGet8(y,i), \ + (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) + + +static CARD32 +fbOver24 (CARD32 x, CARD32 y) +{ + CARD16 a = ~x >> 24; + CARD16 t; + CARD32 m,n,o; + + m = XftOverU(x,y,0,a,t); + n = XftOverU(x,y,8,a,t); + o = XftOverU(x,y,16,a,t); + return m|n|o; +} + +static CARD32 +fbIn (CARD32 x, CARD8 y) +{ + CARD16 a = y; + CARD16 t; + CARD32 m,n,o,p; + + m = XftInU(x,0,a,t); + n = XftInU(x,8,a,t); + o = XftInU(x,16,a,t); + p = XftInU(x,24,a,t); + return m|n|o|p; +} + +static void +_XftSmoothGlyphGray8888 (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + CARD32 src, srca; + CARD32 r, g, b; + CARD32 *dstLine, *dst, d; + CARD8 *maskLine, *mask, m; + int dstStride, maskStride; + int width, height; + int w; + + srca = color->color.alpha >> 8; + + /* This handles only RGB and BGR */ + g = (color->color.green & 0xff00); + if (image->red_mask == 0xff0000) + { + r = (color->color.red & 0xff00) << 8; + b = color->color.blue >> 8; + } + else + { + r = color->color.red >> 8; + b = (color->color.blue & 0xff00) << 8; + } + src = (srca << 24) | r | g | b; + + width = xftg->metrics.width; + height = xftg->metrics.height; + + x -= xftg->metrics.x; + y -= xftg->metrics.y; + + dstLine = (CARD32 *) (image->data + image->bytes_per_line * y + (x << 2)); + dstStride = image->bytes_per_line >> 2; + maskLine = (unsigned char *) xftg->bitmap; + maskStride = (width + 3) & ~3; + + while (height--) + { + dst = dstLine; + dstLine += dstStride; + mask = maskLine; + maskLine += maskStride; + w = width; + + while (w--) + { + m = *mask++; + if (m == 0xff) + { + if (srca == 0xff) + *dst = src; + else + *dst = fbOver24 (src, *dst); + } + else if (m) + { + d = fbIn (src, m); + *dst = fbOver24 (d, *dst); + } + dst++; + } + } +} + +static void +_XftSmoothGlyphGray565 (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + CARD32 src, srca; + CARD32 r, g, b; + CARD32 d; + CARD16 *dstLine, *dst; + CARD8 *maskLine, *mask, m; + int dstStride, maskStride; + int width, height; + int w; + + srca = color->color.alpha >> 8; + + /* This handles only RGB and BGR */ + g = (color->color.green & 0xff00); + if (image->red_mask == 0xf800) + { + r = (color->color.red & 0xff00) << 8; + b = color->color.blue >> 8; + } + else + { + r = color->color.red >> 8; + b = (color->color.blue & 0xff00) << 8; + } + src = (srca << 24) | r | g | b; + + width = xftg->metrics.width; + height = xftg->metrics.height; + + x -= xftg->metrics.x; + y -= xftg->metrics.y; + + dstLine = (CARD16 *) (image->data + image->bytes_per_line * y + (x << 1)); + dstStride = image->bytes_per_line >> 1; + maskLine = (unsigned char *) xftg->bitmap; + maskStride = (width + 3) & ~3; + + while (height--) + { + dst = dstLine; + dstLine += dstStride; + mask = maskLine; + maskLine += maskStride; + w = width; + + while (w--) + { + m = *mask++; + if (m == 0xff) + { + if (srca == 0xff) + d = src; + else + { + d = *dst; + d = fbOver24 (src, cvt0565to8888(d)); + } + *dst = cvt8888to0565(d); + } + else if (m) + { + d = *dst; + d = fbOver24 (fbIn(src,m), cvt0565to8888(d)); + *dst = cvt8888to0565(d); + } + dst++; + } + } +} + +static void +_XftSmoothGlyphGray555 (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + CARD32 src, srca; + CARD32 r, g, b; + CARD32 d; + CARD16 *dstLine, *dst; + CARD8 *maskLine, *mask, m; + int dstStride, maskStride; + int width, height; + int w; + + srca = color->color.alpha >> 8; + + /* This handles only RGB and BGR */ + g = (color->color.green & 0xff00); + if (image->red_mask == 0xf800) + { + r = (color->color.red & 0xff00) << 8; + b = color->color.blue >> 8; + } + else + { + r = color->color.red >> 8; + b = (color->color.blue & 0xff00) << 8; + } + src = (srca << 24) | r | g | b; + + width = xftg->metrics.width; + height = xftg->metrics.height; + + x -= xftg->metrics.x; + y -= xftg->metrics.y; + + dstLine = (CARD16 *) (image->data + image->bytes_per_line * y + (x << 1)); + dstStride = image->bytes_per_line >> 1; + maskLine = (unsigned char *) xftg->bitmap; + maskStride = (width + 3) & ~3; + + while (height--) + { + dst = dstLine; + dstLine += dstStride; + mask = maskLine; + maskLine += maskStride; + w = width; + + while (w--) + { + m = *mask++; + if (m == 0xff) + { + if (srca == 0xff) + d = src; + else + { + d = *dst; + d = fbOver24 (src, cvt0555to8888(d)); + } + *dst = cvt8888to0555(d); + } + else if (m) + { + d = *dst; + d = fbOver24 (fbIn(src,m), cvt0555to8888(d)); + *dst = cvt8888to0555(d); + } + dst++; + } + } +} + +static void +_XftSmoothGlyphGray (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + CARD32 src, srca; + int r_shift, r_len; + int g_shift, g_len; + int b_shift, b_len; + CARD8 *maskLine, *mask, m; + int maskStride; + CARD32 d; + unsigned long pixel; + int width, height; + int w, tx; + + srca = color->color.alpha >> 8; + src = (srca << 24 | + (color->color.red & 0xff00) << 8 | + (color->color.green & 0xff00) | + (color->color.blue) >> 8); + x -= xftg->metrics.x; + y -= xftg->metrics.y; + width = xftg->metrics.width; + height = xftg->metrics.height; + + maskLine = (unsigned char *) xftg->bitmap; + maskStride = (width + 3) & ~3; + + _XftExamineBitfield (image->red_mask, &r_shift, &r_len); + _XftExamineBitfield (image->green_mask, &g_shift, &g_len); + _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); + while (height--) + { + mask = maskLine; + maskLine += maskStride; + w = width; + tx = x; + + while (w--) + { + m = *mask++; + if (m == 0xff) + { + if (srca == 0xff) + d = src; + else + { + pixel = XGetPixel (image, tx, y); + d = (_XftGetField (pixel, r_shift, r_len) << 16 | + _XftGetField (pixel, g_shift, g_len) << 8 | + _XftGetField (pixel, b_shift, b_len)); + d = fbOver24 (src, d); + } + pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | + _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | + _XftPutField ((d ) & 0xff, b_shift, b_len)); + XPutPixel (image, tx, y, pixel); + } + else if (m) + { + pixel = XGetPixel (image, tx, y); + d = (_XftGetField (pixel, r_shift, r_len) << 16 | + _XftGetField (pixel, g_shift, g_len) << 8 | + _XftGetField (pixel, b_shift, b_len)); + d = fbOver24 (fbIn(src,m), d); + pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | + _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | + _XftPutField ((d ) & 0xff, b_shift, b_len)); + XPutPixel (image, tx, y, pixel); + } + tx++; + } + y++; + } +} + +static void +_XftSmoothGlyphRgba (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color) +{ + CARD32 src, srca; + int r_shift, r_len; + int g_shift, g_len; + int b_shift, b_len; + CARD32 *mask, ma; + CARD32 d; + unsigned long pixel; + int width, height; + int w, tx; + + srca = color->color.alpha >> 8; + src = (srca << 24 | + (color->color.red & 0xff00) << 8 | + (color->color.green & 0xff00) | + (color->color.blue) >> 8); + x -= xftg->metrics.x; + y -= xftg->metrics.y; + width = xftg->metrics.width; + height = xftg->metrics.height; + + mask = (CARD32 *) xftg->bitmap; + + _XftExamineBitfield (image->red_mask, &r_shift, &r_len); + _XftExamineBitfield (image->green_mask, &g_shift, &g_len); + _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); + while (height--) + { + w = width; + tx = x; + + while (w--) + { + ma = *mask++; + if (ma == 0xffffffff) + { + if (srca == 0xff) + d = src; + else + { + pixel = XGetPixel (image, tx, y); + d = (_XftGetField (pixel, r_shift, r_len) << 16 | + _XftGetField (pixel, g_shift, g_len) << 8 | + _XftGetField (pixel, b_shift, b_len)); + d = fbOver24 (src, d); + } + pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | + _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | + _XftPutField ((d ) & 0xff, b_shift, b_len)); + XPutPixel (image, tx, y, pixel); + } + else if (ma) + { + CARD32 m,n,o; + pixel = XGetPixel (image, tx, y); + d = (_XftGetField (pixel, r_shift, r_len) << 16 | + _XftGetField (pixel, g_shift, g_len) << 8 | + _XftGetField (pixel, b_shift, b_len)); +#define XftInOverC(src,srca,msk,dst,i,result) { \ + CARD16 __a = XftGet8(msk,i); \ + CARD32 __t, __ta; \ + CARD32 __i; \ + __t = XftIntMult (XftGet8(src,i), __a,__i); \ + __ta = (CARD8) ~XftIntMult (srca, __a,__i); \ + __t = __t + XftIntMult(XftGet8(dst,i),__ta,__i); \ + __t = (CARD32) (CARD8) (__t | (-(__t >> 8))); \ + result = __t << (i); \ +} + XftInOverC(src,srca,ma,d,0,m); + XftInOverC(src,srca,ma,d,8,n); + XftInOverC(src,srca,ma,d,16,o); + d = m | n | o; + pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | + _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | + _XftPutField ((d ) & 0xff, b_shift, b_len)); + XPutPixel (image, tx, y, pixel); + } + tx++; + } + y++; + } +} + +static FcBool +_XftSmoothGlyphPossible (XftDraw *draw) +{ + if (!draw->visual) + return FcFalse; + if (draw->visual->class != TrueColor) + return FcFalse; + return FcTrue; +} + +typedef void (*XftSmoothGlyph) (XImage *image, + _Xconst XftGlyph *xftg, + int x, + int y, + _Xconst XftColor *color); + +static XftSmoothGlyph +_XftSmoothGlyphFind (XftDraw *draw, XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + + if (!font->info.antialias) + return _XftSmoothGlyphMono; + else switch (font->info.rgba) { + case FC_RGBA_RGB: + case FC_RGBA_BGR: + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: + return _XftSmoothGlyphRgba; + default: + switch (XftDrawBitsPerPixel (draw)) { + case 32: + if ((draw->visual->red_mask == 0xff0000 && + draw->visual->green_mask == 0x00ff00 && + draw->visual->blue_mask == 0x0000ff) || + (draw->visual->red_mask == 0x0000ff && + draw->visual->green_mask == 0x00ff00 && + draw->visual->blue_mask == 0xff0000)) + { + return _XftSmoothGlyphGray8888; + } + break; + case 16: + if ((draw->visual->red_mask == 0xf800 && + draw->visual->green_mask == 0x07e0 && + draw->visual->blue_mask == 0x001f) || + (draw->visual->red_mask == 0x001f && + draw->visual->green_mask == 0x07e0 && + draw->visual->blue_mask == 0xf800)) + { + return _XftSmoothGlyphGray565; + } + if ((draw->visual->red_mask == 0x7c00 && + draw->visual->green_mask == 0x03e0 && + draw->visual->blue_mask == 0x001f) || + (draw->visual->red_mask == 0x001f && + draw->visual->green_mask == 0x03e0 && + draw->visual->blue_mask == 0x7c00)) + { + return _XftSmoothGlyphGray555; + } + break; + default: + break; + } + return _XftSmoothGlyphGray; + } +} + +static XftGlyph * +_XftGlyphDefault (Display *dpy, XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + FT_UInt missing[XFT_NMISSING]; + int nmissing; + FcBool glyphs_loaded = FcFalse; + + if (XftFontCheckGlyph (dpy, public, FcTrue, 0, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, public, glyphs_loaded, missing, nmissing); + return font->glyphs[0]; +} + +static int XftGetImageErrorHandler (Display *dpy, XErrorEvent *error_event) +{ + return 0; +} + +_X_HIDDEN void +XftGlyphCore (XftDraw *draw, + _Xconst XftColor *color, + XftFont *public, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs) +{ + Display *dpy = draw->dpy; + XftFontInt *font = (XftFontInt *) public; + XftGlyph *xftg; + FT_UInt glyph; + _Xconst FT_UInt *g; + FT_UInt missing[XFT_NMISSING]; + FcBool glyphs_loaded; + int nmissing; + int n; + XErrorHandler prev_error; + + /* + * Load missing glyphs + */ + g = glyphs; + n = nglyphs; + nmissing = 0; + glyphs_loaded = FcFalse; + while (n--) + if (XftFontCheckGlyph (dpy, public, FcTrue, *g++, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); + + g = glyphs; + n = nglyphs; + if ((font->info.antialias || color->color.alpha != 0xffff) && + _XftSmoothGlyphPossible (draw)) + { + XGlyphInfo gi; + XImage *image; + unsigned int depth; + int ox, oy; + XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); + + XftGlyphExtents (dpy, public, glyphs, nglyphs, &gi); + if (!gi.width || !gi.height) + goto bail1; + ox = x - gi.x; + oy = y - gi.y; + /* + * Try to get bits directly from the drawable; if that fails, + * use a temporary pixmap. When it does fail, assume it + * will probably fail for a while and keep using temporary + * pixmaps for a while to avoid double round trips. + */ + if (draw->core.use_pixmap == 0) + { + prev_error = XSetErrorHandler (XftGetImageErrorHandler); + image = XGetImage (dpy, draw->drawable, + ox, oy, + gi.width, gi.height, AllPlanes, + ZPixmap); + XSetErrorHandler (prev_error); + if (!image) + draw->core.use_pixmap = XFT_ASSUME_PIXMAP; + } + else + { + draw->core.use_pixmap--; + image = NULL; + } + if (!image && (depth = XftDrawDepth (draw))) + { + Pixmap pix; + GC gc; + XGCValues gcv; + + pix = XCreatePixmap (dpy, draw->drawable, + gi.width, gi.height, depth); + gcv.graphics_exposures = False; + gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); + XCopyArea (dpy, draw->drawable, pix, gc, ox, oy, + gi.width, gi.height, 0, 0); + XFreeGC (dpy, gc); + image = XGetImage (dpy, pix, 0, 0, gi.width, gi.height, AllPlanes, + ZPixmap); + XFreePixmap (dpy, pix); + } + if (!image) + goto bail1; + image->red_mask = draw->visual->red_mask; + image->green_mask = draw->visual->green_mask; + image->blue_mask = draw->visual->blue_mask; + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + while (n--) + { + glyph = *g++; + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + { + (*smooth) (image, xftg, x - ox, y - oy, color); + x += xftg->metrics.xOff; + y += xftg->metrics.yOff; + } + } + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, ox, oy, + gi.width, gi.height); + XDestroyImage (image); + } + else + { + XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); + while (n--) + { + glyph = *g++; + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + { + (*sharp) (draw, xftg, x, y); + x += xftg->metrics.xOff; + y += xftg->metrics.yOff; + } + } + } +bail1: + if (glyphs_loaded) + _XftFontManageMemory (dpy, public); +} + +#define NUM_LOCAL 1024 + +_X_HIDDEN void +XftGlyphSpecCore (XftDraw *draw, + _Xconst XftColor *color, + XftFont *public, + _Xconst XftGlyphSpec *glyphs, + int nglyphs) +{ + Display *dpy = draw->dpy; + XftFontInt *font = (XftFontInt *) public; + XftGlyph *xftg; + FT_UInt missing[XFT_NMISSING]; + FcBool glyphs_loaded; + int nmissing; + int i; + XErrorHandler prev_error; + int x1, y1, x2, y2; + + /* + * Load missing glyphs + */ + glyphs_loaded = FcFalse; + x1 = y1 = x2 = y2 = 0; + for (i = 0; i < nglyphs; i++) + { + XGlyphInfo gi; + int g_x1, g_x2, g_y1, g_y2; + + nmissing = 0; + if (XftFontCheckGlyph (dpy, public, FcTrue, glyphs[i].glyph, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); + + XftGlyphExtents (dpy, public, &glyphs[i].glyph, 1, &gi); + g_x1 = glyphs[i].x - gi.x; + g_y1 = glyphs[i].y - gi.y; + g_x2 = g_x1 + gi.width; + g_y2 = g_y1 + gi.height; + if (i) + { + if (g_x1 < x1) + x1 = g_x1; + if (g_y1 < y1) + y1 = g_y1; + if (g_x2 > x2) + x2 = g_x2; + if (g_y2 > y2) + y2 = g_y2; + } + else + { + x1 = g_x1; + y1 = g_y1; + x2 = g_x2; + y2 = g_y2; + } + } + + if (x1 == x2 || y1 == y2) + goto bail1; + + if ((font->info.antialias || color->color.alpha != 0xffff) && + _XftSmoothGlyphPossible (draw)) + { + XImage *image; + unsigned int depth; + int width = x2 - x1, height = y2 - y1; + XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); + + /* + * Try to get bits directly from the drawable; if that fails, + * use a temporary pixmap. When it does fail, assume it + * will probably fail for a while and keep using temporary + * pixmaps for a while to avoid double round trips. + */ + if (draw->core.use_pixmap == 0) + { + prev_error = XSetErrorHandler (XftGetImageErrorHandler); + image = XGetImage (dpy, draw->drawable, + x1, y1, + width, height, AllPlanes, + ZPixmap); + XSetErrorHandler (prev_error); + if (!image) + draw->core.use_pixmap = XFT_ASSUME_PIXMAP; + } + else + { + draw->core.use_pixmap--; + image = NULL; + } + if (!image && (depth = XftDrawDepth (draw))) + { + Pixmap pix; + GC gc; + XGCValues gcv; + + pix = XCreatePixmap (dpy, draw->drawable, + width, height, depth); + gcv.graphics_exposures = False; + gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); + XCopyArea (dpy, draw->drawable, pix, gc, x1, y1, + width, height, 0, 0); + XFreeGC (dpy, gc); + image = XGetImage (dpy, pix, 0, 0, width, height, AllPlanes, + ZPixmap); + XFreePixmap (dpy, pix); + } + if (!image) + goto bail1; + image->red_mask = draw->visual->red_mask; + image->green_mask = draw->visual->green_mask; + image->blue_mask = draw->visual->blue_mask; + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + for (i = 0; i < nglyphs; i++) + { + FT_UInt glyph = glyphs[i].glyph; + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + { + (*smooth) (image, xftg, glyphs[i].x - x1, + glyphs[i].y - y1, color); + } + } + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, x1, y1, + width, height); + XDestroyImage (image); + } + else + { + XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); + for (i = 0; i < nglyphs; i++) + { + FT_UInt glyph = glyphs[i].glyph; + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + (*sharp) (draw, xftg, glyphs[i].x, glyphs[i].y); + } + } +bail1: + if (glyphs_loaded) + _XftFontManageMemory (dpy, public); +} + +_X_HIDDEN void +XftGlyphFontSpecCore (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftGlyphFontSpec *glyphs, + int nglyphs) +{ + Display *dpy = draw->dpy; + XftGlyph *xftg; + FT_UInt missing[XFT_NMISSING]; + FcBool glyphs_loaded; + int nmissing; + int i; + XErrorHandler prev_error; + int x1, y1, x2, y2; + + /* + * Load missing glyphs + */ + glyphs_loaded = FcFalse; + x1 = y1 = x2 = y2 = 0; + for (i = 0; i < nglyphs; i++) + { + XftFont *public = glyphs[i].font; + XGlyphInfo gi; + int g_x1, g_x2, g_y1, g_y2; + + nmissing = 0; + if (XftFontCheckGlyph (dpy, public, FcTrue, glyphs[i].glyph, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); + + XftGlyphExtents (dpy, public, &glyphs[i].glyph, 1, &gi); + g_x1 = glyphs[i].x - gi.x; + g_y1 = glyphs[i].y - gi.y; + g_x2 = g_x1 + gi.width; + g_y2 = g_y1 + gi.height; + if (i) + { + if (g_x1 < x1) + x1 = g_x1; + if (g_y1 < y1) + y1 = g_y1; + if (g_x2 > x2) + x2 = g_x2; + if (g_y2 > y2) + y2 = g_y2; + } + else + { + x1 = g_x1; + y1 = g_y1; + x2 = g_x2; + y2 = g_y2; + } + } + + if (x1 == x2 || y1 == y2) + goto bail1; + + for (i = 0; i < nglyphs; i++) + if (((XftFontInt *) glyphs[i].font)->info.antialias) + break; + + if ((i != nglyphs || color->color.alpha != 0xffff) && + _XftSmoothGlyphPossible (draw)) + { + XImage *image; + unsigned int depth; + int width = x2 - x1, height = y2 - y1; + + /* + * Try to get bits directly from the drawable; if that fails, + * use a temporary pixmap. When it does fail, assume it + * will probably fail for a while and keep using temporary + * pixmaps for a while to avoid double round trips. + */ + if (draw->core.use_pixmap == 0) + { + prev_error = XSetErrorHandler (XftGetImageErrorHandler); + image = XGetImage (dpy, draw->drawable, + x1, y1, + width, height, AllPlanes, + ZPixmap); + XSetErrorHandler (prev_error); + if (!image) + draw->core.use_pixmap = XFT_ASSUME_PIXMAP; + } + else + { + draw->core.use_pixmap--; + image = NULL; + } + if (!image && (depth = XftDrawDepth (draw))) + { + Pixmap pix; + GC gc; + XGCValues gcv; + + pix = XCreatePixmap (dpy, draw->drawable, + width, height, depth); + gcv.graphics_exposures = False; + gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); + XCopyArea (dpy, draw->drawable, pix, gc, x1, y1, + width, height, 0, 0); + XFreeGC (dpy, gc); + image = XGetImage (dpy, pix, 0, 0, width, height, AllPlanes, + ZPixmap); + XFreePixmap (dpy, pix); + } + if (!image) + goto bail1; + image->red_mask = draw->visual->red_mask; + image->green_mask = draw->visual->green_mask; + image->blue_mask = draw->visual->blue_mask; + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + for (i = 0; i < nglyphs; i++) + { + XftFont *public = glyphs[i].font; + XftFontInt *font = (XftFontInt *) public; + XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); + FT_UInt glyph = glyphs[i].glyph; + + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + { + (*smooth) (image, xftg, glyphs[i].x - x1, + glyphs[i].y - y1, color); + } + } + if (image->byte_order != XftNativeByteOrder ()) + XftSwapImage (image); + XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, x1, y1, + width, height); + XDestroyImage (image); + } + else + { + for (i = 0; i < nglyphs; i++) + { + XftFont *public = glyphs[i].font; + XftFontInt *font = (XftFontInt *) public; + XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); + FT_UInt glyph = glyphs[i].glyph; + + if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) + xftg = _XftGlyphDefault (dpy, public); + if (xftg) + (*sharp) (draw, xftg, glyphs[i].x, glyphs[i].y); + } + } +bail1: + if (glyphs_loaded) + for (i = 0; i < nglyphs; i++) + _XftFontManageMemory (dpy, glyphs[i].font); +} diff --git a/libXft/src/xftdbg.c b/libXft/src/xftdbg.c new file mode 100644 index 000000000..4c4b078d0 --- /dev/null +++ b/libXft/src/xftdbg.c @@ -0,0 +1,46 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN int +XftDebug (void) +{ + static int initialized; + static int debug; + + if (!initialized) + { + char *e; + + initialized = 1; + e = getenv ("XFT_DEBUG"); + if (e) + { + printf ("XFT_DEBUG=%s\n", e); + debug = atoi (e); + if (debug <= 0) + debug = 1; + } + } + return debug; +} diff --git a/libXft/src/xftdpy.c b/libXft/src/xftdpy.c new file mode 100644 index 000000000..055351586 --- /dev/null +++ b/libXft/src/xftdpy.c @@ -0,0 +1,552 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN XftDisplayInfo *_XftDisplayInfo; + +static int +_XftCloseDisplay (Display *dpy, XExtCodes *codes) +{ + XftDisplayInfo *info, **prev; + + info = _XftDisplayInfoGet (dpy, FcFalse); + if (!info) + return 0; + + /* + * Get rid of any dangling unreferenced fonts + */ + info->max_unref_fonts = 0; + XftFontManageMemory (dpy); + + /* + * Clean up the default values + */ + if (info->defaults) + FcPatternDestroy (info->defaults); + + /* + * Unhook from the global list + */ + for (prev = &_XftDisplayInfo; (info = *prev); prev = &(*prev)->next) + if (info->display == dpy) + break; + *prev = info->next; + + free (info); + return 0; +} + + +_X_HIDDEN XftDisplayInfo * +_XftDisplayInfoGet (Display *dpy, FcBool createIfNecessary) +{ + XftDisplayInfo *info, **prev; + XRenderPictFormat pf; + int i; + int event_base, error_base; + + for (prev = &_XftDisplayInfo; (info = *prev); prev = &(*prev)->next) + { + if (info->display == dpy) + { + /* + * MRU the list + */ + if (prev != &_XftDisplayInfo) + { + *prev = info->next; + info->next = _XftDisplayInfo; + _XftDisplayInfo = info; + } + return info; + } + } + if (!createIfNecessary) + return NULL; + + info = (XftDisplayInfo *) malloc (sizeof (XftDisplayInfo)); + if (!info) + goto bail0; + info->codes = XAddExtension (dpy); + if (!info->codes) + goto bail1; + (void) XESetCloseDisplay (dpy, info->codes->extension, _XftCloseDisplay); + + info->display = dpy; + info->defaults = NULL; + info->solidFormat = NULL; + info->hasRender = (XRenderQueryExtension (dpy, &event_base, &error_base) && + (XRenderFindVisualFormat (dpy, DefaultVisual (dpy, DefaultScreen (dpy))) != NULL)); + info->use_free_glyphs = FcTrue; + if (info->hasRender) + { + int major, minor; + XRenderQueryVersion (dpy, &major, &minor); + if (major < 0 || (major == 0 && minor <= 2)) + info->use_free_glyphs = FcFalse; + + pf.type = PictTypeDirect; + pf.depth = 32; + pf.direct.redMask = 0xff; + pf.direct.greenMask = 0xff; + pf.direct.blueMask = 0xff; + pf.direct.alphaMask = 0xff; + info->solidFormat = XRenderFindFormat (dpy, + (PictFormatType| + PictFormatDepth| + PictFormatRedMask| + PictFormatGreenMask| + PictFormatBlueMask| + PictFormatAlphaMask), + &pf, + 0); + } + if (XftDebug () & XFT_DBG_RENDER) + { + Visual *visual = DefaultVisual (dpy, DefaultScreen (dpy)); + XRenderPictFormat *format = XRenderFindVisualFormat (dpy, visual); + + printf ("XftDisplayInfoGet Default visual 0x%x ", + (int) visual->visualid); + if (format) + { + if (format->type == PictTypeDirect) + { + printf ("format %d,%d,%d,%d\n", + format->direct.alpha, + format->direct.red, + format->direct.green, + format->direct.blue); + } + else + { + printf ("format indexed\n"); + } + } + else + printf ("No Render format for default visual\n"); + + printf ("XftDisplayInfoGet initialized, hasRender set to \"%s\"\n", + info->hasRender ? "True" : "False"); + } + for (i = 0; i < XFT_NUM_SOLID_COLOR; i++) + { + info->colors[i].screen = -1; + info->colors[i].pict = 0; + } + info->fonts = NULL; + + info->next = _XftDisplayInfo; + _XftDisplayInfo = info; + + info->glyph_memory = NULL; + info->max_glyph_memory = XftDefaultGetInteger (dpy, + XFT_MAX_GLYPH_MEMORY, 0, + XFT_DPY_MAX_GLYPH_MEMORY); + if (XftDebug () & XFT_DBG_CACHE) + printf ("global max cache memory %ld\n", info->max_glyph_memory); + + + info->num_unref_fonts = 0; + info->max_unref_fonts = XftDefaultGetInteger (dpy, + XFT_MAX_UNREF_FONTS, 0, + XFT_DPY_MAX_UNREF_FONTS); + if (XftDebug() & XFT_DBG_CACHE) + printf ("global max unref fonts %d\n", info->max_unref_fonts); + + memset (info->fontHash, '\0', sizeof (XftFont *) * XFT_NUM_FONT_HASH); + return info; + +bail1: + free (info); +bail0: + if (XftDebug () & XFT_DBG_RENDER) + { + printf ("XftDisplayInfoGet failed to initialize, Xft unhappy\n"); + } + return NULL; +} + +/* + * Reduce memory usage in X server + */ + +static void +_XftDisplayValidateMemory (XftDisplayInfo *info) +{ + XftFont *public; + XftFontInt *font; + unsigned long glyph_memory; + + glyph_memory = 0; + for (public = info->fonts; public; public = font->next) + { + font = (XftFontInt *) public; + glyph_memory += font->glyph_memory; + } + if (glyph_memory != info->glyph_memory) + printf ("Display glyph cache incorrect has %ld bytes, should have %ld\n", + info->glyph_memory, glyph_memory); +} + +_X_HIDDEN void +_XftDisplayManageMemory (Display *dpy) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, False); + unsigned long glyph_memory; + XftFont *public; + XftFontInt *font; + + if (!info || !info->max_glyph_memory) + return; + if (XftDebug () & XFT_DBG_CACHE) + { + if (info->glyph_memory > info->max_glyph_memory) + printf ("Reduce global memory from %ld to %ld\n", + info->glyph_memory, info->max_glyph_memory); + _XftDisplayValidateMemory (info); + } + while (info->glyph_memory > info->max_glyph_memory) + { + glyph_memory = rand () % info->glyph_memory; + public = info->fonts; + while (public) + { + font = (XftFontInt *) public; + + if (font->glyph_memory > glyph_memory) + { + _XftFontUncacheGlyph (dpy, public); + break; + } + public = font->next; + glyph_memory -= font->glyph_memory; + } + } + if (XftDebug () & XFT_DBG_CACHE) + _XftDisplayValidateMemory (info); +} + +_X_EXPORT Bool +XftDefaultHasRender (Display *dpy) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + + if (!info) + return False; + return info->hasRender; +} + +_X_EXPORT Bool +XftDefaultSet (Display *dpy, FcPattern *defaults) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + + if (!info) + return False; + if (info->defaults) + FcPatternDestroy (info->defaults); + info->defaults = defaults; + if (!info->max_glyph_memory) + info->max_glyph_memory = XFT_DPY_MAX_GLYPH_MEMORY; + info->max_glyph_memory = XftDefaultGetInteger (dpy, + XFT_MAX_GLYPH_MEMORY, 0, + info->max_glyph_memory); + if (!info->max_unref_fonts) + info->max_unref_fonts = XFT_DPY_MAX_UNREF_FONTS; + info->max_unref_fonts = XftDefaultGetInteger (dpy, + XFT_MAX_UNREF_FONTS, 0, + info->max_unref_fonts); + return True; +} + +_X_HIDDEN int +XftDefaultParseBool (char *v) +{ + char c0, c1; + + c0 = *v; + if (isupper ((int)c0)) + c0 = tolower (c0); + if (c0 == 't' || c0 == 'y' || c0 == '1') + return 1; + if (c0 == 'f' || c0 == 'n' || c0 == '0') + return 0; + if (c0 == 'o') + { + c1 = v[1]; + if (isupper ((int)c1)) + c1 = tolower (c1); + if (c1 == 'n') + return 1; + if (c1 == 'f') + return 0; + } + return -1; +} + +static Bool +_XftDefaultInitBool (Display *dpy, FcPattern *pat, char *option) +{ + char *v; + int i; + + v = XGetDefault (dpy, "Xft", option); + if (v && (i = XftDefaultParseBool (v)) >= 0) + return FcPatternAddBool (pat, option, i != 0); + return True; +} + +static Bool +_XftDefaultInitDouble (Display *dpy, FcPattern *pat, char *option) +{ + char *v, *e; + double d; + + v = XGetDefault (dpy, "Xft", option); + if (v) + { + d = strtod (v, &e); + if (e != v) + return FcPatternAddDouble (pat, option, d); + } + return True; +} + +static Bool +_XftDefaultInitInteger (Display *dpy, FcPattern *pat, char *option) +{ + char *v, *e; + int i; + + v = XGetDefault (dpy, "Xft", option); + if (v) + { + if (FcNameConstant ((FcChar8 *) v, &i)) + return FcPatternAddInteger (pat, option, i); + i = strtol (v, &e, 0); + if (e != v) + return FcPatternAddInteger (pat, option, i); + } + return True; +} + +static FcPattern * +_XftDefaultInit (Display *dpy) +{ + FcPattern *pat; + + pat = FcPatternCreate (); + if (!pat) + goto bail0; + + if (!_XftDefaultInitDouble (dpy, pat, FC_SCALE)) + goto bail1; + if (!_XftDefaultInitDouble (dpy, pat, FC_DPI)) + goto bail1; + if (!_XftDefaultInitBool (dpy, pat, XFT_RENDER)) + goto bail1; + if (!_XftDefaultInitInteger (dpy, pat, FC_RGBA)) + goto bail1; + if (!_XftDefaultInitBool (dpy, pat, FC_ANTIALIAS)) + goto bail1; +#ifdef FC_EMBOLDEN + if (!_XftDefaultInitBool (dpy, pat, FC_EMBOLDEN)) + goto bail1; +#endif + if (!_XftDefaultInitBool (dpy, pat, FC_AUTOHINT)) + goto bail1; +#ifdef FC_HINT_STYLE + if (!_XftDefaultInitInteger (dpy, pat, FC_HINT_STYLE)) + goto bail1; +#endif + if (!_XftDefaultInitBool (dpy, pat, FC_HINTING)) + goto bail1; + if (!_XftDefaultInitBool (dpy, pat, FC_MINSPACE)) + goto bail1; + if (!_XftDefaultInitInteger (dpy, pat, XFT_MAX_GLYPH_MEMORY)) + goto bail1; + + return pat; + +bail1: + FcPatternDestroy (pat); +bail0: + return NULL; +} + +static FcResult +_XftDefaultGet (Display *dpy, const char *object, int screen, FcValue *v) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + FcResult r; + + if (!info) + return FcResultNoMatch; + + if (!info->defaults) + { + info->defaults = _XftDefaultInit (dpy); + if (!info->defaults) + return FcResultNoMatch; + } + r = FcPatternGet (info->defaults, object, screen, v); + if (r == FcResultNoId && screen > 0) + r = FcPatternGet (info->defaults, object, 0, v); + return r; +} + +_X_HIDDEN Bool +XftDefaultGetBool (Display *dpy, const char *object, int screen, Bool def) +{ + FcResult r; + FcValue v; + + r = _XftDefaultGet (dpy, object, screen, &v); + if (r != FcResultMatch || v.type != FcTypeBool) + return def; + return v.u.b; +} + +_X_HIDDEN int +XftDefaultGetInteger (Display *dpy, const char *object, int screen, int def) +{ + FcResult r; + FcValue v; + + r = _XftDefaultGet (dpy, object, screen, &v); + if (r != FcResultMatch || v.type != FcTypeInteger) + return def; + return v.u.i; +} + +_X_HIDDEN double +XftDefaultGetDouble (Display *dpy, const char *object, int screen, double def) +{ + FcResult r; + FcValue v; + + r = _XftDefaultGet (dpy, object, screen, &v); + if (r != FcResultMatch || v.type != FcTypeDouble) + return def; + return v.u.d; +} + +_X_EXPORT void +XftDefaultSubstitute (Display *dpy, int screen, FcPattern *pattern) +{ + FcValue v; + double dpi; + + if (FcPatternGet (pattern, XFT_RENDER, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, XFT_RENDER, + XftDefaultGetBool (dpy, XFT_RENDER, screen, + XftDefaultHasRender (dpy))); + } + if (FcPatternGet (pattern, FC_ANTIALIAS, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, FC_ANTIALIAS, + XftDefaultGetBool (dpy, FC_ANTIALIAS, screen, + True)); + } +#ifdef FC_EMBOLDEN + if (FcPatternGet (pattern, FC_EMBOLDEN, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, FC_EMBOLDEN, + XftDefaultGetBool (dpy, FC_EMBOLDEN, screen, + False)); + } +#endif + if (FcPatternGet (pattern, FC_HINTING, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, FC_HINTING, + XftDefaultGetBool (dpy, FC_HINTING, screen, + True)); + } +#ifdef FC_HINT_STYLE + if (FcPatternGet (pattern, FC_HINT_STYLE, 0, &v) == FcResultNoMatch) + { + FcPatternAddInteger (pattern, FC_HINT_STYLE, + XftDefaultGetInteger (dpy, FC_HINT_STYLE, screen, + FC_HINT_FULL)); + } +#endif + if (FcPatternGet (pattern, FC_AUTOHINT, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, FC_AUTOHINT, + XftDefaultGetBool (dpy, FC_AUTOHINT, screen, + False)); + } + if (FcPatternGet (pattern, FC_RGBA, 0, &v) == FcResultNoMatch) + { + int subpixel = FC_RGBA_UNKNOWN; +#if RENDER_MAJOR > 0 || RENDER_MINOR >= 6 + if (XftDefaultHasRender (dpy)) + { + int render_order = XRenderQuerySubpixelOrder (dpy, screen); + switch (render_order) { + default: + case SubPixelUnknown: subpixel = FC_RGBA_UNKNOWN; break; + case SubPixelHorizontalRGB: subpixel = FC_RGBA_RGB; break; + case SubPixelHorizontalBGR: subpixel = FC_RGBA_BGR; break; + case SubPixelVerticalRGB: subpixel = FC_RGBA_VRGB; break; + case SubPixelVerticalBGR: subpixel = FC_RGBA_VBGR; break; + case SubPixelNone: subpixel = FC_RGBA_NONE; break; + } + } +#endif + FcPatternAddInteger (pattern, FC_RGBA, + XftDefaultGetInteger (dpy, FC_RGBA, screen, + subpixel)); + } + if (FcPatternGet (pattern, FC_MINSPACE, 0, &v) == FcResultNoMatch) + { + FcPatternAddBool (pattern, FC_MINSPACE, + XftDefaultGetBool (dpy, FC_MINSPACE, screen, + False)); + } + if (FcPatternGet (pattern, FC_DPI, 0, &v) == FcResultNoMatch) + { + dpi = (((double) DisplayHeight (dpy, screen) * 25.4) / + (double) DisplayHeightMM (dpy, screen)); + FcPatternAddDouble (pattern, FC_DPI, + XftDefaultGetDouble (dpy, FC_DPI, screen, + dpi)); + } + if (FcPatternGet (pattern, FC_SCALE, 0, &v) == FcResultNoMatch) + { + FcPatternAddDouble (pattern, FC_SCALE, + XftDefaultGetDouble (dpy, FC_SCALE, screen, 1.0)); + } + if (FcPatternGet (pattern, XFT_MAX_GLYPH_MEMORY, 0, &v) == FcResultNoMatch) + { + FcPatternAddInteger (pattern, XFT_MAX_GLYPH_MEMORY, + XftDefaultGetInteger (dpy, XFT_MAX_GLYPH_MEMORY, + screen, + XFT_FONT_MAX_GLYPH_MEMORY)); + } + FcDefaultSubstitute (pattern); +} + diff --git a/libXft/src/xftdraw.c b/libXft/src/xftdraw.c new file mode 100644 index 000000000..ab5174973 --- /dev/null +++ b/libXft/src/xftdraw.c @@ -0,0 +1,994 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +/* + * Ok, this is a pain. To share source pictures across multiple destinations, + * the screen for each drawable must be discovered. + */ + +static int +_XftDrawScreen (Display *dpy, Drawable drawable, Visual *visual) +{ + int s; + Window root; + int x, y; + unsigned int width, height, borderWidth, depth; + /* Special case the most common environment */ + if (ScreenCount (dpy) == 1) + return 0; + /* + * If we've got a visual, look for the screen that points at it. + * This requires no round trip. + */ + if (visual) + { + for (s = 0; s < ScreenCount (dpy); s++) + { + XVisualInfo template, *ret; + int nret; + + template.visualid = visual->visualid; + template.screen = s; + ret = XGetVisualInfo (dpy, VisualIDMask|VisualScreenMask, + &template, &nret); + if (ret) + { + XFree (ret); + return s; + } + } + } + /* + * Otherwise, as the server for the drawable geometry and find + * the screen from the root window. + * This takes a round trip. + */ + if (XGetGeometry (dpy, drawable, &root, &x, &y, &width, &height, + &borderWidth, &depth)) + { + for (s = 0; s < ScreenCount (dpy); s++) + { + if (RootWindow (dpy, s) == root) + return s; + } + } + /* + * Make a guess -- it's probably wrong, but then the app probably + * handed us a bogus drawable in this case + */ + return 0; +} + +_X_HIDDEN unsigned int +XftDrawDepth (XftDraw *draw) +{ + if (!draw->depth) + { + Window root; + int x, y; + unsigned int width, height, borderWidth, depth; + if (XGetGeometry (draw->dpy, draw->drawable, + &root, &x, &y, &width, &height, + &borderWidth, &depth)) + draw->depth = depth; + } + return draw->depth; +} + +_X_HIDDEN unsigned int +XftDrawBitsPerPixel (XftDraw *draw) +{ + if (!draw->bits_per_pixel) + { + XPixmapFormatValues *formats; + int nformats; + unsigned int depth; + + if ((depth = XftDrawDepth (draw)) && + (formats = XListPixmapFormats (draw->dpy, &nformats))) + { + int i; + + for (i = 0; i < nformats; i++) + { + if (formats[i].depth == depth) + { + draw->bits_per_pixel = formats[i].bits_per_pixel; + break; + } + } + XFree (formats); + } + } + return draw->bits_per_pixel; +} + +_X_EXPORT XftDraw * +XftDrawCreate (Display *dpy, + Drawable drawable, + Visual *visual, + Colormap colormap) +{ + XftDraw *draw; + + draw = (XftDraw *) malloc (sizeof (XftDraw)); + if (!draw) + return NULL; + + draw->dpy = dpy; + draw->drawable = drawable; + draw->screen = _XftDrawScreen (dpy, drawable, visual); + draw->depth = 0; /* don't find out unless we need to know */ + draw->bits_per_pixel = 0; /* don't find out unless we need to know */ + draw->visual = visual; + draw->colormap = colormap; + draw->render.pict = 0; + draw->core.gc = NULL; + draw->core.use_pixmap = 0; + draw->clip_type = XftClipTypeNone; + draw->subwindow_mode = ClipByChildren; + XftMemAlloc (XFT_MEM_DRAW, sizeof (XftDraw)); + return draw; +} + +_X_EXPORT XftDraw * +XftDrawCreateBitmap (Display *dpy, + Pixmap bitmap) +{ + XftDraw *draw; + + draw = (XftDraw *) malloc (sizeof (XftDraw)); + if (!draw) + return NULL; + draw->dpy = dpy; + draw->drawable = (Drawable) bitmap; + draw->screen = _XftDrawScreen (dpy, bitmap, NULL); + draw->depth = 1; + draw->bits_per_pixel = 1; + draw->visual = NULL; + draw->colormap = 0; + draw->render.pict = 0; + draw->core.gc = NULL; + draw->core.use_pixmap = 0; + draw->clip_type = XftClipTypeNone; + draw->subwindow_mode = ClipByChildren; + XftMemAlloc (XFT_MEM_DRAW, sizeof (XftDraw)); + return draw; +} + +_X_EXPORT XftDraw * +XftDrawCreateAlpha (Display *dpy, + Pixmap pixmap, + int depth) +{ + XftDraw *draw; + + draw = (XftDraw *) malloc (sizeof (XftDraw)); + if (!draw) + return NULL; + draw->dpy = dpy; + draw->drawable = (Drawable) pixmap; + draw->screen = _XftDrawScreen (dpy, pixmap, NULL); + draw->depth = depth; + draw->bits_per_pixel = 0; /* don't find out until we need it */ + draw->visual = NULL; + draw->colormap = 0; + draw->render.pict = 0; + draw->core.gc = NULL; + draw->core.use_pixmap = 0; + draw->clip_type = XftClipTypeNone; + draw->subwindow_mode = ClipByChildren; + XftMemAlloc (XFT_MEM_DRAW, sizeof (XftDraw)); + return draw; +} + +static XRenderPictFormat * +_XftDrawFormat (XftDraw *draw) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (draw->dpy, True); + + if (!info || !info->hasRender) + return NULL; + + if (draw->visual == NULL) + { + XRenderPictFormat pf; + + pf.type = PictTypeDirect; + pf.depth = XftDrawDepth (draw); + pf.direct.alpha = 0; + pf.direct.alphaMask = (1 << pf.depth) - 1; + return XRenderFindFormat (draw->dpy, + (PictFormatType| + PictFormatDepth| + PictFormatAlpha| + PictFormatAlphaMask), + &pf, + 0); + } + else + return XRenderFindVisualFormat (draw->dpy, draw->visual); +} + +_X_EXPORT void +XftDrawChange (XftDraw *draw, + Drawable drawable) +{ + draw->drawable = drawable; + if (draw->render.pict) + { + XRenderFreePicture (draw->dpy, draw->render.pict); + draw->render.pict = 0; + } + if (draw->core.gc) + { + XFreeGC (draw->dpy, draw->core.gc); + draw->core.gc = NULL; + } +} + +_X_EXPORT Display * +XftDrawDisplay (XftDraw *draw) +{ + return draw->dpy; +} + +_X_EXPORT Drawable +XftDrawDrawable (XftDraw *draw) +{ + return draw->drawable; +} + +_X_EXPORT Colormap +XftDrawColormap (XftDraw *draw) +{ + return draw->colormap; +} + +_X_EXPORT Visual * +XftDrawVisual (XftDraw *draw) +{ + return draw->visual; +} + +_X_EXPORT void +XftDrawDestroy (XftDraw *draw) +{ + if (draw->render.pict) + XRenderFreePicture (draw->dpy, draw->render.pict); + if (draw->core.gc) + XFreeGC (draw->dpy, draw->core.gc); + switch (draw->clip_type) { + case XftClipTypeRegion: + XDestroyRegion (draw->clip.region); + break; + case XftClipTypeRectangles: + free (draw->clip.rect); + break; + case XftClipTypeNone: + break; + } + XftMemFree (XFT_MEM_DRAW, sizeof (XftDraw)); + free (draw); +} + +_X_EXPORT Picture +XftDrawSrcPicture (XftDraw *draw, _Xconst XftColor *color) +{ + Display *dpy = draw->dpy; + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + int i; + XftColor bitmapColor; + + if (!info) + return 0; + + /* + * Monochrome targets require special handling; the PictOp controls + * the color, and the color must be opaque + */ + if (!draw->visual && draw->depth == 1) + { + bitmapColor.color.alpha = 0xffff; + bitmapColor.color.red = 0xffff; + bitmapColor.color.green = 0xffff; + bitmapColor.color.blue = 0xffff; + color = &bitmapColor; + } + + /* + * See if there's one already available + */ + for (i = 0; i < XFT_NUM_SOLID_COLOR; i++) + { + if (info->colors[i].pict && + info->colors[i].screen == draw->screen && + !memcmp ((void *) &color->color, + (void *) &info->colors[i].color, + sizeof (XRenderColor))) + return info->colors[i].pict; + } + /* + * Pick one to replace at random + */ + i = (unsigned int) rand () % XFT_NUM_SOLID_COLOR; + /* + * Recreate if it was for the wrong screen + */ + if (info->colors[i].screen != draw->screen && info->colors[i].pict) + { + XRenderFreePicture (dpy, info->colors[i].pict); + info->colors[i].pict = 0; + } + /* + * Create picture if necessary + */ + if (!info->colors[i].pict) + { + Pixmap pix; + XRenderPictureAttributes pa; + + pix = XCreatePixmap (dpy, RootWindow (dpy, draw->screen), 1, 1, + info->solidFormat->depth); + pa.repeat = True; + info->colors[i].pict = XRenderCreatePicture (draw->dpy, + pix, + info->solidFormat, + CPRepeat, &pa); + XFreePixmap (dpy, pix); + } + /* + * Set to the new color + */ + info->colors[i].color = color->color; + info->colors[i].screen = draw->screen; + XRenderFillRectangle (dpy, PictOpSrc, + info->colors[i].pict, + &color->color, 0, 0, 1, 1); + return info->colors[i].pict; +} + +static int +_XftDrawOp (_Xconst XftDraw *draw, _Xconst XftColor *color) +{ + if (draw->visual || draw->depth != 1) + return PictOpOver; + if (color->color.alpha >= 0x8000) + return PictOpOver; + return PictOpOutReverse; +} + +static FcBool +_XftDrawRenderPrepare (XftDraw *draw) +{ + if (!draw->render.pict) + { + XRenderPictFormat *format; + XRenderPictureAttributes pa; + unsigned long mask = 0; + + format = _XftDrawFormat (draw); + if (!format) + return FcFalse; + + if (draw->subwindow_mode == IncludeInferiors) + { + pa.subwindow_mode = IncludeInferiors; + mask |= CPSubwindowMode; + } + draw->render.pict = XRenderCreatePicture (draw->dpy, draw->drawable, + format, mask, &pa); + if (!draw->render.pict) + return FcFalse; + switch (draw->clip_type) { + case XftClipTypeRegion: + XRenderSetPictureClipRegion (draw->dpy, draw->render.pict, + draw->clip.region); + break; + case XftClipTypeRectangles: + XRenderSetPictureClipRectangles (draw->dpy, draw->render.pict, + draw->clip.rect->xOrigin, + draw->clip.rect->yOrigin, + XftClipRects(draw->clip.rect), + draw->clip.rect->n); + break; + case XftClipTypeNone: + break; + } + } + return FcTrue; +} + +static FcBool +_XftDrawCorePrepare (XftDraw *draw, _Xconst XftColor *color) +{ + if (!draw->core.gc) + { + XGCValues gcv; + unsigned long mask = 0; + if (draw->subwindow_mode == IncludeInferiors) + { + gcv.subwindow_mode = IncludeInferiors; + mask |= GCSubwindowMode; + } + draw->core.gc = XCreateGC (draw->dpy, draw->drawable, mask, &gcv); + if (!draw->core.gc) + return FcFalse; + switch (draw->clip_type) { + case XftClipTypeRegion: + XSetRegion (draw->dpy, draw->core.gc, draw->clip.region); + break; + case XftClipTypeRectangles: + XSetClipRectangles (draw->dpy, draw->core.gc, + draw->clip.rect->xOrigin, + draw->clip.rect->yOrigin, + XftClipRects (draw->clip.rect), + draw->clip.rect->n, + Unsorted); + break; + case XftClipTypeNone: + break; + } + } + XSetForeground (draw->dpy, draw->core.gc, color->pixel); + return FcTrue; +} + +_X_EXPORT Picture +XftDrawPicture (XftDraw *draw) +{ + if (!_XftDrawRenderPrepare (draw)) + return 0; + return draw->render.pict; +} + +#define NUM_LOCAL 1024 + +_X_EXPORT void +XftDrawGlyphs (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs) +{ + XftFontInt *font = (XftFontInt *) pub; + + if (font->format) + { + Picture src; + + if (_XftDrawRenderPrepare (draw) && + (src = XftDrawSrcPicture (draw, color))) + XftGlyphRender (draw->dpy, _XftDrawOp (draw, color), + src, pub, draw->render.pict, + 0, 0, x, y, glyphs, nglyphs); + } + else + { + if (_XftDrawCorePrepare (draw, color)) + XftGlyphCore (draw, color, pub, x, y, glyphs, nglyphs); + } +} + +_X_EXPORT void +XftDrawString8 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (XftDebug () & XFT_DBG_DRAW) + printf ("DrawString \"%*.*s\"\n", len, len, string); + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (draw->dpy, pub, string[i]); + XftDrawGlyphs (draw, color, pub, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawString16 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar16 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (draw->dpy, pub, string[i]); + + XftDrawGlyphs (draw, color, pub, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawString32 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar32 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (draw->dpy, pub, string[i]); + + XftDrawGlyphs (draw, color, pub, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawStringUtf8 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf8ToUcs4 (string, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (draw->dpy, pub, ucs4); + string += l; + len -= l; + } + XftDrawGlyphs (draw, color, pub, x, y, glyphs, i); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawStringUtf16 (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf16ToUcs4 (string, endian, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (draw->dpy, pub, ucs4); + string += l; + len -= l; + } + XftDrawGlyphs (draw, color, pub, x, y, glyphs, i); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawGlyphSpec (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + _Xconst XftGlyphSpec *glyphs, + int len) +{ + XftFontInt *font = (XftFontInt *) pub; + + if (font->format) + { + Picture src; + + if (_XftDrawRenderPrepare (draw) && + (src = XftDrawSrcPicture (draw, color))) + { + XftGlyphSpecRender (draw->dpy, _XftDrawOp (draw, color), + src, pub, draw->render.pict, + 0, 0, glyphs, len); + } + } + else + { + if (_XftDrawCorePrepare (draw, color)) + XftGlyphSpecCore (draw, color, pub, glyphs, len); + } +} + +_X_EXPORT void +XftDrawGlyphFontSpec (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftGlyphFontSpec *glyphs, + int len) +{ + int i; + int start; + + i = 0; + while (i < len) + { + start = i; + if (((XftFontInt *) glyphs[i].font)->format) + { + Picture src; + while (i < len && ((XftFontInt *) glyphs[i].font)->format) + i++; + if (_XftDrawRenderPrepare (draw) && + (src = XftDrawSrcPicture (draw, color))) + { + XftGlyphFontSpecRender (draw->dpy, _XftDrawOp (draw, color), + src, draw->render.pict, + 0, 0, glyphs + start , i - start); + } + } + else + { + while (i < len && !((XftFontInt *) glyphs[i].font)->format) + i++; + if (_XftDrawCorePrepare (draw, color)) + XftGlyphFontSpecCore (draw, color, glyphs + start, i - start); + } + } +} + +_X_EXPORT void +XftDrawCharSpec (XftDraw *draw, + _Xconst XftColor *color, + XftFont *pub, + _Xconst XftCharSpec *chars, + int len) +{ + XftGlyphSpec *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (XftGlyphSpec)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + { + glyphs[i].glyph = XftCharIndex(draw->dpy, pub, chars[i].ucs4); + glyphs[i].x = chars[i].x; + glyphs[i].y = chars[i].y; + } + + XftDrawGlyphSpec (draw, color, pub, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawCharFontSpec (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftCharFontSpec *chars, + int len) +{ + XftGlyphFontSpec *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (XftGlyphFontSpec)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + { + glyphs[i].font = chars[i].font; + glyphs[i].glyph = XftCharIndex(draw->dpy, glyphs[i].font, chars[i].ucs4); + glyphs[i].x = chars[i].x; + glyphs[i].y = chars[i].y; + } + + XftDrawGlyphFontSpec (draw, color, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftDrawRect (XftDraw *draw, + _Xconst XftColor *color, + int x, + int y, + unsigned int width, + unsigned int height) +{ + if (_XftDrawRenderPrepare (draw)) + { + XRenderFillRectangle (draw->dpy, PictOpSrc, draw->render.pict, + &color->color, x, y, width, height); + } + else if (_XftDrawCorePrepare (draw, color)) + { + /* note: not XftRectCore() */ + XSetForeground (draw->dpy, draw->core.gc, color->pixel); + XFillRectangle (draw->dpy, draw->drawable, draw->core.gc, + x, y, width, height); + } +} + +_X_EXPORT Bool +XftDrawSetClip (XftDraw *draw, + Region r) +{ + Region n = NULL; + + /* + * Check for quick exits + */ + if (!r && draw->clip_type == XftClipTypeNone) + return True; + + if (r && + draw->clip_type == XftClipTypeRegion && + XEqualRegion (r, draw->clip.region)) + { + return True; + } + + /* + * Duplicate the region so future changes can be short circuited + */ + if (r) + { + n = XCreateRegion (); + if (n) + { + if (!XUnionRegion (n, r, n)) + { + XDestroyRegion (n); + return False; + } + } + } + + /* + * Destroy existing clip + */ + switch (draw->clip_type) { + case XftClipTypeRegion: + XDestroyRegion (draw->clip.region); + break; + case XftClipTypeRectangles: + free (draw->clip.rect); + break; + case XftClipTypeNone: + break; + } + + /* + * Set the clip + */ + if (n) + { + draw->clip_type = XftClipTypeRegion; + draw->clip.region = n; + } + else + { + draw->clip_type = XftClipTypeNone; + } + /* + * Apply new clip to existing objects + */ + if (draw->render.pict) + { + if (n) + XRenderSetPictureClipRegion (draw->dpy, draw->render.pict, n); + else + { + XRenderPictureAttributes pa; + pa.clip_mask = None; + XRenderChangePicture (draw->dpy, draw->render.pict, + CPClipMask, &pa); + } + } + if (draw->core.gc) + { + if (n) + XSetRegion (draw->dpy, draw->core.gc, draw->clip.region); + else + XSetClipMask (draw->dpy, draw->core.gc, None); + } + return True; +} + +_X_EXPORT Bool +XftDrawSetClipRectangles (XftDraw *draw, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n) +{ + XftClipRect *new = NULL; + + /* + * Check for quick exit + */ + if (draw->clip_type == XftClipTypeRectangles && + draw->clip.rect->n == n && + (n == 0 || (draw->clip.rect->xOrigin == xOrigin && + draw->clip.rect->yOrigin == yOrigin)) && + !memcmp (XftClipRects (draw->clip.rect), rects, n * sizeof (XRectangle))) + { + return True; + } + + /* + * Duplicate the region so future changes can be short circuited + */ + new = malloc (sizeof (XftClipRect) + n * sizeof (XRectangle)); + if (!new) + return False; + + new->n = n; + new->xOrigin = xOrigin; + new->yOrigin = yOrigin; + memcpy (XftClipRects (new), rects, n * sizeof (XRectangle)); + + /* + * Destroy existing clip + */ + switch (draw->clip_type) { + case XftClipTypeRegion: + XDestroyRegion (draw->clip.region); + break; + case XftClipTypeRectangles: + free (draw->clip.rect); + break; + case XftClipTypeNone: + break; + } + + /* + * Set the clip + */ + draw->clip_type = XftClipTypeRectangles; + draw->clip.rect = new; + /* + * Apply new clip to existing objects + */ + if (draw->render.pict) + { + XRenderSetPictureClipRectangles (draw->dpy, draw->render.pict, + new->xOrigin, + new->yOrigin, + XftClipRects(new), + new->n); + } + if (draw->core.gc) + { + XSetClipRectangles (draw->dpy, draw->core.gc, + new->xOrigin, + new->yOrigin, + XftClipRects (new), + new->n, + Unsorted); + } + return True; +} + +_X_EXPORT void +XftDrawSetSubwindowMode (XftDraw *draw, int mode) +{ + if (mode == draw->subwindow_mode) + return; + draw->subwindow_mode = mode; + if (draw->render.pict) + { + XRenderPictureAttributes pa; + + pa.subwindow_mode = mode; + XRenderChangePicture (draw->dpy, draw->render.pict, + CPSubwindowMode, &pa); + } + if (draw->core.gc) + XSetSubwindowMode (draw->dpy, draw->core.gc, mode); +} diff --git a/libXft/src/xftextent.c b/libXft/src/xftextent.c new file mode 100644 index 000000000..71f5c1c13 --- /dev/null +++ b/libXft/src/xftextent.c @@ -0,0 +1,285 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_EXPORT void +XftGlyphExtents (Display *dpy, + XftFont *pub, + _Xconst FT_UInt *glyphs, + int nglyphs, + XGlyphInfo *extents) +{ + XftFontInt *font = (XftFontInt *) pub; + FT_UInt missing[XFT_NMISSING]; + int nmissing; + int n; + _Xconst FT_UInt *g; + FT_UInt glyph; + XftGlyph *xftg; + FcBool glyphs_loaded; + int x, y; + int left, right, top, bottom; + int overall_left, overall_right; + int overall_top, overall_bottom; + + g = glyphs; + n = nglyphs; + nmissing = 0; + glyphs_loaded = FcFalse; + while (n--) + if (XftFontCheckGlyph (dpy, pub, FcFalse, *g++, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, pub, FcFalse, missing, nmissing); + g = glyphs; + n = nglyphs; + xftg = NULL; + while (n) + { + glyph = *g++; + n--; + if (glyph < font->num_glyphs && + (xftg = font->glyphs[glyph])) + break; + } + if (n == 0) + { + if (xftg) + *extents = xftg->metrics; + else + memset (extents, '\0', sizeof (*extents)); + } + else + { + x = 0; + y = 0; + overall_left = x - xftg->metrics.x; + overall_top = y - xftg->metrics.y; + overall_right = overall_left + (int) xftg->metrics.width; + overall_bottom = overall_top + (int) xftg->metrics.height; + x += xftg->metrics.xOff; + y += xftg->metrics.yOff; + while (n--) + { + glyph = *g++; + if (glyph < font->num_glyphs && (xftg = font->glyphs[glyph])) + { + left = x - xftg->metrics.x; + top = y - xftg->metrics.y; + right = left + (int) xftg->metrics.width; + bottom = top + (int) xftg->metrics.height; + if (left < overall_left) + overall_left = left; + if (top < overall_top) + overall_top = top; + if (right > overall_right) + overall_right = right; + if (bottom > overall_bottom) + overall_bottom = bottom; + x += xftg->metrics.xOff; + y += xftg->metrics.yOff; + } + } + extents->x = -overall_left; + extents->y = -overall_top; + extents->width = overall_right - overall_left; + extents->height = overall_bottom - overall_top; + extents->xOff = x; + extents->yOff = y; + } + if (glyphs_loaded) + _XftFontManageMemory (dpy, pub); +} + +#define NUM_LOCAL 1024 + +_X_EXPORT void +XftTextExtents8 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + { + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphExtents (dpy, pub, glyphs, len, extents); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextExtents16 (Display *dpy, + XftFont *pub, + _Xconst FcChar16 *string, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + { + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphExtents (dpy, pub, glyphs, len, extents); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextExtents32 (Display *dpy, + XftFont *pub, + _Xconst FcChar32 *string, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + { + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphExtents (dpy, pub, glyphs, len, extents); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextExtentsUtf8 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf8ToUcs4 (string, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } + XftGlyphExtents (dpy, pub, glyphs, i, extents); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextExtentsUtf16 (Display *dpy, + XftFont *pub, + _Xconst FcChar8 *string, + FcEndian endian, + int len, + XGlyphInfo *extents) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf16ToUcs4 (string, endian, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + memset (extents, '\0', sizeof (XGlyphInfo)); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } + XftGlyphExtents (dpy, pub, glyphs, i, extents); + if (glyphs != glyphs_local) + free (glyphs); +} diff --git a/libXft/src/xftfont.c b/libXft/src/xftfont.c new file mode 100644 index 000000000..70ab5d8bb --- /dev/null +++ b/libXft/src/xftfont.c @@ -0,0 +1,206 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_EXPORT FcPattern * +XftFontMatch (Display *dpy, + int screen, + _Xconst FcPattern *pattern, + FcResult *result) +{ + FcPattern *new; + FcPattern *match; + + if (!XftInit (NULL)) + return NULL; + + new = FcPatternDuplicate (pattern); + if (!new) + return NULL; + + if (XftDebug () & XFT_DBG_OPENV) + { + printf ("XftFontMatch pattern "); + FcPatternPrint (new); + } + FcConfigSubstitute (NULL, new, FcMatchPattern); + if (XftDebug () & XFT_DBG_OPENV) + { + printf ("XftFontMatch after FcConfig substitutions "); + FcPatternPrint (new); + } + XftDefaultSubstitute (dpy, screen, new); + if (XftDebug () & XFT_DBG_OPENV) + { + printf ("XftFontMatch after X resource substitutions "); + FcPatternPrint (new); + } + + match = FcFontMatch (NULL, new, result); + if (XftDebug () & XFT_DBG_OPENV) + { + printf ("XftFontMatch result "); + FcPatternPrint (match); + } + FcPatternDestroy (new); + return match; +} + +_X_EXPORT XftFont * +XftFontOpen (Display *dpy, int screen, ...) +{ + va_list va; + FcPattern *pat; + FcPattern *match; + FcResult result; + XftFont *font; + + va_start (va, screen); + pat = FcPatternVaBuild (NULL, va); + va_end (va); + if (!pat) + { + if (XftDebug () & XFT_DBG_OPEN) + printf ("XftFontOpen: Invalid pattern argument\n"); + return NULL; + } + match = XftFontMatch (dpy, screen, pat, &result); + if (XftDebug () & XFT_DBG_OPEN) + { + printf ("Pattern "); + FcPatternPrint (pat); + if (match) + { + printf ("Match "); + FcPatternPrint (match); + } + else + printf ("No Match\n"); + } + FcPatternDestroy (pat); + if (!match) + return NULL; + + font = XftFontOpenPattern (dpy, match); + if (!font) + { + if (XftDebug () & XFT_DBG_OPEN) + printf ("No Font\n"); + FcPatternDestroy (match); + } + + return font; +} + +_X_EXPORT XftFont * +XftFontOpenName (Display *dpy, int screen, const char *name) +{ + FcPattern *pat; + FcPattern *match; + FcResult result; + XftFont *font; + + pat = FcNameParse ((FcChar8 *) name); + if (XftDebug () & XFT_DBG_OPEN) + { + printf ("XftFontOpenName \"%s\": ", name); + if (pat) + FcPatternPrint (pat); + else + printf ("Invalid name\n"); + } + + if (!pat) + return NULL; + match = XftFontMatch (dpy, screen, pat, &result); + if (XftDebug () & XFT_DBG_OPEN) + { + if (match) + { + printf ("Match "); + FcPatternPrint (match); + } + else + printf ("No Match\n"); + } + FcPatternDestroy (pat); + if (!match) + return NULL; + + font = XftFontOpenPattern (dpy, match); + if (!font) + { + if (XftDebug () & XFT_DBG_OPEN) + printf ("No Font\n"); + FcPatternDestroy (match); + } + + return font; +} + +_X_EXPORT XftFont * +XftFontOpenXlfd (Display *dpy, int screen, const char *xlfd) +{ + FcPattern *pat; + FcPattern *match; + FcResult result; + XftFont *font; + + pat = XftXlfdParse (xlfd, FcFalse, FcFalse); + if (XftDebug () & XFT_DBG_OPEN) + { + printf ("XftFontOpenXlfd \"%s\": ", xlfd); + if (pat) + printf ("Invalid xlfd\n"); + else + FcPatternPrint (pat); + } + + if (!pat) + return NULL; + match = XftFontMatch (dpy, screen, pat, &result); + if (XftDebug () & XFT_DBG_OPEN) + { + if (match) + { + printf ("Match "); + FcPatternPrint (match); + } + else + printf ("No Match\n"); + } + FcPatternDestroy (pat); + if (!match) + return NULL; + + font = XftFontOpenPattern (dpy, match); + if (!font) + { + if (XftDebug () & XFT_DBG_OPEN) + printf ("No Font\n"); + FcPatternDestroy (match); + } + + return font; +} + diff --git a/libXft/src/xftfreetype.c b/libXft/src/xftfreetype.c new file mode 100644 index 000000000..7238b8259 --- /dev/null +++ b/libXft/src/xftfreetype.c @@ -0,0 +1,1174 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN FT_Library _XftFTlibrary; + +#define FT_Matrix_Equal(a,b) ((a)->xx == (b)->xx && \ + (a)->yy == (b)->yy && \ + (a)->xy == (b)->xy && \ + (a)->yx == (b)->yx) +/* + * List of all open files (each face in a file is managed separately) + */ + +static XftFtFile *_XftFtFiles; +static int XftMaxFreeTypeFiles = 5; + +static XftFtFile * +_XftGetFile (const FcChar8 *file, int id) +{ + XftFtFile *f; + + if (!XftInitFtLibrary ()) + return NULL; + + for (f = _XftFtFiles; f; f = f->next) + { + if (!strcmp (f->file, (char *) file) && f->id == id) + { + ++f->ref; + if (XftDebug () & XFT_DBG_REF) + printf ("FontFile %s/%d matches existing (%d)\n", + file, id, f->ref); + return f; + } + } + f = malloc (sizeof (XftFtFile) + strlen ((char *) file) + 1); + if (!f) + return NULL; + + XftMemAlloc (XFT_MEM_FILE, sizeof (XftFtFile) + strlen ((char *) file) + 1); + if (XftDebug () & XFT_DBG_REF) + printf ("FontFile %s/%d matches new\n", + file, id); + f->next = _XftFtFiles; + _XftFtFiles = f; + + f->ref = 1; + + f->file = (char *) (f+1); + strcpy (f->file, (char *) file); + f->id = id; + + f->lock = 0; + f->face = NULL; + f->xsize = 0; + f->ysize = 0; + f->matrix.xx = f->matrix.xy = f->matrix.yx = f->matrix.yy = 0; + return f; +} + +static XftFtFile * +_XftGetFaceFile (FT_Face face) +{ + XftFtFile *f; + + f = malloc (sizeof (XftFtFile)); + if (!f) + return NULL; + XftMemAlloc (XFT_MEM_FILE, sizeof(XftFtFile)); + f->next = NULL; + + f->ref = 1; + + f->file = NULL; + f->id = 0; + f->lock = 0; + f->face = face; + f->xsize = 0; + f->ysize = 0; + f->matrix.xx = f->matrix.xy = f->matrix.yx = f->matrix.yy = 0; + return f; +} + +static int +_XftNumFiles (void) +{ + XftFtFile *f; + int count = 0; + for (f = _XftFtFiles; f; f = f->next) + if (f->face && !f->lock) + ++count; + return count; +} + +static XftFtFile * +_XftNthFile (int n) +{ + XftFtFile *f; + int count = 0; + for (f = _XftFtFiles; f; f = f->next) + if (f->face && !f->lock) + if (count++ == n) + break; + return f; +} + +static void +_XftUncacheFiles (void) +{ + int n; + XftFtFile *f; + while ((n = _XftNumFiles ()) > XftMaxFreeTypeFiles) + { + f = _XftNthFile (rand () % n); + if (f) + { + if (XftDebug() & XFT_DBG_REF) + printf ("Discard file %s/%d from cache\n", + f->file, f->id); + FT_Done_Face (f->face); + f->face = NULL; + } + } +} + +static FT_Face +_XftLockFile (XftFtFile *f) +{ + ++f->lock; + if (!f->face) + { + if (XftDebug() & XFT_DBG_REF) + printf ("Loading file %s/%d\n", f->file, f->id); + if (FT_New_Face (_XftFTlibrary, f->file, f->id, &f->face)) + --f->lock; + + f->xsize = 0; + f->ysize = 0; + f->matrix.xx = f->matrix.xy = f->matrix.yx = f->matrix.yy = 0; + _XftUncacheFiles (); + } + return f->face; +} + +static void +_XftLockError (char *reason) +{ + fprintf (stderr, "Xft: locking error %s\n", reason); +} + +static void +_XftUnlockFile (XftFtFile *f) +{ + if (--f->lock < 0) + _XftLockError ("too many file unlocks"); +} + +#if HAVE_FT_BITMAP_SIZE_Y_PPEM +#define X_SIZE(face,i) ((face)->available_sizes[i].x_ppem) +#define Y_SIZE(face,i) ((face)->available_sizes[i].y_ppem) +#else +#define X_SIZE(face,i) ((face)->available_sizes[i].width << 6) +#define Y_SIZE(face,i) ((face)->available_sizes[i].height << 6) +#endif + +_X_HIDDEN FcBool +_XftSetFace (XftFtFile *f, FT_F26Dot6 xsize, FT_F26Dot6 ysize, FT_Matrix *matrix) +{ + FT_Face face = f->face; + + if (f->xsize != xsize || f->ysize != ysize) + { + if (XftDebug() & XFT_DBG_GLYPH) + printf ("Set face size to %dx%d (%dx%d)\n", + (int) (xsize >> 6), (int) (ysize >> 6), (int) xsize, (int) ysize); + /* + * Bitmap only faces must match exactly, so find the closest + * one (height dominant search) + */ + if (!(face->face_flags & FT_FACE_FLAG_SCALABLE)) + { + int i, best = 0; + +#define xft_abs(a) ((a) < 0 ? -(a) : (a)) +#define dist(a,b) (xft_abs((a)-(b))) + + for (i = 1; i < face->num_fixed_sizes; i++) + { + if (dist (ysize, Y_SIZE(face,i)) < + dist (ysize, Y_SIZE(face, best)) || + (dist (ysize, Y_SIZE(face, i)) == + dist (ysize, Y_SIZE(face, best)) && + dist (xsize, X_SIZE(face, i)) < + dist (xsize, X_SIZE(face, best)))) + { + best = i; + } + } + /* + * Freetype 2.1.7 and earlier used width/height + * for matching sizes in the BDF and PCF loaders. + * This has been fixed for 2.1.8. Because BDF and PCF + * files have but a single strike per file, we can + * simply try both sizes. + */ + if ( +#if HAVE_FT_BITMAP_SIZE_Y_PPEM + FT_Set_Char_Size (face, face->available_sizes[best].x_ppem, + face->available_sizes[best].y_ppem, 0, 0) != 0 + && +#endif + FT_Set_Char_Size (face, face->available_sizes[best].width << 6, + face->available_sizes[best].height << 6, + 0, 0) != 0) + { + return False; + } + } + else + { + if (FT_Set_Char_Size (face, xsize, ysize, 0, 0)) + { + return False; + } + } + f->xsize = xsize; + f->ysize = ysize; + } + if (!FT_Matrix_Equal (&f->matrix, matrix)) + { + if (XftDebug() & XFT_DBG_GLYPH) + printf ("Set face matrix to (%g,%g,%g,%g)\n", + (double) matrix->xx / 0x10000, + (double) matrix->xy / 0x10000, + (double) matrix->yx / 0x10000, + (double) matrix->yy / 0x10000); + FT_Set_Transform (face, matrix, NULL); + f->matrix = *matrix; + } + return True; +} + +static void +_XftReleaseFile (XftFtFile *f) +{ + XftFtFile **prev; + + if (--f->ref != 0) + return; + if (f->lock) + _XftLockError ("Attempt to close locked file"); + if (f->file) + { + for (prev = &_XftFtFiles; *prev; prev = &(*prev)->next) + { + if (*prev == f) + { + *prev = f->next; + break; + } + } + if (f->face) + FT_Done_Face (f->face); + } + XftMemFree (XFT_MEM_FILE, + sizeof (XftFtFile) + (f->file ? strlen (f->file) + 1 : 0)); + free (f); +} + +/* + * Find a prime larger than the minimum reasonable hash size + */ + +static FcChar32 +_XftSqrt (FcChar32 a) +{ + FcChar32 l, h, m; + + l = 2; + h = a/2; + while ((h-l) > 1) + { + m = (h+l) >> 1; + if (m * m < a) + l = m; + else + h = m; + } + return h; +} + +static FcBool +_XftIsPrime (FcChar32 i) +{ + FcChar32 l, t; + + if (i < 2) + return FcFalse; + if ((i & 1) == 0) + { + if (i == 2) + return FcTrue; + return FcFalse; + } + l = _XftSqrt (i) + 1; + for (t = 3; t <= l; t += 2) + if (i % t == 0) + return FcFalse; + return FcTrue; +} + +static FcChar32 +_XftHashSize (FcChar32 num_unicode) +{ + /* at least 31.25 % extra space */ + FcChar32 hash = num_unicode + (num_unicode >> 2) + (num_unicode >> 4); + + if ((hash & 1) == 0) + hash++; + while (!_XftIsPrime (hash)) + hash += 2; + return hash; +} + +_X_EXPORT FT_Face +XftLockFace (XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + XftFontInfo *fi = &font->info; + FT_Face face; + + face = _XftLockFile (fi->file); + /* + * Make sure the face is usable at the requested size + */ + if (face && !_XftSetFace (fi->file, fi->xsize, fi->ysize, &fi->matrix)) + { + _XftUnlockFile (fi->file); + face = NULL; + } + return face; +} + +_X_EXPORT void +XftUnlockFace (XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + _XftUnlockFile (font->info.file); +} + +static FcBool +XftFontInfoFill (Display *dpy, _Xconst FcPattern *pattern, XftFontInfo *fi) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + FcChar8 *filename; + int id; + double dsize; + double aspect; + FcMatrix *font_matrix; + FcBool hinting, vertical_layout, autohint, global_advance; +#ifdef FC_HINT_STYLE + int hint_style; +#endif + FcChar32 hash, *hashp; + FT_Face face; + int nhash; + FcBool bitmap; + + if (!info) + return FcFalse; + + /* + * Initialize the whole XftFontInfo so that padding doesn't interfere with + * hash or XftFontInfoEqual(). + */ + + memset (fi, '\0', sizeof(*fi)); + + /* + * Find the associated file + */ + switch (FcPatternGetString (pattern, FC_FILE, 0, &filename)) { + case FcResultNoMatch: + filename = NULL; + break; + case FcResultMatch: + break; + default: + goto bail0; + } + + switch (FcPatternGetInteger (pattern, FC_INDEX, 0, &id)) { + case FcResultNoMatch: + id = 0; + break; + case FcResultMatch: + break; + default: + goto bail0; + } + + if (filename) + fi->file = _XftGetFile (filename, id); + else if (FcPatternGetFTFace (pattern, FC_FT_FACE, 0, &face) == FcResultMatch + && face) + fi->file = _XftGetFaceFile (face); + if (!fi->file) + goto bail0; + + /* + * Compute pixel size + */ + if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &dsize) != FcResultMatch) + goto bail1; + + if (FcPatternGetDouble (pattern, FC_ASPECT, 0, &aspect) != FcResultMatch) + aspect = 1.0; + + fi->ysize = (FT_F26Dot6) (dsize * 64.0); + fi->xsize = (FT_F26Dot6) (dsize * aspect * 64.0); + + if (XftDebug() & XFT_DBG_OPEN) + printf ("XftFontInfoFill: %s: %d (%g pixels)\n", + (filename ? filename : (FcChar8 *) "<none>"), id, dsize); + /* + * Get antialias value + */ + switch (FcPatternGetBool (pattern, FC_ANTIALIAS, 0, &fi->antialias)) { + case FcResultNoMatch: + fi->antialias = True; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + /* + * Get rgba value + */ + switch (FcPatternGetInteger (pattern, FC_RGBA, 0, &fi->rgba)) { + case FcResultNoMatch: + fi->rgba = FC_RGBA_UNKNOWN; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + /* + * Get matrix and transform values + */ + switch (FcPatternGetMatrix (pattern, FC_MATRIX, 0, &font_matrix)) { + case FcResultNoMatch: + fi->matrix.xx = fi->matrix.yy = 0x10000; + fi->matrix.xy = fi->matrix.yx = 0; + break; + case FcResultMatch: + fi->matrix.xx = 0x10000L * font_matrix->xx; + fi->matrix.yy = 0x10000L * font_matrix->yy; + fi->matrix.xy = 0x10000L * font_matrix->xy; + fi->matrix.yx = 0x10000L * font_matrix->yx; + break; + default: + goto bail1; + } + + fi->transform = (fi->matrix.xx != 0x10000 || fi->matrix.xy != 0 || + fi->matrix.yx != 0 || fi->matrix.yy != 0x10000); + + /* + * Get render value, set to false if no Render extension present + */ + if (info->hasRender) + { + switch (FcPatternGetBool (pattern, XFT_RENDER, 0, &fi->render)) { + case FcResultNoMatch: + fi->render = info->hasRender; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + } + else + fi->render = FcFalse; + + /* + * Compute glyph load flags + */ + fi->load_flags = FT_LOAD_DEFAULT; + +#ifndef XFT_EMBEDDED_BITMAP +#define XFT_EMBEDDED_BITMAP "embeddedbitmap" +#endif + + switch (FcPatternGetBool (pattern, XFT_EMBEDDED_BITMAP, 0, &bitmap)) { + case FcResultNoMatch: + bitmap = FcFalse; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + /* disable bitmaps when anti-aliasing or transforming glyphs */ + if ((!bitmap && fi->antialias) || fi->transform) + fi->load_flags |= FT_LOAD_NO_BITMAP; + + /* disable hinting if requested */ + switch (FcPatternGetBool (pattern, FC_HINTING, 0, &hinting)) { + case FcResultNoMatch: + hinting = FcTrue; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + +#ifdef FC_EMBOLDEN + switch (FcPatternGetBool (pattern, FC_EMBOLDEN, 0, &fi->embolden)) { + case FcResultNoMatch: + fi->embolden = FcFalse; + break; + case FcResultMatch: + break; + default: + goto bail1; + } +#else + fi->embolden = FcFalse; +#endif + +#ifdef FC_HINT_STYLE + switch (FcPatternGetInteger (pattern, FC_HINT_STYLE, 0, &hint_style)) { + case FcResultNoMatch: + hint_style = FC_HINT_FULL; + break; + case FcResultMatch: + break; + default: + goto bail1; + } +#endif + + if (!hinting +#ifdef FC_HINT_STYLE + || hint_style == FC_HINT_NONE +#endif + ) + { + fi->load_flags |= FT_LOAD_NO_HINTING; + } + + /* Figure out the load target, which modifies the hinting + * behavior of FreeType based on the intended use of the glyphs. + */ + if (fi->antialias) + { +#ifdef FC_HINT_STYLE +#ifdef FT_LOAD_TARGET_LIGHT + if (FC_HINT_NONE < hint_style && hint_style < FC_HINT_FULL) + { + fi->load_flags |= FT_LOAD_TARGET_LIGHT; + } + else +#endif +#endif + { + /* autohinter will snap stems to integer widths, when + * the LCD targets are used. + */ + switch (fi->rgba) { + case FC_RGBA_RGB: + case FC_RGBA_BGR: +#ifdef FT_LOAD_TARGET_LCD + fi->load_flags |= FT_LOAD_TARGET_LCD; +#endif + break; + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: +#ifdef FT_LOAD_TARGET_LCD_V + fi->load_flags |= FT_LOAD_TARGET_LCD_V; +#endif + break; + } + } + } +#ifdef FT_LOAD_TARGET_MONO + else + fi->load_flags |= FT_LOAD_TARGET_MONO; +#endif + + /* set vertical layout if requested */ + switch (FcPatternGetBool (pattern, FC_VERTICAL_LAYOUT, 0, &vertical_layout)) { + case FcResultNoMatch: + vertical_layout = FcFalse; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + if (vertical_layout) + fi->load_flags |= FT_LOAD_VERTICAL_LAYOUT; + + /* force autohinting if requested */ + switch (FcPatternGetBool (pattern, FC_AUTOHINT, 0, &autohint)) { + case FcResultNoMatch: + autohint = FcFalse; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + if (autohint) + fi->load_flags |= FT_LOAD_FORCE_AUTOHINT; + + /* disable global advance width (for broken DynaLab TT CJK fonts) */ + switch (FcPatternGetBool (pattern, FC_GLOBAL_ADVANCE, 0, &global_advance)) { + case FcResultNoMatch: + global_advance = FcTrue; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + if (!global_advance) + fi->load_flags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; + + /* + * Get requested spacing value + */ + switch (FcPatternGetInteger (pattern, FC_SPACING, 0, &fi->spacing)) { + case FcResultNoMatch: + fi->spacing = FC_PROPORTIONAL; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + + /* + * Check for minspace + */ + + switch (FcPatternGetBool (pattern, FC_MINSPACE, 0, &fi->minspace)) { + case FcResultNoMatch: + fi->minspace = FcFalse; + break; + case FcResultMatch: + break; + default: + goto bail1; + } + /* + * Check for fixed pixel spacing + */ + switch (FcPatternGetInteger (pattern, FC_CHAR_WIDTH, 0, &fi->char_width)) { + case FcResultNoMatch: + fi->char_width = 0; + break; + case FcResultMatch: + if (fi->char_width) + fi->spacing = FC_MONO; + break; + default: + goto bail1; + } + + /* + * Step over hash value in the structure + */ + hash = 0; + hashp = (FcChar32 *) fi + 1; + nhash = (sizeof (XftFontInfo) / sizeof (FcChar32)) - 1; + + while (nhash--) + hash += *hashp++; + fi->hash = hash; + + /* + * All done + */ + return FcTrue; + +bail1: + _XftReleaseFile (fi->file); + fi->file = NULL; +bail0: + return FcFalse; +} + +static void +XftFontInfoEmpty (Display *dpy, XftFontInfo *fi) +{ + if (fi->file) + _XftReleaseFile (fi->file); +} + +XftFontInfo * +XftFontInfoCreate (Display *dpy, _Xconst FcPattern *pattern) +{ + XftFontInfo *fi = malloc (sizeof (XftFontInfo)); + + if (!fi) + return NULL; + + if (!XftFontInfoFill (dpy, pattern, fi)) + { + free (fi); + fi = NULL; + } + XftMemAlloc (XFT_MEM_FONT, sizeof (XftFontInfo)); + return fi; +} + +_X_EXPORT void +XftFontInfoDestroy (Display *dpy, XftFontInfo *fi) +{ + XftFontInfoEmpty (dpy, fi); + XftMemFree (XFT_MEM_FONT, sizeof (XftFontInfo)); + free (fi); +} + +_X_EXPORT FcChar32 +XftFontInfoHash (_Xconst XftFontInfo *fi) +{ + return fi->hash; +} + +_X_EXPORT FcBool +XftFontInfoEqual (_Xconst XftFontInfo *a, _Xconst XftFontInfo *b) +{ + return memcmp ((void *) a, (void *) b, sizeof (XftFontInfo)) == 0; +} + +_X_EXPORT XftFont * +XftFontOpenInfo (Display *dpy, + FcPattern *pattern, + XftFontInfo *fi) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + FT_Face face; + XftFont **bucket; + XftFontInt *font; + XRenderPictFormat *format; + FcCharSet *charset; + FcChar32 num_unicode; + FcChar32 hash_value; + FcChar32 rehash_value; + FcBool antialias; + int max_glyph_memory; + int alloc_size; + int ascent, descent, height; + int i; + int num_glyphs; + + if (!info) + return NULL; + /* + * Find a matching previously opened font + */ + bucket = &info->fontHash[fi->hash % XFT_NUM_FONT_HASH]; + for (font = (XftFontInt *) *bucket; font; font = (XftFontInt *) font->hash_next) + if (XftFontInfoEqual (&font->info, fi)) + { + if (!font->ref++) + --info->num_unref_fonts; + FcPatternDestroy (pattern); + return &font->public; + } + + /* + * No existing font, create another. + */ + + if (XftDebug () & XFT_DBG_CACHE) + printf ("New font %s/%d size %dx%d\n", + fi->file->file, fi->file->id, + (int) fi->xsize >> 6, (int) fi->ysize >> 6); + + if (FcPatternGetInteger (pattern, XFT_MAX_GLYPH_MEMORY, 0, + &max_glyph_memory) != FcResultMatch) + max_glyph_memory = XFT_FONT_MAX_GLYPH_MEMORY; + + face = _XftLockFile (fi->file); + if (!face) + goto bail0; + + if (!_XftSetFace (fi->file, fi->xsize, fi->ysize, &fi->matrix)) + goto bail1; + + /* + * Get the set of Unicode codepoints covered by the font. + * If the incoming pattern doesn't provide this data, go + * off and compute it. Yes, this is expensive, but it's + * required to map Unicode to glyph indices. + */ + if (FcPatternGetCharSet (pattern, FC_CHARSET, 0, &charset) == FcResultMatch) + charset = FcCharSetCopy (charset); + else + charset = FcFreeTypeCharSet (face, FcConfigGetBlanks (NULL)); + + antialias = fi->antialias; + if (!(face->face_flags & FT_FACE_FLAG_SCALABLE)) + antialias = FcFalse; + + /* + * Find the appropriate picture format + */ + if (fi->render) + { + if (antialias) + { + switch (fi->rgba) { + case FC_RGBA_RGB: + case FC_RGBA_BGR: + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: + format = XRenderFindStandardFormat (dpy, PictStandardARGB32); + break; + default: + format = XRenderFindStandardFormat (dpy, PictStandardA8); + break; + } + } + else + { + format = XRenderFindStandardFormat (dpy, PictStandardA1); + } + + if (!format) + goto bail2; + } + else + format = NULL; + + if (charset) + { + num_unicode = FcCharSetCount (charset); + hash_value = _XftHashSize (num_unicode); + rehash_value = hash_value - 2; + } + else + { + num_unicode = 0; + hash_value = 0; + rehash_value = 0; + } + + /* + * Sometimes the glyphs are numbered 1..n, other times 0..n-1, + * accept either numbering scheme by making room in the table + */ + num_glyphs = face->num_glyphs + 1; + alloc_size = (sizeof (XftFontInt) + + num_glyphs * sizeof (XftGlyph *) + + hash_value * sizeof (XftUcsHash)); + font = malloc (alloc_size); + + if (!font) + goto bail2; + + XftMemAlloc (XFT_MEM_FONT, alloc_size); + + /* + * Public fields + */ + if (fi->transform) + { + FT_Vector vector; + + vector.x = 0; + vector.y = face->size->metrics.descender; + FT_Vector_Transform (&vector, &fi->matrix); + descent = -(vector.y >> 6); + + vector.x = 0; + vector.y = face->size->metrics.ascender; + FT_Vector_Transform (&vector, &fi->matrix); + ascent = vector.y >> 6; + + if (fi->minspace) + height = ascent + descent; + else + { + vector.x = 0; + vector.y = face->size->metrics.height; + FT_Vector_Transform (&vector, &fi->matrix); + height = vector.y >> 6; + } + } + else + { + descent = -(face->size->metrics.descender >> 6); + ascent = face->size->metrics.ascender >> 6; + if (fi->minspace) + height = ascent + descent; + else + height = face->size->metrics.height >> 6; + } + font->public.ascent = ascent; + font->public.descent = descent; + font->public.height = height; + + if (fi->char_width) + font->public.max_advance_width = fi->char_width; + else + { + if (fi->transform) + { + FT_Vector vector; + vector.x = face->size->metrics.max_advance; + vector.y = 0; + FT_Vector_Transform (&vector, &fi->matrix); + font->public.max_advance_width = vector.x >> 6; + } + else + font->public.max_advance_width = face->size->metrics.max_advance >> 6; + } + font->public.charset = charset; + font->public.pattern = pattern; + + /* + * Management fields + */ + font->ref = 1; + + font->next = info->fonts; + info->fonts = &font->public; + + font->hash_next = *bucket; + *bucket = &font->public; + + /* + * Copy the info over + */ + font->info = *fi; + /* + * reset the antialias field. It can't + * be set correctly until the font is opened, + * which doesn't happen in XftFontInfoFill + */ + font->info.antialias = antialias; + /* + * bump XftFile reference count + */ + font->info.file->ref++; + + /* + * Per glyph information + */ + font->glyphs = (XftGlyph **) (font + 1); + memset (font->glyphs, '\0', num_glyphs * sizeof (XftGlyph *)); + font->num_glyphs = num_glyphs; + /* + * Unicode hash table information + */ + font->hash_table = (XftUcsHash *) (font->glyphs + font->num_glyphs); + for (i = 0; i < hash_value; i++) + { + font->hash_table[i].ucs4 = ((FcChar32) ~0); + font->hash_table[i].glyph = 0; + } + font->hash_value = hash_value; + font->rehash_value = rehash_value; + /* + * X specific fields + */ + font->glyphset = 0; + font->format = format; + + /* + * Glyph memory management fields + */ + font->glyph_memory = 0; + font->max_glyph_memory = max_glyph_memory; + font->use_free_glyphs = info->use_free_glyphs; + + _XftUnlockFile (fi->file); + + return &font->public; + +bail2: + FcCharSetDestroy (charset); +bail1: + _XftUnlockFile (fi->file); +bail0: + return NULL; +} + +_X_EXPORT XftFont * +XftFontOpenPattern (Display *dpy, FcPattern *pattern) +{ + XftFontInfo info; + XftFont *font; + + if (!XftFontInfoFill (dpy, pattern, &info)) + return NULL; + + font = XftFontOpenInfo (dpy, pattern, &info); + XftFontInfoEmpty (dpy, &info); + return font; +} + +_X_EXPORT XftFont * +XftFontCopy (Display *dpy, XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + + font->ref++; + return public; +} + +static void +XftFontDestroy (Display *dpy, XftFont *public) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, False); + XftFontInt *font = (XftFontInt *) public; + int i; + + /* note reduction in memory use */ + if (info) + info->glyph_memory -= font->glyph_memory; + /* Clean up the info */ + XftFontInfoEmpty (dpy, &font->info); + /* Free the glyphset */ + if (font->glyphset) + XRenderFreeGlyphSet (dpy, font->glyphset); + /* Free the glyphs */ + for (i = 0; i < font->num_glyphs; i++) + { + XftGlyph *xftg = font->glyphs[i]; + if (xftg) + { + if (xftg->bitmap) + free (xftg->bitmap); + free (xftg); + } + } + + /* Free the pattern and the charset */ + FcPatternDestroy (font->public.pattern); + FcCharSetDestroy (font->public.charset); + + /* Finally, free the font structure */ + XftMemFree (XFT_MEM_FONT, sizeof (XftFontInt) + + font->num_glyphs * sizeof (XftGlyph *) + + font->hash_value * sizeof (XftUcsHash)); + free (font); +} + +static XftFont * +XftFontFindNthUnref (XftDisplayInfo *info, int n) +{ + XftFont *public; + XftFontInt *font; + + for (public = info->fonts; public; public = font->next) + { + font = (XftFontInt*) public; + if (!font->ref && !n--) + break; + } + return public; +} + +_X_HIDDEN void +XftFontManageMemory (Display *dpy) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, False); + XftFont **prev; + XftFont *public; + XftFontInt *font; + + if (!info) + return; + while (info->num_unref_fonts > info->max_unref_fonts) + { + public = XftFontFindNthUnref (info, rand() % info->num_unref_fonts); + font = (XftFontInt *) public; + + if (XftDebug () & XFT_DBG_CACHE) + printf ("freeing unreferenced font %s/%d size %dx%d\n", + font->info.file->file, font->info.file->id, + (int) font->info.xsize >> 6, (int) font->info.ysize >> 6); + + /* Unhook from display list */ + for (prev = &info->fonts; *prev; prev = &(*(XftFontInt **) prev)->next) + { + if (*prev == public) + { + *prev = font->next; + break; + } + } + /* Unhook from hash list */ + for (prev = &info->fontHash[font->info.hash % XFT_NUM_FONT_HASH]; + *prev; + prev = &(*(XftFontInt **) prev)->hash_next) + { + if (*prev == public) + { + *prev = font->hash_next; + break; + } + } + /* Destroy the font */ + XftFontDestroy (dpy, public); + --info->num_unref_fonts; + } +} + +_X_EXPORT void +XftFontClose (Display *dpy, XftFont *public) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, False); + XftFontInt *font = (XftFontInt *) public; + + if (--font->ref != 0) + return; + + if (info) + { + ++info->num_unref_fonts; + XftFontManageMemory (dpy); + } + else + { + XftFontDestroy (dpy, public); + } +} + +_X_EXPORT FcBool +XftInitFtLibrary (void) +{ + if (_XftFTlibrary) + return FcTrue; + if (FT_Init_FreeType (&_XftFTlibrary)) + return FcFalse; + return FcTrue; +} diff --git a/libXft/src/xftglyphs.c b/libXft/src/xftglyphs.c new file mode 100644 index 000000000..10adb1587 --- /dev/null +++ b/libXft/src/xftglyphs.c @@ -0,0 +1,827 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" +#include <freetype/ftoutln.h> + +#if HAVE_FT_GLYPHSLOT_EMBOLDEN +#include <freetype/ftsynth.h> +#endif + +static const int filters[3][3] = { + /* red */ +#if 0 +{ 65538*4/7,65538*2/7,65538*1/7 }, + /* green */ +{ 65536*1/4, 65536*2/4, 65537*1/4 }, + /* blue */ +{ 65538*1/7,65538*2/7,65538*4/7 }, +#endif +{ 65538*9/13,65538*3/13,65538*1/13 }, + /* green */ +{ 65538*1/6, 65538*4/6, 65538*1/6 }, + /* blue */ +{ 65538*1/13,65538*3/13,65538*9/13 }, +}; + +/* + * Validate the memory info for a font + */ + +static void +_XftFontValidateMemory (Display *dpy, XftFont *public) +{ + XftFontInt *font = (XftFontInt *) public; + unsigned long glyph_memory; + FT_UInt glyphindex; + XftGlyph *xftg; + + glyph_memory = 0; + for (glyphindex = 0; glyphindex < font->num_glyphs; glyphindex++) + { + xftg = font->glyphs[glyphindex]; + if (xftg) + { + glyph_memory += xftg->glyph_memory; + } + } + if (glyph_memory != font->glyph_memory) + printf ("Font glyph cache incorrect has %ld bytes, should have %ld\n", + font->glyph_memory, glyph_memory); +} + +_X_EXPORT void +XftFontLoadGlyphs (Display *dpy, + XftFont *pub, + FcBool need_bitmaps, + _Xconst FT_UInt *glyphs, + int nglyph) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, True); + XftFontInt *font = (XftFontInt *) pub; + FT_Error error; + FT_UInt glyphindex; + FT_GlyphSlot glyphslot; + XftGlyph *xftg; + Glyph glyph; + unsigned char bufLocal[4096]; + unsigned char *bufBitmap = bufLocal; + int bufSize = sizeof (bufLocal); + int size, pitch; + unsigned char bufLocalRgba[4096]; + unsigned char *bufBitmapRgba = bufLocalRgba; + int bufSizeRgba = sizeof (bufLocalRgba); + int sizergba, pitchrgba, widthrgba; + int width; + int height; + int left, right, top, bottom; + int hmul = 1; + int vmul = 1; + FT_Bitmap ftbit; + FT_Matrix matrix; + FT_Vector vector; + Bool subpixel = False; + FT_Face face; + + if (!info) + return; + + face = XftLockFace (&font->public); + + if (!face) + return; + + matrix.xx = matrix.yy = 0x10000L; + matrix.xy = matrix.yx = 0; + + if (font->info.antialias) + { + switch (font->info.rgba) { + case FC_RGBA_RGB: + case FC_RGBA_BGR: + matrix.xx *= 3; + subpixel = True; + hmul = 3; + break; + case FC_RGBA_VRGB: + case FC_RGBA_VBGR: + matrix.yy *= 3; + vmul = 3; + subpixel = True; + break; + } + } + + while (nglyph--) + { + glyphindex = *glyphs++; + xftg = font->glyphs[glyphindex]; + if (!xftg) + continue; + + if (XftDebug() & XFT_DBG_CACHE) + _XftFontValidateMemory (dpy, pub); + /* + * Check to see if this glyph has just been loaded, + * this happens when drawing the same glyph twice + * in a single string + */ + if (xftg->glyph_memory) + continue; + + error = FT_Load_Glyph (face, glyphindex, font->info.load_flags); + if (error) + { + /* + * If anti-aliasing or transforming glyphs and + * no outline version exists, fallback to the + * bitmap and let things look bad instead of + * missing the glyph + */ + if (font->info.load_flags & FT_LOAD_NO_BITMAP) + error = FT_Load_Glyph (face, glyphindex, + font->info.load_flags & ~FT_LOAD_NO_BITMAP); + if (error) + continue; + } + +#define FLOOR(x) ((x) & -64) +#define CEIL(x) (((x)+63) & -64) +#define TRUNC(x) ((x) >> 6) +#define ROUND(x) (((x)+32) & -64) + + glyphslot = face->glyph; + +#if HAVE_FT_GLYPHSLOT_EMBOLDEN + /* + * Embolden if required + */ + if (font->info.embolden) FT_GlyphSlot_Embolden(glyphslot); +#endif + + /* + * Compute glyph metrics from FreeType information + */ + if(font->info.transform && glyphslot->format != ft_glyph_format_bitmap) + { + /* + * calculate the true width by transforming all four corners. + */ + int xc, yc; + left = right = top = bottom = 0; + for(xc = 0; xc <= 1; xc ++) { + for(yc = 0; yc <= 1; yc++) { + vector.x = glyphslot->metrics.horiBearingX + xc * glyphslot->metrics.width; + vector.y = glyphslot->metrics.horiBearingY - yc * glyphslot->metrics.height; + FT_Vector_Transform(&vector, &font->info.matrix); + if (XftDebug() & XFT_DBG_GLYPH) + printf("Trans %d %d: %d %d\n", (int) xc, (int) yc, + (int) vector.x, (int) vector.y); + if(xc == 0 && yc == 0) { + left = right = vector.x; + top = bottom = vector.y; + } else { + if(left > vector.x) left = vector.x; + if(right < vector.x) right = vector.x; + if(bottom > vector.y) bottom = vector.y; + if(top < vector.y) top = vector.y; + } + + } + } + left = FLOOR(left); + right = CEIL(right); + bottom = FLOOR(bottom); + top = CEIL(top); + + } else { + left = FLOOR( glyphslot->metrics.horiBearingX ); + right = CEIL( glyphslot->metrics.horiBearingX + glyphslot->metrics.width ); + + top = CEIL( glyphslot->metrics.horiBearingY ); + bottom = FLOOR( glyphslot->metrics.horiBearingY - glyphslot->metrics.height ); + } + + width = TRUNC(right - left); + height = TRUNC( top - bottom ); + + /* + * Clip charcell glyphs to the bounding box + * XXX transformed? + */ + if (font->info.spacing >= FC_CHARCELL && !font->info.transform) + { + if (font->info.load_flags & FT_LOAD_VERTICAL_LAYOUT) + { + if (TRUNC(bottom) > font->public.max_advance_width) + { + int adjust; + + adjust = bottom - (font->public.max_advance_width << 6); + if (adjust > top) + adjust = top; + top -= adjust; + bottom -= adjust; + height = font->public.max_advance_width; + } + } + else + { + if (TRUNC(right) > font->public.max_advance_width) + { + int adjust; + + adjust = right - (font->public.max_advance_width << 6); + if (adjust > left) + adjust = left; + left -= adjust; + right -= adjust; + width = font->public.max_advance_width; + } + } + } + + if (font->info.antialias) + pitch = (width * hmul + 3) & ~3; + else + pitch = ((width + 31) & ~31) >> 3; + + size = pitch * height * vmul; + + xftg->metrics.width = width; + xftg->metrics.height = height; + xftg->metrics.x = -TRUNC(left); + xftg->metrics.y = TRUNC(top); + + if (font->info.spacing >= FC_MONO) + { + if (font->info.transform) + { + if (font->info.load_flags & FT_LOAD_VERTICAL_LAYOUT) + { + vector.x = 0; + vector.y = -face->size->metrics.max_advance; + } + else + { + vector.x = face->size->metrics.max_advance; + vector.y = 0; + } + FT_Vector_Transform (&vector, &font->info.matrix); + xftg->metrics.xOff = vector.x >> 6; + xftg->metrics.yOff = -(vector.y >> 6); + } + else + { + if (font->info.load_flags & FT_LOAD_VERTICAL_LAYOUT) + { + xftg->metrics.xOff = 0; + xftg->metrics.yOff = -font->public.max_advance_width; + } + else + { + xftg->metrics.xOff = font->public.max_advance_width; + xftg->metrics.yOff = 0; + } + } + } + else + { + xftg->metrics.xOff = TRUNC(ROUND(glyphslot->advance.x)); + xftg->metrics.yOff = -TRUNC(ROUND(glyphslot->advance.y)); + } + + /* + * If the glyph is relatively large (> 1% of server memory), + * don't send it until necessary + */ + if (!need_bitmaps && size > info->max_glyph_memory / 100) + continue; + + /* + * Make sure there's enough buffer space for the glyph + */ + if (size > bufSize) + { + if (bufBitmap != bufLocal) + free (bufBitmap); + bufBitmap = (unsigned char *) malloc (size); + if (!bufBitmap) + continue; + bufSize = size; + } + memset (bufBitmap, 0, size); + + /* + * Rasterize into the local buffer + */ + switch (glyphslot->format) { + case ft_glyph_format_outline: + ftbit.width = width * hmul; + ftbit.rows = height * vmul; + ftbit.pitch = pitch; + if (font->info.antialias) + ftbit.pixel_mode = ft_pixel_mode_grays; + else + ftbit.pixel_mode = ft_pixel_mode_mono; + + ftbit.buffer = bufBitmap; + + if (subpixel) + FT_Outline_Transform (&glyphslot->outline, &matrix); + + FT_Outline_Translate ( &glyphslot->outline, -left*hmul, -bottom*vmul ); + + FT_Outline_Get_Bitmap( _XftFTlibrary, &glyphslot->outline, &ftbit ); + break; + case ft_glyph_format_bitmap: + if (font->info.antialias) + { + unsigned char *srcLine, *dstLine; + int height; + int x; + int h, v; + + srcLine = glyphslot->bitmap.buffer; + dstLine = bufBitmap; + height = glyphslot->bitmap.rows; + while (height--) + { + for (x = 0; x < glyphslot->bitmap.width; x++) + { + /* always MSB bitmaps */ + unsigned char a = ((srcLine[x >> 3] & (0x80 >> (x & 7))) ? + 0xff : 0x00); + if (subpixel) + { + for (v = 0; v < vmul; v++) + for (h = 0; h < hmul; h++) + dstLine[v * pitch + x*hmul + h] = a; + } + else + dstLine[x] = a; + } + dstLine += pitch * vmul; + srcLine += glyphslot->bitmap.pitch; + } + } + else + { + unsigned char *srcLine, *dstLine; + int h, bytes; + + srcLine = glyphslot->bitmap.buffer; + dstLine = bufBitmap; + h = glyphslot->bitmap.rows; + bytes = (glyphslot->bitmap.width + 7) >> 3; + while (h--) + { + memcpy (dstLine, srcLine, bytes); + dstLine += pitch; + srcLine += glyphslot->bitmap.pitch; + } + } + break; + default: + if (XftDebug() & XFT_DBG_GLYPH) + printf ("glyph %d is not in a usable format\n", + (int) glyphindex); + continue; + } + + if (XftDebug() & XFT_DBG_GLYPH) + { + printf ("glyph %d:\n", (int) glyphindex); + printf (" xywh (%d %d %d %d), trans (%d %d %d %d) wh (%d %d)\n", + (int) glyphslot->metrics.horiBearingX, + (int) glyphslot->metrics.horiBearingY, + (int) glyphslot->metrics.width, + (int) glyphslot->metrics.height, + left, right, top, bottom, + width, height); + if (XftDebug() & XFT_DBG_GLYPHV) + { + int x, y; + unsigned char *line; + + line = bufBitmap; + for (y = 0; y < height * vmul; y++) + { + if (font->info.antialias) + { + static char den[] = { " .:;=+*#" }; + for (x = 0; x < pitch; x++) + printf ("%c", den[line[x] >> 5]); + } + else + { + for (x = 0; x < pitch * 8; x++) + { + printf ("%c", line[x>>3] & (1 << (x & 7)) ? '#' : ' '); + } + } + printf ("|\n"); + line += pitch; + } + printf ("\n"); + } + } + + /* + * Use the glyph index as the wire encoding; it + * might be more efficient for some locales to map + * these by first usage to smaller values, but that + * would require persistently storing the map when + * glyphs were freed. + */ + glyph = (Glyph) glyphindex; + + if (subpixel) + { + int x, y; + unsigned char *in_line, *out_line, *in; + unsigned int *out; + unsigned int red, green, blue; + int rf, gf, bf; + int s; + int o, os; + + /* + * Filter the glyph to soften the color fringes + */ + widthrgba = width; + pitchrgba = (widthrgba * 4 + 3) & ~3; + sizergba = pitchrgba * height; + + os = 1; + switch (font->info.rgba) { + case FC_RGBA_VRGB: + os = pitch; + case FC_RGBA_RGB: + default: + rf = 0; + gf = 1; + bf = 2; + break; + case FC_RGBA_VBGR: + os = pitch; + case FC_RGBA_BGR: + bf = 0; + gf = 1; + rf = 2; + break; + } + if (sizergba > bufSizeRgba) + { + if (bufBitmapRgba != bufLocalRgba) + free (bufBitmapRgba); + bufBitmapRgba = (unsigned char *) malloc (sizergba); + if (!bufBitmapRgba) + continue; + bufSizeRgba = sizergba; + } + memset (bufBitmapRgba, 0, sizergba); + in_line = bufBitmap; + out_line = bufBitmapRgba; + for (y = 0; y < height; y++) + { + in = in_line; + out = (unsigned int *) out_line; + in_line += pitch * vmul; + out_line += pitchrgba; + for (x = 0; x < width * hmul; x += hmul) + { + red = green = blue = 0; + o = 0; + for (s = 0; s < 3; s++) + { + red += filters[rf][s]*in[x+o]; + green += filters[gf][s]*in[x+o]; + blue += filters[bf][s]*in[x+o]; + o += os; + } + red = red / 65536; + green = green / 65536; + blue = blue / 65536; + *out++ = (green << 24) | (red << 16) | (green << 8) | blue; + } + } + + xftg->glyph_memory = sizergba + sizeof (XftGlyph); + if (font->format) + { + if (!font->glyphset) + font->glyphset = XRenderCreateGlyphSet (dpy, font->format); + if (ImageByteOrder (dpy) != XftNativeByteOrder ()) + XftSwapCARD32 ((CARD32 *) bufBitmapRgba, sizergba >> 2); + XRenderAddGlyphs (dpy, font->glyphset, &glyph, + &xftg->metrics, 1, + (char *) bufBitmapRgba, sizergba); + } + else + { + if (sizergba) + { + xftg->bitmap = malloc (sizergba); + if (xftg->bitmap) + memcpy (xftg->bitmap, bufBitmapRgba, sizergba); + } + else + xftg->bitmap = NULL; + } + } + else + { + xftg->glyph_memory = size + sizeof (XftGlyph); + if (font->format) + { + /* + * swap bit order around; FreeType is always MSBFirst + */ + if (!font->info.antialias) + { + if (BitmapBitOrder (dpy) != MSBFirst) + { + unsigned char *line; + unsigned char c; + int i; + + line = (unsigned char *) bufBitmap; + i = size; + while (i--) + { + c = *line; + c = ((c << 1) & 0xaa) | ((c >> 1) & 0x55); + c = ((c << 2) & 0xcc) | ((c >> 2) & 0x33); + c = ((c << 4) & 0xf0) | ((c >> 4) & 0x0f); + *line++ = c; + } + } + } + if (!font->glyphset) + font->glyphset = XRenderCreateGlyphSet (dpy, font->format); + XRenderAddGlyphs (dpy, font->glyphset, &glyph, + &xftg->metrics, 1, + (char *) bufBitmap, size); + } + else + { + if (size) + { + xftg->bitmap = malloc (size); + if (xftg->bitmap) + memcpy (xftg->bitmap, bufBitmap, size); + } + else + xftg->bitmap = NULL; + } + } + font->glyph_memory += xftg->glyph_memory; + info->glyph_memory += xftg->glyph_memory; + if (XftDebug() & XFT_DBG_CACHE) + _XftFontValidateMemory (dpy, pub); + if (XftDebug() & XFT_DBG_CACHEV) + printf ("Caching glyph 0x%x size %ld\n", glyphindex, + xftg->glyph_memory); + } + if (bufBitmap != bufLocal) + free (bufBitmap); + if (bufBitmapRgba != bufLocalRgba) + free (bufBitmapRgba); + XftUnlockFace (&font->public); +} + +_X_EXPORT void +XftFontUnloadGlyphs (Display *dpy, + XftFont *pub, + _Xconst FT_UInt *glyphs, + int nglyph) +{ + XftDisplayInfo *info = _XftDisplayInfoGet (dpy, False); + XftFontInt *font = (XftFontInt *) pub; + XftGlyph *xftg; + FT_UInt glyphindex; + Glyph glyphBuf[1024]; + int nused; + + nused = 0; + while (nglyph--) + { + glyphindex = *glyphs++; + xftg = font->glyphs[glyphindex]; + if (!xftg) + continue; + if (xftg->glyph_memory) + { + if (font->format) + { + if (font->glyphset) + { + glyphBuf[nused++] = (Glyph) glyphindex; + if (nused == sizeof (glyphBuf) / sizeof (glyphBuf[0])) + { + XRenderFreeGlyphs (dpy, font->glyphset, glyphBuf, nused); + nused = 0; + } + } + } + else + { + if (xftg->bitmap) + free (xftg->bitmap); + } + font->glyph_memory -= xftg->glyph_memory; + if (info) + info->glyph_memory -= xftg->glyph_memory; + } + free (xftg); + XftMemFree (XFT_MEM_GLYPH, sizeof (XftGlyph)); + font->glyphs[glyphindex] = NULL; + } + if (font->glyphset && nused) + XRenderFreeGlyphs (dpy, font->glyphset, glyphBuf, nused); +} + +_X_EXPORT FcBool +XftFontCheckGlyph (Display *dpy, + XftFont *pub, + FcBool need_bitmaps, + FT_UInt glyph, + FT_UInt *missing, + int *nmissing) +{ + XftFontInt *font = (XftFontInt *) pub; + XftGlyph *xftg; + int n; + + if (glyph >= font->num_glyphs) + return FcFalse; + xftg = font->glyphs[glyph]; + if (!xftg || (need_bitmaps && !xftg->glyph_memory)) + { + if (!xftg) + { + xftg = (XftGlyph *) malloc (sizeof (XftGlyph)); + if (!xftg) + return FcFalse; + XftMemAlloc (XFT_MEM_GLYPH, sizeof (XftGlyph)); + xftg->bitmap = NULL; + xftg->glyph_memory = 0; + font->glyphs[glyph] = xftg; + } + n = *nmissing; + missing[n++] = glyph; + if (n == XFT_NMISSING) + { + XftFontLoadGlyphs (dpy, pub, need_bitmaps, missing, n); + n = 0; + } + *nmissing = n; + return FcTrue; + } + else + return FcFalse; +} + +_X_EXPORT FcBool +XftCharExists (Display *dpy, + XftFont *pub, + FcChar32 ucs4) +{ + if (pub->charset) + return FcCharSetHasChar (pub->charset, ucs4); + return FcFalse; +} + +#define Missing ((FT_UInt) ~0) + +_X_EXPORT FT_UInt +XftCharIndex (Display *dpy, + XftFont *pub, + FcChar32 ucs4) +{ + XftFontInt *font = (XftFontInt *) pub; + FcChar32 ent, offset; + FT_Face face; + + if (!font->hash_value) + return 0; + + ent = ucs4 % font->hash_value; + offset = 0; + while (font->hash_table[ent].ucs4 != ucs4) + { + if (font->hash_table[ent].ucs4 == (FcChar32) ~0) + { + if (!XftCharExists (dpy, pub, ucs4)) + return 0; + face = XftLockFace (pub); + if (!face) + return 0; + font->hash_table[ent].ucs4 = ucs4; + font->hash_table[ent].glyph = FcFreeTypeCharIndex (face, ucs4); + XftUnlockFace (pub); + break; + } + if (!offset) + { + offset = ucs4 % font->rehash_value; + if (!offset) + offset = 1; + } + ent = ent + offset; + if (ent >= font->hash_value) + ent -= font->hash_value; + } + return font->hash_table[ent].glyph; +} + +/* + * Pick a random glyph from the font and remove it from the cache + */ +_X_HIDDEN void +_XftFontUncacheGlyph (Display *dpy, XftFont *pub) +{ + XftFontInt *font = (XftFontInt *) pub; + unsigned long glyph_memory; + FT_UInt glyphindex; + XftGlyph *xftg; + + if (!font->glyph_memory) + return; + if (font->use_free_glyphs) + { + glyph_memory = rand() % font->glyph_memory; + } + else + { + if (font->glyphset) + { + XRenderFreeGlyphSet (dpy, font->glyphset); + font->glyphset = 0; + } + glyph_memory = 0; + } + + if (XftDebug() & XFT_DBG_CACHE) + _XftFontValidateMemory (dpy, pub); + for (glyphindex = 0; glyphindex < font->num_glyphs; glyphindex++) + { + xftg = font->glyphs[glyphindex]; + if (xftg) + { + if (xftg->glyph_memory > glyph_memory) + { + if (XftDebug() & XFT_DBG_CACHEV) + printf ("Uncaching glyph 0x%x size %ld\n", + glyphindex, xftg->glyph_memory); + XftFontUnloadGlyphs (dpy, pub, &glyphindex, 1); + if (!font->use_free_glyphs) + continue; + break; + } + glyph_memory -= xftg->glyph_memory; + } + } + if (XftDebug() & XFT_DBG_CACHE) + _XftFontValidateMemory (dpy, pub); +} + +_X_HIDDEN void +_XftFontManageMemory (Display *dpy, XftFont *pub) +{ + XftFontInt *font = (XftFontInt *) pub; + + if (font->max_glyph_memory) + { + if (XftDebug() & XFT_DBG_CACHE) + { + if (font->glyph_memory > font->max_glyph_memory) + printf ("Reduce memory for font 0x%lx from %ld to %ld\n", + font->glyphset ? font->glyphset : (unsigned long) font, + font->glyph_memory, font->max_glyph_memory); + } + while (font->glyph_memory > font->max_glyph_memory) + _XftFontUncacheGlyph (dpy, pub); + } + _XftDisplayManageMemory (dpy); +} diff --git a/libXft/src/xftinit.c b/libXft/src/xftinit.c new file mode 100644 index 000000000..43efc00e1 --- /dev/null +++ b/libXft/src/xftinit.c @@ -0,0 +1,113 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +static Bool _XftConfigInitialized; + +_X_EXPORT Bool +XftInit (_Xconst char *config) +{ + if (_XftConfigInitialized) + return True; + _XftConfigInitialized = True; + if (!FcInit ()) + return False; + _XftNameInit (); + return True; +} + +_X_EXPORT int +XftGetVersion (void) +{ + return XftVersion; +} + +static struct { + char *name; + int alloc_count; + int alloc_mem; + int free_count; + int free_mem; +} XftInUse[XFT_MEM_NUM] = { + { "XftDraw", 0, 0 }, + { "XftFont", 0 ,0 }, + { "XftFtFile", 0, 0 }, + { "XftGlyph", 0, 0 }, +}; + +static int XftAllocCount, XftAllocMem; +static int XftFreeCount, XftFreeMem; + +static int XftMemNotice = 1*1024*1024; + +static int XftAllocNotify, XftFreeNotify; + +_X_HIDDEN void +XftMemReport (void) +{ + int i; + printf ("Xft Memory Usage:\n"); + printf ("\t Which Alloc Free\n"); + printf ("\t count bytes count bytes\n"); + for (i = 0; i < XFT_MEM_NUM; i++) + printf ("\t%8.8s%8d%8d%8d%8d\n", + XftInUse[i].name, + XftInUse[i].alloc_count, XftInUse[i].alloc_mem, + XftInUse[i].free_count, XftInUse[i].free_mem); + printf ("\t%8.8s%8d%8d%8d%8d\n", + "Total", + XftAllocCount, XftAllocMem, + XftFreeCount, XftFreeMem); + XftAllocNotify = 0; + XftFreeNotify = 0; +} + +_X_HIDDEN void +XftMemAlloc (int kind, int size) +{ + if (XftDebug() & XFT_DBG_MEMORY) + { + XftInUse[kind].alloc_count++; + XftInUse[kind].alloc_mem += size; + XftAllocCount++; + XftAllocMem += size; + XftAllocNotify += size; + if (XftAllocNotify > XftMemNotice) + XftMemReport (); + } +} + +_X_HIDDEN void +XftMemFree (int kind, int size) +{ + if (XftDebug() & XFT_DBG_MEMORY) + { + XftInUse[kind].free_count++; + XftInUse[kind].free_mem += size; + XftFreeCount++; + XftFreeMem += size; + XftFreeNotify += size; + if (XftFreeNotify > XftMemNotice) + XftMemReport (); + } +} diff --git a/libXft/src/xftint.h b/libXft/src/xftint.h new file mode 100644 index 000000000..3aafecf86 --- /dev/null +++ b/libXft/src/xftint.h @@ -0,0 +1,465 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* + * These definitions are solely for use by the implementation of Xft + * and constitute no kind of standard. If you need any of these functions, + * please drop me a note. Either the library needs new functionality, + * or there's a way to do what you need using the existing published + * interfaces. keithp@freedesktop.org + */ + +#ifndef _XFTINT_H_ +#define _XFTINT_H_ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#else /* X monolithic tree */ +#define HAVE_STDLIB_H 1 /* assumed since all ANSI C platforms require it */ +#include <X11/Xosdefs.h> /* get string.h or strings.h as appropriate */ +#endif + +#include <stdio.h> +#if HAVE_STDLIB_H +#include <stdlib.h> +#endif +#if HAVE_STRING_H +#include <string.h> +#else +#if HAVE_STRINGS_H +#include <strings.h> +#endif +#endif +#include <ctype.h> + +#include <X11/Xlib.h> +#include <X11/Xutil.h> +#include <X11/Xmd.h> +#include <X11/Xlibint.h> +#define _XFT_NO_COMPAT_ +#include "Xft.h" +#include <fontconfig/fcprivate.h> +#include <fontconfig/fcfreetype.h> + +/* Added to <X11/Xfuncproto.h> in X11R6.9 and later */ +#ifndef _X_HIDDEN +# define _X_HIDDEN /**/ +#endif +#ifndef _X_EXPORT +# define _X_EXPORT /**/ +#endif + +#ifndef HAVE_CONFIG_H +# if (FREETYPE_MAJOR > 2 || \ + (FREETYPE_MAJOR == 2 && (FREETYPE_MINOR > 1 || \ + (FREETYPE_MINOR == 1 && FREETYPE_PATCH >= 5)))) +# define HAVE_FT_BITMAP_SIZE_Y_PPEM 1 +# else +# define HAVE_FT_BITMAP_SIZE_Y_PPEM 0 +# endif +#endif + +typedef struct _XftMatcher { + char *object; + double (*compare) (char *object, FcValue value1, FcValue value2); +} XftMatcher; + +typedef struct _XftSymbolic { + const char *name; + int value; +} XftSymbolic; + +/* + * Glyphs are stored in this structure + */ +typedef struct _XftGlyph { + XGlyphInfo metrics; + void *bitmap; + unsigned long glyph_memory; +} XftGlyph; + +/* + * A hash table translates Unicode values into glyph indicies + */ +typedef struct _XftUcsHash { + FcChar32 ucs4; + FT_UInt glyph; +} XftUcsHash; + +/* + * Many fonts can share the same underlying face data; this + * structure references that. Note that many faces may in fact + * live in the same font file; that is irrelevant to this structure + * which is concerned only with the individual faces themselves + */ + +typedef struct _XftFtFile { + struct _XftFtFile *next; + int ref; /* number of font infos using this file */ + + char *file; /* file name */ + int id; /* font index within that file */ + + FT_F26Dot6 xsize; /* current xsize setting */ + FT_F26Dot6 ysize; /* current ysize setting */ + FT_Matrix matrix; /* current matrix setting */ + + int lock; /* lock count; can't unload unless 0 */ + FT_Face face; /* pointer to face; only valid when lock */ +} XftFtFile; + +/* + * This structure holds the data extracted from a pattern + * needed to create a unique font object. + */ + +struct _XftFontInfo { + /* + * Hash value (not include in hash value computation) + */ + FcChar32 hash; + XftFtFile *file; /* face source */ + /* + * Rendering options + */ + FT_F26Dot6 xsize, ysize; /* pixel size */ + FcBool antialias; /* doing antialiasing */ + FcBool embolden; /* force emboldening */ + int rgba; /* subpixel order */ + FT_Matrix matrix; /* glyph transformation matrix */ + FcBool transform; /* non-identify matrix? */ + FT_Int load_flags; /* glyph load flags */ + FcBool render; /* whether to use the Render extension */ + /* + * Internal fields + */ + int spacing; + FcBool minspace; + int char_width; +}; + +/* + * Internal version of the font with private data + */ + +typedef struct _XftFontInt { + XftFont public; /* public fields */ + XftFont *next; /* all fonts on display */ + XftFont *hash_next; /* fonts in this hash chain */ + XftFontInfo info; /* Data from pattern */ + int ref; /* reference count */ + /* + * Per-glyph information, indexed by glyph ID + * This array follows the font in memory + */ + XftGlyph **glyphs; + int num_glyphs; /* size of glyphs/bitmaps arrays */ + /* + * Hash table to get from Unicode value to glyph ID + * This array follows the glyphs in memory + */ + XftUcsHash *hash_table; + int hash_value; + int rehash_value; + /* + * X specific fields + */ + GlyphSet glyphset; /* Render glyphset */ + XRenderPictFormat *format; /* Render format for glyphs */ + /* + * Glyph memory management fields + */ + unsigned long glyph_memory; + unsigned long max_glyph_memory; + FcBool use_free_glyphs; /* Use XRenderFreeGlyphs */ +} XftFontInt; + +typedef enum _XftClipType { + XftClipTypeNone, XftClipTypeRegion, XftClipTypeRectangles +} XftClipType; + +typedef struct _XftClipRect { + int xOrigin; + int yOrigin; + int n; +} XftClipRect; + +#define XftClipRects(cr) ((XRectangle *) ((cr) + 1)) + +typedef union _XftClip { + XftClipRect *rect; + Region region; +} XftClip; + +struct _XftDraw { + Display *dpy; + int screen; + unsigned int bits_per_pixel; + unsigned int depth; + Drawable drawable; + Visual *visual; /* NULL for bitmaps */ + Colormap colormap; + XftClipType clip_type; + XftClip clip; + int subwindow_mode; + struct { + Picture pict; + } render; + struct { + GC gc; + int use_pixmap; + } core; +}; + +/* + * Instead of taking two round trips for each blending request, + * assume that if a particular drawable fails GetImage that it will + * fail for a "while"; use temporary pixmaps to avoid the errors + */ + +#define XFT_ASSUME_PIXMAP 20 + +typedef struct _XftSolidColor { + XRenderColor color; + int screen; + Picture pict; +} XftSolidColor; + +#define XFT_NUM_SOLID_COLOR 16 + +#define XFT_NUM_FONT_HASH 127 + +typedef struct _XftDisplayInfo { + struct _XftDisplayInfo *next; + Display *display; + XExtCodes *codes; + FcPattern *defaults; + FcBool hasRender; + XftFont *fonts; + XRenderPictFormat *solidFormat; + unsigned long glyph_memory; + unsigned long max_glyph_memory; + FcBool use_free_glyphs; + int num_unref_fonts; + int max_unref_fonts; + XftSolidColor colors[XFT_NUM_SOLID_COLOR]; + XftFont *fontHash[XFT_NUM_FONT_HASH]; +} XftDisplayInfo; + +/* + * By default, use no more than 4 meg of server memory total, and no + * more than 1 meg for any one font + */ +#define XFT_DPY_MAX_GLYPH_MEMORY (4 * 1024 * 1024) +#define XFT_FONT_MAX_GLYPH_MEMORY (1024 * 1024) + +/* + * By default, keep the last 16 unreferenced fonts around to + * speed reopening them. Note that the glyph caching code + * will keep the global memory usage reasonably limited + */ +#define XFT_DPY_MAX_UNREF_FONTS 16 + +extern XftDisplayInfo *_XftDisplayInfo; + +#define XFT_DBG_OPEN 1 +#define XFT_DBG_OPENV 2 +#define XFT_DBG_RENDER 4 +#define XFT_DBG_DRAW 8 +#define XFT_DBG_REF 16 +#define XFT_DBG_GLYPH 32 +#define XFT_DBG_GLYPHV 64 +#define XFT_DBG_CACHE 128 +#define XFT_DBG_CACHEV 256 +#define XFT_DBG_MEMORY 512 + +#define XFT_MEM_DRAW 0 +#define XFT_MEM_FONT 1 +#define XFT_MEM_FILE 2 +#define XFT_MEM_GLYPH 3 +#define XFT_MEM_NUM 4 + +/* xftcompat.c */ +void XftFontSetDestroy (FcFontSet *s); +FcBool XftMatrixEqual (_Xconst FcMatrix *mat1, _Xconst FcMatrix *mat2); +void XftMatrixMultiply (FcMatrix *result, FcMatrix *a, FcMatrix *b); +void XftMatrixRotate (FcMatrix *m, double c, double s); +void XftMatrixScale (FcMatrix *m, double sx, double sy); +void XftMatrixShear (FcMatrix *m, double sh, double sv); +FcPattern *XftPatternCreate (void); +void XftValueDestroy (FcValue v); +void XftPatternDestroy (FcPattern *p); +FcBool XftPatternAdd (FcPattern *p, _Xconst char *object, FcValue value, FcBool append); +FcBool XftPatternDel (FcPattern *p, _Xconst char *object); +FcBool XftPatternAddInteger (FcPattern *p, _Xconst char *object, int i); +FcBool XftPatternAddDouble (FcPattern *p, _Xconst char *object, double i); +FcBool XftPatternAddMatrix (FcPattern *p, _Xconst char *object, FcMatrix *i); +FcBool XftPatternAddString (FcPattern *p, _Xconst char *object, char *i); +FcBool XftPatternAddBool (FcPattern *p, _Xconst char *object, FcBool i); +FcResult XftPatternGet (FcPattern *p, _Xconst char *object, int id, FcValue *v); +FcResult XftPatternGetInteger (FcPattern *p, _Xconst char *object, int id, int *i); +FcResult XftPatternGetDouble (FcPattern *p, _Xconst char *object, int id, double *i); +FcResult XftPatternGetString (FcPattern *p, _Xconst char *object, int id, char **i); +FcResult XftPatternGetMatrix (FcPattern *p, _Xconst char *object, int id, FcMatrix **i); +FcResult XftPatternGetBool (FcPattern *p, _Xconst char *object, int id, FcBool *i); +FcPattern *XftPatternDuplicate (FcPattern *orig); +FcPattern *XftPatternVaBuild (FcPattern *orig, va_list va); +FcPattern *XftPatternBuild (FcPattern *orig, ...); +FcBool XftNameUnparse (FcPattern *pat, char *dest, int len); +FcBool XftGlyphExists (Display *dpy, XftFont *font, FcChar32 ucs4); +FcObjectSet *XftObjectSetCreate (void); +Bool XftObjectSetAdd (FcObjectSet *os, _Xconst char *object); +void XftObjectSetDestroy (FcObjectSet *os); +FcObjectSet *XftObjectSetVaBuild (_Xconst char *first, va_list va); +FcObjectSet *XftObjectSetBuild (_Xconst char *first, ...); +FcFontSet *XftListFontSets (FcFontSet **sets, int nsets, FcPattern *p, FcObjectSet *os); + +/* xftcore.c */ +void +XftRectCore (XftDraw *draw, + _Xconst XftColor *color, + int x, + int y, + unsigned int width, + unsigned int height); + +void +XftGlyphCore (XftDraw *draw, + _Xconst XftColor *color, + XftFont *public, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs); + +void +XftGlyphSpecCore (XftDraw *draw, + _Xconst XftColor *color, + XftFont *public, + _Xconst XftGlyphSpec *glyphs, + int nglyphs); + +void +XftGlyphFontSpecCore (XftDraw *draw, + _Xconst XftColor *color, + _Xconst XftGlyphFontSpec *glyphs, + int nglyphs); + +/* xftdbg.c */ +int +XftDebug (void); + +/* xftdpy.c */ +XftDisplayInfo * +_XftDisplayInfoGet (Display *dpy, FcBool createIfNecessary); + +void +_XftDisplayManageMemory (Display *dpy); + +int +XftDefaultParseBool (char *v); + +FcBool +XftDefaultGetBool (Display *dpy, const char *object, int screen, FcBool def); + +int +XftDefaultGetInteger (Display *dpy, const char *object, int screen, int def); + +double +XftDefaultGetDouble (Display *dpy, const char *object, int screen, double def); + +FcFontSet * +XftDisplayGetFontSet (Display *dpy); + +/* xftdraw.c */ +unsigned int +XftDrawDepth (XftDraw *draw); + +unsigned int +XftDrawBitsPerPixel (XftDraw *draw); + +FcBool +XftDrawRenderPrepare (XftDraw *draw); + +/* xftextent.c */ + +/* xftfont.c */ + +/* xftfreetype.c */ +FcBool +_XftSetFace (XftFtFile *f, FT_F26Dot6 xsize, FT_F26Dot6 ysize, FT_Matrix *matrix); + +void +XftFontManageMemory (Display *dpy); + +/* xftglyph.c */ +void +_XftFontUncacheGlyph (Display *dpy, XftFont *public); + +void +_XftFontManageMemory (Display *dpy, XftFont *public); + +/* xftinit.c */ +void +XftMemReport (void); + +void +XftMemAlloc (int kind, int size); + +void +XftMemFree (int kind, int size); + +/* xftlist.c */ +FcFontSet * +XftListFontsPatternObjects (Display *dpy, + int screen, + FcPattern *pattern, + FcObjectSet *os); + +/* xftname.c */ +void +_XftNameInit (void); + +/* xftrender.c */ + +/* xftstr.c */ +int +_XftMatchSymbolic (XftSymbolic *s, int n, const char *name, int def); + +/* xftswap.c */ +int +XftNativeByteOrder (void); + +void +XftSwapCARD32 (CARD32 *data, int n); + +void +XftSwapCARD24 (CARD8 *data, int width, int height); + +void +XftSwapCARD16 (CARD16 *data, int n); + +void +XftSwapImage (XImage *image); + +/* xftxlfd.c */ +#endif /* _XFT_INT_H_ */ diff --git a/libXft/src/xftlist.c b/libXft/src/xftlist.c new file mode 100644 index 000000000..0780f7ca8 --- /dev/null +++ b/libXft/src/xftlist.c @@ -0,0 +1,58 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN FcFontSet * +XftListFontsPatternObjects (Display *dpy, + int screen, + FcPattern *pattern, + FcObjectSet *os) +{ + return FcFontList (NULL, pattern, os); +} + +_X_EXPORT FcFontSet * +XftListFonts (Display *dpy, + int screen, + ...) +{ + va_list va; + FcFontSet *fs; + FcObjectSet *os; + FcPattern *pattern; + const char *first; + + va_start (va, screen); + + FcPatternVapBuild (pattern, NULL, va); + + first = va_arg (va, const char *); + FcObjectSetVapBuild (os, first, va); + + va_end (va); + + fs = XftListFontsPatternObjects (dpy, screen, pattern, os); + FcPatternDestroy (pattern); + FcObjectSetDestroy (os); + return fs; +} diff --git a/libXft/src/xftname.c b/libXft/src/xftname.c new file mode 100644 index 000000000..a0c6be704 --- /dev/null +++ b/libXft/src/xftname.c @@ -0,0 +1,82 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +static const FcObjectType _XftObjectTypes[] = { + { XFT_CORE, FcTypeBool, }, + { XFT_XLFD, FcTypeString, }, + { XFT_RENDER, FcTypeBool, }, + { XFT_MAX_GLYPH_MEMORY, FcTypeInteger, }, +}; + +#define NUM_OBJECT_TYPES (sizeof _XftObjectTypes / sizeof _XftObjectTypes[0]) + +static FcBool _XftNameInitialized; + +_X_HIDDEN void +_XftNameInit (void) +{ + if (_XftNameInitialized) + return; + _XftNameInitialized = FcTrue; + FcNameRegisterObjectTypes (_XftObjectTypes, NUM_OBJECT_TYPES); +} + +_X_EXPORT FcPattern +*XftNameParse (const char *name) +{ + _XftNameInit (); + return FcNameParse ((FcChar8 *) name); +} + +_X_EXPORT FcBool +XftNameUnparse (FcPattern *pat, char *dest, int len) +{ + FcChar8 *name; + + _XftNameInit (); + name = FcNameUnparse (pat); + if (!name) + return FcFalse; + if (strlen ((char *) name) + 1 > len) + { + FcPattern *new = FcPatternDuplicate (pat); + free (name); + FcPatternDel (new, FC_LANG); + FcPatternDel (new, FC_CHARSET); + name = FcNameUnparse (new); + FcPatternDestroy (new); + if (!name) + return FcFalse; + if (strlen ((char *) name) + 1 > len) + { + strncpy (dest, ((char *) name), (size_t) len - 1); + dest[len - 1] = '\0'; + free (name); + return FcFalse; + } + } + strcpy (dest, ((char *) name)); + free (name); + return FcTrue; +} diff --git a/libXft/src/xftrender.c b/libXft/src/xftrender.c new file mode 100644 index 000000000..94c211bde --- /dev/null +++ b/libXft/src/xftrender.c @@ -0,0 +1,1007 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +#define NUM_LOCAL 1024 +#define NUM_ELT_LOCAL 128 + +/* + * Use the Render extension to draw the glyphs + */ + +_X_EXPORT void +XftGlyphRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FT_UInt *glyphs, + int nglyphs) +{ + XftFontInt *font = (XftFontInt *) pub; + int i; + FT_UInt missing[XFT_NMISSING]; + int nmissing; + FT_UInt g, max; + int size, width; + Glyph wire; + char *char8; + unsigned short *char16; + unsigned int *char32; + unsigned int char_local[NUM_LOCAL]; + unsigned int *chars; + FcBool glyphs_loaded; + + if (!font->format) + return; + + /* + * Load missing glyphs + */ + nmissing = 0; + max = 0; + glyphs_loaded = FcFalse; + for (i = 0; i < nglyphs; i++) + { + g = glyphs[i]; + if (g > max) + max = g; + if (XftFontCheckGlyph (dpy, pub, FcTrue, g, missing, &nmissing)) + glyphs_loaded = FcTrue; + } + if (nmissing) + XftFontLoadGlyphs (dpy, pub, FcTrue, missing, nmissing); + + if (!font->glyphset) + goto bail1; + if (max < 0x100) + { + width = 1; + size = sizeof (char); + } + else if (max < 0x10000) + { + width = 2; + size = sizeof (unsigned short); + } + else + { + width = 4; + size = sizeof (unsigned int); + } + chars = char_local; + if (nglyphs * size > sizeof (char_local)) + { + chars = malloc (nglyphs * size); + if (!chars) + goto bail1; + } + char8 = (char *) chars; + char16 = (unsigned short *) chars; + char32 = (unsigned int *) chars; + for (i = 0; i < nglyphs; i++) + { + wire = (Glyph) glyphs[i]; + if (wire >= font->num_glyphs || !font->glyphs[wire]) + wire = 0; + switch (width) { + case 1: char8[i] = (char) wire; break; + case 2: char16[i] = (unsigned short) wire; break; + case 4: char32[i] = (unsigned long) wire; break; + } + } + switch (width) { + case 1: + default: + XRenderCompositeString8 (dpy, op, + src, dst, font->format, font->glyphset, + srcx, srcy, x, y, char8, nglyphs); + break; + case 2: + XRenderCompositeString16(dpy, op, + src, dst, font->format, font->glyphset, + srcx, srcy, x, y, char16, nglyphs); + break; + case 4: + XRenderCompositeString32(dpy, op, + src, dst, font->format, font->glyphset, + srcx, srcy, x, y, char32, nglyphs); + break; + } + if (chars != char_local) + free (chars); +bail1: + if (glyphs_loaded) + _XftFontManageMemory (dpy, pub); +} + +_X_EXPORT void +XftGlyphSpecRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + _Xconst XftGlyphSpec *glyphs, + int nglyphs) +{ + XftFontInt *font = (XftFontInt *) pub; + int i, j; + FT_UInt missing[XFT_NMISSING]; + int nmissing; + int n; + FT_UInt g; + XftGlyph *glyph; + FT_UInt max; + int size, width; + char *char8; + unsigned short *char16; + unsigned int *char32; + unsigned int char_local[NUM_LOCAL]; + unsigned int *chars; + XGlyphElt8 *elts; + XGlyphElt8 elts_local[NUM_ELT_LOCAL]; + FcBool glyphs_loaded; + int nelt; + int x, y; + + if (!font->format) + return; + if (!nglyphs) + return; + + /* + * Load missing glyphs + */ + max = 0; + nmissing = 0; + glyphs_loaded = FcFalse; + g = glyphs[0].glyph; + for (i = 0; i < nglyphs; i++) + { + g = glyphs[i].glyph; + if (g > max) + max = g; + if (XftFontCheckGlyph (dpy, pub, FcTrue, g, missing, &nmissing)) + glyphs_loaded = FcTrue; + } + if (nmissing) + XftFontLoadGlyphs (dpy, pub, FcTrue, missing, nmissing); + + if (!font->glyphset) + goto bail1; + + /* + * See what encoding size is needed + */ + if (max < 0x100) + { + size = sizeof (char); + width = 1; + } + else if (max < 0x10000) + { + size = sizeof (unsigned short); + width = 2; + } + else + { + size = sizeof (unsigned int); + width = 4; + } + chars = char_local; + if (nglyphs * size > NUM_LOCAL) + { + chars = malloc (nglyphs * size); + if (!chars) + goto bail1; + } + char8 = (char *) chars; + char16 = (unsigned short *) chars; + char32 = (unsigned int *) chars; + + /* + * Compute the number of glyph elts needed + */ + nelt = 1; + for (i = 0; i < nglyphs; i++) + { + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + if (font->glyphs[g]) + break; + } + if (i == nglyphs) + goto bail2; + glyph = font->glyphs[g]; + x = glyphs[i].x + glyph->metrics.xOff; + y = glyphs[i].y + glyph->metrics.yOff; + while (++i < nglyphs) + { + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + /* + * check to see if the glyph is placed where it would + * fall using the normal spacing + */ + if ((glyph = font->glyphs[g])) + { + if (x != glyphs[i].x || y != glyphs[i].y) + { + x = glyphs[i].x; + y = glyphs[i].y; + ++nelt; + } + x += glyph->metrics.xOff; + y += glyph->metrics.yOff; + } + } + + elts = elts_local; + if (nelt > NUM_ELT_LOCAL) + { + elts = malloc (nelt * sizeof (XGlyphElt8)); + if (!elts) + goto bail2; + } + + /* + * Generate the list of glyph elts + */ + nelt = 0; + x = y = 0; + n = 0; + j = 0; + for (i = 0; i < nglyphs; i++) + { + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + if ((glyph = font->glyphs[g])) + { + if (!i || x != glyphs[i].x || y != glyphs[i].y) + { + if (n) + { + elts[nelt].nchars = n; + nelt++; + } + elts[nelt].glyphset = font->glyphset; + elts[nelt].chars = char8 + size * j; + elts[nelt].xOff = glyphs[i].x - x; + elts[nelt].yOff = glyphs[i].y - y; + x = glyphs[i].x; + y = glyphs[i].y; + n = 0; + } + switch (width) { + case 1: char8[j] = (char) g; break; + case 2: char16[j] = (unsigned short) g; break; + case 4: char32[j] = (unsigned int) g; break; + } + x += glyph->metrics.xOff; + y += glyph->metrics.yOff; + j++; + n++; + } + } + if (n) + { + elts[nelt].nchars = n; + nelt++; + } + switch (width) { + case 1: + XRenderCompositeText8 (dpy, op, src, dst, font->format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + elts, nelt); + break; + case 2: + XRenderCompositeText16 (dpy, op, src, dst, font->format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + (XGlyphElt16 *) elts, nelt); + break; + case 4: + XRenderCompositeText32 (dpy, op, src, dst, font->format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + (XGlyphElt32 *) elts, nelt); + break; + } + + if (elts != elts_local) + free (elts); +bail2: + if (chars != char_local) + free (chars); +bail1: + if (glyphs_loaded) + _XftFontManageMemory (dpy, pub); +} + +_X_EXPORT void +XftCharSpecRender (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + _Xconst XftCharSpec *chars, + int len) +{ + XftGlyphSpec *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (XftGlyphSpec)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + { + glyphs[i].glyph = XftCharIndex(dpy, pub, chars[i].ucs4); + glyphs[i].x = chars[i].x; + glyphs[i].y = chars[i].y; + } + + XftGlyphSpecRender (dpy, op, src, pub, dst, srcx, srcy, glyphs, len); + + if (glyphs != glyphs_local) + free (glyphs); +} + +/* + * Choose which format to draw text in when drawing with fonts + * of different formats. The trick is that ARGB formats aren't + * compatible with A formats as PictOpAdd does the wrong thing, so + * fall back to an A format when presented with an ARGB and A format + */ + +#define XftIsARGBFormat(a) ((a)->depth == 32) + +static XRenderPictFormat * +XftPreferFormat (Display *dpy, XRenderPictFormat *a, XRenderPictFormat *b) +{ + XRenderPictFormat *prefer = NULL; + + if (a == b) + prefer = a; + else if (XftIsARGBFormat(a) != XftIsARGBFormat(b)) + prefer = XRenderFindStandardFormat (dpy, PictStandardA8); + else if (a->depth > b->depth) + prefer = a; + else + prefer = b; + return prefer; +} + +_X_EXPORT void +XftGlyphFontSpecRender (Display *dpy, + int op, + Picture src, + Picture dst, + int srcx, + int srcy, + _Xconst XftGlyphFontSpec *glyphs, + int nglyphs) +{ + int i, j; + XftFont *prevPublic; + XftFontInt *firstFont; + XRenderPictFormat *format; + FT_UInt missing[XFT_NMISSING]; + int nmissing; + int n; + FT_UInt g; + XftGlyph *glyph; + FT_UInt max; + int size, width; + char *char8; + unsigned short *char16; + unsigned int *char32; + unsigned int char_local[NUM_LOCAL]; + unsigned int *chars; + XGlyphElt8 *elts; + XGlyphElt8 elts_local[NUM_ELT_LOCAL]; + FcBool glyphs_loaded; + int nelt; + int x, y; + + if (!nglyphs) + return; + + /* + * Load missing glyphs. Have to load them + * one at a time in case the font changes + */ + max = 0; + glyphs_loaded = FcFalse; + g = glyphs[0].glyph; + for (i = 0; i < nglyphs; i++) + { + XftFont *pub = glyphs[i].font; + XftFontInt *font = (XftFontInt *) pub; + g = glyphs[i].glyph; + if (g > max) + max = g; + nmissing = 0; + if (XftFontCheckGlyph (dpy, pub, FcTrue, g, missing, &nmissing)) + glyphs_loaded = FcTrue; + if (nmissing) + XftFontLoadGlyphs (dpy, pub, FcTrue, missing, nmissing); + if (!font->format) + goto bail1; + if (!font->glyphset) + goto bail1; + } + + /* + * See what encoding size is needed + */ + if (max < 0x100) + { + size = sizeof (char); + width = 1; + } + else if (max < 0x10000) + { + size = sizeof (unsigned short); + width = 2; + } + else + { + size = sizeof (unsigned int); + width = 4; + } + chars = char_local; + if (nglyphs * size > NUM_LOCAL) + { + chars = malloc (nglyphs * size); + if (!chars) + goto bail1; + } + char8 = (char *) chars; + char16 = (unsigned short *) chars; + char32 = (unsigned int *) chars; + + /* + * Compute the number of glyph elts needed + */ + nelt = 1; + firstFont = NULL; + for (i = 0; i < nglyphs; i++) + { + XftFont *pub = glyphs[i].font; + XftFontInt *font = (XftFontInt *) pub; + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + if (font->glyphs[g]) + { + firstFont = font; + break; + } + } + if (i == nglyphs || !firstFont) + goto bail2; + glyph = firstFont->glyphs[g]; + format = firstFont->format; + x = glyphs[i].x + glyph->metrics.xOff; + y = glyphs[i].y + glyph->metrics.yOff; + prevPublic = NULL; + while (++i < nglyphs) + { + XftFont *pub = glyphs[i].font; + XftFontInt *font = (XftFontInt *) pub; + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + /* + * check to see if the glyph is placed where it would + * fall using the normal spacing + */ + if ((glyph = font->glyphs[g])) + { + if (pub != prevPublic || x != glyphs[i].x || y != glyphs[i].y) + { + prevPublic = pub; + if (font->format != format) + format = XftPreferFormat (dpy, font->format, format); + x = glyphs[i].x; + y = glyphs[i].y; + ++nelt; + } + x += glyph->metrics.xOff; + y += glyph->metrics.yOff; + } + } + + elts = elts_local; + if (nelt > NUM_ELT_LOCAL) + { + elts = malloc (nelt * sizeof (XGlyphElt8)); + if (!elts) + goto bail2; + } + + /* + * Generate the list of glyph elts + */ + nelt = 0; + x = y = 0; + n = 0; + j = 0; + prevPublic = NULL; + for (i = 0; i < nglyphs; i++) + { + XftFont *pub = glyphs[i].font; + XftFontInt *font = (XftFontInt *) pub; + + g = glyphs[i].glyph; + /* Substitute default for non-existant glyphs */ + if (g >= font->num_glyphs || !font->glyphs[g]) + g = 0; + if ((glyph = font->glyphs[g])) + { + if (!i || pub != prevPublic || x != glyphs[i].x || y != glyphs[i].y) + { + if (n) + { + elts[nelt].nchars = n; + nelt++; + } + elts[nelt].glyphset = font->glyphset; + elts[nelt].chars = char8 + size * j; + elts[nelt].xOff = glyphs[i].x - x; + elts[nelt].yOff = glyphs[i].y - y; + prevPublic = pub; + x = glyphs[i].x; + y = glyphs[i].y; + n = 0; + } + switch (width) { + case 1: char8[j] = (char) g; break; + case 2: char16[j] = (unsigned short) g; break; + case 4: char32[j] = (unsigned int) g; break; + } + x += glyph->metrics.xOff; + y += glyph->metrics.yOff; + j++; + n++; + } + } + if (n) + { + elts[nelt].nchars = n; + nelt++; + } + switch (width) { + case 1: + XRenderCompositeText8 (dpy, op, src, dst, format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + elts, nelt); + break; + case 2: + XRenderCompositeText16 (dpy, op, src, dst, format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + (XGlyphElt16 *) elts, nelt); + break; + case 4: + XRenderCompositeText32 (dpy, op, src, dst, format, + srcx, srcy, glyphs[0].x, glyphs[0].y, + (XGlyphElt32 *) elts, nelt); + break; + } + + if (elts != elts_local) + free (elts); +bail2: + if (chars != char_local) + free (chars); +bail1: + if (glyphs_loaded) + for (i = 0; i < nglyphs; i++) + _XftFontManageMemory (dpy, glyphs[i].font); +} + +_X_EXPORT void +XftCharFontSpecRender (Display *dpy, + int op, + Picture src, + Picture dst, + int srcx, + int srcy, + _Xconst XftCharFontSpec *chars, + int len) +{ + XftGlyphFontSpec *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (XftGlyphFontSpec)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + { + glyphs[i].font = chars[i].font; + glyphs[i].glyph = XftCharIndex(dpy, glyphs[i].font, chars[i].ucs4); + glyphs[i].x = chars[i].x; + glyphs[i].y = chars[i].y; + } + + XftGlyphFontSpecRender (dpy, op, src, dst, srcx, srcy, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender8 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar16 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender16BE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, + (string[i*2]<<8) | string[i*2+1]); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender16LE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, + string[i*2] | (string[i*2+1]<<8)); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender32 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar32 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, string[i]); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender32BE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, + (string[i*4] << 24) | + (string[i*4+1] << 16) | + (string[i*4+2] << 8) | + (string[i*4+3])); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRender32LE (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, glyphs_local[NUM_LOCAL]; + int i; + + if (len <= NUM_LOCAL) + glyphs = glyphs_local; + else + { + glyphs = malloc (len * sizeof (FT_UInt)); + if (!glyphs) + return; + } + for (i = 0; i < len; i++) + glyphs[i] = XftCharIndex (dpy, pub, + (string[i*4]) | + (string[i*4+1] << 8) | + (string[i*4+2] << 16) | + (string[i*4+3] << 24)); + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, len); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRenderUtf8 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + int len) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf8ToUcs4 (string, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } + XftGlyphRender (dpy, op, src, pub, dst, + srcx, srcy, x, y, glyphs, i); + if (glyphs != glyphs_local) + free (glyphs); +} + +_X_EXPORT void +XftTextRenderUtf16 (Display *dpy, + int op, + Picture src, + XftFont *pub, + Picture dst, + int srcx, + int srcy, + int x, + int y, + _Xconst FcChar8 *string, + FcEndian endian, + int len) +{ + FT_UInt *glyphs, *glyphs_new, glyphs_local[NUM_LOCAL]; + FcChar32 ucs4; + int i; + int l; + int size; + + i = 0; + glyphs = glyphs_local; + size = NUM_LOCAL; + while (len && (l = FcUtf16ToUcs4 (string, endian, &ucs4, len)) > 0) + { + if (i == size) + { + glyphs_new = malloc (size * 2 * sizeof (FT_UInt)); + if (!glyphs_new) + { + if (glyphs != glyphs_local) + free (glyphs); + return; + } + memcpy (glyphs_new, glyphs, size * sizeof (FT_UInt)); + size *= 2; + if (glyphs != glyphs_local) + free (glyphs); + glyphs = glyphs_new; + } + glyphs[i++] = XftCharIndex (dpy, pub, ucs4); + string += l; + len -= l; + } + XftGlyphRender (dpy, PictOpOver, src, pub, dst, + srcx, srcy, x, y, glyphs, i); + if (glyphs != glyphs_local) + free (glyphs); +} diff --git a/libXft/src/xftstr.c b/libXft/src/xftstr.c new file mode 100644 index 000000000..a5733f4bb --- /dev/null +++ b/libXft/src/xftstr.c @@ -0,0 +1,35 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN int +_XftMatchSymbolic (XftSymbolic *s, int n, const char *name, int def) +{ + while (n--) + { + if (!FcStrCmpIgnoreCase ((FcChar8 *) s->name, (FcChar8 *) name)) + return s->value; + s++; + } + return def; +} diff --git a/libXft/src/xftswap.c b/libXft/src/xftswap.c new file mode 100644 index 000000000..942efdb31 --- /dev/null +++ b/libXft/src/xftswap.c @@ -0,0 +1,119 @@ +/* + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +_X_HIDDEN int +XftNativeByteOrder (void) +{ + int whichbyte = 1; + + if (*((char *) &whichbyte)) + return LSBFirst; + return MSBFirst; +} + +/* byte swap a 32-bit value */ +#define swapl(x, n) { \ + n = ((char *) (x))[0];\ + ((char *) (x))[0] = ((char *) (x))[3];\ + ((char *) (x))[3] = n;\ + n = ((char *) (x))[1];\ + ((char *) (x))[1] = ((char *) (x))[2];\ + ((char *) (x))[2] = n; } + +/* byte swap a short */ +#define swaps(x, n) { \ + n = ((char *) (x))[0];\ + ((char *) (x))[0] = ((char *) (x))[1];\ + ((char *) (x))[1] = n; } + +/* byte swap a three-byte unit */ +#define swapt(x, n) { \ + n = ((char *) (x))[0];\ + ((char *) (x))[0] = ((char *) (x))[2];\ + ((char *) (x))[2] = n; } + +_X_HIDDEN void +XftSwapCARD32 (CARD32 *data, int u) +{ + char n; + while (u--) + { + swapl (data, n); + data++; + } +} + +_X_HIDDEN void +XftSwapCARD24 (CARD8 *data, int width, int height) +{ + int units, u; + char n; + CARD8 *d; + + units = width / 3; + while (height--) + { + d = data; + data += width; + u = units; + while (u--) + { + swapt (d, n); + d += 3; + } + } +} + +_X_HIDDEN void +XftSwapCARD16 (CARD16 *data, int u) +{ + char n; + while (u--) + { + swaps (data, n); + data++; + } +} + +_X_HIDDEN void +XftSwapImage (XImage *image) +{ + switch (image->bits_per_pixel) { + case 32: + XftSwapCARD32 ((CARD32 *) image->data, + image->height * image->bytes_per_line >> 2); + break; + case 24: + XftSwapCARD24 ((CARD8 *) image->data, + image->bytes_per_line, + image->height); + break; + case 16: + XftSwapCARD16 ((CARD16 *) image->data, + image->height * image->bytes_per_line >> 1); + break; + default: + break; + } +} diff --git a/libXft/src/xftxlfd.c b/libXft/src/xftxlfd.c new file mode 100644 index 000000000..7c1991163 --- /dev/null +++ b/libXft/src/xftxlfd.c @@ -0,0 +1,177 @@ +/* + * Copyright © 2000 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#include "xftint.h" + +static XftSymbolic XftXlfdWeights[] = { + { "light", FC_WEIGHT_LIGHT }, + { "medium", FC_WEIGHT_MEDIUM }, + { "regular", FC_WEIGHT_MEDIUM }, + { "demibold", FC_WEIGHT_DEMIBOLD }, + { "bold", FC_WEIGHT_BOLD }, + { "black", FC_WEIGHT_BLACK }, +}; + +#define NUM_XLFD_WEIGHTS (sizeof XftXlfdWeights/sizeof XftXlfdWeights[0]) + +static XftSymbolic XftXlfdSlants[] = { + { "r", FC_SLANT_ROMAN }, + { "i", FC_SLANT_ITALIC }, + { "o", FC_SLANT_OBLIQUE }, +}; + +#define NUM_XLFD_SLANTS (sizeof XftXlfdSlants/sizeof XftXlfdSlants[0]) + +/* + * Cut out one XLFD field, placing it in 'save' and return + * the start of 'save' + */ +static char * +XftSplitStr (const char *field, char *save) +{ + char *s = save; + char c; + + while (*field) + { + if (*field == '-') + break; + c = *field++; + *save++ = c; + } + *save = 0; + return s; +} + +/* + * convert one XLFD numeric field. Return -1 if the field is '*' + */ + +static const char * +XftGetInt(const char *ptr, int *val) +{ + if (*ptr == '*') { + *val = -1; + ptr++; + } else + for (*val = 0; *ptr >= '0' && *ptr <= '9';) + *val = *val * 10 + *ptr++ - '0'; + if (*ptr == '-') + return ptr; + return (char *) 0; +} + +_X_EXPORT FcPattern * +XftXlfdParse (const char *xlfd_orig, FcBool ignore_scalable, FcBool complete) +{ + FcPattern *pat; + const char *xlfd = xlfd_orig; + const char *foundry; + const char *family; + const char *weight_name; + const char *slant; + const char *registry; + const char *encoding; + char *save; + int pixel; + int point; + int resx; + int resy; + int slant_value, weight_value; + double dpixel; + + if (*xlfd != '-') + return NULL; + if (!(xlfd = strchr (foundry = ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (family = ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (weight_name = ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (slant = ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (/* setwidth_name = */ ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (/* add_style_name = */ ++xlfd, '-'))) return NULL; + if (!(xlfd = XftGetInt (++xlfd, &pixel))) return NULL; + if (!(xlfd = XftGetInt (++xlfd, &point))) return NULL; + if (!(xlfd = XftGetInt (++xlfd, &resx))) return NULL; + if (!(xlfd = XftGetInt (++xlfd, &resy))) return NULL; + if (!(xlfd = strchr (/* spacing = */ ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (/* average_width = */ ++xlfd, '-'))) return NULL; + if (!(xlfd = strchr (registry = ++xlfd, '-'))) return NULL; + /* make sure no fields follow this one */ + if ((xlfd = strchr (encoding = ++xlfd, '-'))) return NULL; + + if (!pixel) + return NULL; + + pat = FcPatternCreate (); + if (!pat) + return NULL; + + save = (char *) malloc (strlen (foundry) + 1); + + if (!save) { + FcPatternDestroy (pat); + return NULL; + } + + if (!FcPatternAddString (pat, XFT_XLFD, (FcChar8 *) xlfd_orig)) goto bail; + + XftSplitStr (foundry, save); + if (save[0] && strcmp (save, "*") != 0) + if (!FcPatternAddString (pat, FC_FOUNDRY, (FcChar8 *) save)) goto bail; + + XftSplitStr (family, save); + if (save[0] && strcmp (save, "*") != 0) + if (!FcPatternAddString (pat, FC_FAMILY, (FcChar8 *) save)) goto bail; + + weight_value = _XftMatchSymbolic (XftXlfdWeights, NUM_XLFD_WEIGHTS, + XftSplitStr (weight_name, save), + FC_WEIGHT_MEDIUM); + if (!FcPatternAddInteger (pat, FC_WEIGHT, weight_value)) + goto bail; + + slant_value = _XftMatchSymbolic (XftXlfdSlants, NUM_XLFD_SLANTS, + XftSplitStr (slant, save), + FC_SLANT_ROMAN); + if (!FcPatternAddInteger (pat, FC_SLANT, slant_value)) + goto bail; + + dpixel = (double) pixel; + + if (point > 0) + { + if (!FcPatternAddDouble (pat, FC_SIZE, ((double) point) / 10.0)) goto bail; + if (pixel <= 0 && resy > 0) + { + dpixel = (double) point * (double) resy / 720.0; + } + } + + if (dpixel > 0) + if (!FcPatternAddDouble (pat, FC_PIXEL_SIZE, dpixel)) goto bail; + + free (save); + return pat; + +bail: + free (save); + FcPatternDestroy (pat); + return NULL; +} diff --git a/libXft/xft.pc.in b/libXft/xft.pc.in new file mode 100644 index 000000000..68d108990 --- /dev/null +++ b/libXft/xft.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Xft +Description: X FreeType library +Version: @VERSION@ +Requires: xproto +Requires.private: xrender, fontconfig, freetype2 +Cflags: -I${includedir} +Libs: -L${libdir} -lXft diff --git a/libXrender/.gitignore b/libXrender/.gitignore new file mode 100644 index 000000000..9ba386edc --- /dev/null +++ b/libXrender/.gitignore @@ -0,0 +1,78 @@ +# +# X.Org module default exclusion patterns +# The next section if for module specific patterns +# +# Do not edit the following section +# GNU Build System (Autotools) +aclocal.m4 +autom4te.cache/ +autoscan.log +ChangeLog +compile +config.guess +config.h +config.h.in +config.log +config-ml.in +config.py +config.status +config.status.lineno +config.sub +configure +configure.scan +depcomp +.deps/ +INSTALL +install-sh +.libs/ +libtool +libtool.m4 +ltmain.sh +lt~obsolete.m4 +ltoptions.m4 +ltsugar.m4 +ltversion.m4 +Makefile +Makefile.in +mdate-sh +missing +mkinstalldirs +*.pc +py-compile +stamp-h? +symlink-tree +texinfo.tex +ylwrap + +# Do not edit the following section +# Edit Compile Debug Document Distribute +*~ +*.[0-9] +*.[0-9]x +*.bak +*.bin +core +*.dll +*.exe +*-ISO*.bdf +*-JIS*.bdf +*-KOI8*.bdf +*.kld +*.ko +*.ko.cmd +*.lai +*.l[oa] +*.[oa] +*.obj +*.patch +*.so +*.pcf.gz +*.pdb +*.tar.bz2 +*.tar.gz +# +# Add & Override patterns for libXrender +# +# Edit the following section as needed +# For example, !report.pc overrides *.pc. See 'man gitignore' +# diff --git a/libXrender/AUTHORS b/libXrender/AUTHORS new file mode 100644 index 000000000..5f6c46a80 --- /dev/null +++ b/libXrender/AUTHORS @@ -0,0 +1,3 @@ +Keith Packard, of SuSE, XFree86 and Hewlett-Packard + +Noah Levitt, autotooling. diff --git a/libXrender/COPYING b/libXrender/COPYING new file mode 100644 index 000000000..0d548e5ea --- /dev/null +++ b/libXrender/COPYING @@ -0,0 +1,39 @@ + +Copyright © 2001,2003 Keith Packard + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of Keith Packard not be used in +advertising or publicity pertaining to distribution of the software without +specific, written prior permission. Keith Packard makes no +representations about the suitability of this software for any purpose. It +is provided "as is" without express or implied warranty. + +KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. + +Copyright © 2000 SuSE, Inc. + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation, and that the name of SuSE not be used in advertising or +publicity pertaining to distribution of the software without specific, +written prior permission. SuSE makes no representations about the +suitability of this software for any purpose. It is provided "as is" +without express or implied warranty. + +SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE +BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/libXrender/Makefile.am b/libXrender/Makefile.am new file mode 100644 index 000000000..01ef1721e --- /dev/null +++ b/libXrender/Makefile.am @@ -0,0 +1,39 @@ +# +# Copyright © 2003 Keith Packard, Noah Levitt +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of Keith Packard not be used in +# advertising or publicity pertaining to distribution of the software without +# specific, written prior permission. Keith Packard makes no +# representations about the suitability of this software for any purpose. It +# is provided "as is" without express or implied warranty. +# +# KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +# EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +# DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +# TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +# PERFORMANCE OF THIS SOFTWARE. + +SUBDIRS = src + +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = xrender.pc + +dist_doc_DATA = doc/libXrender.txt + +MAINTAINERCLEANFILES = ChangeLog INSTALL + +.PHONY: ChangeLog INSTALL + +INSTALL: + $(INSTALL_CMD) + +ChangeLog: + $(CHANGELOG_CMD) + +dist-hook: ChangeLog INSTALL diff --git a/libXrender/README b/libXrender/README new file mode 100644 index 000000000..c9d964a0f --- /dev/null +++ b/libXrender/README @@ -0,0 +1,25 @@ +libXrender - library for the Render Extension to the X11 protocol + +All questions regarding this software should be directed at the +Xorg mailing list: + + http://lists.freedesktop.org/mailman/listinfo/xorg + +Please submit bug reports to the Xorg bugzilla: + + https://bugs.freedesktop.org/enter_bug.cgi?product=xorg + +The master development code repository can be found at: + + git://anongit.freedesktop.org/git/xorg/lib/libXrender + + http://cgit.freedesktop.org/xorg/lib/libXrender + +For patch submission instructions, see: + + http://www.x.org/wiki/Development/Documentation/SubmittingPatches + +For more information on the git code manager, see: + + http://wiki.x.org/wiki/GitPage + diff --git a/libXrender/autogen.sh b/libXrender/autogen.sh new file mode 100644 index 000000000..904cd6746 --- /dev/null +++ b/libXrender/autogen.sh @@ -0,0 +1,12 @@ +#! /bin/sh + +srcdir=`dirname $0` +test -z "$srcdir" && srcdir=. + +ORIGDIR=`pwd` +cd $srcdir + +autoreconf -v --install || exit 1 +cd $ORIGDIR || exit $? + +$srcdir/configure --enable-maintainer-mode "$@" diff --git a/libXrender/configure.ac b/libXrender/configure.ac new file mode 100644 index 000000000..57ae66e37 --- /dev/null +++ b/libXrender/configure.ac @@ -0,0 +1,67 @@ +dnl +dnl Copyright © 2003 Keith Packard, Noah Levitt +dnl +dnl Permission to use, copy, modify, distribute, and sell this software and its +dnl documentation for any purpose is hereby granted without fee, provided that +dnl the above copyright notice appear in all copies and that both that +dnl copyright notice and this permission notice appear in supporting +dnl documentation, and that the name of Keith Packard not be used in +dnl advertising or publicity pertaining to distribution of the software without +dnl specific, written prior permission. Keith Packard makes no +dnl representations about the suitability of this software for any purpose. It +dnl is provided "as is" without express or implied warranty. +dnl +dnl KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, +dnl INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO +dnl EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR +dnl CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +dnl DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +dnl TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +dnl PERFORMANCE OF THIS SOFTWARE. +dnl +dnl Process this file with autoconf to create configure. + +AC_PREREQ([2.60]) + +dnl +dnl Version should match the current Render version. XRenderQueryVersion +dnl returns the version from render.h, NOT the version we set here. But we +dnl try to keep these the same. Note that the library has an extra +dnl digit in the version number to track changes which don't affect the +dnl protocol, so Xrender version l.n.m corresponds to protocol version l.n +dnl +AC_INIT(libXrender, + 0.9.6, + [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], + libXrender) +AM_INIT_AUTOMAKE([foreign dist-bzip2]) +AM_MAINTAINER_MODE + +# Require xorg-macros: XORG_DEFAULT_OPTIONS +m4_ifndef([XORG_MACROS_VERSION], + [m4_fatal([must install xorg-macros 1.3 or later before running autoconf/autogen])]) +XORG_MACROS_VERSION(1.3) +XORG_DEFAULT_OPTIONS +AM_CONFIG_HEADER(config.h) + +# Check for progs +AC_PROG_CC +AC_PROG_LIBTOOL + +# Check render configuration, strip extra digits from package version to +# find the required protocol version + +if test "$VERSION" = "" ; then + VERSION=$PACKAGE_VERSION; +fi +RENDER_VERSION=[`echo $VERSION | sed 's/^\([0-9][0-9]*\.[0-9][0-9]*\).*$/\1/'`] +AC_SUBST(RENDER_VERSION) +PKG_CHECK_MODULES(RENDER, x11 renderproto >= $RENDER_VERSION) +AC_SUBST(RENDER_CFLAGS) + +XORG_CHECK_MALLOC_ZERO + +AC_OUTPUT([Makefile + src/Makefile + xrender.pc]) + diff --git a/libXrender/doc/libXrender.txt b/libXrender/doc/libXrender.txt new file mode 100644 index 000000000..79af0345a --- /dev/null +++ b/libXrender/doc/libXrender.txt @@ -0,0 +1,600 @@ + The Xrender Library + Version 0.7 + 2002-11-6 + Keith Packard + keithp@xfree86.org + +1. Introduction + +The Xrender library is designed as a lightweight library interface to the +Render extension. This document describes how the library maps to the +protocol without duplicating the semantics described by that document. + +2. Data Types + +2.1 Primitive Types + +For resources represented as CARD32 or XID on the wire, Xrender exposes them +using an 'unsigned long' type as is the norm for 32-bit data objects in an +Xlib compatible API. + + typedef unsigned long Glyph; + typedef unsigned long GlyphSet; + typedef unsigned long Picture; + typedef unsigned long PictFormat; + +Glyphs are just CARD32 objects, while GlyphSet, Picture and PictFormat +values are XIDs. + + typedef int XFixed; + +Fixed point numbers buck the Xlib convention by being represented as ints. +Machines for which 'int' is smaller than 32 bits cannot support the Xrender +library. + +2.2 PictFormat descriptions. + +The definition of a PictFormat is exposed by two data structures: + + typedef struct { + short red; + short redMask; + short green; + short greenMask; + short blue; + short blueMask; + short alpha; + short alphaMask; + } XRenderDirectFormat; + + typedef struct { + PictFormat id; + int type; + int depth; + XRenderDirectFormat direct; + Colormap colormap; + } XRenderPictFormat; + +These serve both as a description of the available formats and as patterns +against which available formats are matched. + +2.3 Picture Attributes + +When creating or changing Picture objects, attributes are passed much as +they are for XCreateWindow/XChangeWindowAttributes. A structure capable of +holding all of the attributes has the relevant ones set and a bitmask passed +as a separate argument which marks the valid entries. + + typedef struct _XRenderPictureAttributes { + Bool repeat; + Picture alpha_map; + int alpha_x_origin; + int alpha_y_origin; + int clip_x_origin; + int clip_y_origin; + Pixmap clip_mask; + Bool graphics_exposures; + int subwindow_mode; + int poly_edge; + int poly_mode; + Atom dither; + Bool component_alpha; + } XRenderPictureAttributes; + +2.4 Colors + +The core protocol XColor type doesn't include an alpha component, so Xrender +has a separate type. + + typedef struct { + unsigned short red; + unsigned short green; + unsigned short blue; + unsigned short alpha; + } XRenderColor; + +2.5 Glyph Types + +Glyphs are stored in the server, so these definitions are passed from the +client to the library and on to the server as glyphs are rasterized and +transmitted over the wire. + + typedef struct _XGlyphInfo { + unsigned short width; + unsigned short height; + short x; + short y; + short xOff; + short yOff; + } XGlyphInfo; + +2.6 Glyph Rendering types + +Glyph rendering can either take a single string of glyph indices or an array +of one of the following structures. + + typedef struct _XGlyphElt8 { + GlyphSet glyphset; + _Xconst char *chars; + int nchars; + int xOff; + int yOff; + } XGlyphElt8; + + typedef struct _XGlyphElt16 { + GlyphSet glyphset; + _Xconst unsigned short *chars; + int nchars; + int xOff; + int yOff; + } XGlyphElt16; + + typedef struct _XGlyphElt32 { + GlyphSet glyphset; + _Xconst unsigned int *chars; + int nchars; + int xOff; + int yOff; + } XGlyphElt32; + +2.7 Geometric Types + +Geometric operations directly expose the available protocol datatypes + + typedef struct _XPointFixed { + XFixed x, y; + } XPointFixed; + + typedef struct _XLineFixed { + XPointFixed p1, p2; + } XLineFixed; + + typedef struct _XTriangle { + XPointFixed p1, p2, p3; + } XTriangle; + + typedef struct _XTrapezoid { + XFixed top, bottom; + XLineFixed left, right; + } XTrapezoid; + + typedef struct _XTransform { + XFixed matrix[3][3]; + } XTransform; + +2.8 Transformation Filters + +All of the filters are named simultaneously; Xrender provides no convenience +functions for dealing with them. + + typedef struct _XFilters { + int nfilter; + char **filter; + int nalias; + short *alias; + } XFilters; + +2.9 Index type PictFormat colors + +PictFormats of Index type advertise which colors will be used for drawing +through this type. + + typedef struct _XIndexValue { + unsigned long pixel; + unsigned short red, green, blue, alpha; + } XIndexValue; + + +3 Application Startup Functions + +3.1 Initialization functions + + Bool XRenderQueryExtension (Display *dpy, + int *event_basep, + int *error_basep) + +This function returns True if the Render extension is available on dpy. +event_basep and error_basep will be filled in with the first event and error +numbers used by the extension (note that Render currently uses no events). + + Status XRenderQueryVersion (Display *dpy, + int *major_versionp, + int *minor_versionp) + +XRenderQueryVersion returns zero if the Render extension is not present or +some error occurred while attempting to discover the current Render version +number. Otherwise, XRenderQueryVersion returns 1 and stores the version +number returned by the server in *major_versionp and *minor_versionp, which +will be less than or equal to the library version numbers RENDER_MAJOR and +RENDER_MINOR. + + Status XRenderQueryFormats (Display *dpy) + +XRenderQueryFormats returns 1 if it successfully fetches the available +PictFormat information from the X server, 0 otherwise. Applications needn't +invoke this function directly (hmm, perhaps it should be removed from the +external interfaces then). + +3.2 Subpixel Order + + int XRenderQuerySubpixelOrder (Display *dpy, int screen) + + Bool XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel) + +Applications interested in the geometry of the elements making up a single +pixel on the screen should use XRenderQuerySubpixelOrder and not cache the +return value. XRenderSetSubpixelOrder is used by the XRandR library to +update the value stored by Xrender when the subpixel order changes as a +result of screen reconfiguration. + +3.3 PictFormat matching + +Xrender provides these APIs to help locate appropriate PictFormats; they are +intended to work much like the Visual matching APIs in Xlib. The +application provides a specification including the necessary PictFormat +characteristics and Xrender returns a matching XRenderPictFormat structure +which describes the PictFormat. + + XRenderPictFormat * + XRenderFindFormat (Display *dpy, + unsigned long mask, + _Xconst XRenderPictFormat *templ, + int count) + + #define PictFormatID (1 << 0) + #define PictFormatType (1 << 1) + #define PictFormatDepth (1 << 2) + #define PictFormatRed (1 << 3) + #define PictFormatRedMask (1 << 4) + #define PictFormatGreen (1 << 5) + #define PictFormatGreenMask (1 << 6) + #define PictFormatBlue (1 << 7) + #define PictFormatBlueMask (1 << 8) + #define PictFormatAlpha (1 << 9) + #define PictFormatAlphaMask (1 << 10) + #define PictFormatColormap (1 << 11) + +XRenderFindFormat locates a PictFormat matching the characteristics provided +in the templ. Only elements whose associated bit in mask are compared. + + XRenderPictFormat * + XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual) + +Finds the PictFormat suitable for use with the specified visual. + + XRenderPictFormat * + XRenderFindStandardFormat (Display *dpy, + int format) + + #define PictStandardARGB32 0 + #define PictStandardRGB24 1 + #define PictStandardA8 2 + #define PictStandardA4 3 + #define PictStandardA1 4 + #define PictStandardNUM 5 + +As a convenience, this function locates PictFormats that coorespond to +commonly used formats. + + ARGB32 depth 32, bits 31-24 A, 23-16 R, 15-8 G, 7-0 B + RGB24 depth 24, bits 23-16 R, 15-8 G, 7-0 B + A8 depth 8, bits 7-0 A + A4 depth 4, bits 3-0 A + A1 depth 1, bits 0 A + +Any server supporting Render must have a PictFormat cooresponding to each of +these standard formats. + +3.4 Index type PictFormat color values + + XIndexValue * + XRenderQueryPictIndexValues(Display *dpy, + _Xconst XRenderPictFormat *format, + int *num) + +If format refers to an Index type PictFormat, XRenderQueryPictIndexValues +returns the set of pixel values and their associated colors used when +drawing to Pictures created with that format. Otherwise, +XRenderQueryPictIndexValues generates a BadMatch error. + +3.5 Querying available filters + + XFilters * + XRenderQueryFilters (Display *dpy, Drawable drawable); + +Filters are used with non-identity transformation matrices, this function +returns a datastructure identifying the available filters on display that +can be associated with pictures for the screen associated with drawable. + +Free this structure with XFree. + +4 Picture Functions + + Picture + XRenderCreatePicture (Display *dpy, + Drawable drawable, + _Xconst XRenderPictFormat *format, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes) + + #define CPRepeat (1 << 0) + #define CPAlphaMap (1 << 1) + #define CPAlphaXOrigin (1 << 2) + #define CPAlphaYOrigin (1 << 3) + #define CPClipXOrigin (1 << 4) + #define CPClipYOrigin (1 << 5) + #define CPClipMask (1 << 6) + #define CPGraphicsExposure (1 << 7) + #define CPSubwindowMode (1 << 8) + #define CPPolyEdge (1 << 9) + #define CPPolyMode (1 << 10) + #define CPDither (1 << 11) + #define CPComponentAlpha (1 << 12) + #define CPLastBit 11 + +Creates a picture for drawable in the specified format. Any values +specified in 'attributes' and 'valuemask' are used in place of the default +values. + + void + XRenderChangePicture (Display *dpy, + Picture picture, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes) + +Change values in picture to those specified by valuemask and attributes. + + + void + XRenderSetPictureClipRectangles (Display *dpy, + Picture picture, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n) + +Sets the clip mask in picture to the union of rects offset by +xOrigin/yOrigin. + + void + XRenderSetPictureClipRegion (Display *dpy, + Picture picture, + Region r) + +Sets the clip mask in picture to r. + + void + XRenderSetPictureTransform (Display *dpy, + Picture picture, + XTransform *transform) + +Sets the projective transformation matrix of picture to transform. + + void + XRenderFreePicture (Display *dpy, + Picture picture) + +Instructs the server to free picture. + +5 GlyphSet functions + + GlyphSet + XRenderCreateGlyphSet (Display *dpy, _Xconst XRenderPictFormat *format) + +Creates a glyphset, every glyph in the set will use PictFormat format. + + GlyphSet + XRenderReferenceGlyphSet (Display *dpy, GlyphSet existing) + +Creates a new GlyphSet ID which references an existing GlyphSet. The +two IDs refer to the same object so that changes using one ID will be +visible through the other ID. This is designed to allow multiple clients to +share the same GlyphSet so that it doesn't get destroyed when the first +client exits. + + void + XRenderFreeGlyphSet (Display *dpy, GlyphSet glyphset) + +Frees the glyphset ID. If no other GlyphSet IDs refer to the underlying +GlyphSet, it will be destroyed. + + void + XRenderAddGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + _Xconst XGlyphInfo *glyphs, + int nglyphs, + _Xconst char *images, + int nbyte_images) + +Add glyphs to glyphset. The images are packed together in Z-pixmap format +according to the depth of the PictFormat used in creating glyphset. + + void + XRenderFreeGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + int nglyphs) + +Free some glyphs from glyphset. + +6 Glyph Drawing Routines + +Xrender provides two parallel APIs for glyph rendering, a simple API which +accepts a single string similar to XDrawString and a more complex API which +accepts an array of XGlyphElt{8,16,32} structures, each of which includes a +glyphset, string and x/y offsets which parallel the XDrawText API. Xrender +also provides glyphs in three sizes, 8 16 and 32 bits. The simple API is +just a convenience for the user as both forms generate the same underlying +Render protocol. + +6.1 Simple single-string glyph drawing functions + +These are identical except for the format of the glyph ids. + + void + XRenderCompositeString8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst char *string, + int nchar) + + void + XRenderCompositeString16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned short *string, + int nchar) + + void + XRenderCompositeString32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned int *string, + int nchar) + +6.2 Complete glyph drawing functions + +As with the simple functions above, these differ only in the type of the +underlying glyph id storage type. + + void + XRenderCompositeText8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt8 *elts, + int nelt) + + void + XRenderCompositeText16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt16 *elts, + int nelt) + + void + XRenderCompositeText32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt32 *elts, + int nelt) + +7 Basic Graphics Functions + +These are the simplest graphics functions upon which the other functions are +conceptually built. + +7.1 Composite + +XRenderComposite exposes the RenderComposite protocol request directly. + + void + XRenderComposite (Display *dpy, + int op, + Picture src, + Picture mask, + Picture dst, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) + + +7.2 Rectangles + +These functions composite rectangles of the specified color, they differ +only in that XRenderFillRectangles draws more than one at a time. + + void + XRenderFillRectangle (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + int x, + int y, + unsigned int width, + unsigned int height) + + void + XRenderFillRectangles (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + _Xconst XRectangle *rectangles, + int n_rects) + +8 Geometric Objects + +All geometric drawing with Render is performed with sequences of trapezoids +or triangles; the client is responsible for breaking more complex figures +into these simple shapes. + +8.1 Trapezoids + + void + XRenderCompositeTrapezoids (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XTrapezoid *traps, + int ntrap) + +XRenderCompositeTrapezoids builds RenderTrapezoids requests to composite the +specified list of trapezoids to dst. XRenderCompositeTrapezoids will split +the list of trapezoids to build requests no larger than the maximum request +size supported by the server. This can create rendering artifacts as the +precompositing done by RenderTrapezoids when a maskFormat is specified +cannot span multiple requests. + +8.2 Triangles + +Render provides three different ways of encoding triangles on the wire, +Xrender exposes those with three separate triangle drawing routines. As +with trapezoids above, Xrender will split the arguments to fit requests into +the servers limits, but this may cause rendering artifacts. diff --git a/libXrender/include/X11/extensions/Xrender.h b/libXrender/include/X11/extensions/Xrender.h new file mode 100644 index 000000000..5248e99bd --- /dev/null +++ b/libXrender/include/X11/extensions/Xrender.h @@ -0,0 +1,528 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifndef _XRENDER_H_ +#define _XRENDER_H_ + +#include <X11/Xlib.h> +#include <X11/Xfuncproto.h> +#include <X11/Xosdefs.h> +#include <X11/Xutil.h> + +#include <X11/extensions/render.h> + +typedef struct { + short red; + short redMask; + short green; + short greenMask; + short blue; + short blueMask; + short alpha; + short alphaMask; +} XRenderDirectFormat; + +typedef struct { + PictFormat id; + int type; + int depth; + XRenderDirectFormat direct; + Colormap colormap; +} XRenderPictFormat; + +#define PictFormatID (1 << 0) +#define PictFormatType (1 << 1) +#define PictFormatDepth (1 << 2) +#define PictFormatRed (1 << 3) +#define PictFormatRedMask (1 << 4) +#define PictFormatGreen (1 << 5) +#define PictFormatGreenMask (1 << 6) +#define PictFormatBlue (1 << 7) +#define PictFormatBlueMask (1 << 8) +#define PictFormatAlpha (1 << 9) +#define PictFormatAlphaMask (1 << 10) +#define PictFormatColormap (1 << 11) + +typedef struct _XRenderPictureAttributes { + int repeat; + Picture alpha_map; + int alpha_x_origin; + int alpha_y_origin; + int clip_x_origin; + int clip_y_origin; + Pixmap clip_mask; + Bool graphics_exposures; + int subwindow_mode; + int poly_edge; + int poly_mode; + Atom dither; + Bool component_alpha; +} XRenderPictureAttributes; + +typedef struct { + unsigned short red; + unsigned short green; + unsigned short blue; + unsigned short alpha; +} XRenderColor; + +typedef struct _XGlyphInfo { + unsigned short width; + unsigned short height; + short x; + short y; + short xOff; + short yOff; +} XGlyphInfo; + +typedef struct _XGlyphElt8 { + GlyphSet glyphset; + _Xconst char *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt8; + +typedef struct _XGlyphElt16 { + GlyphSet glyphset; + _Xconst unsigned short *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt16; + +typedef struct _XGlyphElt32 { + GlyphSet glyphset; + _Xconst unsigned int *chars; + int nchars; + int xOff; + int yOff; +} XGlyphElt32; + +typedef double XDouble; + +typedef struct _XPointDouble { + XDouble x, y; +} XPointDouble; + +#define XDoubleToFixed(f) ((XFixed) ((f) * 65536)) +#define XFixedToDouble(f) (((XDouble) (f)) / 65536) + +typedef int XFixed; + +typedef struct _XPointFixed { + XFixed x, y; +} XPointFixed; + +typedef struct _XLineFixed { + XPointFixed p1, p2; +} XLineFixed; + +typedef struct _XTriangle { + XPointFixed p1, p2, p3; +} XTriangle; + +typedef struct _XCircle { + XFixed x; + XFixed y; + XFixed radius; +} XCircle; + +typedef struct _XTrapezoid { + XFixed top, bottom; + XLineFixed left, right; +} XTrapezoid; + +typedef struct _XTransform { + XFixed matrix[3][3]; +} XTransform; + +typedef struct _XFilters { + int nfilter; + char **filter; + int nalias; + short *alias; +} XFilters; + +typedef struct _XIndexValue { + unsigned long pixel; + unsigned short red, green, blue, alpha; +} XIndexValue; + +typedef struct _XAnimCursor { + Cursor cursor; + unsigned long delay; +} XAnimCursor; + +typedef struct _XSpanFix { + XFixed left, right, y; +} XSpanFix; + +typedef struct _XTrap { + XSpanFix top, bottom; +} XTrap; + +typedef struct _XLinearGradient { + XPointFixed p1; + XPointFixed p2; +} XLinearGradient; + +typedef struct _XRadialGradient { + XCircle inner; + XCircle outer; +} XRadialGradient; + +typedef struct _XConicalGradient { + XPointFixed center; + XFixed angle; /* in degrees */ +} XConicalGradient; + +_XFUNCPROTOBEGIN + +Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep); + +Status XRenderQueryVersion (Display *dpy, + int *major_versionp, + int *minor_versionp); + +Status XRenderQueryFormats (Display *dpy); + +int XRenderQuerySubpixelOrder (Display *dpy, int screen); + +Bool XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel); + +XRenderPictFormat * +XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual); + +XRenderPictFormat * +XRenderFindFormat (Display *dpy, + unsigned long mask, + _Xconst XRenderPictFormat *templ, + int count); + +#define PictStandardARGB32 0 +#define PictStandardRGB24 1 +#define PictStandardA8 2 +#define PictStandardA4 3 +#define PictStandardA1 4 +#define PictStandardNUM 5 + +XRenderPictFormat * +XRenderFindStandardFormat (Display *dpy, + int format); + +XIndexValue * +XRenderQueryPictIndexValues(Display *dpy, + _Xconst XRenderPictFormat *format, + int *num); + +Picture +XRenderCreatePicture (Display *dpy, + Drawable drawable, + _Xconst XRenderPictFormat *format, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes); + +void +XRenderChangePicture (Display *dpy, + Picture picture, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes); + +void +XRenderSetPictureClipRectangles (Display *dpy, + Picture picture, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n); + +void +XRenderSetPictureClipRegion (Display *dpy, + Picture picture, + Region r); + +void +XRenderSetPictureTransform (Display *dpy, + Picture picture, + XTransform *transform); + +void +XRenderFreePicture (Display *dpy, + Picture picture); + +void +XRenderComposite (Display *dpy, + int op, + Picture src, + Picture mask, + Picture dst, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height); + +GlyphSet +XRenderCreateGlyphSet (Display *dpy, _Xconst XRenderPictFormat *format); + +GlyphSet +XRenderReferenceGlyphSet (Display *dpy, GlyphSet existing); + +void +XRenderFreeGlyphSet (Display *dpy, GlyphSet glyphset); + +void +XRenderAddGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + _Xconst XGlyphInfo *glyphs, + int nglyphs, + _Xconst char *images, + int nbyte_images); + +void +XRenderFreeGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + int nglyphs); + +void +XRenderCompositeString8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst char *string, + int nchar); + +void +XRenderCompositeString16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned short *string, + int nchar); + +void +XRenderCompositeString32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned int *string, + int nchar); + +void +XRenderCompositeText8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt8 *elts, + int nelt); + +void +XRenderCompositeText16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt16 *elts, + int nelt); + +void +XRenderCompositeText32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt32 *elts, + int nelt); + +void +XRenderFillRectangle (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + int x, + int y, + unsigned int width, + unsigned int height); + +void +XRenderFillRectangles (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + _Xconst XRectangle *rectangles, + int n_rects); + +void +XRenderCompositeTrapezoids (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XTrapezoid *traps, + int ntrap); + +void +XRenderCompositeTriangles (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XTriangle *triangles, + int ntriangle); + +void +XRenderCompositeTriStrip (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XPointFixed *points, + int npoint); + +void +XRenderCompositeTriFan (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XPointFixed *points, + int npoint); + +void +XRenderCompositeDoublePoly (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XPointDouble *fpoints, + int npoints, + int winding); +Status +XRenderParseColor(Display *dpy, + char *spec, + XRenderColor *def); + +Cursor +XRenderCreateCursor (Display *dpy, + Picture source, + unsigned int x, + unsigned int y); + +XFilters * +XRenderQueryFilters (Display *dpy, Drawable drawable); + +void +XRenderSetPictureFilter (Display *dpy, + Picture picture, + const char *filter, + XFixed *params, + int nparams); + +Cursor +XRenderCreateAnimCursor (Display *dpy, + int ncursor, + XAnimCursor *cursors); + + +void +XRenderAddTraps (Display *dpy, + Picture picture, + int xOff, + int yOff, + _Xconst XTrap *traps, + int ntrap); + +Picture XRenderCreateSolidFill (Display *dpy, + const XRenderColor *color); + +Picture XRenderCreateLinearGradient (Display *dpy, + const XLinearGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nstops); + +Picture XRenderCreateRadialGradient (Display *dpy, + const XRadialGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nstops); + +Picture XRenderCreateConicalGradient (Display *dpy, + const XConicalGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nstops); + +_XFUNCPROTOEND + +#endif /* _XRENDER_H_ */ diff --git a/libXrender/src/AddTrap.c b/libXrender/src/AddTrap.c new file mode 100644 index 000000000..421463def --- /dev/null +++ b/libXrender/src/AddTrap.c @@ -0,0 +1,68 @@ +/* + * Copyright © 2004 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +#define NLOCAL 256 + +void +XRenderAddTraps (Display *dpy, + Picture picture, + int xOff, + int yOff, + _Xconst XTrap *traps, + int ntrap) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderAddTrapsReq *req; + int n; + long len; + unsigned long max_req = dpy->bigreq_size ? dpy->bigreq_size : dpy->max_request_size; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + while (ntrap) + { + GetReq(RenderAddTraps, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderAddTraps; + req->picture = picture; + req->xOff = xOff; + req->yOff = yOff; + n = ntrap; + len = ((long) n) * (SIZEOF (xTrap) >> 2); + if (len > (max_req - req->length)) { + n = (max_req - req->length) / (SIZEOF (xTrap) >> 2); + len = ((long)n) * (SIZEOF (xTrap) >> 2); + } + SetReqLen (req, len, len); + len <<= 2; + DataInt32 (dpy, (int *) traps, len); + ntrap -= n; + traps += n; + } + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/libXrender/src/Color.c b/libXrender/src/Color.c new file mode 100644 index 000000000..4f934f038 --- /dev/null +++ b/libXrender/src/Color.c @@ -0,0 +1,92 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +Status +XRenderParseColor(Display *dpy, char *spec, XRenderColor *def) +{ + + if (!strncmp (spec, "rgba:", 5)) + { + unsigned short elements[4]; + unsigned short *pShort; + int i, n; + char c; + + spec += 5; + /* + * Attempt to parse the value portion. + */ + pShort = elements; + for (i = 0; i < 4; i++, pShort++, spec++) { + n = 0; + *pShort = 0; + while (*spec != '/' && *spec != '\0') { + if (++n > 4) { + return 0; + } + c = *spec++; + *pShort <<= 4; + if (c >= '0' && c <= '9') + *pShort |= c - '0'; + /* assume string in lowercase + else if (c >= 'A' && c <= 'F') + *pShort |= c - ('A' - 10); + */ + else if (c >= 'a' && c <= 'f') + *pShort |= c - ('a' - 10); + else return 0; + } + if (n == 0) + return 0; + if (n < 4) { + *pShort = ((unsigned long)*pShort * 0xFFFF) / ((1 << n*4) - 1); + } + } + def->red = elements[0]; + def->green = elements[1]; + def->blue = elements[2]; + def->alpha = elements[3]; + } + else + { + XColor coreColor; + Colormap colormap; + + colormap = DefaultColormap (dpy, DefaultScreen (dpy)); + if (!XParseColor (dpy, colormap, spec, &coreColor)) + return 0; + def->red = coreColor.red; + def->green = coreColor.green; + def->blue = coreColor.blue; + def->alpha = 0xffff; + } + def->red = (def->red * def->alpha) / 65535; + def->green = (def->green * def->alpha) / 65535; + def->blue = (def->blue * def->alpha) / 65535; + return 1; +} diff --git a/libXrender/src/Composite.c b/libXrender/src/Composite.c new file mode 100644 index 000000000..07151ded9 --- /dev/null +++ b/libXrender/src/Composite.c @@ -0,0 +1,67 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +void +XRenderComposite (Display *dpy, + int op, + Picture src, + Picture mask, + Picture dst, + int src_x, + int src_y, + int mask_x, + int mask_y, + int dst_x, + int dst_y, + unsigned int width, + unsigned int height) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeReq *req; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderComposite, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderComposite; + req->op = (CARD8) op; + req->src = src; + req->mask = mask; + req->dst = dst; + req->xSrc = src_x; + req->ySrc = src_y; + req->xMask = mask_x; + req->yMask = mask_y; + req->xDst = dst_x; + req->yDst = dst_y; + req->width = width; + req->height = height; + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/libXrender/src/Cursor.c b/libXrender/src/Cursor.c new file mode 100644 index 000000000..2679a9eaa --- /dev/null +++ b/libXrender/src/Cursor.c @@ -0,0 +1,79 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +Cursor +XRenderCreateCursor (Display *dpy, + Picture source, + unsigned int x, + unsigned int y) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Cursor cid; + xRenderCreateCursorReq *req; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateCursor, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateCursor; + req->cid = cid = XAllocID (dpy); + req->src = source; + req->x = x; + req->y = y; + + UnlockDisplay(dpy); + SyncHandle(); + return cid; +} + +Cursor +XRenderCreateAnimCursor (Display *dpy, + int ncursor, + XAnimCursor *cursors) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Cursor cid; + xRenderCreateAnimCursorReq *req; + long len; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateAnimCursor, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateAnimCursor; + req->cid = cid = XAllocID (dpy); + + len = (long) ncursor * SIZEOF (xAnimCursorElt) >> 2; + SetReqLen (req, len, len); + len <<= 2; + Data32 (dpy, (long *) cursors, len); + + UnlockDisplay(dpy); + SyncHandle(); + return cid; +} diff --git a/libXrender/src/FillRect.c b/libXrender/src/FillRect.c new file mode 100644 index 000000000..319c35d57 --- /dev/null +++ b/libXrender/src/FillRect.c @@ -0,0 +1,106 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +/* precompute the maximum size of batching request allowed */ + +#define size (SIZEOF(xRenderFillRectanglesReq) + FRCTSPERBATCH * SIZEOF(xRectangle)) + +void +XRenderFillRectangle (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + int x, + int y, + unsigned int width, + unsigned int height) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRectangle *rect; + xRenderFillRectanglesReq *req; +#ifdef MUSTCOPY + xRectangle rectdata; + long len = SIZEOF(xRectangle); + + rect = &rectdata; +#endif /* MUSTCOPY */ + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + req = (xRenderFillRectanglesReq *) dpy->last_req; + /* if same as previous request, with same drawable, batch requests */ + if (req->reqType == info->codes->major_opcode && + req->renderReqType == X_RenderFillRectangles && + req->op == op && + req->dst == dst && + req->color.red == color->red && + req->color.green == color->green && + req->color.blue == color->blue && + req->color.alpha == color->alpha && + dpy->bufptr + SIZEOF(xRectangle) <= dpy->bufmax && + (char *)dpy->bufptr - (char *)req < size) + { + req->length += SIZEOF(xRectangle) >> 2; +#ifndef MUSTCOPY + rect = (xRectangle *) dpy->bufptr; + dpy->bufptr += SIZEOF(xRectangle); +#endif /* not MUSTCOPY */ + } + else + { + GetReqExtra(RenderFillRectangles, SIZEOF(xRectangle), req); + + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderFillRectangles; + req->op = op; + req->dst = dst; + req->color.red = color->red; + req->color.green = color->green; + req->color.blue = color->blue; + req->color.alpha = color->alpha; + +#ifdef MUSTCOPY + dpy->bufptr -= SIZEOF(xRectangle); +#else + rect = (xRectangle *) NEXTPTR(req,xRenderFillRectanglesReq); +#endif /* MUSTCOPY */ + } + rect->x = x; + rect->y = y; + rect->width = width; + rect->height = height; + +#ifdef MUSTCOPY + Data (dpy, (char *) rect, len); +#endif /* MUSTCOPY */ + UnlockDisplay(dpy); + SyncHandle(); +} + diff --git a/libXrender/src/FillRects.c b/libXrender/src/FillRects.c new file mode 100644 index 000000000..517eeb0dc --- /dev/null +++ b/libXrender/src/FillRects.c @@ -0,0 +1,79 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +/* precompute the maximum size of batching request allowed */ + +#define size (SIZEOF(xRenderFillRectanglesReq) + FRCTSPERBATCH * SIZEOF(xRectangle)) + +void +XRenderFillRectangles (Display *dpy, + int op, + Picture dst, + _Xconst XRenderColor *color, + _Xconst XRectangle *rectangles, + int n_rects) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderFillRectanglesReq *req; + long len; + int n; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + while (n_rects) + { + GetReq(RenderFillRectangles, req); + + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderFillRectangles; + req->op = op; + req->dst = dst; + req->color.red = color->red; + req->color.green = color->green; + req->color.blue = color->blue; + req->color.alpha = color->alpha; + + n = n_rects; + len = ((long)n) << 1; + if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) + { + n = (dpy->max_request_size - req->length) >> 1; + len = ((long)n) << 1; + } + SetReqLen(req, len, len); + len <<= 2; /* watch out for macros... */ + Data16 (dpy, (short *) rectangles, len); + n_rects -= n; + rectangles += n; + } + UnlockDisplay(dpy); + SyncHandle(); +} + diff --git a/libXrender/src/Filter.c b/libXrender/src/Filter.c new file mode 100644 index 000000000..3ac660a40 --- /dev/null +++ b/libXrender/src/Filter.c @@ -0,0 +1,153 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +XFilters * +XRenderQueryFilters (Display *dpy, Drawable drawable) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + XRenderInfo *xri; + xRenderQueryFiltersReq *req; + xRenderQueryFiltersReply rep; + XFilters *filters; + char *name; + char len; + int i; + long nbytes, nbytesAlias, nbytesName; + + if (!RenderHasExtension (info)) + return NULL; + + if (!XRenderQueryFormats (dpy)) + return NULL; + + xri = info->info; + if (xri->minor_version < 6) + return NULL; + + LockDisplay (dpy); + GetReq (RenderQueryFilters, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderQueryFilters; + req->drawable = drawable; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return NULL; + } + /* + * Compute total number of bytes for filter names + */ + nbytes = (long)rep.length << 2; + nbytesAlias = rep.numAliases * 2; + if (rep.numAliases & 1) + nbytesAlias += 2; + nbytesName = nbytes - nbytesAlias; + + /* + * Allocate one giant block for the whole data structure + */ + filters = Xmalloc (sizeof (XFilters) + + rep.numFilters * sizeof (char *) + + rep.numAliases * sizeof (short) + + nbytesName); + + if (!filters) + { + _XEatData (dpy, (unsigned long) rep.length << 2); + UnlockDisplay (dpy); + SyncHandle (); + return NULL; + } + + /* + * Layout: + * XFilters + * numFilters char * pointers to filter names + * numAliases short alias values + * nbytesName char strings + */ + + filters->nfilter = rep.numFilters; + filters->nalias = rep.numAliases; + filters->filter = (char **) (filters + 1); + filters->alias = (short *) (filters->filter + rep.numFilters); + name = (char *) (filters->alias + rep.numAliases); + + /* + * Read the filter aliases + */ + _XRead16Pad (dpy, filters->alias, 2 * rep.numAliases); + + /* + * Read the filter names + */ + for (i = 0; i < rep.numFilters; i++) + { + int l; + _XRead (dpy, &len, 1); + l = len & 0xff; + filters->filter[i] = name; + _XRead (dpy, name, l); + name[l] = '\0'; + name += l + 1; + } + i = name - (char *) (filters->alias + rep.numAliases); + + if (i & 3) + _XEatData (dpy, 4 - (i & 3)); + + UnlockDisplay (dpy); + SyncHandle (); + return filters; +} + +void +XRenderSetPictureFilter (Display *dpy, + Picture picture, + const char *filter, + XFixed *params, + int nparams) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderSetPictureFilterReq *req; + int nbytes = strlen (filter); + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderSetPictureFilter, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderSetPictureFilter; + req->picture = picture; + req->nbytes = nbytes; + req->length += ((nbytes + 3) >> 2) + nparams; + Data (dpy, filter, nbytes); + Data (dpy, (_Xconst char *)params, nparams << 2); + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/libXrender/src/Glyph.c b/libXrender/src/Glyph.c new file mode 100644 index 000000000..894bb77f2 --- /dev/null +++ b/libXrender/src/Glyph.c @@ -0,0 +1,712 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +GlyphSet +XRenderCreateGlyphSet (Display *dpy, _Xconst XRenderPictFormat *format) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + GlyphSet gsid; + xRenderCreateGlyphSetReq *req; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateGlyphSet, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateGlyphSet; + req->gsid = gsid = XAllocID(dpy); + req->format = format->id; + UnlockDisplay(dpy); + SyncHandle(); + return gsid; +} + +GlyphSet +XRenderReferenceGlyphSet (Display *dpy, GlyphSet existing) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + GlyphSet gsid; + xRenderReferenceGlyphSetReq *req; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderReferenceGlyphSet, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderReferenceGlyphSet; + req->gsid = gsid = XAllocID(dpy); + req->existing = existing; + UnlockDisplay(dpy); + SyncHandle(); + return gsid; +} + +void +XRenderFreeGlyphSet (Display *dpy, GlyphSet glyphset) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderFreeGlyphSetReq *req; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderFreeGlyphSet, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderFreeGlyphSet; + req->glyphset = glyphset; + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderAddGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + _Xconst XGlyphInfo *glyphs, + int nglyphs, + _Xconst char *images, + int nbyte_images) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderAddGlyphsReq *req; + long len; + + if (nbyte_images & 3) + nbyte_images += 4 - (nbyte_images & 3); + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderAddGlyphs, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderAddGlyphs; + req->glyphset = glyphset; + req->nglyphs = nglyphs; + len = (nglyphs * (SIZEOF (xGlyphInfo) + 4) + nbyte_images) >> 2; + SetReqLen(req, len, len); + Data32 (dpy, (long *) gids, nglyphs * 4); + Data16 (dpy, (short *) glyphs, nglyphs * SIZEOF (xGlyphInfo)); + Data (dpy, images, nbyte_images); + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderFreeGlyphs (Display *dpy, + GlyphSet glyphset, + _Xconst Glyph *gids, + int nglyphs) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderFreeGlyphsReq *req; + long len; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderFreeGlyphs, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderFreeGlyphs; + req->glyphset = glyphset; + len = nglyphs; + SetReqLen(req, len, len); + len <<= 2; + Data32 (dpy, (long *) gids, len); + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeString8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst char *string, + int nchar) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs8Req *req; + long len; + xGlyphElt *elt; + int nbytes; + + if (!nchar) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + GetReq(RenderCompositeGlyphs8, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs8; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + + /* + * xGlyphElt must be aligned on a 32-bit boundary; this is + * easily done by filling no more than 252 glyphs in each + * bucket + */ + +#define MAX_8 252 + + len = SIZEOF(xGlyphElt) * ((nchar + MAX_8-1) / MAX_8) + nchar; + + req->length += (len + 3)>>2; /* convert to number of 32-bit words */ + + /* + * If the entire request does not fit into the remaining space in the + * buffer, flush the buffer first. + */ + + if (dpy->bufptr + len > dpy->bufmax) + _XFlush (dpy); + + while(nchar > MAX_8) + { + nbytes = MAX_8 + SIZEOF(xGlyphElt); + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = MAX_8; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + memcpy ((char *) (elt + 1), string, MAX_8); + nchar = nchar - MAX_8; + string += MAX_8; + } + + if (nchar) + { + nbytes = (nchar + SIZEOF(xGlyphElt) + 3) & ~3; + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = nchar; + elt->deltax = xDst; + elt->deltay = yDst; + memcpy ((char *) (elt + 1), string, nchar); + } +#undef MAX_8 + + UnlockDisplay(dpy); + SyncHandle(); +} +void +XRenderCompositeString16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned short *string, + int nchar) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs8Req *req; + long len; + xGlyphElt *elt; + int nbytes; + + if (!nchar) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + GetReq(RenderCompositeGlyphs16, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs16; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + +#define MAX_16 254 + + len = SIZEOF(xGlyphElt) * ((nchar + MAX_16-1) / MAX_16) + nchar * 2; + + req->length += (len + 3)>>2; /* convert to number of 32-bit words */ + + /* + * If the entire request does not fit into the remaining space in the + * buffer, flush the buffer first. + */ + + if (dpy->bufptr + len > dpy->bufmax) + _XFlush (dpy); + + while(nchar > MAX_16) + { + nbytes = MAX_16 * 2 + SIZEOF(xGlyphElt); + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = MAX_16; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + memcpy ((char *) (elt + 1), (char *) string, MAX_16 * 2); + nchar = nchar - MAX_16; + string += MAX_16; + } + + if (nchar) + { + nbytes = (nchar * 2 + SIZEOF(xGlyphElt) + 3) & ~3; + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = nchar; + elt->deltax = xDst; + elt->deltay = yDst; + memcpy ((char *) (elt + 1), (char *) string, nchar * 2); + } +#undef MAX_16 + + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeString32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + GlyphSet glyphset, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst unsigned int *string, + int nchar) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs8Req *req; + long len; + xGlyphElt *elt; + int nbytes; + + if (!nchar) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + GetReq(RenderCompositeGlyphs32, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs32; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + +#define MAX_32 254 + + len = SIZEOF(xGlyphElt) * ((nchar + MAX_32-1) / MAX_32) + nchar * 4; + + req->length += (len + 3)>>2; /* convert to number of 32-bit words */ + + /* + * If the entire request does not fit into the remaining space in the + * buffer, flush the buffer first. + */ + + if (dpy->bufptr + len > dpy->bufmax) + _XFlush (dpy); + + while(nchar > MAX_32) + { + nbytes = MAX_32 * 4 + SIZEOF(xGlyphElt); + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = MAX_32; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + memcpy ((char *) (elt + 1), (char *) string, MAX_32 * 4); + nchar = nchar - MAX_32; + string += MAX_32; + } + + if (nchar) + { + nbytes = nchar * 4 + SIZEOF(xGlyphElt); + BufAlloc (xGlyphElt *, elt, nbytes); + elt->len = nchar; + elt->deltax = xDst; + elt->deltay = yDst; + memcpy ((char *) (elt + 1), (char *) string, nchar * 4); + } +#undef MAX_32 + + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeText8 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt8 *elts, + int nelt) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs8Req *req; + GlyphSet glyphset; + long len; + long elen; + xGlyphElt *elt; + int i; + _Xconst char *chars; + int nchars; + + if (!nelt) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + GetReq(RenderCompositeGlyphs8, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs8; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = elts[0].glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + + /* + * Compute the space necessary + */ + len = 0; + +#define MAX_8 252 + + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Check for glyphset change + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + len += (SIZEOF (xGlyphElt) + 4) >> 2; + } + nchars = elts[i].nchars; + /* + * xGlyphElt must be aligned on a 32-bit boundary; this is + * easily done by filling no more than 252 glyphs in each + * bucket + */ + elen = SIZEOF(xGlyphElt) * ((nchars + MAX_8-1) / MAX_8) + nchars; + len += (elen + 3) >> 2; + } + + req->length += len; + + /* + * Send the glyphs + */ + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Switch glyphsets + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + BufAlloc (xGlyphElt *, elt, SIZEOF (xGlyphElt)); + elt->len = 0xff; + elt->deltax = 0; + elt->deltay = 0; + Data32(dpy, &glyphset, 4); + } + nchars = elts[i].nchars; + xDst = elts[i].xOff; + yDst = elts[i].yOff; + chars = elts[i].chars; + while (nchars) + { + int this_chars = nchars > MAX_8 ? MAX_8 : nchars; + + BufAlloc (xGlyphElt *, elt, SIZEOF(xGlyphElt)) + elt->len = this_chars; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + Data (dpy, chars, this_chars); + nchars -= this_chars; + chars += this_chars; + } + } +#undef MAX_8 + + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeText16 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt16 *elts, + int nelt) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs16Req *req; + GlyphSet glyphset; + long len; + long elen; + xGlyphElt *elt; + int i; + _Xconst unsigned short *chars; + int nchars; + + if (!nelt) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + GetReq(RenderCompositeGlyphs16, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs16; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = elts[0].glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + + /* + * Compute the space necessary + */ + len = 0; + +#define MAX_16 254 + + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Check for glyphset change + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + len += (SIZEOF (xGlyphElt) + 4) >> 2; + } + nchars = elts[i].nchars; + /* + * xGlyphElt must be aligned on a 32-bit boundary; this is + * easily done by filling no more than 254 glyphs in each + * bucket + */ + elen = SIZEOF(xGlyphElt) * ((nchars + MAX_16-1) / MAX_16) + nchars * 2; + len += (elen + 3) >> 2; + } + + req->length += len; + + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Switch glyphsets + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + BufAlloc (xGlyphElt *, elt, SIZEOF (xGlyphElt)); + elt->len = 0xff; + elt->deltax = 0; + elt->deltay = 0; + Data32(dpy, &glyphset, 4); + } + nchars = elts[i].nchars; + xDst = elts[i].xOff; + yDst = elts[i].yOff; + chars = elts[i].chars; + while (nchars) + { + int this_chars = nchars > MAX_16 ? MAX_16 : nchars; + int this_bytes = this_chars * 2; + + BufAlloc (xGlyphElt *, elt, SIZEOF(xGlyphElt)) + elt->len = this_chars; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + Data16 (dpy, chars, this_bytes); + nchars -= this_chars; + chars += this_chars; + } + } +#undef MAX_16 + + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeText32 (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XGlyphElt32 *elts, + int nelt) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderCompositeGlyphs32Req *req; + GlyphSet glyphset; + long len; + long elen; + xGlyphElt *elt; + int i; + _Xconst unsigned int *chars; + int nchars; + + if (!nelt) + return; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + + + GetReq(RenderCompositeGlyphs32, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCompositeGlyphs32; + req->op = op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : None; + req->glyphset = elts[0].glyphset; + req->xSrc = xSrc; + req->ySrc = ySrc; + + /* + * Compute the space necessary + */ + len = 0; + +#define MAX_32 254 + + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Check for glyphset change + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + len += (SIZEOF (xGlyphElt) + 4) >> 2; + } + nchars = elts[i].nchars; + elen = SIZEOF(xGlyphElt) * ((nchars + MAX_32) / MAX_32) + nchars *4; + len += (elen + 3) >> 2; + } + + req->length += len; + + glyphset = elts[0].glyphset; + for (i = 0; i < nelt; i++) + { + /* + * Switch glyphsets + */ + if (elts[i].glyphset != glyphset) + { + glyphset = elts[i].glyphset; + BufAlloc (xGlyphElt *, elt, SIZEOF (xGlyphElt)); + elt->len = 0xff; + elt->deltax = 0; + elt->deltay = 0; + Data32(dpy, &glyphset, 4); + } + nchars = elts[i].nchars; + xDst = elts[i].xOff; + yDst = elts[i].yOff; + chars = elts[i].chars; + while (nchars) + { + int this_chars = nchars > MAX_32 ? MAX_32 : nchars; + int this_bytes = this_chars * 4; + BufAlloc (xGlyphElt *, elt, SIZEOF(xGlyphElt)) + elt->len = this_chars; + elt->deltax = xDst; + elt->deltay = yDst; + xDst = 0; + yDst = 0; + DataInt32 (dpy, chars, this_bytes); + nchars -= this_chars; + chars += this_chars; + } + } +#undef MAX_32 + + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/libXrender/src/Makefile.am b/libXrender/src/Makefile.am new file mode 100644 index 000000000..7474b43a8 --- /dev/null +++ b/libXrender/src/Makefile.am @@ -0,0 +1,27 @@ +AM_CFLAGS = $(CWARNFLAGS) $(RENDER_CFLAGS) $(MALLOC_ZERO_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/include/X11/extensions + +lib_LTLIBRARIES = libXrender.la + +libXrender_la_SOURCES = AddTrap.c \ + Color.c \ + Composite.c \ + Cursor.c \ + FillRect.c \ + FillRects.c \ + Filter.c \ + Glyph.c \ + Picture.c \ + Poly.c \ + Trap.c \ + Tri.c \ + Xrender.c \ + Xrenderint.h + +libXrender_la_LIBADD = $(RENDER_LIBS) + +# -version-number requires libtool >= 1.5 +libXrender_la_LDFLAGS = -version-number 1:3:0 -no-undefined + +libXrenderincludedir = $(includedir)/X11/extensions +libXrenderinclude_HEADERS = $(top_srcdir)/include/X11/extensions/Xrender.h diff --git a/libXrender/src/Picture.c b/libXrender/src/Picture.c new file mode 100644 index 000000000..509a83580 --- /dev/null +++ b/libXrender/src/Picture.c @@ -0,0 +1,372 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" +#include <X11/Xregion.h> + +static void +_XRenderProcessPictureAttributes (Display *dpy, + xRenderChangePictureReq *req, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes) +{ + unsigned long values[32]; + register unsigned long *value = values; + unsigned int nvalues; + + if (valuemask & CPRepeat) + *value++ = attributes->repeat; + if (valuemask & CPAlphaMap) + *value++ = attributes->alpha_map; + if (valuemask & CPAlphaXOrigin) + *value++ = attributes->alpha_x_origin; + if (valuemask & CPAlphaYOrigin) + *value++ = attributes->alpha_y_origin; + if (valuemask & CPClipXOrigin) + *value++ = attributes->clip_x_origin; + if (valuemask & CPClipYOrigin) + *value++ = attributes->clip_y_origin; + if (valuemask & CPClipMask) + *value++ = attributes->clip_mask; + if (valuemask & CPGraphicsExposure) + *value++ = attributes->graphics_exposures; + if (valuemask & CPSubwindowMode) + *value++ = attributes->subwindow_mode; + if (valuemask & CPPolyEdge) + *value++ = attributes->poly_edge; + if (valuemask & CPPolyMode) + *value++ = attributes->poly_mode; + if (valuemask & CPDither) + *value++ = attributes->dither; + if (valuemask & CPComponentAlpha) + *value++ = attributes->component_alpha; + + req->length += (nvalues = value - values); + + nvalues <<= 2; /* watch out for macros... */ + Data32 (dpy, (long *) values, (long)nvalues); +} + +Picture +XRenderCreatePicture (Display *dpy, + Drawable drawable, + _Xconst XRenderPictFormat *format, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Picture pid; + xRenderCreatePictureReq *req; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreatePicture, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreatePicture; + req->pid = pid = XAllocID(dpy); + req->drawable = drawable; + req->format = format->id; + if ((req->mask = valuemask)) + _XRenderProcessPictureAttributes (dpy, + (xRenderChangePictureReq *) req, + valuemask, + attributes); + UnlockDisplay(dpy); + SyncHandle(); + return pid; +} + +void +XRenderChangePicture (Display *dpy, + Picture picture, + unsigned long valuemask, + _Xconst XRenderPictureAttributes *attributes) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderChangePictureReq *req; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderChangePicture, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderChangePicture; + req->picture = picture; + req->mask = valuemask; + _XRenderProcessPictureAttributes (dpy, + req, + valuemask, + attributes); + UnlockDisplay(dpy); + SyncHandle(); +} + +static void +_XRenderSetPictureClipRectangles (Display *dpy, + XRenderExtDisplayInfo *info, + Picture picture, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n) +{ + xRenderSetPictureClipRectanglesReq *req; + long len; + + GetReq (RenderSetPictureClipRectangles, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderSetPictureClipRectangles; + req->picture = picture; + req->xOrigin = xOrigin; + req->yOrigin = yOrigin; + len = ((long) n) << 1; + SetReqLen (req, len, 1); + len <<= 2; + Data16 (dpy, (short *) rects, len); +} + +void +XRenderSetPictureClipRectangles (Display *dpy, + Picture picture, + int xOrigin, + int yOrigin, + _Xconst XRectangle *rects, + int n) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + _XRenderSetPictureClipRectangles (dpy, info, picture, + xOrigin, yOrigin, rects, n); + UnlockDisplay (dpy); + SyncHandle (); +} + +void +XRenderSetPictureClipRegion (Display *dpy, + Picture picture, + Region r) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + int i; + XRectangle *xr, *pr; + BOX *pb; + unsigned long total; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + total = r->numRects * sizeof (XRectangle); + if ((xr = (XRectangle *) _XAllocTemp(dpy, total))) { + for (pr = xr, pb = r->rects, i = r->numRects; --i >= 0; pr++, pb++) { + pr->x = pb->x1; + pr->y = pb->y1; + pr->width = pb->x2 - pb->x1; + pr->height = pb->y2 - pb->y1; + } + } + if (xr || !r->numRects) + _XRenderSetPictureClipRectangles (dpy, info, picture, 0, 0, + xr, r->numRects); + if (xr) + _XFreeTemp(dpy, (char *)xr, total); + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderSetPictureTransform (Display *dpy, + Picture picture, + XTransform *transform) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderSetPictureTransformReq *req; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay (dpy); + GetReq(RenderSetPictureTransform, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderSetPictureTransform; + req->picture = picture; + req->transform.matrix11 = transform->matrix[0][0]; + req->transform.matrix12 = transform->matrix[0][1]; + req->transform.matrix13 = transform->matrix[0][2]; + req->transform.matrix21 = transform->matrix[1][0]; + req->transform.matrix22 = transform->matrix[1][1]; + req->transform.matrix23 = transform->matrix[1][2]; + req->transform.matrix31 = transform->matrix[2][0]; + req->transform.matrix32 = transform->matrix[2][1]; + req->transform.matrix33 = transform->matrix[2][2]; + UnlockDisplay(dpy); + SyncHandle(); + +} + +void +XRenderFreePicture (Display *dpy, + Picture picture) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderFreePictureReq *req; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + GetReq(RenderFreePicture, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderFreePicture; + req->picture = picture; + UnlockDisplay(dpy); + SyncHandle(); +} + + +Picture XRenderCreateSolidFill(Display *dpy, + const XRenderColor *color) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Picture pid; + xRenderCreateSolidFillReq *req; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateSolidFill, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateSolidFill; + + req->pid = pid = XAllocID(dpy); + req->color.red = color->red; + req->color.green = color->green; + req->color.blue = color->blue; + req->color.alpha = color->alpha; + + UnlockDisplay(dpy); + SyncHandle(); + return pid; +} + + +Picture XRenderCreateLinearGradient(Display *dpy, + const XLinearGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nStops) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Picture pid; + xRenderCreateLinearGradientReq *req; + long len; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateLinearGradient, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateLinearGradient; + + req->pid = pid = XAllocID(dpy); + req->p1.x = gradient->p1.x; + req->p1.y = gradient->p1.y; + req->p2.x = gradient->p2.x; + req->p2.y = gradient->p2.y; + + req->nStops = nStops; + len = (long) nStops * 3; + SetReqLen (req, len, 6); + DataInt32(dpy, stops, nStops * 4); + Data16(dpy, colors, nStops * 8); + + UnlockDisplay(dpy); + SyncHandle(); + return pid; +} + +Picture XRenderCreateRadialGradient(Display *dpy, + const XRadialGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nStops) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Picture pid; + xRenderCreateRadialGradientReq *req; + long len; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateRadialGradient, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateRadialGradient; + + req->pid = pid = XAllocID(dpy); + req->inner.x = gradient->inner.x; + req->inner.y = gradient->inner.y; + req->outer.x = gradient->outer.x; + req->outer.y = gradient->outer.y; + req->inner_radius = gradient->inner.radius; + req->outer_radius = gradient->outer.radius; + + req->nStops = nStops; + len = (long) nStops * 3; + SetReqLen (req, len, 6); + DataInt32(dpy, stops, nStops * 4); + Data16(dpy, colors, nStops * 8); + + UnlockDisplay(dpy); + SyncHandle(); + return pid; +} + +Picture XRenderCreateConicalGradient(Display *dpy, + const XConicalGradient *gradient, + const XFixed *stops, + const XRenderColor *colors, + int nStops) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + Picture pid; + xRenderCreateConicalGradientReq *req; + long len; + + RenderCheckExtension (dpy, info, 0); + LockDisplay(dpy); + GetReq(RenderCreateConicalGradient, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderCreateConicalGradient; + + req->pid = pid = XAllocID(dpy); + req->center.x = gradient->center.x; + req->center.y = gradient->center.y; + req->angle = gradient->angle; + + req->nStops = nStops; + len = (long) nStops * 3; + SetReqLen (req, len, 6); + DataInt32(dpy, stops, nStops * 4); + Data16(dpy, colors, nStops * 8); + + UnlockDisplay(dpy); + SyncHandle(); + return pid; +} diff --git a/libXrender/src/Poly.c b/libXrender/src/Poly.c new file mode 100644 index 000000000..16599b22e --- /dev/null +++ b/libXrender/src/Poly.c @@ -0,0 +1,302 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +typedef struct _Edge Edge; + +struct _Edge { + XLineFixed edge; + XFixed current_x; + Bool clockWise; + Edge *next, *prev; +}; + +static int +CompareEdge (const void *o1, const void *o2) +{ + const Edge *e1 = o1, *e2 = o2; + + return e1->edge.p1.y - e2->edge.p1.y; +} + +static XFixed +XRenderComputeX (XLineFixed *line, XFixed y) +{ + XFixed dx = line->p2.x - line->p1.x; + double ex = (double) (y - line->p1.y) * (double) dx; + XFixed dy = line->p2.y - line->p1.y; + + return (XFixed) line->p1.x + (XFixed) (ex / dy); +} + +static double +XRenderComputeInverseSlope (XLineFixed *l) +{ + return (XFixedToDouble (l->p2.x - l->p1.x) / + XFixedToDouble (l->p2.y - l->p1.y)); +} + +static double +XRenderComputeXIntercept (XLineFixed *l, double inverse_slope) +{ + return XFixedToDouble (l->p1.x) - inverse_slope * XFixedToDouble (l->p1.y); +} + +static XFixed +XRenderComputeIntersect (XLineFixed *l1, XLineFixed *l2) +{ + /* + * x = m1y + b1 + * x = m2y + b2 + * m1y + b1 = m2y + b2 + * y * (m1 - m2) = b2 - b1 + * y = (b2 - b1) / (m1 - m2) + */ + double m1 = XRenderComputeInverseSlope (l1); + double b1 = XRenderComputeXIntercept (l1, m1); + double m2 = XRenderComputeInverseSlope (l2); + double b2 = XRenderComputeXIntercept (l2, m2); + + return XDoubleToFixed ((b2 - b1) / (m1 - m2)); +} + +static int +XRenderComputeTrapezoids (Edge *edges, + int nedges, + int winding, + XTrapezoid *traps) +{ + int ntraps = 0; + int inactive; + Edge *active; + Edge *e, *en, *next; + XFixed y, next_y, intersect; + + qsort (edges, nedges, sizeof (Edge), CompareEdge); + + y = edges[0].edge.p1.y; + active = NULL; + inactive = 0; + while (active || inactive < nedges) + { + /* insert new active edges into list */ + while (inactive < nedges) + { + e = &edges[inactive]; + if (e->edge.p1.y > y) + break; + /* move this edge into the active list */ + inactive++; + e->next = active; + e->prev = NULL; + if (active) + active->prev = e; + active = e; + } + /* compute x coordinates along this group */ + for (e = active; e; e = e->next) + e->current_x = XRenderComputeX (&e->edge, y); + + /* sort active list */ + for (e = active; e; e = next) + { + next = e->next; + /* + * Find one later in the list that belongs before the + * current one + */ + for (en = next; en; en = en->next) + { + if (en->current_x < e->current_x || + (en->current_x == e->current_x && + en->edge.p2.x < e->edge.p2.x)) + { + /* + * insert en before e + * + * extract en + */ + en->prev->next = en->next; + if (en->next) + en->next->prev = en->prev; + /* + * insert en + */ + if (e->prev) + e->prev->next = en; + else + active = en; + en->prev = e->prev; + e->prev = en; + en->next = e; + /* + * start over at en + */ + next = en; + break; + } + } + } +#if 0 + printf ("y: %6.3g:", y / 65536.0); + for (e = active; e; e = e->next) + { + printf (" %6.3g", e->current_x / 65536.0); + } + printf ("\n"); +#endif + /* find next inflection point */ + next_y = active->edge.p2.y; + for (e = active; e; e = en) + { + if (e->edge.p2.y < next_y) + next_y = e->edge.p2.y; + en = e->next; + /* check intersect */ + if (en && e->edge.p2.x > en->edge.p2.x) + { + intersect = XRenderComputeIntersect (&e->edge, &e->next->edge); + /* make sure this point is below the actual intersection */ + intersect = intersect + 1; + if (intersect < next_y) + next_y = intersect; + } + } + /* check next inactive point */ + if (inactive < nedges && edges[inactive].edge.p1.y < next_y) + next_y = edges[inactive].edge.p1.y; + + /* walk the list generating trapezoids */ + for (e = active; e && (en = e->next); e = en->next) + { + traps->top = y; + traps->bottom = next_y; + traps->left = e->edge; + traps->right = en->edge; + traps++; + ntraps++; + } + + y = next_y; + + /* delete inactive edges from list */ + for (e = active; e; e = next) + { + next = e->next; + if (e->edge.p2.y <= y) + { + if (e->prev) + e->prev->next = e->next; + else + active = e->next; + if (e->next) + e->next->prev = e->prev; + } + } + } + return ntraps; +} + +void +XRenderCompositeDoublePoly (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + int xDst, + int yDst, + _Xconst XPointDouble *fpoints, + int npoints, + int winding) +{ + Edge *edges; + XTrapezoid *traps; + int i, nedges, ntraps; + XFixed x, y, prevx = 0, prevy = 0, firstx = 0, firsty = 0; + XFixed top = 0, bottom = 0; /* GCCism */ + + edges = (Edge *) Xmalloc (npoints * sizeof (Edge) + + (npoints * npoints * sizeof (XTrapezoid))); + if (!edges) + return; + traps = (XTrapezoid *) (edges + npoints); + nedges = 0; + for (i = 0; i <= npoints; i++) + { + if (i == npoints) + { + x = firstx; + y = firsty; + } + else + { + x = XDoubleToFixed (fpoints[i].x); + y = XDoubleToFixed (fpoints[i].y); + } + if (i) + { + if (y < top) + top = y; + else if (y > bottom) + bottom = y; + if (prevy < y) + { + edges[nedges].edge.p1.x = prevx; + edges[nedges].edge.p1.y = prevy; + edges[nedges].edge.p2.x = x; + edges[nedges].edge.p2.y = y; + edges[nedges].clockWise = True; + nedges++; + } + else if (prevy > y) + { + edges[nedges].edge.p1.x = x; + edges[nedges].edge.p1.y = y; + edges[nedges].edge.p2.x = prevx; + edges[nedges].edge.p2.y = prevy; + edges[nedges].clockWise = False; + nedges++; + } + /* drop horizontal edges */ + } + else + { + top = y; + bottom = y; + firstx = x; + firsty = y; + } + prevx = x; + prevy = y; + } + ntraps = XRenderComputeTrapezoids (edges, nedges, winding, traps); + /* XXX adjust xSrc/xDst */ + XRenderCompositeTrapezoids (dpy, op, src, dst, maskFormat, xSrc, ySrc, traps, ntraps); + Xfree (edges); +} diff --git a/libXrender/src/Trap.c b/libXrender/src/Trap.c new file mode 100644 index 000000000..919aaef53 --- /dev/null +++ b/libXrender/src/Trap.c @@ -0,0 +1,74 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +void +XRenderCompositeTrapezoids (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XTrapezoid *traps, + int ntrap) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderTrapezoidsReq *req; + int n; + long len; + unsigned long max_req = dpy->bigreq_size ? dpy->bigreq_size : dpy->max_request_size; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + while (ntrap) + { + GetReq(RenderTrapezoids, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderTrapezoids; + req->op = (CARD8) op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : 0; + req->xSrc = xSrc; + req->ySrc = ySrc; + n = ntrap; + len = ((long) n) * (SIZEOF (xTrapezoid) >> 2); + if (len > (max_req - req->length)) { + n = (max_req - req->length) / (SIZEOF (xTrapezoid) >> 2); + len = ((long)n) * (SIZEOF (xTrapezoid) >> 2); + } + SetReqLen (req, len, len); + len <<= 2; + DataInt32 (dpy, (int *) traps, len); + ntrap -= n; + traps += n; + } + UnlockDisplay(dpy); + SyncHandle(); +} + diff --git a/libXrender/src/Tri.c b/libXrender/src/Tri.c new file mode 100644 index 000000000..155f2ce14 --- /dev/null +++ b/libXrender/src/Tri.c @@ -0,0 +1,169 @@ +/* + * + * Copyright © 2002 Keith Packard + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of Keith Packard not be used in + * advertising or publicity pertaining to distribution of the software without + * specific, written prior permission. Keith Packard makes no + * representations about the suitability of this software for any purpose. It + * is provided "as is" without express or implied warranty. + * + * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO + * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +void +XRenderCompositeTriangles (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XTriangle *triangles, + int ntriangle) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderTrianglesReq *req; + int n; + long len; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + while (ntriangle) + { + GetReq(RenderTriangles, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderTriangles; + req->op = (CARD8) op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : 0; + req->xSrc = xSrc; + req->ySrc = ySrc; + n = ntriangle; + len = ((long) n) * (SIZEOF (xTriangle) >> 2); + if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) { + n = (dpy->max_request_size - req->length) / (SIZEOF (xTriangle) >> 2); + len = ((long)n) * (SIZEOF (xTriangle) >> 2); + } + SetReqLen (req, len, len); + len <<= 2; + DataInt32 (dpy, (int *) triangles, len); + ntriangle -= n; + triangles += n; + } + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeTriStrip (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XPointFixed *points, + int npoint) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderTriStripReq *req; + int n; + long len; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + while (npoint > 2) + { + GetReq(RenderTriStrip, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderTriStrip; + req->op = (CARD8) op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : 0; + req->xSrc = xSrc; + req->ySrc = ySrc; + n = npoint; + len = ((long) n) * (SIZEOF (xPointFixed) >> 2); + if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) { + n = (dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2); + len = ((long)n) * (SIZEOF (xPointFixed) >> 2); + } + SetReqLen (req, len, len); + len <<= 2; + DataInt32 (dpy, (int *) points, len); + npoint -= (n - 2); + points += (n - 2); + } + UnlockDisplay(dpy); + SyncHandle(); +} + +void +XRenderCompositeTriFan (Display *dpy, + int op, + Picture src, + Picture dst, + _Xconst XRenderPictFormat *maskFormat, + int xSrc, + int ySrc, + _Xconst XPointFixed *points, + int npoint) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + _Xconst XPointFixed *first = points; + xPointFixed *p; + xRenderTriFanReq *req; + int n; + long len; + + RenderSimpleCheckExtension (dpy, info); + LockDisplay(dpy); + points++; + npoint--; + while (npoint > 1) + { + GetReqExtra(RenderTriFan, SIZEOF (xPointFixed), req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderTriFan; + req->op = (CARD8) op; + req->src = src; + req->dst = dst; + req->maskFormat = maskFormat ? maskFormat->id : 0; + req->xSrc = xSrc; + req->ySrc = ySrc; + p = (xPointFixed *) (req + 1); + p->x = first->x; + p->y = first->y; + n = npoint; + len = ((long) n) * (SIZEOF (xPointFixed) >> 2); + if (!dpy->bigreq_size && len > (dpy->max_request_size - req->length)) { + n = (dpy->max_request_size - req->length) / (SIZEOF (xPointFixed) >> 2); + len = ((long)n) * (SIZEOF (xPointFixed) >> 2); + } + SetReqLen (req, len, len); + len <<= 2; + DataInt32 (dpy, (int *) points, len); + npoint -= (n - 1); + points += (n - 1); + } + UnlockDisplay(dpy); + SyncHandle(); +} diff --git a/libXrender/src/Xrender.c b/libXrender/src/Xrender.c new file mode 100644 index 000000000..c7630766f --- /dev/null +++ b/libXrender/src/Xrender.c @@ -0,0 +1,889 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#include "Xrenderint.h" + +XRenderExtInfo XRenderExtensionInfo; +char XRenderExtensionName[] = RENDER_NAME; + +static int XRenderCloseDisplay (Display *dpy, XExtCodes *codes); + +/* + * XRenderExtFindDisplay - look for a display in this extension; keeps a + * cache of the most-recently used for efficiency. (Replaces + * XextFindDisplay.) + */ +static XRenderExtDisplayInfo * +XRenderExtFindDisplay (XRenderExtInfo *extinfo, + Display *dpy) +{ + XRenderExtDisplayInfo *dpyinfo; + + /* + * see if this was the most recently accessed display + */ + if ((dpyinfo = extinfo->cur) && dpyinfo->display == dpy) + return dpyinfo; + + /* + * look for display in list + */ + _XLockMutex(_Xglobal_lock); + for (dpyinfo = extinfo->head; dpyinfo; dpyinfo = dpyinfo->next) { + if (dpyinfo->display == dpy) { + extinfo->cur = dpyinfo; /* cache most recently used */ + _XUnlockMutex(_Xglobal_lock); + return dpyinfo; + } + } + _XUnlockMutex(_Xglobal_lock); + + return NULL; +} + +/* + * If the server is missing support for any of the required depths on + * any screen, tell the application that Render is not present. + */ + +#define DEPTH_MASK(d) (1 << ((d) - 1)) + +/* + * Render requires support for depth 1, 4, 8, 24 and 32 pixmaps + */ + +#define REQUIRED_DEPTHS (DEPTH_MASK(1) | \ + DEPTH_MASK(4) | \ + DEPTH_MASK(8) | \ + DEPTH_MASK(24) | \ + DEPTH_MASK(32)) + +typedef struct _DepthCheckRec { + struct _DepthCheckRec *next; + Display *dpy; + CARD32 missing; + unsigned long serial; +} DepthCheckRec, *DepthCheckPtr; + +static DepthCheckPtr depthChecks; + +static int +XRenderDepthCheckErrorHandler (Display *dpy, XErrorEvent *evt) +{ + if (evt->request_code == X_CreatePixmap && evt->error_code == BadValue) + { + DepthCheckPtr d; + _XLockMutex(_Xglobal_lock); + for (d = depthChecks; d; d = d->next) + if (d->dpy == dpy) + { + if ((long) (evt->serial - d->serial) >= 0) + d->missing |= DEPTH_MASK(evt->resourceid); + break; + } + _XUnlockMutex (_Xglobal_lock); + } + return 0; +} + +static Bool +XRenderHasDepths (Display *dpy) +{ + int s; + + for (s = 0; s < ScreenCount (dpy); s++) + { + CARD32 depths = 0; + CARD32 missing; + Screen *scr = ScreenOfDisplay (dpy, s); + int d; + + for (d = 0; d < scr->ndepths; d++) + depths |= DEPTH_MASK(scr->depths[d].depth); + missing = ~depths & REQUIRED_DEPTHS; + if (missing) + { + DepthCheckRec dc, **dp; + XErrorHandler previousHandler; + + /* + * Ok, this is ugly. It should be sufficient at this + * point to just return False, but Xinerama is broken at + * this point and only advertises depths which have an + * associated visual. Of course, the other depths still + * work, but the only way to find out is to try them. + */ + dc.dpy = dpy; + dc.missing = 0; + dc.serial = XNextRequest (dpy); + _XLockMutex(_Xglobal_lock); + dc.next = depthChecks; + depthChecks = &dc; + _XUnlockMutex (_Xglobal_lock); + /* + * I suspect this is not really thread safe, but Xlib doesn't + * provide a lot of options here + */ + previousHandler = XSetErrorHandler (XRenderDepthCheckErrorHandler); + /* + * Try each missing depth and see if pixmap creation succeeds + */ + for (d = 1; d <= 32; d++) + /* don't check depth 1 == Xcursor recurses... */ + if ((missing & DEPTH_MASK(d)) && d != 1) + { + Pixmap p; + p = XCreatePixmap (dpy, RootWindow (dpy, s), 1, 1, d); + XFreePixmap (dpy, p); + } + XSync (dpy, False); + XSetErrorHandler (previousHandler); + /* + * Unhook from the list of depth check records + */ + _XLockMutex(_Xglobal_lock); + for (dp = &depthChecks; *dp; dp = &(*dp)->next) + { + if (*dp == &dc) + { + *dp = dc.next; + break; + } + } + _XUnlockMutex (_Xglobal_lock); + if (dc.missing) + return False; + } + } + return True; +} + +/* + * XRenderExtAddDisplay - add a display to this extension. (Replaces + * XextAddDisplay) + */ +static XRenderExtDisplayInfo * +XRenderExtAddDisplay (XRenderExtInfo *extinfo, + Display *dpy, + char *ext_name) +{ + XRenderExtDisplayInfo *dpyinfo; + + dpyinfo = (XRenderExtDisplayInfo *) Xmalloc (sizeof (XRenderExtDisplayInfo)); + if (!dpyinfo) return NULL; + dpyinfo->display = dpy; + dpyinfo->info = NULL; + + if (XRenderHasDepths (dpy)) + dpyinfo->codes = XInitExtension (dpy, ext_name); + else + dpyinfo->codes = NULL; + + /* + * if the server has the extension, then we can initialize the + * appropriate function vectors + */ + if (dpyinfo->codes) { + XESetCloseDisplay (dpy, dpyinfo->codes->extension, + XRenderCloseDisplay); + } else { + /* The server doesn't have this extension. + * Use a private Xlib-internal extension to hang the close_display + * hook on so that the "cache" (extinfo->cur) is properly cleaned. + * (XBUG 7955) + */ + XExtCodes *codes = XAddExtension(dpy); + if (!codes) { + XFree(dpyinfo); + return NULL; + } + XESetCloseDisplay (dpy, codes->extension, XRenderCloseDisplay); + } + + /* + * now, chain it onto the list + */ + _XLockMutex(_Xglobal_lock); + dpyinfo->next = extinfo->head; + extinfo->head = dpyinfo; + extinfo->cur = dpyinfo; + extinfo->ndisplays++; + _XUnlockMutex(_Xglobal_lock); + return dpyinfo; +} + + +/* + * XRenderExtRemoveDisplay - remove the indicated display from the + * extension object. (Replaces XextRemoveDisplay.) + */ +static int +XRenderExtRemoveDisplay (XRenderExtInfo *extinfo, Display *dpy) +{ + XRenderExtDisplayInfo *dpyinfo, *prev; + + /* + * locate this display and its back link so that it can be removed + */ + _XLockMutex(_Xglobal_lock); + prev = NULL; + for (dpyinfo = extinfo->head; dpyinfo; dpyinfo = dpyinfo->next) { + if (dpyinfo->display == dpy) break; + prev = dpyinfo; + } + if (!dpyinfo) { + _XUnlockMutex(_Xglobal_lock); + return 0; /* hmm, actually an error */ + } + + /* + * remove the display from the list; handles going to zero + */ + if (prev) + prev->next = dpyinfo->next; + else + extinfo->head = dpyinfo->next; + + extinfo->ndisplays--; + if (dpyinfo == extinfo->cur) extinfo->cur = NULL; /* flush cache */ + _XUnlockMutex(_Xglobal_lock); + + Xfree ((char *) dpyinfo); + return 1; +} + + + +XRenderExtDisplayInfo * +XRenderFindDisplay (Display *dpy) +{ + XRenderExtDisplayInfo *dpyinfo; + + dpyinfo = XRenderExtFindDisplay (&XRenderExtensionInfo, dpy); + if (!dpyinfo) + dpyinfo = XRenderExtAddDisplay (&XRenderExtensionInfo, dpy, + XRenderExtensionName); + return dpyinfo; +} + +static int +XRenderCloseDisplay (Display *dpy, XExtCodes *codes) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + if (info && info->info) XFree (info->info); + + return XRenderExtRemoveDisplay (&XRenderExtensionInfo, dpy); +} + +/**************************************************************************** + * * + * Render public interfaces * + * * + ****************************************************************************/ + +Bool XRenderQueryExtension (Display *dpy, int *event_basep, int *error_basep) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + + if (RenderHasExtension(info)) { + *event_basep = info->codes->first_event; + *error_basep = info->codes->first_error; + return True; + } else { + return False; + } +} + + +Status XRenderQueryVersion (Display *dpy, + int *major_versionp, + int *minor_versionp) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + XRenderInfo *xri; + + if (!RenderHasExtension (info)) + return 0; + + if (!XRenderQueryFormats (dpy)) + return 0; + + xri = info->info; + *major_versionp = xri->major_version; + *minor_versionp = xri->minor_version; + return 1; +} + +static XRenderPictFormat * +_XRenderFindFormat (XRenderInfo *xri, PictFormat format) +{ + int nf; + + for (nf = 0; nf < xri->nformat; nf++) + if (xri->format[nf].id == format) + return &xri->format[nf]; + return NULL; +} + +static Visual * +_XRenderFindVisual (Display *dpy, VisualID vid) +{ + return _XVIDtoVisual (dpy, vid); +} + +typedef struct _renderVersionState { + unsigned long version_seq; + Bool error; + int major_version; + int minor_version; + +} _XrenderVersionState; + +static Bool +_XRenderVersionHandler (Display *dpy, + xReply *rep, + char *buf, + int len, + XPointer data) +{ + xRenderQueryVersionReply replbuf; + xRenderQueryVersionReply *repl; + _XrenderVersionState *state = (_XrenderVersionState *) data; + + if (dpy->last_request_read != state->version_seq) + return False; + if (rep->generic.type == X_Error) + { + state->error = True; + return False; + } + repl = (xRenderQueryVersionReply *) + _XGetAsyncReply(dpy, (char *)&replbuf, rep, buf, len, + (SIZEOF(xRenderQueryVersionReply) - SIZEOF(xReply)) >> 2, + True); + state->major_version = repl->majorVersion; + state->minor_version = repl->minorVersion; + return True; +} + +Status +XRenderQueryFormats (Display *dpy) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + _XAsyncHandler async; + _XrenderVersionState async_state; + xRenderQueryVersionReq *vreq; + xRenderQueryPictFormatsReply rep; + xRenderQueryPictFormatsReq *req; + XRenderInfo *xri; + XRenderPictFormat *format; + XRenderScreen *screen; + XRenderDepth *depth; + XRenderVisual *visual; + xPictFormInfo *xFormat; + xPictScreen *xScreen; + xPictDepth *xDepth; + xPictVisual *xVisual; + CARD32 *xSubpixel; + void *xData; + int nf, ns, nd, nv; + int rlength; + int nbytes; + + RenderCheckExtension (dpy, info, 0); + LockDisplay (dpy); + if (info->info) + { + UnlockDisplay (dpy); + return 1; + } + GetReq (RenderQueryVersion, vreq); + vreq->reqType = info->codes->major_opcode; + vreq->renderReqType = X_RenderQueryVersion; + vreq->majorVersion = RENDER_MAJOR; + vreq->minorVersion = RENDER_MINOR; + + async_state.version_seq = dpy->request; + async_state.error = False; + async.next = dpy->async_handlers; + async.handler = _XRenderVersionHandler; + async.data = (XPointer) &async_state; + dpy->async_handlers = &async; + + GetReq (RenderQueryPictFormats, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderQueryPictFormats; + + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + DeqAsyncHandler (dpy, &async); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + DeqAsyncHandler (dpy, &async); + if (async_state.error) + { + UnlockDisplay(dpy); + SyncHandle(); + return 0; + } + /* + * Check for the lack of sub-pixel data + */ + if (async_state.major_version == 0 && async_state.minor_version < 6) + rep.numSubpixel = 0; + + xri = (XRenderInfo *) Xmalloc (sizeof (XRenderInfo) + + rep.numFormats * sizeof (XRenderPictFormat) + + rep.numScreens * sizeof (XRenderScreen) + + rep.numDepths * sizeof (XRenderDepth) + + rep.numVisuals * sizeof (XRenderVisual)); + rlength = (rep.numFormats * sizeof (xPictFormInfo) + + rep.numScreens * sizeof (xPictScreen) + + rep.numDepths * sizeof (xPictDepth) + + rep.numVisuals * sizeof (xPictVisual) + + rep.numSubpixel * 4); + xData = (void *) Xmalloc (rlength); + nbytes = (int) rep.length << 2; + + if (!xri || !xData || nbytes < rlength) + { + if (xri) Xfree (xri); + if (xData) Xfree (xData); + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return 0; + } + xri->major_version = async_state.major_version; + xri->minor_version = async_state.minor_version; + xri->format = (XRenderPictFormat *) (xri + 1); + xri->nformat = rep.numFormats; + xri->screen = (XRenderScreen *) (xri->format + rep.numFormats); + xri->nscreen = rep.numScreens; + xri->depth = (XRenderDepth *) (xri->screen + rep.numScreens); + xri->ndepth = rep.numDepths; + xri->visual = (XRenderVisual *) (xri->depth + rep.numDepths); + xri->nvisual = rep.numVisuals; + _XRead (dpy, (char *) xData, rlength); + format = xri->format; + xFormat = (xPictFormInfo *) xData; + for (nf = 0; nf < rep.numFormats; nf++) + { + format->id = xFormat->id; + format->type = xFormat->type; + format->depth = xFormat->depth; + format->direct.red = xFormat->direct.red; + format->direct.redMask = xFormat->direct.redMask; + format->direct.green = xFormat->direct.green; + format->direct.greenMask = xFormat->direct.greenMask; + format->direct.blue = xFormat->direct.blue; + format->direct.blueMask = xFormat->direct.blueMask; + format->direct.alpha = xFormat->direct.alpha; + format->direct.alphaMask = xFormat->direct.alphaMask; + format->colormap = xFormat->colormap; + format++; + xFormat++; + } + xScreen = (xPictScreen *) xFormat; + screen = xri->screen; + depth = xri->depth; + visual = xri->visual; + for (ns = 0; ns < xri->nscreen; ns++) + { + screen->depths = depth; + screen->ndepths = xScreen->nDepth; + screen->fallback = _XRenderFindFormat (xri, xScreen->fallback); + screen->subpixel = SubPixelUnknown; + xDepth = (xPictDepth *) (xScreen + 1); + for (nd = 0; nd < screen->ndepths; nd++) + { + depth->depth = xDepth->depth; + depth->nvisuals = xDepth->nPictVisuals; + depth->visuals = visual; + xVisual = (xPictVisual *) (xDepth + 1); + for (nv = 0; nv < depth->nvisuals; nv++) + { + visual->visual = _XRenderFindVisual (dpy, xVisual->visual); + visual->format = _XRenderFindFormat (xri, xVisual->format); + visual++; + xVisual++; + } + depth++; + xDepth = (xPictDepth *) xVisual; + } + screen++; + xScreen = (xPictScreen *) xDepth; + } + xSubpixel = (CARD32 *) xScreen; + screen = xri->screen; + for (ns = 0; ns < rep.numSubpixel; ns++) + { + screen->subpixel = *xSubpixel; + xSubpixel++; + screen++; + } + info->info = xri; + /* + * Skip any extra data + */ + if (nbytes > rlength) + _XEatData (dpy, (unsigned long) (nbytes - rlength)); + + UnlockDisplay (dpy); + SyncHandle (); + Xfree (xData); + return 1; +} + +int +XRenderQuerySubpixelOrder (Display *dpy, int screen) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + XRenderInfo *xri; + + if (!RenderHasExtension (info)) + return SubPixelUnknown; + + if (!XRenderQueryFormats (dpy)) + return SubPixelUnknown; + + xri = info->info; + return xri->screen[screen].subpixel; +} + +Bool +XRenderSetSubpixelOrder (Display *dpy, int screen, int subpixel) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + XRenderInfo *xri; + + if (!RenderHasExtension (info)) + return False; + + if (!XRenderQueryFormats (dpy)) + return False; + + xri = info->info; + xri->screen[screen].subpixel = subpixel; + return True; +} + +XRenderPictFormat * +XRenderFindVisualFormat (Display *dpy, _Xconst Visual *visual) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + int nv; + XRenderInfo *xri; + XRenderVisual *xrv; + + RenderCheckExtension (dpy, info, NULL); + if (!XRenderQueryFormats (dpy)) + return NULL; + xri = info->info; + for (nv = 0, xrv = xri->visual; nv < xri->nvisual; nv++, xrv++) + if (xrv->visual == visual) + return xrv->format; + return NULL; +} + +XRenderPictFormat * +XRenderFindFormat (Display *dpy, + unsigned long mask, + _Xconst XRenderPictFormat *template, + int count) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + int nf; + XRenderInfo *xri; + + RenderCheckExtension (dpy, info, NULL); + if (!XRenderQueryFormats (dpy)) + return NULL; + xri = info->info; + for (nf = 0; nf < xri->nformat; nf++) + { + if (mask & PictFormatID) + if (template->id != xri->format[nf].id) + continue; + if (mask & PictFormatType) + if (template->type != xri->format[nf].type) + continue; + if (mask & PictFormatDepth) + if (template->depth != xri->format[nf].depth) + continue; + if (mask & PictFormatRed) + if (template->direct.red != xri->format[nf].direct.red) + continue; + if (mask & PictFormatRedMask) + if (template->direct.redMask != xri->format[nf].direct.redMask) + continue; + if (mask & PictFormatGreen) + if (template->direct.green != xri->format[nf].direct.green) + continue; + if (mask & PictFormatGreenMask) + if (template->direct.greenMask != xri->format[nf].direct.greenMask) + continue; + if (mask & PictFormatBlue) + if (template->direct.blue != xri->format[nf].direct.blue) + continue; + if (mask & PictFormatBlueMask) + if (template->direct.blueMask != xri->format[nf].direct.blueMask) + continue; + if (mask & PictFormatAlpha) + if (template->direct.alpha != xri->format[nf].direct.alpha) + continue; + if (mask & PictFormatAlphaMask) + if (template->direct.alphaMask != xri->format[nf].direct.alphaMask) + continue; + if (mask & PictFormatColormap) + if (template->colormap != xri->format[nf].colormap) + continue; + if (count-- == 0) + return &xri->format[nf]; + } + return NULL; +} + +XRenderPictFormat * +XRenderFindStandardFormat (Display *dpy, + int format) +{ + static struct { + XRenderPictFormat templ; + unsigned long mask; + } standardFormats[PictStandardNUM] = { + /* PictStandardARGB32 */ + { + { + 0, /* id */ + PictTypeDirect, /* type */ + 32, /* depth */ + { /* direct */ + 16, /* direct.red */ + 0xff, /* direct.redMask */ + 8, /* direct.green */ + 0xff, /* direct.greenMask */ + 0, /* direct.blue */ + 0xff, /* direct.blueMask */ + 24, /* direct.alpha */ + 0xff, /* direct.alphaMask */ + }, + 0, /* colormap */ + }, + PictFormatType | + PictFormatDepth | + PictFormatRed | + PictFormatRedMask | + PictFormatGreen | + PictFormatGreenMask | + PictFormatBlue | + PictFormatBlueMask | + PictFormatAlpha | + PictFormatAlphaMask, + }, + /* PictStandardRGB24 */ + { + { + 0, /* id */ + PictTypeDirect, /* type */ + 24, /* depth */ + { /* direct */ + 16, /* direct.red */ + 0xff, /* direct.redMask */ + 8, /* direct.green */ + 0xff, /* direct.greenMask */ + 0, /* direct.blue */ + 0xff, /* direct.blueMask */ + 0, /* direct.alpha */ + 0x00, /* direct.alphaMask */ + }, + 0, /* colormap */ + }, + PictFormatType | + PictFormatDepth | + PictFormatRed | + PictFormatRedMask | + PictFormatGreen | + PictFormatGreenMask | + PictFormatBlue | + PictFormatBlueMask | + PictFormatAlphaMask, + }, + /* PictStandardA8 */ + { + { + 0, /* id */ + PictTypeDirect, /* type */ + 8, /* depth */ + { /* direct */ + 0, /* direct.red */ + 0x00, /* direct.redMask */ + 0, /* direct.green */ + 0x00, /* direct.greenMask */ + 0, /* direct.blue */ + 0x00, /* direct.blueMask */ + 0, /* direct.alpha */ + 0xff, /* direct.alphaMask */ + }, + 0, /* colormap */ + }, + PictFormatType | + PictFormatDepth | + PictFormatRedMask | + PictFormatGreenMask | + PictFormatBlueMask | + PictFormatAlpha | + PictFormatAlphaMask, + }, + /* PictStandardA4 */ + { + { + 0, /* id */ + PictTypeDirect, /* type */ + 4, /* depth */ + { /* direct */ + 0, /* direct.red */ + 0x00, /* direct.redMask */ + 0, /* direct.green */ + 0x00, /* direct.greenMask */ + 0, /* direct.blue */ + 0x00, /* direct.blueMask */ + 0, /* direct.alpha */ + 0x0f, /* direct.alphaMask */ + }, + 0, /* colormap */ + }, + PictFormatType | + PictFormatDepth | + PictFormatRedMask | + PictFormatGreenMask | + PictFormatBlueMask | + PictFormatAlpha | + PictFormatAlphaMask, + }, + /* PictStandardA1 */ + { + { + 0, /* id */ + PictTypeDirect, /* type */ + 1, /* depth */ + { /* direct */ + 0, /* direct.red */ + 0x00, /* direct.redMask */ + 0, /* direct.green */ + 0x00, /* direct.greenMask */ + 0, /* direct.blue */ + 0x00, /* direct.blueMask */ + 0, /* direct.alpha */ + 0x01, /* direct.alphaMask */ + }, + 0, /* colormap */ + }, + PictFormatType | + PictFormatDepth | + PictFormatRedMask | + PictFormatGreenMask | + PictFormatBlueMask | + PictFormatAlpha | + PictFormatAlphaMask, + }, + }; + + if (0 <= format && format < PictStandardNUM) + return XRenderFindFormat (dpy, + standardFormats[format].mask, + &standardFormats[format].templ, + 0); + return NULL; +} + +XIndexValue * +XRenderQueryPictIndexValues(Display *dpy, + _Xconst XRenderPictFormat *format, + int *num) +{ + XRenderExtDisplayInfo *info = XRenderFindDisplay (dpy); + xRenderQueryPictIndexValuesReq *req; + xRenderQueryPictIndexValuesReply rep; + XIndexValue *values; + int nbytes, nread, rlength, i; + + RenderCheckExtension (dpy, info, NULL); + + LockDisplay (dpy); + GetReq (RenderQueryPictIndexValues, req); + req->reqType = info->codes->major_opcode; + req->renderReqType = X_RenderQueryPictIndexValues; + req->format = format->id; + if (!_XReply (dpy, (xReply *) &rep, 0, xFalse)) + { + UnlockDisplay (dpy); + SyncHandle (); + return NULL; + } + + /* request data length */ + nbytes = (long)rep.length << 2; + /* bytes of actual data in the request */ + nread = rep.numIndexValues * SIZEOF (xIndexValue); + /* size of array returned to application */ + rlength = rep.numIndexValues * sizeof (XIndexValue); + + /* allocate returned data */ + values = (XIndexValue *)Xmalloc (rlength); + if (!values) + { + _XEatData (dpy, nbytes); + UnlockDisplay (dpy); + SyncHandle (); + return NULL; + } + + /* read the values one at a time and convert */ + *num = rep.numIndexValues; + for(i = 0; i < rep.numIndexValues; i++) + { + xIndexValue value; + + _XRead (dpy, (char *) &value, SIZEOF (xIndexValue)); + values[i].pixel = value.pixel; + values[i].red = value.red; + values[i].green = value.green; + values[i].blue = value.blue; + values[i].alpha = value.alpha; + } + /* skip any padding */ + if(nbytes > nread) + { + _XEatData (dpy, (unsigned long) (nbytes - nread)); + } + UnlockDisplay (dpy); + SyncHandle (); + return values; +} diff --git a/libXrender/src/Xrenderint.h b/libXrender/src/Xrenderint.h new file mode 100644 index 000000000..49a294b14 --- /dev/null +++ b/libXrender/src/Xrenderint.h @@ -0,0 +1,114 @@ +/* + * + * Copyright © 2000 SuSE, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of SuSE not be used in advertising or + * publicity pertaining to distribution of the software without specific, + * written prior permission. SuSE makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * SuSE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL SuSE + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Keith Packard, SuSE, Inc. + */ + +#ifndef _XRENDERINT_H_ +#define _XRENDERINT_H_ + +#include "config.h" +#define NEED_EVENTS +#define NEED_REPLIES +#include <X11/Xlibint.h> +#include <X11/Xutil.h> +#include <X11/extensions/renderproto.h> +#include "Xrender.h" + +typedef struct { + Visual *visual; + XRenderPictFormat *format; +} XRenderVisual; + +typedef struct { + int depth; + int nvisuals; + XRenderVisual *visuals; +} XRenderDepth; + +typedef struct { + XRenderDepth *depths; + int ndepths; + XRenderPictFormat *fallback; + int subpixel; +} XRenderScreen; + +typedef struct _XRenderInfo { + int major_version; + int minor_version; + XRenderPictFormat *format; + int nformat; + XRenderScreen *screen; + int nscreen; + XRenderDepth *depth; + int ndepth; + XRenderVisual *visual; + int nvisual; + int *subpixel; + int nsubpixel; + char **filter; + int nfilter; + short *filter_alias; + int nfilter_alias; +} XRenderInfo; + +/* replaces XRenderExtDisplayInfo */ +typedef struct _XRenderExtDisplayInfo { + struct _XRenderExtDisplayInfo *next; /* keep a linked list */ + Display *display; /* which display this is */ + XExtCodes *codes; /* the extension protocol codes */ + XRenderInfo *info; /* extra data for the extension to use */ +} XRenderExtDisplayInfo; + +/* replaces XExtensionInfo */ +typedef struct _XRenderExtInfo { + XRenderExtDisplayInfo *head; /* start of the list */ + XRenderExtDisplayInfo *cur; /* most recently used */ + int ndisplays; /* number of displays */ +} XRenderExtInfo; + +extern XRenderExtInfo XRenderExtensionInfo; +extern char XRenderExtensionName[]; + +XRenderExtDisplayInfo * +XRenderFindDisplay (Display *dpy); + +#define RenderHasExtension(i) ((i) && ((i)->codes)) + +#define RenderCheckExtension(dpy,i,val) \ + if (!RenderHasExtension(i)) { return val; } + +#define RenderSimpleCheckExtension(dpy,i) \ + if (!RenderHasExtension(i)) { return; } + +/* + * Xlib uses long for 32-bit values. Xrender uses int. This + * matters on alpha. Note that this macro assumes that int is 32 bits + * except on WORD64 machines where it is 64 bits. + */ + +#ifdef WORD64 +#define DataInt32(dpy,d,len) Data32(dpy,(long *) (d),len) +#else +#define DataInt32(dpy,d,len) Data(dpy,(char *) (d),len) +#endif + +#endif /* _XRENDERINT_H_ */ diff --git a/libXrender/xrender.pc.in b/libXrender/xrender.pc.in new file mode 100644 index 000000000..dd30ce9c2 --- /dev/null +++ b/libXrender/xrender.pc.in @@ -0,0 +1,12 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Xrender +Description: X Render Library +Version: @VERSION@ +Requires: xproto renderproto >= @RENDER_VERSION@ x11 +Requires.private: x11 +Cflags: -I${includedir} +Libs: -L${libdir} -lXrender diff --git a/packages.txt b/packages.txt index dd4ce67e6..9307ecc89 100644 --- a/packages.txt +++ b/packages.txt @@ -43,6 +43,7 @@ font-sun-misc-1.0.2 font-util-1.1.1
font-winitzki-cyrillic-1.0.1
font-xfree86-type1-1.0.2
+fontconfig-2.8.0
fontsproto-2.1.1
freetype-2.4.4
glproto-1.4.12
@@ -54,9 +55,11 @@ libXaw-1.0.7 libXdmcp-1.0.3
libXext-1.1.2
libXfont-1.4.2
+libXft-2.2.0
libXinerama-1.1
libXmu-1.0.5
libXpm-3.5.8
+libXrender-0.9.6
libXt-1.0.8
libfontenc-1.0.5
libxcb-1.5
|