summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorUoti Urpala <uau@glyph.nonexistent.invalid>2009-02-28 05:58:59 +0200
committerUoti Urpala <uau@glyph.nonexistent.invalid>2009-02-28 05:58:59 +0200
commit0c6f667896620943ee6ae899d6e36c3da5c98c54 (patch)
treee9e9f2e7dc1632525250b8a54834c9c207aa80bc /libass
parent54bb7a2582ce084895dcd0c6511dda4baf9a6c0e (diff)
parentcde07e8a61ba78a8c35b1548181c1e1fd43215d9 (diff)
downloadmpv-0c6f667896620943ee6ae899d6e36c3da5c98c54.tar.bz2
mpv-0c6f667896620943ee6ae899d6e36c3da5c98c54.tar.xz
Merge svn changes up to r28755
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_bitmap.c5
-rw-r--r--libass/ass_render.c99
-rw-r--r--libass/ass_utils.c17
-rw-r--r--libass/ass_utils.h3
4 files changed, 70 insertions, 54 deletions
diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c
index 0b80d7ab2c..9ccb1bada9 100644
--- a/libass/ass_bitmap.c
+++ b/libass/ass_bitmap.c
@@ -62,8 +62,8 @@ static int generate_tables(ass_synth_priv_t* priv, double radius)
priv->g_w = 2*priv->g_r+1;
if (priv->g_r) {
- priv->g = malloc(priv->g_w * sizeof(unsigned));
- priv->gt2 = malloc(256 * priv->g_w * sizeof(unsigned));
+ priv->g = realloc(priv->g, priv->g_w * sizeof(unsigned));
+ priv->gt2 = realloc(priv->gt2, 256 * priv->g_w * sizeof(unsigned));
if (priv->g==NULL || priv->gt2==NULL) {
return -1;
}
@@ -259,6 +259,7 @@ int glyph_to_bitmap(ass_synth_priv_t* priv, ass_synth_priv_t* priv_blur,
bitmap_t** bm_o, bitmap_t** bm_s, int be, double blur_radius)
{
int bord = be ? (be+1) : 0;
+ blur_radius *= 2;
bord = (blur_radius > 0.0) ? blur_radius : bord;
assert(bm_g && bm_o && bm_s);
diff --git a/libass/ass_render.c b/libass/ass_render.c
index b3ef0ca76f..a755f23223 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -581,12 +581,9 @@ static void change_border(double border)
if (!render_context.font) return;
if (border < 0) {
- if (render_context.style->BorderStyle == 1) {
- if (render_context.style->Outline == 0 && render_context.style->Shadow > 0)
- border = 1.;
- else
- border = render_context.style->Outline;
- } else
+ if (render_context.style->BorderStyle == 1)
+ border = render_context.style->Outline;
+ else
border = 1.;
}
render_context.border = border;
@@ -705,31 +702,31 @@ static char* parse_tag(char* p, double pwr) {
mp_msg(MSGT_ASS, MSGL_V, "stub: \\ybord%.2f\n", val);
} else if (mystrcmp(&p, "xshad")) {
int val;
- if (mystrtoi(&p, 10, &val))
+ if (mystrtoi(&p, &val))
mp_msg(MSGT_ASS, MSGL_V, "stub: \\xshad%d\n", val);
} else if (mystrcmp(&p, "yshad")) {
int val;
- if (mystrtoi(&p, 10, &val))
+ if (mystrtoi(&p, &val))
mp_msg(MSGT_ASS, MSGL_V, "stub: \\yshad%d\n", val);
} else if (mystrcmp(&p, "fax")) {
int val;
- if (mystrtoi(&p, 10, &val))
+ if (mystrtoi(&p, &val))
mp_msg(MSGT_ASS, MSGL_V, "stub: \\fax%d\n", val);
} else if (mystrcmp(&p, "fay")) {
int val;
- if (mystrtoi(&p, 10, &val))
+ if (mystrtoi(&p, &val))
mp_msg(MSGT_ASS, MSGL_V, "stub: \\fay%d\n", val);
} else if (mystrcmp(&p, "iclip")) {
int x0, y0, x1, y1;
int res = 1;
skip('(');
- res &= mystrtoi(&p, 10, &x0);
+ res &= mystrtoi(&p, &x0);
skip(',');
- res &= mystrtoi(&p, 10, &y0);
+ res &= mystrtoi(&p, &y0);
skip(',');
- res &= mystrtoi(&p, 10, &x1);
+ res &= mystrtoi(&p, &x1);
skip(',');
- res &= mystrtoi(&p, 10, &y1);
+ res &= mystrtoi(&p, &y1);
skip(')');
mp_msg(MSGT_ASS, MSGL_V, "stub: \\iclip(%d,%d,%d,%d)\n", x0, y0, x1, y1);
} else if (mystrcmp(&p, "blur")) {
@@ -784,18 +781,18 @@ static char* parse_tag(char* p, double pwr) {
double x, y;
double k;
skip('(');
- x1 = strtol(p, &p, 10);
+ mystrtoi(&p, &x1);
skip(',');
- y1 = strtol(p, &p, 10);
+ mystrtoi(&p, &y1);
skip(',');
- x2 = strtol(p, &p, 10);
+ mystrtoi(&p, &x2);
skip(',');
- y2 = strtol(p, &p, 10);
+ mystrtoi(&p, &y2);
if (*p == ',') {
skip(',');
- t1 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t1);
skip(',');
- t2 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t2);
mp_msg(MSGT_ASS, MSGL_DBG2, "movement6: (%d, %d) -> (%d, %d), (%" PRId64 " .. %" PRId64 ")\n",
x1, y1, x2, y2, (int64_t)t1, (int64_t)t2);
} else {
@@ -870,7 +867,7 @@ static char* parse_tag(char* p, double pwr) {
// FIXME: simplify
} else if (mystrcmp(&p, "an")) {
int val;
- if (mystrtoi(&p, 10, &val) && val) {
+ if (mystrtoi(&p, &val) && val) {
int v = (val - 1) / 3; // 0, 1 or 2 for vertical alignment
mp_msg(MSGT_ASS, MSGL_DBG2, "an %d\n", val);
if (v != 0) v = 3 - v;
@@ -882,16 +879,16 @@ static char* parse_tag(char* p, double pwr) {
render_context.alignment = render_context.style->Alignment;
} else if (mystrcmp(&p, "a")) {
int val;
- if (mystrtoi(&p, 10, &val) && val)
+ if (mystrtoi(&p, &val) && val)
render_context.alignment = val;
else
render_context.alignment = render_context.style->Alignment;
} else if (mystrcmp(&p, "pos")) {
int v1, v2;
skip('(');
- v1 = strtol(p, &p, 10);
+ mystrtoi(&p, &v1);
skip(',');
- v2 = strtol(p, &p, 10);
+ mystrtoi(&p, &v2);
skip(')');
mp_msg(MSGT_ASS, MSGL_DBG2, "pos(%d, %d)\n", v1, v2);
if (render_context.evt_type == EVENT_POSITIONED) {
@@ -908,9 +905,9 @@ static char* parse_tag(char* p, double pwr) {
long long t1, t2, t3, t4;
if (*p == 'e') ++p; // either \fad or \fade
skip('(');
- a1 = strtol(p, &p, 10);
+ mystrtoi(&p, &a1);
skip(',');
- a2 = strtol(p, &p, 10);
+ mystrtoi(&p, &a2);
if (*p == ')') {
// 2-argument version (\fad, according to specs)
// a1 and a2 are fade-in and fade-out durations
@@ -925,24 +922,24 @@ static char* parse_tag(char* p, double pwr) {
// 6-argument version (\fade)
// a1 and a2 (and a3) are opacity values
skip(',');
- a3 = strtol(p, &p, 10);
+ mystrtoi(&p, &a3);
skip(',');
- t1 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t1);
skip(',');
- t2 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t2);
skip(',');
- t3 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t3);
skip(',');
- t4 = strtoll(p, &p, 10);
+ mystrtoll(&p, &t4);
}
skip(')');
render_context.fade = interpolate_alpha(frame_context.time - render_context.event->Start, t1, t2, t3, t4, a1, a2, a3);
} else if (mystrcmp(&p, "org")) {
int v1, v2;
skip('(');
- v1 = strtol(p, &p, 10);
+ mystrtoi(&p, &v1);
skip(',');
- v2 = strtol(p, &p, 10);
+ mystrtoi(&p, &v2);
skip(')');
mp_msg(MSGT_ASS, MSGL_DBG2, "org(%d, %d)\n", v1, v2);
// render_context.evt_type = EVENT_POSITIONED;
@@ -996,13 +993,13 @@ static char* parse_tag(char* p, double pwr) {
int x0, y0, x1, y1;
int res = 1;
skip('(');
- res &= mystrtoi(&p, 10, &x0);
+ res &= mystrtoi(&p, &x0);
skip(',');
- res &= mystrtoi(&p, 10, &y0);
+ res &= mystrtoi(&p, &y0);
skip(',');
- res &= mystrtoi(&p, 10, &x1);
+ res &= mystrtoi(&p, &x1);
skip(',');
- res &= mystrtoi(&p, 10, &y1);
+ res &= mystrtoi(&p, &y1);
skip(')');
if (res) {
render_context.clip_x0 = render_context.clip_x0 * (1-pwr) + x0 * pwr;
@@ -1045,7 +1042,7 @@ static char* parse_tag(char* p, double pwr) {
reset_render_context();
} else if (mystrcmp(&p, "be")) {
int val;
- if (mystrtoi(&p, 10, &val)) {
+ if (mystrtoi(&p, &val)) {
// Clamp to 10, since high values need excessive CPU
val = (val < 0) ? 0 : val;
val = (val > 10) ? 10 : val;
@@ -1054,7 +1051,7 @@ static char* parse_tag(char* p, double pwr) {
render_context.be = 0;
} else if (mystrcmp(&p, "b")) {
int b;
- if (mystrtoi(&p, 10, &b)) {
+ if (mystrtoi(&p, &b)) {
if (pwr >= .5)
render_context.bold = b;
} else
@@ -1062,41 +1059,45 @@ static char* parse_tag(char* p, double pwr) {
update_font();
} else if (mystrcmp(&p, "i")) {
int i;
- if (mystrtoi(&p, 10, &i)) {
+ if (mystrtoi(&p, &i)) {
if (pwr >= .5)
render_context.italic = i;
} else
render_context.italic = render_context.style->Italic;
update_font();
} else if (mystrcmp(&p, "kf") || mystrcmp(&p, "K")) {
- int val = strtol(p, &p, 10);
+ int val = 0;
+ mystrtoi(&p, &val);
render_context.effect_type = EF_KARAOKE_KF;
if (render_context.effect_timing)
render_context.effect_skip_timing += render_context.effect_timing;
render_context.effect_timing = val * 10;
} else if (mystrcmp(&p, "ko")) {
- int val = strtol(p, &p, 10);
+ int val = 0;
+ mystrtoi(&p, &val);
render_context.effect_type = EF_KARAOKE_KO;
if (render_context.effect_timing)
render_context.effect_skip_timing += render_context.effect_timing;
render_context.effect_timing = val * 10;
} else if (mystrcmp(&p, "k")) {
- int val = strtol(p, &p, 10);
+ int val = 0;
+ mystrtoi(&p, &val);
render_context.effect_type = EF_KARAOKE;
if (render_context.effect_timing)
render_context.effect_skip_timing += render_context.effect_timing;
render_context.effect_timing = val * 10;
} else if (mystrcmp(&p, "shad")) {
int val;
- if (mystrtoi(&p, 10, &val))
+ if (mystrtoi(&p, &val))
render_context.shadow = val;
else
render_context.shadow = render_context.style->Shadow;
} else if (mystrcmp(&p, "pbo")) {
- (void)strtol(p, &p, 10); // ignored
+ int val = 0;
+ mystrtoi(&p, &val); // ignored
} else if (mystrcmp(&p, "p")) {
int val;
- if (!mystrtoi(&p, 10, &val))
+ if (!mystrtoi(&p, &val))
val = 0;
render_context.drawing_mode = !!val;
}
@@ -1150,7 +1151,7 @@ static unsigned get_next_char(char** str)
return ' ';
}
}
- chr = utf8_get_char(&p);
+ chr = utf8_get_char((const char **)&p);
*str = p;
return chr;
}
@@ -1312,7 +1313,7 @@ static void get_outline_glyph(int symbol, glyph_info_t* info, FT_Vector* advance
key.italic = render_context.italic;
key.outline = render_context.border * 0xFFFF;
- info->glyph = info->outline_glyph = 0;
+ memset(info, 0, sizeof(glyph_info_t));
val = cache_find_glyph(&key);
if (val) {
@@ -2049,7 +2050,7 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
center.x = x2scr(render_context.org_x);
center.y = y2scr(render_context.org_y);
} else {
- int bx, by;
+ int bx = 0, by = 0;
get_base_point(bbox, alignment, &bx, &by);
center.x = device_x + bx;
center.y = device_y + by;
diff --git a/libass/ass_utils.c b/libass/ass_utils.c
index d48685c631..25e4d4fe7b 100644
--- a/libass/ass_utils.c
+++ b/libass/ass_utils.c
@@ -30,10 +30,23 @@
#include "mputils.h"
#include "ass_utils.h"
-int mystrtoi(char** p, int base, int* res)
+int mystrtoi(char** p, int* res)
{
+ // NOTE: base argument is ignored, but not used in libass anyway
+ double temp_res;
char* start = *p;
- *res = strtol(*p, p, base);
+ temp_res = strtod(*p, p);
+ *res = (int) (temp_res + 0.5);
+ if (*p != start) return 1;
+ else return 0;
+}
+
+int mystrtoll(char** p, long long* res)
+{
+ double temp_res;
+ char* start = *p;
+ temp_res = strtod(*p, p);
+ *res = (long long) (temp_res + 0.5);
if (*p != start) return 1;
else return 0;
}
diff --git a/libass/ass_utils.h b/libass/ass_utils.h
index d7501c485d..f37bc0edc1 100644
--- a/libass/ass_utils.h
+++ b/libass/ass_utils.h
@@ -25,7 +25,8 @@
#include <stdint.h>
-int mystrtoi(char** p, int base, int* res);
+int mystrtoi(char** p, int* res);
+int mystrtoll(char** p, long long* res);
int mystrtou32(char** p, int base, uint32_t* res);
int mystrtod(char** p, double* res);
int strtocolor(char** q, uint32_t* res);