                              Fontconfig
             Font configuration and customization library
                      Version 2.13.91 (2.14 RC1)
                              2019-06-10


Check INSTALL for compilation and installation instructions.
Report bugs to https://gitlab.freedesktop.org/fontconfig/fontconfig/issues/new.

2.13.91 (2.14 RC1)

Akira TAGOH (74):
      Fix the build issue with --enable-static
      Fix the issue that '~' wasn't extracted to the proper homedir
      Add a test case for d1f48f11
      Fix CI
      Add more prefix support in <dir> element
      Update fonts.dtd for last commit
      Update docs for 1aa8b700
      add missing the case of prefix="default" as documented
      Fix test case
      CI: Add more logs
      Do not update mtime when removing .uuid file
      Do not try updating mtime when unlink was failed
      Do not run a test case for .uuid deletion
      Drop Mitra Mono from 65-nonlatin.conf
      Enable bubblewrap test case
      Use FC_PATH_MAX instead of PATH_MAX
      Use Rachana instead of Meera for Malayalam
      Add doc for description element and update fonts.dtd
      Fix FcFontList doesn't return a font with FC_COLOR=true
      Add a test case for FcFontList
      Warn when constant name is used for unexpected object
      covscan fix: get rid of unnecessary condition check
      Don't call unlink_dirs if basedir is null
      covscan: fix compiler warnings
      Fix a dereference of a null pointer
      Fix a crash with invalid matrix element
      Add system-ui generic family
      Fix misleading summary in docs for FcStrStrIgnoreCase
      Fix build issue on Win32.
      autogen.sh: Make AUTORECONF_FLAGS overwritable
      Ifdef'ed unnecessary code for Win32
      Fix make check on cross-compiled env
      Add build test for MinGW
      Fix make distcheck error
      Update requirement for gettext
      Correct configure option to cross-compile
      Install wine for CI on MinGW
      Don't test bind-mount thing for MinGW
      Reset errno to do error handling properly
      Add FcDirCacheCreateUUID doc back to pass make check
      Drop a line to include uuid.h
      Fix make check fail on run-test-conf.sh
      Add new element remap-dir instead of extending dir element
      Trim the last slash
      Update testcase
      Update deps to run CI
      Drop unnecessary line to include uuid.h
      Fix a typo
      Add reset-dirs element
      Add salt attribute to dir and remap-dir elements
      Update doc for salt
      trivial testcase update
      Add back if !OS_WIN32 line
      Fix build issues on MinGW
      Use alternative function for realpath on Win32
      Fix make check fail on MinGW again
      Add more data to artifacts for debugging purpose
      Don't share fonts and cache dir for testing
      Don't warn if path can't be converted with prefix
      Add some debugging output
      Oops, Terminate string
      fc-cache: Show font directories to generate cache with -v
      Allow overriding salt with new one coming later
      Don't show salt in debugging message if salt is null
      Fix unexpected cache name by double-slash in path
      Fallback uuid-based name to read a cache if no MD5-based cache available
      No need to remap for uuid based
      Update the test case that is looking for uuid based on host
      Distribute archive in xz instead of bz2
      Update CaseFolding.txt to Unicode 12.1
      fc-validate: returns an error code when missing some glyphs
      Correct the comment for FC_LANG in fontconfig.h
      Fix a typo in the description of FcWeightFromOpenTypeDouble
      Fix endianness on generating MD5 cache name

Behdad Esfahbod (1):
      Fix name-table language code mapping for Mongolian

Ben Wagner (1):
      Better document sysroot.

Chris McDonald (2):
      Respect sysroot option for file path passed to stat
      Lowered temporary rooted_dir variable inside loop

Jon Turney (1):
      Only use test wrapper-script if host is MinGW

Keith Packard (6):
      Do not remove UUID file when a scanned directory is empty
      Fetch FONTCONFIG_SYSROOT in FcConfigCreate
      Remove '-u' option from run-test-conf.sh
      Add delays to test-bz106632, check UptoDate separately
      Remove UUID-related tests
      Replace UUID file mechanism with per-directory 'map' attribute [v2]

Robert Yang (1):
      src/fccache.c: Fix define for HAVE_POSIX_FADVISE

2.13.1

Akira TAGOH (48):
      Use the builtin uuid for OSX
      Fix the build issue again on MinGW with enabling nls
      Add uuid to Requires.private in .pc only when pkgconfig macro found it
      Allow the constant names in the range
      Do not override locale if already set by app
      Add the value of the constant name to the implicit object in the pattern
      Add a testcase for FcNameParse
      Leave the locale setting to applications
      call setlocale
      Fix make check fail when srcdir != builddir.
      Do not ship fcobjshash.h
      Fix typo in doc
      Change the emboldening logic again
      Bug 43367 - RFE: iterator to peek objects in FcPattern
      Add a testrunner for conf
      Add a test case for 90-synthetic.conf
      Bug 106497 - better error description when problem reading font configuration
      Bug 106459 - fc-cache doesn't use -y option for .uuid files
      Fix leaks
      Fix -Wstringop-truncation warning
      Fix double-free
      Add a test case for bz#106618
      Update CaseFolding.txt to Unicode 11
      Remove .uuid when no font files exists on a directory
      Fix the leak of file handle
      Fix memory leak
      Fix memory leaks
      Fix memory leak
      Fix memory leak
      Fix memory leak
      Fix unterminated string issue
      Fix array access in a null pointer dereference
      Fix access in a null pointer dereference
      do not pass null pointer to memcpy
      Fix dereferencing null pointer
      Fix a typo
      Fix possibly dereferencing a null pointer
      Fix allocating insufficient memory for terminating null of the string
      Make a call fail on ENOMEM
      Allocate sufficient memory to terminate with null
      Drop the redundant code
      Fix memory leak
      Fix the build issue with gperf
      Fix missing closing bracket in FcStrIsAbsoluteFilename()
      Update the issue tracker URL
      Fix distcheck fail
      Add .gitlab-ci.yml
      Bump the libtool revision

Alexander Larsson (3):
      Add FcCacheAllocate() helper
      Cache: Rewrite relocated paths in earlier
      Cache: Remove alias_table

Behdad Esfahbod (4):
      Minor: fix warnings
      Fix name scanning
      Share name-mapping across instances
      Use FT_HAS_COLOR

Chris Lamb (1):
      Ensure cache checksums are deterministic

Matthieu Herrb (1):
      FcCacheFindByStat(): fix checking of nanoseconds field.

Tom Anderson (7):
      Fix undefined-shift UBSAN errors
      Use realfilename for FcOpen in _FcConfigParse
      Add FONTCONFIG_SYSROOT environment variable
      Fix CFI builds
      Fix heap use-after-free
      Return canonicalized paths from FcConfigRealFilename
      Fix build with CFLAGS="-std=c11 -D_GNU_SOURCE"

2.13

Akira TAGOH (4):
      Add Simplified Chinese translations
      Fix a build issue on MinGW with enabling nls
      Initialize an array explicitly
      Bump the libtool revision

2.12.93 (2.13 RC3)

Akira TAGOH (12):
      trivial fix
      Add files to enable ITS support in gettext
      Use the native ITS support in gettext
      Remove POTFILES.in until new release of gettext is coming...
      export GETTEXTDATADIR to refer the local .its/.loc file instead of using --its option
      clean up
      Do not add cflags and libs coming from pkg-config file.
      Revert some removal from 7ac6af6
      Take effects on dir, cachedir, acceptfont, and rejectfont only when loading
      Do not mix up font dirs into the list of config dirs
      Ensure the user config dir is available in the list of config dirs on the fallback config
      Add missing files to ship

Alexander Larsson (1):
      FcHashTableAddInternal: Compare against the right key

Behdad Esfahbod (5):
      Remove hack for OS/2 weights 1..9
      Support FC_WIDTH as double as well
      Fix leak
      Use FT_Done_MM_Var if available
      Fix undefined-behavior signed shifts

Olivier Crête (1):
      Fix cross-compilation by passing CPPFLAGS to CPP

Tom Anderson (1):
      Allow overriding symbol visibility.

2.12.92 (2.13 RC2)

Akira TAGOH (13):
      cleanup files
      Update .uuid only when -r is given but not -f.
      Returns false if key is already available in the table
      Add missing doc of FcDirCacheCreateUUID
      Replace uuid in the table properly when -r
      Add a test case for uuid creation
      Do not update mtime with creating .uuid
      Disable uuid related code on Win32
      Try to get current instance of FcConfig as far as possible
      do not check the existence of itstool on win32
      Fix the mis-ordering of ruleset evaluation in a file with include element
      Fix compiler warnings
      Add FcReadLink to wrap up readlink impl.

Alexander Larsson (1):
      fchash: Fix replace

Behdad Esfahbod (7):
      Don't crash
      Remove a debug abort()
      Minor
      Set font-variations settings for standard axes in variable fonts
      Let pattern FC_FONT_VARIATIONS override standard axis variations
      Put back accidentally removed code
      Add FcWeightTo/FromOpenTypeDouble()

2.12.91 (2.13 RC1)

Akira TAGOH (37):
      und_zsye.orth: polish to get for NotoEmoji-Regular.ttf
      Revert "Keep the same behavior to the return value of FcConfigParseAndLoad"
      Fix again to keep the same behavior to the return value of FcConfigParseAndLoad
      cleanup
      Fix a compiler warning
      Update libtool revision
      Bump version to 2.12.6
      doc: trivial update
      Add the ruleset description support
      workaround to avoid modifying by gettextize
      missing an open parenthesis
      another workaround to avoid modifying by gettextize...
      Validate cache more carefully
      Allow autoreconf through autopoint for gettext things
      Correct debugging messages to load/scan config
      Add the check of PCF_CONFIG_OPTION_LONG_FAMILY_NAMES back
      Use uuid-based cache filename if uuid is assigned to dirs
      Add new API to find out a font from current search path
      Replace the font path in FcPattern to what it is actually located.
      Replace the original path to the new one
      Replace the path of subdirs in caches as well
      Don't call FcStat when the alias has already been added
      Destroy the alias and UUID tables when all of caches is unloaded
      cleanup
      abstract hash table functions
      update
      Fix memory leak
      Fix a typo
      Don't call FcStat when the alias has already been added
      Add a testcase for bind-mounted cachedir
      cleanup
      Use smaller prime for hash size
      Fix the testcase for env not enabled PCF_CONFIG_OPTION_LONG_FAMILY_NAMES in freetype
      thread-safe functions in fchash.c
      Fix distcheck error
      Fix "make check" fail again
      Bump the libtool revision

Alban Browaeys (1):
      Fixes cleanup

Alexander Kanavin (1):
      src/fcxml.c: avoid double free() of filename

Bastien Nocera (1):
      conf: Prefer system emoji fonts to third-party ones

Behdad Esfahbod (76):
      Minor
      Remove stray printf()
      [fc-query] Fix linking order
      Instead of loading glyphs (with FreeType), just check loca table
      Don't even check loca for glyph outline detection
      Check for non-empty outline for U+0000..U+001F
      Add back code for choosing strike, and cleanup
      Minor: adjust debug output
      Remove unnecessary check
      Remove a few unused blanks parameters
      Remove check that cannot fail
      Remove use of psnames for charset construction
      Remove unused variable
      Remove fc-glyphname
      Remove blanks facility from the library
      Remove blanks support from fc-scan
      Mark more parameters FC_UNUSED
      Move variables to narrower scope and indent
      Remove unneeded check
      Use multiplication instead of division
      Use inline functions instead of macros for a couple of things
      Simplify advance-width calculations
      Inline FcFreeTypeCheckGlyph()
      Call FT_Get_Advance() only as long as we need to determine font width type
      Minor
      Update documentation for removal of blanks
      Merge branch 'faster'
      Add FcFreeTypeQueryAll()
      Document FcFreeTypeQueryAll()
      Accept NULL in for spacing in FcFreeTypeCharSetAndSpacing()
      Remove FcCompareSize()
      Rename FcCompareSizeRange() to FcCompareRange()
      Rewrite FcCompareRange()
      In FcSubstituteDefault(), handle size range
      Check instance-index before accessing array
      Indent
      [varfonts] Add FC_FONT_VARIATIONS
      [varfonts] Add FC_VARIABLE
      [varfonts] Change id argument in FcFreeTypeQuery* to unsigned int
      Print ranges as closed as opposed to half-open
      [varfonts] Change FC_WEIGHT and FC_WIDTH into ranges
      [varfonts] Query varfonts if id >> 16 == 0x8000
      Fix instance-num handling in collections
      [varfonts] Query variable font in FcFreeTypeQueryAll()
      [varfonts] Fetch optical-size for named instances
      In RenderPrepare(), handle ranges smartly
      [fc-query] Remove --ignore-blanks / -b
      [fc-match/fc-list/fc-query/fc-scan] Add --brief that is like --verbose without charset
      Add separate match compare function for size
      Fix range comparision operators implementation
      Adjust emboldening logic
      [varfonts] Map from OpenType to Fontconfig weight values
      Add FcDontCare value to FcBool
      Implement more config bool operations for boolean types
      Fix possible div-by-zero
      [varfonts] Use fvar data even if there's no variation in it
      Minor
      Revert "[varfonts] Use fvar data even if there's no variation in it"
      [varfonts] Minor
      [varfonts] Comment
      [varfonts] Don't set style for variable-font pattern
      [varfonts] Skip named-instance that is equivalent to base font
      [varfonts] Do not set postscriptname for varfont pattern
      [varfonts] Don't reopen face for each named instance
      Separate charset and spacing code
      [varfonts] Reuse charset for named instances
      Move whitespace-trimming code to apply to all name-table strings
      Fix whitespace-trimming loop and empty strings...
      Whitespace
      Don't convert nameds to UTF-8 unless we are going to use them
      Simplify name-table platform mathcing logic
      Use binary-search for finding name table entries
      [varfonts] Share lang across named-instances
      Merge branch 'varfonts2'
      Require freetype >= 2.8.1
      Remove assert

David Kaspar [Dee'Kej] (1):
      conf.d: Drop aliases for (URW)++ fonts

Florian Müllner (1):
      build: Remove references to deleted file

2.12.6

Akira TAGOH (4):
      und_zsye.orth: polish to get for NotoEmoji-Regular.ttf
      Revert "Keep the same behavior to the return value of FcConfigParseAndLoad"
      Fix again to keep the same behavior to the return value of FcConfigParseAndLoad
      Update libtool revision

Behdad Esfahbod (2):
      Minor
      [fc-query] Fix linking order

David Kaspar [Dee'Kej] (1):
      conf.d: Drop aliases for (URW)++ fonts

Florian Müllner (1):
      build: Remove references to deleted file

2.12.5

Akira TAGOH (17):
      Add FcPatternGetWithBinding() to obtain the binding type of the value in FcPattern.
      Add FcConfigParseAndLoadFromMemory() to load a configuration from memory.
      Bug 101726 - Sans config pulls in Microsoft Serifed font
      Fix gcc warnings with enabling libxml2
      Add und-zsye.orth to support emoji in lang
      Add more code points to und-zsye.orth
      Keep the same behavior to the return value of FcConfigParseAndLoad
      Do not ship fcobjshash.gperf in archive
      Accept 4 digit script tag in FcLangNormalize().
      Fix to work the debugging option on fc-validate
      Add und_zmth.orth to support Math in lang
      Polish und_zmth.orth for Libertinus Math
      Polish und_zmth.orth more for Cambria Math and Minion Math
      Update similar to emoji's
      fc-blanks: fall back to the static data available in repo if downloaded data is corrupted
      Update docs
      Update libtool versioning

Behdad Esfahbod (14):
      Pass --pic to gperf
      Add generic family matching for "emoji" and "math"
      [fc-query] Support listing named instances
      Add Twitter Color Emoji
      Add EmojiOne Mozilla font
      [fc-lang] Allow using ".." instead of "-" in ranges
      Minor
      Remove unneeded codepoints
      Adjust color emoji config some more
      Ignore 'und-' prefix for in FcLangCompare
      Minor
      Fix sign-difference compare warning
      Fix warning
      Fix weight mapping

2.12.4

Akira TAGOH (5):
      Force regenerate fcobjshash.h when updating Makefile
      Fix the build failure when srcdir != builddir and have gperf 3.1 or later installed
      Add a testcase for Bug#131804
      Update libtool revision
      Fix distcheck error

Florent Rougon (6):
      FcCharSetHash(): use the 'numbers' values to compute the hash
      fc-lang: gracefully handle the case where the last language initial is < 'z'
      Fix an off-by-one error in FcLangSetIndex()
      Fix erroneous test on language id in FcLangSetPromote()
      FcLangSetCompare(): fix bug when two charsets come from different "buckets"
      FcCharSetFreezeOrig(), FcCharSetFindFrozen(): use all buckets of freezer->orig_hash_table

Helmut Grohne (1):
      fix cross compilation

Jan Alexander Steffens (heftig) (1):
      Fix testing PCF_CONFIG_OPTION_LONG_FAMILY_NAMES (CFLAGS need to be right)

Josselin Mouette (1):
      Treat C.UTF-8 and C.utf8 locales as built in the C library.

Masamichi Hosoda (1):
      Bug 99360 - Fix cache file update on MinGW

2.12.3

Akira TAGOH (1):
      Fix make check fail with freetype-2.7.1 and 2.8 with PCF_CONFIG_OPTION_LONG_FAMILY_NAMES enabled.

2.12.2

Akira TAGOH (8):
      Don't call perror() if no changes happens in errno
      Fix FcCacheOffsetsValid()
      Fix the build issue with gperf 3.1
      Fix the build issue on GNU/Hurd
      Update a bit for the changes in FreeType 2.7.1
      Add the description of FC_LANG envvar to the doc
      Bug 101202 - fontconfig FTBFS if docbook-utils is installed
      Update libtool revision

Alan Coopersmith (1):
      Correct cache version info in doc/fontconfig-user.sgml

Khem Raj (1):
      Avoid conflicts with integer width macros from TS 18661-1:2014

Masamichi Hosoda (2):
      Fix PostScript font alias name
      Update aliases for URW June 2016

2.12.1

Akira TAGOH (6):
      Add --with-default-hinting to configure
      Update CaseFolding.txt to Unicode 9.0
      Check python installed in autogen.sh
      Fix some errors related to python3
      Bug 96676 - Check range of FcWeightFromOpenType argument
      Update libtool revision

Tobias Stoeckmann (1):
      Properly validate offsets in cache files.

2.12

Akira TAGOH (8):
      Modernize fc-blanks.py
      Update URL
      Bug 95477 - FcAtomicLock fails when SELinux denies link() syscall with EACCES
      45-latin.conf: Add some Windows fonts to categorize them properly
      Correct one for the previous change
      Bug 95481 - Build fails on Android due to broken lconv struct
      Add the static raw data to generate fcblanks.h
      Remove unused code

Erik de Castro Lopo (1):
      Fix a couple of minor memory leaks

Petr Filipsky (1):
      Fix memory leak in FcDirCacheLock

2.11.95 (2.12 RC5)

Akira TAGOH (22):
      Add one more debugging option to see transformation on font-matching
      Fix a crash when no objects are available after filtering
      No need to be public
      mark as private at this moment
      Don't return FcFalse even when no fonts dirs is configured
      Add a warning for blank in fonts.conf
      Fix a memory leak in FcFreeTypeQueryFace
      Update CaseFolding.txt to Unicode 8.0
      Bug 90867 - Memory Leak during error case in fccharset
      Fix the broken cache more.
      Fail on make runtime as needed instead of configure if no python installed
      Use long long to see the same size between LP64 and LLP64
      Fix build issue on MinGW
      Use int64_t instead of long long
      Fix compiler warnings on MinGW
      Fix assertion on 32bit arch
      remomve unnecessary code
      Bug 93075 - Possible fix for make check failure on msys/MinGW...
      Avoid an error message on testing when no fonts.conf installed
      Add hintstyle templates and make hintslight default
      Revert "Workaround another race condition issue"
      Update libtool revision

Behdad Esfahbod (6):
      Revert changes made to FcConfigAppFontAddDir() recently
      Call FcFreeTypeQueryFace() from fcdir.c, instead of FcFreeTypeQuery()
      [GX] Support instance weight, width, and style name
      [GX] Enumerate all named-instances in TrueType GX fonts
      Improve OpenType to Fontconfig weight mapping
      [GX] Improve weight mapping

Patrick Haller (1):
      Optimizations in FcStrSet

2.11.94 (2.12 RC4)

Akira TAGOH (16):
      Remove the dead code
      Bug 89617 - FcConfigAppFontAddFile() returns false on any font file
      Fix unknown attribute in Win32
      Fix SIGFPE
      Fix a typo for the latest cache version
      Fix a typo in fontconfig-user.sgml
      Drop unmaintained code
      Observe blanks to compute correct languages in fc-query/fc-scan
      Add missing description for usage
      Make FC_SCALE deprecated
      Bug 90148 - Don't warn if cachedir isn't specified
      Fix memory leaks after FcFini()
      Fix a typo
      Fix a crash
      Detect the overflow for the object ID
      Revert the previous change

Behdad Esfahbod (11):
      Fix bitmap scaling
      Add su[pport for symbol fonts
      Write ranges using a [start finish) format
      Only set FC_SIZE for scalable fonts if OS/2 version 5 is present
      Add bitmap-only font size as Double, not Range
      Accept Integer for FC_SIZE
      Don't set FC_SIZE for bitmap fonts
      Fix compiler warnings
      Simplify FcRange
      Reduce number of places that cache version is specified to 1
      Bump cache version number to 6, because of recent FcRange changes

Руслан Ижбулатов (1):
      W32: Support cache paths relative to the root directory

2.11.93 (2.12 RC3)

Akira TAGOH (18):
      Fix a typo in docs
      Add pkg.m4 to git
      Fix a build fail on some non-POSIX platforms
      ifdef'd the unnecessary code for win32
      Fix pointer cast warning on win32
      filter can be null
      Copy the real size of struct dirent
      Rework again to copy the struct dirent
      Hardcode the blanks in the library
      Update the script to recognize the escaped space
      Fix a build issue when $(srcdir) != $(builddir)
      Don't add FC_LANG when it has "und"
      Fix the array allocation
      Improve the performance on searching blanks
      Fix a segfault when OOM happened.
      Fix a bug in the previous change forFcBlanksIsMember()
      Fix an infinite loop in FcBlanksIsMember()
      Fix a trivial bug for dist

Alan Coopersmith (1):
      Fix configure to work with Solaris Studio compilers

Behdad Esfahbod (3):
      Fix symbol cmap handling
      Remove dead code after previous commit
      Simplify some more

Michael Haubenwallner (1):
      Ensure config.h is included first, bug#89336.

2.11.92 (2.12 RC2)

Akira TAGOH (1):
      Add missing docs

2.11.91 (2.12 RC1)

Akira TAGOH (28):
      Bug 71287 - size specific design selection support in OS/2 table version 5
      Fix a build issue with freetype <2.5.1
      Fix missing docs
      Fix a typo
      Fix fc-cache fail with -r
      Rebase ja.orth against Joyo kanji characters
      Allow the modification on FcTypeVoid with FcTypeLangSet and FcTypeCharSet
      Workaround another race condition issue
      Read the config files and fonts on the sysroot when --sysroot is given to fc-cache
      Fix a segfault
      Update CaseFolding.txt to Unicode 7.0
      Don't read/write from/to the XDG dirs if the home directory is disabled
      Rework for 5004e8e01f5de30ad01904e57ea0eda006ab3a0c
      Fix a crash when no sysroot is given and failed to load the default fonts.conf
      Fix a gcc warning
      Don't add duplicate lang
      fallback to the another method to lock when link() failed
      Increase the refcount in FcConfigSetCurrent()
      Fix the memory leak in fc-cat
      Note FcConfigSetCurrent() increases the refcount in document
      Add FcRangeGetDouble()
      Revert "Bug 73291 - poppler does not show fl ligature"
      Update aliases for new URW fonts
      Returns False if no fonts found
      fc-cache: make a fail if no fonts processed on a given path
      fc-cache: Add an option to raise an error if no fonts found
      Bump the cache version to 5
      Fix a typo

Behdad Esfahbod (39):
      Remove unused code
      Simplify hash code
      Further simplify hash code
      Rewrite hashing to use FT_Stream directly
      Allow passing NULL for file to FcFreeTypeQueryFace()
      [ko.orth] Remove U+3164 HANGUL FILLER
      Deprecate FC_HASH and don't compute it
      Remove unused FcHash code now that FC_HASH is deprecated
      Update list of blanks to Unicode 6.3.0
      Update blanks to Unicode 7.0
      Change charset parse/unparse format to be human readable
      Minor
      Fix charset unparse after recent changes
      Comments
      Remove HASH from matching priorities
      Fixup previous commit
      Update mingw32 MemoryBarrier from HarfBuzz
      More mingw32 MemoryBarrier() fixup
      Symlinks fix for DESTDIR
      Revert "Symlinks fix for DESTDIR"
      Call FcInitDebug from FcFreeTypeQueryFace
      Decode MacRoman encoding in name table without iconv
      Ouch, fix buffer
      Use lang=und instead of lang=xx for "undetermined"
      Remove unused regex code
      Improve / cleanup namelang matching
      Add FC_WEIGHT_DEMILIGHT
      Change DemiLight from 65 to 55
      Linearly interpolate weight values
      Export recently added API
      Remove unneeded FcPublic
      Fix assertion failure
      If OS/2 table says weight is 1 to 9, multiply by 100
      Trebuchet MS is a sans-serif font, not serif
      Fix previous commit
      Revert "[fcmatch] When matching, reserve score 0 for when elements don't exist"
      Fix buffer overflow in copying PS name
      Add FC_COLOR
      Treat color fonts as scalable

Nick Alcock (1):
      Generate documentation for FcWeight* functions.

2.11.1

Akira TAGOH (31):
      do not build test-migration for Win32
      Fix build issue on Debian/kFreeBSD 7.0
      Update ax_pthread.m4 to the latest version
      Fix the dynamic loading issue on NetBSD
      Use stat() if there are no d_type in struct dirent
      Fix a build issue on Solaris 10
      Change the default weight on match to FC_WEIGHT_NORMAL
      Warn if no <test> nor <edit> elements in <match>
      Correct DTD
      Re-scan font directories only when it contains subdirs
      Fix typo
      Bug 72086 - Check for gperf in autogen.sh
      Simplify to validate the availability of posix_fadvise
      Simplify to validate the availability of scandir
      Fix a typo
      Fix a build issue on platforms where doesn't support readlink()
      Improve the performance issue on rescanning directories
      Bug 73686 - confdir is not set correctly in fontconfig.pc
      Update zh_hk.orth
      clean up the unused files
      Add missing license headers
      Update the use of autotools' macro
      Fix a crash issue when empty strings are set to the BDF properties
      Add a doc for FcDirCacheRescan
      Add missing #include <sys/statvfs.h> in fcstat.c
      Fix incompatible API on AIX with random_r and initstate_r
      Fallback to lstat() in case the filesystem doesn't support d_type in struct dirent
      Update doc to include the version info of `since when'
      Bug 73291 - poppler does not show fl ligature
      Add README describes the criteria to add/modify the orthography files
      Fix autoconf warning, warning: AC_COMPILE_IFELSE was called before AC_USE_SYSTEM_EXTENSIONS

Alan Coopersmith (3):
      Leave room for null terminators in arrays
      Avoid memory leak when NULL path passed to FcStrBuildFilename
      Avoid null pointer dereference in FcNameParse if malloc fails

Behdad Esfahbod (1):
      Bug 72380 - Never drop first font when trimming

Frederic Crozat (2):
      Fix inversion between Tinos and Cousine in the comment
      Add metric aliases for additional Google ChromeOS fonts

Jehan (1):
      Defaulting <cachedir> to LOCAL_APPDATA_FONTCONFIG_CACHE for Win32 build

Ross Burton (1):
      fc-cache: --sysroot option takes an argument

2.11

Akira TAGOH (15):
      Do not create a config dir for migration when no config files nor dirs
      Add a test case of the migration for config place
      Fix memory leaks in FcFreeTypeQueryFace
      Bug 68955 - Deprecate / remove FC_RASTERIZER
      Copy all values from the font to the pattern if the pattern doesn't have the element
      Fix a crash when FcPattern is set to null on FcFontSetList() and FcFontList()
      Add the description of -q option to the man page
      avoid reading config.h twice
      clean up
      Add the relative path for <include> to fonts.conf if the parent path is same to fonts.conf
      Workaround the race condition issue on updating cache
      exit with the error code when FcNameParse() failed
      Add missing doc for FcStrListFirst and fix a typo
      Bump libtool revision
      Update CaseFolding.txt to Unicode 6.3

Jan Alexander Steffens (heftig) (1):
      Further changes to 30-metric-aliases.conf

W. Trevor King (1):
      doc/fccharset.fncs: Describe the map format in more detail

2.10.95 (2.11 RC5)

Akira TAGOH (2):
      Fix a typo
      Fix a crash

2.10.94 (2.11 RC4)

Akira TAGOH (25):
      Bug 64906 - FcNameParse() should ignore leading whitespace in parameters
      Fix a comparison of constant warning with clang
      Fix a shift count overflow on 32bit box
      Fix a incompatible pointer warning on NetBSD
      Add FcTypeUnknown to FcType to avoid comparison of constant -1
      Fix the behavior of intermixed tests end edits in match
      Ignore scandir() check on mingw
      Use INT_MAX instead of unreliable hardcoding value
      Add FC_UNUSED to FC_ASSERT_STATIC macro to avoid compiler warning
      Rework to apply the intermixed test and edit elements in one-pass
      trivial code optimization
      Correct fontconfig.pc to add certain dependencies for build
      Correct fontconfig.pc to add certain dependencies for static build
      Fix wrong edit position
      Bug 67809 - Invalid read/write with valgrind when assigning something twice
      warn deprecated only when migration failed
      Bug 67845 - Match on FC_SCALABLE
      Bug 16818 - fontformat in match pattern is not respected?
      Bug 68340 - More metric compat fonts
      Bug 63399 - Add default aliases for Georgia, Garamond, Palatino Linotype, Trebuchet MS
      Fix a typo
      Fix a crash when non-builtin objects are edited
      Fix a wrong edit position when 'kind' is different
      Bug 68587 - copy qu.orth to quz.orth
      Add quz.orth to Makefile.am

Behdad Esfahbod (2):
      Minor
      Fix assertion

2.10.93 (2.11 RC3)

Akira TAGOH (10):
      Bug 62980 - matching native fonts with even :lang=en
      Ensure closing fp on error
      Obtain fonts data via FT_Face instead of opening a file directly
      Revert the previous change and rework to not export freetype API outside fcfreetype.c
      documented FC_HASH and FC_POSTSCRIPT_NAME
      Bug 63329 - make check fails: .. contents:: :depth: 2
      Use the glob matching for filename
      Bug 63452 - conf.d/README outdated
      Fix missing OSAtomicCompareAndSwapPtrBarrier() on Mac OS X 10.4
      Bug 63922 - FcFreeTypeQueryFace fails on postscripts fonts loaded from memory

Sebastian Freundt (1):
      build-chain, replace INCLUDES directive by AM_CPPFLAGS

2.10.92 (2.11 RC2)

Akira TAGOH (33):
      Fix the build fail on MinGW
      Bug 50497 - RFE: Add OpenType feature tags support
      Improve FcGetPrgname() to work on BSD
      Better fix for 2fe5ddfd
      Add missing file descriptor to F_DUPFD_CLOEXEC
      Fix mkstemp absence for some platform
      Fix installation on MinGW32
      Add another approach to FC_PRGNAME for Solaris 10 or before
      remove the unnecessary code
      Bug 59385 - Do the right thing for intermixed edit and test elements
      Bug 23757 - Add mode="delete" to <edit>
      Modernize configure.ac
      Use AM_MISSING_PROG instead of hardcoding missing
      Revert "test: Use SH_LOG_COMPILER and AM_TESTS_ENVIRONMENT"
      Use AM_MISSING_PROG instead of hardcoding missing
      Bug 50733 - Add font-file hash?
      Bug 60312 - DIST_SUBDIRS should never appear in a conditional
      Update _FcMatchers definition logic
      Bump the cache version to 4
      Add Culmus foundry to the vendor list
      Bug 60748 - broken conf.d/10-autohint.conf and conf.d/10-unhinted.conf
      Bug 60783 - Add Liberation Sans Narrow to 30-metric-aliases.conf
      Fix a typo
      Fix a crash when the object is non-builtin object
      Fix broken sort order with FcFontSort()
      Fix a memory leak
      Bug 59456 - Adding a --sysroot like option to fc-cache
      Do not copy FC_*LANG_OBJECT even if it's not available on the pattern
      Fix a SIGSEGV on FcPatternGet* with NULL pattern
      Bug 38737 - Wishlist: support FC_POSTSCRIPT_NAME
      Minor cleanup
      Bump libtool revision
      Minor fix

Behdad Esfahbod (12):
      Resepct $NOCONFIGURE
      Ensure we find the uninstalled fontconfig header
      Copy all values from pattern to font if the font doesn't have the element
      Minor
      Bug 59379 - FC_PRGNAME
      Remove unused checks for common functions
      Minor
      Fix fc-cache crash caused by looking up NULL object incorrectly
      Fix FC_PRGNAME default
      Fix readlink failure
      Accept digits as part of OpenType script tags
      Fix crash with FcConfigSetCurrent(NULL)

Christoph J. Thompson (1):
      Use the PKG_INSTALLDIR macro.

Colin Walters (1):
      build: Only use PKG_INSTALLDIR if available

Quentin Glidic (2):
      test: Use SH_LOG_COMPILER and AM_TESTS_ENVIRONMENT
      Use LOG_COMPILER and AM_TESTS_ENVIRONMENT

2.10.91 (2.11 RC1)

Akira TAGOH (19):
      Fix a potability issue about stdint.h
      Fix build issues on clean tree
      Do not show the deprecation warning if it is a symlink
      Fix a typo
      Fix the wrong estimation for the memory usage information in fontconfig
      Remove the duplicate null-check
      Remove the dead code
      clean up
      Fix a typo that accessing to the out of array
      Fix a memory leak
      Check the system font to be initialized
      Missing header file for _mkdir declaration
      Clean up the unused variable
      Bug 47705 - Using O_CLOEXEC
      missing header file to declare _mkdir
      Fix a build fail on mingw
      Fix a typo in the manpages template
      Bug 29312 - RFE: feature to indicate which characters are missing to satisfy the language support
      Update the date in README properly

Behdad Esfahbod (73):
      Fix typo
      Parse matrices of expressions
      Fix compiler warnings
      Fix unused-parameter warnings
      Fix more warnings
      Fix sign-compare warnings
      Fix warning
      Fix more warnings
      Fixup from 4f6767470f52b287a2923e7e6d8de5fae1993f67
      Remove memory accounting and reporting
      Allow target="font/pattern/default" in <name> elements
      Don't warn if an unknown element is used in an expression
      Unbreak build when FC_ARCHITECTURE is defined
      Remove unneeded stuff
      Enable fcarch assert checks even when FC_ARCHITECTURE is explicitly given
      Make tests run on Windows
      Initialize matrix during name parsing
      Adjust docs for recent changes
      Warn if <name target="font"> appears in <match target="pattern">
      Make FC_DBG_OBJTYPES debug messages into warnings
      Refuse to set value to unsupported types during config too
      Add NULL check
      Don't crash in FcPatternDestroy with NULL pattern
      Don't crash in FcPatternFormat() with NULL pattern
      Minor
      Whitespace
      Deprecate FcName(Un)RegisterObjectTypes / FcName(Un)RegisterConstants
      Use a static perfect hash table for object-name lookup
      Switch .gitignore to git.mk
      Remove shared-str pool
      Fix build stuff
      Add build stuff for threadsafety primitives
      Add thread-safety primitives
      Make refcounts, patterns, charsets, strings, and FcLang thread-safe
      Make FcGetDefaultLang and FcGetDefaultLangs thread-safe
      Make FcInitDebug() idempotent
      Make FcDefaultFini() threadsafe
      Refactor; contain default config in fccfg.c
      Minor
      Make default-FcConfig threadsafe
      Minor
      Make FcCacheIsMmapSafe() threadsafe
      Minor
      Make cache refcounting threadsafe
      Add a big cache lock
      Make random-state initialization threadsafe
      Make cache hash threadsafe
      Make FcDirCacheDispose() threadsafe
      Make fcobjs.c thread-safe
      Warn about undefined/invalid attributes during config parsing
      Fixup fcobjs.c
      Remove FcSharedStr*
      Fix compiler warnings
      Minor
      Fix build and warnings on win32
      Use CC_FOR_BUILD to generate source files
      Fix more warnings.
      Trying to fix distcheck
      Fix build around true/false
      Work around Sun CPP
      Really fix cross-compiling and building of tools this time
      Second try to make Sun CPP happy
      Ugh, add Tools.mk
      Minor
      Don't use blanks for fc-query
      Remove FcInit() calls from tools
      Add 10-scale-bitmap-fonts.conf and enable by default
      Oops, add the actual file
      Fix pthreads setup
      Fix memory corruption!
      Add pthread test
      Add atomic ops for Solaris
      Make linker happy

Jon TURNEY (1):
      Fix build when srcdir != builddir

2.10.2

Akira TAGOH (13):
      Bug 53585 - Two highly-visible typos in src/fcxml.c
      Fix for libtoolize's warnings
      Bug 54138 - X_OK permission is invalid for win32 access(..) calls
      Bug 52573 - patch required to build 2.10.x with oldish GNU C library headers
      deal with warnings as errors for the previous change
      Fix wrongly squashing for the network path on Win32.
      Fix syntax errors in fonts.dtd.
      autogen.sh: Add -I option to tell aclocal a place for external m4 files
      Use automake variable instead of cleaning files in clean-local
      Bug 56531 - autogen.sh fails due to missing 'm4' directory
      Bug 57114 - regression on FcFontMatch with namelang
      Update CaseFolding.txt to Unicode 6.2
      Bug 57286 - Remove UnBatang and Baekmuk Batang from monospace in 65-nonlatin.conf

Behdad Esfahbod (1):
      Fix N'ko orthography

Jeremy Huddleston Sequoia (1):
      Remove _CONFIG_FIXUPS_H_ guards, so multiple includes of "config.h" result in the correct values

2.10.1

Akira TAGOH (2):
      Fix a typo in fontconfig.pc
      Install config files first

2.10.0

Akira TAGOH (5):
      Bug 34266 - configs silently ignored if libxml2 doesn't support SAX1 interface
      Update CaseFolding.txt to Unicode 6.1
      Fix a build fail with gcc 2.95, not supporting the flexible array members.
      Bump libtool revision
      Update INSTALL

2.9.92 (2.10 RC2)

Akira TAGOH (9):
      Bug 50835 - Deprecate FC_GLOBAL_ADVANCE
      Fix a typo and build fail.
      Fix a build fail on MINGW
      Fix the fail of make install with --disable-shared on Win32
      clean up the lock file properly on even hardlink-not-supported filesystem.
      Rename configure.in to configure.ac
      Bug 18726 - RFE: help write locale-specific tests
      Bump libtool revision
      Update INSTALL

Marius Tolzmann (2):
      Fix newline in warning about deprecated config includes
      Fix warning about deprecated, non-existent config includes

2.9.91 (2.10 RC1)

Akira TAGOH (60):
      [doc] Update the path for cache files and the version.
      [doc] Update for cachedir.
      Revert "Fix a build fail on some environment."
      Revert "Fix a build fail on some environment"
      Fix a build issue due to the use of non-portable variables
      Get rid of the prerequisites from the sufix rules
      Bug 39914 - Please tag the cache directory with CACHEDIR.TAG
      fc-cache: improvement of the fix for Bug#39914.
      fcmatch: Set FcResultMatch at the end if the return value is valid.
      Bug 47703 - SimSun default family
      Bug 17722 - Don't overwrite user's configurations in default config
      Fix a memory leak in FcDirScanConfig()
      Bug 17832 - Memory leaks due to FcStrStaticName use for external patterns
      fcpat: Increase the number of buckets in the shared string hash table
      Fix the hardcoded cache file suffix
      Move workaround macros for fat binaries into the separate header file
      Bug 48020 - Fix for src/makealias on Solaris 10
      Bug 24729 - [ne_NP] Fix ortho file
      doc: Add contains and not_contains operators and elements
      Use AC_HELP_STRING instead of formatting manually
      Use pkgconfig to check builddeps
      Bug 29341 - Make some fontconfig paths configurable
      Bug 22862 - <alias> ignores <match> <test>s
      Bug 26830 - Add search for libiconv non-default directory
      Bug 28491 - Allow matching on FC_FILE
      Bug 48573 - platform without regex do not have also REG_XXX defines
      Bug 27526 - Compatibility fix for old windows sytems
      Add --with-expat, --with-expat-includes and --with-expat-lib back.
      doc: Fix a typo of the environment variable name.
      Bug 25151 - Move cleanCacheDirectory() from fc-cache.c into
      Rework to avoid adding the unexpected value to ICONV_CFLAGS and ICONV_LIBS
      Fix a build issue again when no regex functions available
      C++11 requires a space between literal and identifier
      Bug 47721 - Add ChromeOS fonts to 30-metric-aliases.conf
      Create CACHEDIR.TAG when fc-cache is run or only when the cache directory is created at the runtime.
      Add --enable-iconv option to configure
      Bug 27765 - FcMatch() returns style in wrong language
      Disable iconv support anyway...
      Bug 39278 - make usage of mmap optional
      Output more verbose debugging log to show where to insert the element into the value list
      fonts.conf: keeps same binding for alternatives
      fcarch.c: get rid of the duplicate definition of FC_MAX
      Bug 19128 - Handling whitespace in aliases
      Bug 20411 - fontconfig doesn't match FreeDesktop directories specs
      Correct the example
      Bug 33644 - Fontconfig doesn't match correctly in <test>
      fcatomic: fallback to create a directory with FcAtomicLock
      Move statfs/statvfs wrapper to fcstat.c and add a test for the mtime broken fs
      Fix the build fail on Solaris
      Fix a typo and polish the previous change
      Fix the wrong estimation for the memory usage information in fontconfig
      Bug 32853 - Export API to get the default language
      fcdefault: fallback if the environment variables are empty
      Add the default language to the pattern prior to do build the substitution
      fcdefault: no need to set FC_LANG in FcDefaultSubstitute() anymore
      fcdefault: Add the lang object at FcConfigSubstituteWithPat() only when kind is FcMatchPattern
      Bug 50525 - superfluous whitespace in the style
      Bump libtool revision
      doc: Fix distcheck error again...
      Generate bzip2-compressed tarball too

Jeremy Huddleston (1):
      fcarch: Check for architecture signature at compile time rather than configure time

Keith Packard (3):
      Use posix_fadvise to speed startup
      Extra ',' in AC_ARG_WITH(arch causes arch to never be autodetected
      Deal with architectures where ALIGNOF_DOUBLE < 4

Mark Brand (1):
      fix building for WIN32

Mikhail Gusarov (2):
      Move FcStat to separate compilation unit
      Fix cache aging for fonts on FAT filesystem under Linux

2.9

Akira TAGOH (28):
      Add charset editing feature.
      add some document for range and charset.
      Add the range support in blank element
      Add editing langset feature.
      add some documents
      Bug 24744 - No n'ko orthography
      Remove the unnecessary comment in ks.orth
      Bug 32965 - Asturian (ast-ES) language matching missing ḷḷḥ
      Add a missing file
      Bug 35517 - Remove Apple Roman cmap support
      Bug 40452 - Running 'fc-match --all' core dumps when no fonts are installed
      Get rid of the unexpected family name
      Bug 44826 - <alias> must contain only a single <family>
      Bug 46169 - Pointer error in FcConfigGlobMatch
      Do not update stream->pos when seeking is failed.
      Bug 27385 - lcdfilter settings for freetype-2.3.12 not available in fontconfig-2.8.0
      Add brx.orth and sat.orth
      Bug 41694 - FcCache functions have random-number-generator side effects
      Bug 23336 - unable to display bitmap-only (SFNT) TrueType or OpenType
      Check null value for given object to avoid possibly segfaulting
      Bug 19128 - Handling whitespace in aliases
      Fix distcheck error
      Update the version info
      Update to detect the uncommited changes properly
      Fix a build issue
      Fix a build fail on some environment
      Fix a build fail on some environment.
      Get rid of $< from Makefile.am

Alan Coopersmith (1):
      Fix compiler warnings

Behdad Esfahbod (54):
      [fc-cache] Document -r argument in man page
      [doc] Fix typo
      Bug 25508 configure assumes bash > 2.0 is on system
      Update INSTALL
      Add note about autogen.sh to INSTALL
      Fix doc typo
      More doc typo fixes
      Bug 18886 installation crashes if fontconfig already installed
      Bug 26157 Solaris/Sun C 5.8: compilation of 2.8.0 and 2.7.3 fails
      Bug 25152 Don't sleep(2) if all caches were uptodate
      Don't include unistd.h in fontconfig.h
      Accept TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS from name table
      Whitespace
      More whitespace
      Remove all training whitespaces
      Fix comment
      Add fc-pattern cmdline tool
      Bug 29338 - fc-pattern.sgml, open para tag
      Add comments
      Bug 29995 - fc-cat does not invoke FcFini()
      Add new public API: FcCharSetDelChar()
      [fc-lang] Support excluding characters
      Bug 24729 - [ne_NP] Fix ortho file
      Add more copyright owners
      Cleanup copyright notices to replace "Keith Packard" with "the author(s)"
      Fix returned value
      Bug 28958 - lang=en matches other langs
      Make most generated-files cross-compiling-safe
      Make fc-arch stuff cross-compiling-safe
      Bump version
      Allow editing charset and lang in target="scan"
      Add <range> support for <blank> into the DTD
      Skip <range> elements with begin > end
      Doc nit
      Fix assertion failure on le32d4
      Remove AM_MAINTAINER_MODE
      Update CaseFolding.txt to Unicode 6.0
      Remove --enable-maintainer-mode from autogen.sh
      Bug 20113 - Uighur (ug) orthography incomplete
      Bug 30566 - fcformat.c:interpret_enumerate() passes uninitialized idx to FcPatternGetLangSet()
      Mark constant strings as constant
      More doc typo fixes
      Always define FcStat as a function
      Fix warning
      Bug 35587 - Add padding to make valgrind and glibc not hate each other
      [.gitignore] Update
      Bug 36577 - Updating cache with no-bitmaps disables bitmap fonts...
      Bug 26718 - "fc-match sans file" doesn't work
      Switch fc-match to use FcPatternFormat()
      Switch fc-cat to use FcPatternFormat()
      Fix stupid bug in FcFontSort()
      Bug 41171 - Invalid use of memset
      Fix parallel build
      Add FcPublic to FcLangSetUnion and FcLangSetSubtract

Brad Hards (1):
      Documentation fixes

Jeremy Huddleston (2):
      fontconfig.pc: Add variables for confdir and cachedir
      fontconfig.pc.in: Add sysconfdir, localstatedir, and PACKAGE

Jinkyu Yi (1):
      Bug 42423 - make default Korean font from Un to Nanum

MINAMI Hirokazu (1):
      Bug 43406 - typo of Japanese font name in conf.d/65-nonlatin.conf

Mike Frysinger (9):
      FcStrPlus: optimize a little
      delete unused variables
      FcStat: change to FcChar8 for first arg
      fc-cat: fix pointer warning
      FcName{,Get}Constant: constify string input
      fc-{list,match}: constify format string
      fix build warnings when using --with-arch
      FcObjectValidType: tweak -1 checking
      makealias: handle missing funcs better

Parag Nemade (2):
      Bug 25651 - Add ortho file for locale brx_IN
      Bug 25650 - Add ortho file for locale sat_IN

Pravin Satpute (4):
      Bug 27195 - need updates to ks.orth file
      Bug 43321 - Required corrections in urdu.orth file
      Bug 25653 - Add ortho file for locale doi_IN
      Bug 25652 - Add ortho file for locale mni_IN

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
