diff options
author | Grigori Goronzy <greg@blackbox> | 2010-01-06 23:51:01 +0100 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2010-01-07 09:05:15 +0100 |
commit | 7df7db97fdda2ea6f8617882cd5202575f44bfc5 (patch) | |
tree | 3323a1dd5e68c0be86bfdfb00d79ba4f6c8173b6 | |
parent | 29fd817f4678ea7f674c7252ec84e87f4302c06a (diff) | |
download | libass-7df7db97fdda2ea6f8617882cd5202575f44bfc5.tar.bz2 libass-7df7db97fdda2ea6f8617882cd5202575f44bfc5.tar.xz |
Improve rotation cache accuracy
In some cases 16.16 precision is not good enough. Instead use 10.22 and
use modulo 360.0 on the angles to make overflows impossible and improve
cache hit ratio sometimes.
-rw-r--r-- | libass/ass_render.c | 6 | ||||
-rw-r--r-- | libass/ass_utils.h | 15 |
2 files changed, 18 insertions, 3 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c index 1dc347f..22edce8 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1915,11 +1915,11 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, text_info->glyphs[text_info->length].hash_key.scale_y = render_priv->state.scale_y * 0xFFFF; text_info->glyphs[text_info->length].hash_key.frx = - render_priv->state.frx * 0xFFFF; + rot_key(render_priv->state.frx); text_info->glyphs[text_info->length].hash_key.fry = - render_priv->state.fry * 0xFFFF; + rot_key(render_priv->state.fry); text_info->glyphs[text_info->length].hash_key.frz = - render_priv->state.frz * 0xFFFF; + rot_key(render_priv->state.frz); text_info->glyphs[text_info->length].hash_key.fax = render_priv->state.fax * 0xFFFF; text_info->glyphs[text_info->length].hash_key.fay = diff --git a/libass/ass_utils.h b/libass/ass_utils.h index f5c68e9..ad8574c 100644 --- a/libass/ass_utils.h +++ b/libass/ass_utils.h @@ -102,6 +102,21 @@ static inline int double_to_d16(double x) { return (int) (x * 0x10000); } +static inline double d22_to_double(int x) +{ + return ((double) x) / 0x400000; +} +static inline int double_to_d22(double x) +{ + return (int) (x * 0x400000); +} + +// Calculate cache key for a rotational angle in degrees +static inline int rot_key(double a) +{ + const int m = double_to_d22(360.0); + return double_to_d22(a) % m; +} #define FNV1_32A_INIT (unsigned)0x811c9dc5 |