From 8adee493913fbf21c285f15717270757e87b4779 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Wed, 29 Jan 2014 05:23:55 +0100 Subject: shaper: use global features correctly start/end of feature tags is unsigned, so use the proper constant to signal to HarfBuzz that these features are global. This allows HarfBuzz to cache shape plans, and that can considerably speed up shaping, especially if many small runs need to be shaped. --- libass/ass_shaper.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libass/ass_shaper.c b/libass/ass_shaper.c index 0e81824..8f12291 100644 --- a/libass/ass_shaper.c +++ b/libass/ass_shaper.c @@ -140,15 +140,15 @@ static void init_features(ASS_Shaper *shaper) shaper->n_features = NUM_FEATURES; shaper->features[VERT].tag = HB_TAG('v', 'e', 'r', 't'); - shaper->features[VERT].end = INT_MAX; + shaper->features[VERT].end = UINT_MAX; shaper->features[VKNA].tag = HB_TAG('v', 'k', 'n', 'a'); - shaper->features[VKNA].end = INT_MAX; + shaper->features[VKNA].end = UINT_MAX; shaper->features[KERN].tag = HB_TAG('k', 'e', 'r', 'n'); - shaper->features[KERN].end = INT_MAX; + shaper->features[KERN].end = UINT_MAX; shaper->features[LIGA].tag = HB_TAG('l', 'i', 'g', 'a'); - shaper->features[LIGA].end = INT_MAX; + shaper->features[LIGA].end = UINT_MAX; shaper->features[CLIG].tag = HB_TAG('c', 'l', 'i', 'g'); - shaper->features[CLIG].end = INT_MAX; + shaper->features[CLIG].end = UINT_MAX; } /** -- cgit v1.2.3 From f466b9678b4b68e56d7374dea51218348d628b06 Mon Sep 17 00:00:00 2001 From: Grigori Goronzy Date: Wed, 29 Jan 2014 05:25:40 +0100 Subject: Unroll FNV-1A hash function Unroll the hash function with Duff's device for improved performance. --- libass/ass_utils.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libass/ass_utils.h b/libass/ass_utils.h index 6d795f0..4e2ba6c 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -132,11 +132,16 @@ static inline int rot_key(double a) static inline unsigned fnv_32a_buf(void *buf, size_t len, unsigned hval) { unsigned char *bp = buf; - unsigned char *be = bp + len; - while (bp < be) { - hval ^= (unsigned) *bp++; - hval *= FNV1_32A_PRIME; + size_t n = (len + 3) / 4; + + switch (len % 4) { + case 0: do { hval ^= (unsigned) *bp++; hval *= FNV1_32A_PRIME; + case 3: hval ^= (unsigned) *bp++; hval *= FNV1_32A_PRIME; + case 2: hval ^= (unsigned) *bp++; hval *= FNV1_32A_PRIME; + case 1: hval ^= (unsigned) *bp++; hval *= FNV1_32A_PRIME; + } while (--n > 0); } + return hval; } static inline unsigned fnv_32a_str(char *str, unsigned hval) -- cgit v1.2.3