src/hb-common.h | 2 src/hb-open-type-private.hh | 2 src/hb-ot-layout-private.hh | 2 src/hb-private.hh | 2 src/hb-shape.cc | 102 +++++++++++++++++++++++++++++++++----------- util/options.cc | 4 + 6 files changed, 85 insertions(+), 29 deletions(-)
New commits: commit fe6788bc570d77d5b3aafc68efd51ca6b80499b1 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:40:56 2014 -0400 Typo diff --git a/src/hb-common.h b/src/hb-common.h index 32a62e5..f5141b9 100644 --- a/src/hb-common.h +++ b/src/hb-common.h @@ -316,7 +316,7 @@ typedef enum hb_script_t hb_script_from_iso15924_tag (hb_tag_t tag); -/* suger for tag_from_string() then script_from_iso15924_tag */ +/* sugar for tag_from_string() then script_from_iso15924_tag */ /* len=-1 means s is NUL-terminated */ hb_script_t hb_script_from_string (const char *s, int len); commit 0de25d4184d2d92b1a2ebb6fa054275aaae4c316 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:35:03 2014 -0400 [util] Note CSS compatibility in --help-features diff --git a/util/options.cc b/util/options.cc index 738fb7a..0adc179 100644 --- a/util/options.cc +++ b/util/options.cc @@ -304,7 +304,9 @@ shape_options_t::add_options (option_parser_t *parser) const gchar *features_help = "Comma-separated list of font features\n" "\n" " Features can be enabled or disabled, either globally or limited to\n" - " specific character ranges.\n" + " specific character ranges. The format for specifying feature settings\n" + " follows. All valid CSS font-feature-settings values other than 'normal'\n" + " and 'inherited' are also accepted, though, not documented below.\n" "\n" " The range indices refer to the positions between Unicode characters,\n" " unless the --utf8-clusters is provided, in which case range indices\n" commit 6e69200a2aadbc6bba35ffb4a058c14286b84f46 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:30:47 2014 -0400 Fix snprintf() format Patch from Maks Naumov. Fixes https://github.com/behdad/harfbuzz/pull/22 diff --git a/src/hb-shape.cc b/src/hb-shape.cc index efe3bff..812cf59 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -257,18 +257,18 @@ hb_feature_to_string (hb_feature_t *feature, { s[len++] = '['; if (feature->start) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->start)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->start)); if (feature->end != feature->start + 1) { s[len++] = ':'; if (feature->end != (unsigned int) -1) - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->end)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->end)); } s[len++] = ']'; } if (feature->value > 1) { s[len++] = '='; - len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%d", feature->value)); + len += MAX (0, snprintf (s + len, ARRAY_LENGTH (s) - len, "%u", feature->value)); } assert (len < ARRAY_LENGTH (s)); len = MIN (len, size - 1); commit 5c5cdbbdf8be231c433e21b050a6c6991d327b61 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:21:49 2014 -0400 Make sure broken feature strings are not partially parsed If user doesn't check hb_feature_from_string() return value, we don't want them to end up see the partially-parsed feature. diff --git a/src/hb-shape.cc b/src/hb-shape.cc index f5a4ef2..efe3bff 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -37,8 +37,7 @@ static bool parse_space (const char **pp, const char *end) { - char c; - while (*pp < end && (c = **pp, ISSPACE (c))) + while (*pp < end && ISSPACE (**pp)) (*pp)++; return true; } @@ -201,7 +200,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) * hb_feature_from_string: * @str: (array length=len): * @len: - * @feature: (out): + * @feature: (out) (allow-none): * * * @@ -213,10 +212,21 @@ hb_bool_t hb_feature_from_string (const char *str, int len, hb_feature_t *feature) { + hb_feature_t feat; + if (len < 0) len = strlen (str); - return parse_one_feature (&str, str + len, feature); + if (likely (parse_one_feature (&str, str + len, &feat))) + { + if (feature) + *feature = feat; + return true; + } + + if (feature) + memset (feature, 0, sizeof (*feature)); + return false; } /** commit a795fe637846e0d9561d2f7cdd84cfafd58b23a7 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:15:33 2014 -0400 Allow quotation marks around feature tag in hb_feature_from_string() With this, I believe we accept CSS feature strings completely. diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 2ed6ce9..f5a4ef2 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -117,16 +117,34 @@ parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) { parse_space (pp, end); - const char *p = *pp; - char c; + char quote = 0; + + if (*pp < end && (**pp == '\'' || **pp == '"')) + { + quote = **pp; + (*pp)++; + } - while (*pp < end && (c = **pp, ISALNUM(c))) + const char *p = *pp; + while (*pp < end && ISALNUM(**pp)) (*pp)++; if (p == *pp || *pp - p > 4) return false; feature->tag = hb_tag_from_string (p, *pp - p); + + if (quote) + { + /* CSS expects exactly four bytes. And we only allow quotations for + * CSS compatibility. So, enforce the length. */ + if (*pp - p != 4) + return false; + if (*pp == end || **pp != quote) + return false; + (*pp)++; + } + return true; } commit 3f6461847412e78bcddc8eba97200f3afcde869a Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:04:27 2014 -0400 Allow space at the end of feature string with values, eg 'dlig=1 ' diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 94c6f72..2ed6ce9 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -34,12 +34,13 @@ #include "hb-font-private.hh" -static void +static bool parse_space (const char **pp, const char *end) { char c; while (*pp < end && (c = **pp, ISSPACE (c))) (*pp)++; + return true; } static bool @@ -174,6 +175,7 @@ parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) parse_feature_tag (pp, end, feature) && parse_feature_indices (pp, end, feature) && parse_feature_value_postfix (pp, end, feature) && + parse_space (pp, end) && *pp == end; } commit f31f7d2259dd8edffc070af55938cb7aa23514c1 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:03:52 2014 -0400 Minor diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 93311b4..94c6f72 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -42,7 +42,7 @@ parse_space (const char **pp, const char *end) (*pp)++; } -static hb_bool_t +static bool parse_char (const char **pp, const char *end, char c) { parse_space (pp, end); @@ -54,7 +54,7 @@ parse_char (const char **pp, const char *end, char c) return true; } -static hb_bool_t +static bool parse_uint (const char **pp, const char *end, unsigned int *pv) { char buf[32]; @@ -78,7 +78,7 @@ parse_uint (const char **pp, const char *end, unsigned int *pv) return true; } -static hb_bool_t +static bool parse_bool (const char **pp, const char *end, unsigned int *pv) { parse_space (pp, end); @@ -98,7 +98,7 @@ parse_bool (const char **pp, const char *end, unsigned int *pv) return true; } -static hb_bool_t +static bool parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feature) { if (parse_char (pp, end, '-')) @@ -111,7 +111,7 @@ parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feat return true; } -static hb_bool_t +static bool parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) { parse_space (pp, end); @@ -129,12 +129,12 @@ parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) return true; } -static hb_bool_t +static bool parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) { parse_space (pp, end); - hb_bool_t has_start; + bool has_start; feature->start = 0; feature->end = (unsigned int) -1; @@ -154,7 +154,7 @@ parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) return parse_char (pp, end, ']'); } -static hb_bool_t +static bool parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature) { bool had_equal = parse_char (pp, end, '='); @@ -167,7 +167,7 @@ parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *fea } -static hb_bool_t +static bool parse_one_feature (const char **pp, const char *end, hb_feature_t *feature) { return parse_feature_value_prefix (pp, end, feature) && commit 60cb18a5dea2d30793f89e80995bb729c014864a Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 12:01:22 2014 -0400 Allow on/off in hb_feature_from_string() We now allow things like "dlig on" / "dlig=on". diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 794cc1c..93311b4 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -79,6 +79,26 @@ parse_uint (const char **pp, const char *end, unsigned int *pv) } static hb_bool_t +parse_bool (const char **pp, const char *end, unsigned int *pv) +{ + parse_space (pp, end); + + const char *p = *pp; + while (*pp < end && ISALPHA(**pp)) + (*pp)++; + + /* CSS allows on/off as aliases 1/0. */ + if (*pp - p == 2 || 0 == strncmp (p, "on", 2)) + *pv = 1; + else if (*pp - p == 3 || 0 == strncmp (p, "off", 2)) + *pv = 0; + else + return false; + + return true; +} + +static hb_bool_t parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feature) { if (parse_char (pp, end, '-')) @@ -138,8 +158,10 @@ static hb_bool_t parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature) { bool had_equal = parse_char (pp, end, '='); - bool had_value = parse_uint (pp, end, &feature->value); - /* If there was an equal-sign, then there *must* be a value. + bool had_value = parse_uint (pp, end, &feature->value) || + parse_bool (pp, end, &feature->value); + /* CSS doesn't use equal-sign between tag and value. + * If there was an equal-sign, then there *must* be a value. * A value without an eqaul-sign is ok, but not required. */ return !had_equal || had_value; } commit d9e618eca9e01c2eb6db65504af3f73be370a1e7 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 11:56:01 2014 -0400 Remove duplicate definition of ISALNUM It's defined in hb-private.h already. diff --git a/src/hb-shape.cc b/src/hb-shape.cc index 34298a1..794cc1c 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -99,10 +99,8 @@ parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) const char *p = *pp; char c; -#define ISALNUM(c) (('a' <= (c) && (c) <= 'z') || ('A' <= (c) && (c) <= 'Z') || ('0' <= (c) && (c) <= '9')) while (*pp < end && (c = **pp, ISALNUM(c))) (*pp)++; -#undef ISALNUM if (p == *pp || *pp - p > 4) return false; commit 2ee5f665ded86147acedc400153c0b3a90fe07c6 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 11:53:46 2014 -0400 Fix parsing of features like "- liga" (with the space) diff --git a/src/hb-shape.cc b/src/hb-shape.cc index b4d3004..34298a1 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -94,11 +94,11 @@ parse_feature_value_prefix (const char **pp, const char *end, hb_feature_t *feat static hb_bool_t parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) { + parse_space (pp, end); + const char *p = *pp; char c; - parse_space (pp, end); - #define ISALNUM(c) (('a' <= (c) && (c) <= 'z') || ('A' <= (c) && (c) <= 'Z') || ('0' <= (c) && (c) <= '9')) while (*pp < end && (c = **pp, ISALNUM(c))) (*pp)++; commit e15fa7a8cffbe6a67b1048d7b87b7df77d8b1686 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 11:44:35 2014 -0400 Do not require the '=' in hb_feature_from_string() Towards accepting CSS font-feature-settings strings. diff --git a/src/hb-shape.cc b/src/hb-shape.cc index a63a5c1..b4d3004 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -139,7 +139,11 @@ parse_feature_indices (const char **pp, const char *end, hb_feature_t *feature) static hb_bool_t parse_feature_value_postfix (const char **pp, const char *end, hb_feature_t *feature) { - return !parse_char (pp, end, '=') || parse_uint (pp, end, &feature->value); + bool had_equal = parse_char (pp, end, '='); + bool had_value = parse_uint (pp, end, &feature->value); + /* If there was an equal-sign, then there *must* be a value. + * A value without an eqaul-sign is ok, but not required. */ + return !had_equal || had_value; } commit f4fe9baefdb7e0ff9946f88b6f4b55738fa30cdf Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 11:39:55 2014 -0400 Reject tags longer than 4 chars in hb_feature_from_string() diff --git a/src/hb-shape.cc b/src/hb-shape.cc index c1b7524..a63a5c1 100644 --- a/src/hb-shape.cc +++ b/src/hb-shape.cc @@ -104,7 +104,7 @@ parse_feature_tag (const char **pp, const char *end, hb_feature_t *feature) (*pp)++; #undef ISALNUM - if (p == *pp) + if (p == *pp || *pp - p > 4) return false; feature->tag = hb_tag_from_string (p, *pp - p); commit 7e8c38954649c0bf2e6051d84ca08dce090ec169 Author: Behdad Esfahbod <[email protected]> Date: Fri Jul 25 11:18:11 2014 -0400 Minor warnings fixes Some systems insist on -Wmissing-field-initializers. We have too many, by design. Fix a few easy ones. diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 046df97..475187b 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -289,7 +289,7 @@ template <typename Type> struct Sanitizer { static hb_blob_t *sanitize (hb_blob_t *blob) { - hb_sanitize_context_t c[1] = {{0}}; + hb_sanitize_context_t c[1] = {{0, NULL, NULL, false, 0, NULL}}; bool sane; /* TODO is_sane() stuff */ diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh index 9b06300..d94ac50 100644 --- a/src/hb-ot-layout-private.hh +++ b/src/hb-ot-layout-private.hh @@ -127,7 +127,7 @@ struct hb_ot_layout_lookup_accelerator_t } template <typename TLookup> - inline void fini (const TLookup &lookup) + inline void fini (const TLookup &lookup HB_UNUSED) { } diff --git a/src/hb-private.hh b/src/hb-private.hh index b24c9d1..5a4ca69 100644 --- a/src/hb-private.hh +++ b/src/hb-private.hh @@ -284,7 +284,7 @@ typedef int (*hb_compare_func_t) (const void *, const void *); /* arrays and maps */ -#define HB_PREALLOCED_ARRAY_INIT {0} +#define HB_PREALLOCED_ARRAY_INIT {0, 0, NULL} template <typename Type, unsigned int StaticSize=16> struct hb_prealloced_array_t { _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
