summaryrefslogtreecommitdiffstats
path: root/libass/ass_render.c
diff options
context:
space:
mode:
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-07 01:13:02 +0000
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>2009-02-07 01:13:02 +0000
commit94ea507ec23433fe594fec19e41bd96f89cd8083 (patch)
tree4e5aae2f206ae95dd299a7ea41e0007565f4fe47 /libass/ass_render.c
parent4e553a8764f412349e1fa5861b72c1239fa8a64c (diff)
downloadmpv-94ea507ec23433fe594fec19e41bd96f89cd8083.tar.bz2
mpv-94ea507ec23433fe594fec19e41bd96f89cd8083.tar.xz
Allow \be with arguments other than 0 or 1. Implement \blur.
Patch by Grigori G, greg at chown ath cx. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@28471 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libass/ass_render.c')
-rw-r--r--libass/ass_render.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 1da8b93dfc..a526f3e56c 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -43,6 +43,8 @@
#define MAX_GLYPHS 3000
#define MAX_LINES 300
+#define BE_RADIUS 1.5
+#define BLUR_MAX_RADIUS 50.0
static int last_render_id = 0;
@@ -80,6 +82,7 @@ struct ass_renderer_s {
ass_settings_t settings;
int render_id;
ass_synth_priv_t* synth_priv;
+ ass_synth_priv_t* synth_priv_blur;
ass_image_t* images_root; // rendering result is stored here
ass_image_t* prev_images_root;
@@ -112,6 +115,7 @@ typedef struct glyph_info_s {
int asc, desc; // font max ascender and descender
// int height;
int be; // blur edges
+ double blur; // gaussian blur
int shadow;
double frx, fry, frz; // rotation
@@ -160,6 +164,7 @@ typedef struct render_context_s {
char detect_collisions;
uint32_t fade; // alpha from \fad
char be; // blur edges
+ double blur; // gaussian blur
int shadow;
int drawing_mode; // not implemented; when != 0 text is discarded, except for style override tags
@@ -258,7 +263,8 @@ ass_renderer_t* ass_renderer_init(ass_library_t* library)
goto ass_init_exit;
}
- priv->synth_priv = ass_synth_init();
+ priv->synth_priv = ass_synth_init(BE_RADIUS);
+ priv->synth_priv_blur = ass_synth_init(BLUR_MAX_RADIUS);
priv->library = library;
priv->ftlibrary = ft;
@@ -688,7 +694,16 @@ static char* parse_tag(char* p, double pwr) {
if ((*p == '}') || (*p == 0))
return p;
- if (mystrcmp(&p, "fsc")) {
+ if (mystrcmp(&p, "blur")) {
+ double val;
+ if (mystrtod(&p, &val)) {
+ val = (val < 0) ? 0 : val;
+ val = (val > BLUR_MAX_RADIUS) ? BLUR_MAX_RADIUS : val;
+ render_context.blur = val;
+ } else
+ render_context.blur = 0.0;
+ // ASS standard tags
+ } else if (mystrcmp(&p, "fsc")) {
char tp = *p++;
double val;
if (tp == 'x') {
@@ -985,9 +1000,12 @@ static char* parse_tag(char* p, double pwr) {
reset_render_context();
} else if (mystrcmp(&p, "be")) {
int val;
- if (mystrtoi(&p, 10, &val))
- render_context.be = val ? 1 : 0;
- else
+ if (mystrtoi(&p, 10, &val)) {
+ // Clamp to 10, since high values need excessive CPU
+ val = (val < 0) ? 0 : val;
+ val = (val > 10) ? 10 : val;
+ render_context.be = val;
+ } else
render_context.be = 0;
} else if (mystrcmp(&p, "b")) {
int b;
@@ -1181,6 +1199,7 @@ static void reset_render_context(void)
render_context.scale_y = render_context.style->ScaleY;
render_context.hspacing = render_context.style->Spacing;
render_context.be = 0;
+ render_context.blur = 0.0;
render_context.shadow = render_context.style->Shadow;
render_context.frx = render_context.fry = 0.;
render_context.frz = M_PI * render_context.style->Angle / 180.;
@@ -1321,9 +1340,10 @@ static void get_bitmap_glyph(glyph_info_t* info)
// render glyph
error = glyph_to_bitmap(ass_renderer->synth_priv,
+ ass_renderer->synth_priv_blur,
info->glyph, info->outline_glyph,
&info->bm, &info->bm_o,
- &info->bm_s, info->be);
+ &info->bm_s, info->be, info->blur);
if (error)
info->symbol = 0;
@@ -1815,6 +1835,7 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
text_info.glyphs[text_info.length].effect_timing = render_context.effect_timing;
text_info.glyphs[text_info.length].effect_skip_timing = render_context.effect_skip_timing;
text_info.glyphs[text_info.length].be = render_context.be;
+ text_info.glyphs[text_info.length].blur = render_context.blur;
text_info.glyphs[text_info.length].shadow = render_context.shadow;
text_info.glyphs[text_info.length].frx = render_context.frx;
text_info.glyphs[text_info.length].fry = render_context.fry;
@@ -1839,6 +1860,7 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
text_info.glyphs[text_info.length].hash_key.ch = code;
text_info.glyphs[text_info.length].hash_key.advance = shift;
text_info.glyphs[text_info.length].hash_key.be = render_context.be;
+ text_info.glyphs[text_info.length].hash_key.blur = render_context.blur;
text_info.length++;