diff options
author | Akira TAGOH <akira@tagoh.org> | 2019-07-29 09:38:51 +0000 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2019-07-29 10:19:26 +0000 |
commit | 80047ed8e8b63153ad2014f731453eb47c79c296 (patch) | |
tree | 86821089ecf96c513c8d9e61d9354135fc52f793 | |
parent | f555f50a207a96689dd6cf8ef96fd7f01b37a952 (diff) |
Add FC_FONT_HAS_HINT property to see if font has hinting or not.
This may helps to enable autohint only when font doesn't have any hinting
-rw-r--r-- | conf.d/09-autohint-if-no-hinting.conf | 20 | ||||
-rw-r--r-- | conf.d/Makefile.am | 1 | ||||
-rw-r--r-- | doc/fontconfig-devel.sgml | 1 | ||||
-rw-r--r-- | doc/fontconfig-user.sgml | 1 | ||||
-rw-r--r-- | fontconfig/fontconfig.h | 1 | ||||
-rw-r--r-- | src/fcfreetype.c | 21 | ||||
-rw-r--r-- | src/fcobjs.h | 1 |
7 files changed, 46 insertions, 0 deletions
diff --git a/conf.d/09-autohint-if-no-hinting.conf b/conf.d/09-autohint-if-no-hinting.conf new file mode 100644 index 0000000..afcef3f --- /dev/null +++ b/conf.d/09-autohint-if-no-hinting.conf @@ -0,0 +1,20 @@ +<?xml version="1.0"?> +<!DOCTYPE fontconfig SYSTEM "fonts.dtd"> +<fontconfig> + <its:rules xmlns:its="http://www.w3.org/2005/11/its" version="1.0"> + <its:translateRule translate="no" selector="/fontconfig/*[not(self::description)]"/> + </its:rules> + + <description>Enable autohinter if font doesn't have any hinting</description> + <!-- Use the Autohinter --> + <match target="font"> + <test name="fonthashint"><bool>false</bool></test> + <!-- + This configuration is available on the major desktop environments. + We shouldn't overwrite it with "assign" unconditionally. + Most clients may picks up the first value only. so using "append" + may simply works to avoid it. + --> + <edit name="autohint" mode="append"><bool>true</bool></edit> + </match> +</fontconfig> diff --git a/conf.d/Makefile.am b/conf.d/Makefile.am index 3bb92dd..710318c 100644 --- a/conf.d/Makefile.am +++ b/conf.d/Makefile.am @@ -57,6 +57,7 @@ config_DATA = $(DOC_FILES) templatedir = $(TEMPLATEDIR) template_DATA = \ 05-reset-dirs-sample.conf \ + 09-autohint-if-no-hinting.conf \ 10-autohint.conf \ 10-hinting-full.conf \ 10-hinting-medium.conf \ diff --git a/doc/fontconfig-devel.sgml b/doc/fontconfig-devel.sgml index ee4a432..c4d7537 100644 --- a/doc/fontconfig-devel.sgml +++ b/doc/fontconfig-devel.sgml @@ -211,6 +211,7 @@ convenience for the application's rendering mechanism. color FC_COLOR Bool Whether any glyphs have color fontvariations FC_FONT_VARIATIONS String comma-separated string of axes in variable font variable FC_VARIABLE Bool Whether font is Variable Font + fonthashint FC_FONT_HAS_HINT Bool Whether font has hinting </programlisting> </sect2> </sect1> diff --git a/doc/fontconfig-user.sgml b/doc/fontconfig-user.sgml index cfe173f..59431dd 100644 --- a/doc/fontconfig-user.sgml +++ b/doc/fontconfig-user.sgml @@ -140,6 +140,7 @@ convenience for the applications' rendering mechanism. familylang, stylelang, and fullnamelang prgname String String Name of the running program postscriptname String Font family name in PostScript + fonthashint Bool Whether the font has hinting </programlisting> </refsect2> <refsect2> diff --git a/fontconfig/fontconfig.h b/fontconfig/fontconfig.h index 14a23be..9586616 100644 --- a/fontconfig/fontconfig.h +++ b/fontconfig/fontconfig.h @@ -126,6 +126,7 @@ typedef int FcBool; #define FC_PRGNAME "prgname" /* String */ #define FC_HASH "hash" /* String (deprecated) */ #define FC_POSTSCRIPT_NAME "postscriptname" /* String */ +#define FC_FONT_HAS_HINT "fonthashint" /* Bool - true if font has hinting */ #define FC_CACHE_SUFFIX ".cache-" FC_CACHE_VERSION #define FC_DIR_CACHE_FILE "fonts.cache-" FC_CACHE_VERSION diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 28fa8ac..77c174e 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -543,6 +543,9 @@ static const FcMacRomanFake fcMacRomanFake[] = { static FcChar8 * FcFontCapabilities(FT_Face face); +static FcBool +FcFontHasHint (FT_Face face); + static int FcFreeTypeSpacing (FT_Face face); @@ -1829,6 +1832,9 @@ FcFreeTypeQueryFaceInternal (const FT_Face face, free (complex_); } + if (!FcPatternAddBool (pat, FC_FONT_HAS_HINT, FcFontHasHint (face))) + goto bail1; + if (!variable_size && os2 && os2->version >= 0x0005 && os2->version != 0xffff) { double lower_size, upper_size; @@ -2552,6 +2558,7 @@ FcFreeTypeCharSetAndSpacing (FT_Face face, FcBlanks *blanks FC_UNUSED, int *spac #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 TTAG_prep FT_MAKE_TAG( 'p', 'r', 'e', 'p' ) #define OTLAYOUT_HEAD "otlayout:" #define OTLAYOUT_HEAD_LEN 9 @@ -2736,6 +2743,20 @@ bail: return complex_; } +static FcBool +FcFontHasHint (FT_Face face) +{ + FT_ULong *prep = NULL; + FT_UShort prep_count = 0; + + prep_count = GetScriptTags (face, TTAG_prep, &prep); + + free (prep); + + return prep_count > 0; +} + + #define __fcfreetype__ #include "fcaliastail.h" #include "fcftaliastail.h" diff --git a/src/fcobjs.h b/src/fcobjs.h index e3926cc..7bb97d0 100644 --- a/src/fcobjs.h +++ b/src/fcobjs.h @@ -72,4 +72,5 @@ FC_OBJECT (COLOR, FcTypeBool, FcCompareBool) FC_OBJECT (SYMBOL, FcTypeBool, FcCompareBool) FC_OBJECT (FONT_VARIATIONS, FcTypeString, NULL) FC_OBJECT (VARIABLE, FcTypeBool, FcCompareBool) +FC_OBJECT (FONT_HAS_HINT, FcTypeBool, NULL) /* ^-------------- Add new objects here. */ |