summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-03-20 01:19:13 +0100
committerwm4 <wm4@nowhere>2013-03-20 01:39:24 +0100
commit085666a08f4f287e5c3575c64397265599d06fa9 (patch)
tree670cd3b01cf34509b7ad386d490d9bbc62ee7a64
parentfc3b05f3178a88e5af1e994d91e43fdb0fda1059 (diff)
downloadlibass-085666a08f4f287e5c3575c64397265599d06fa9.tar.bz2
libass-085666a08f4f287e5c3575c64397265599d06fa9.tar.xz
Add type field to ASS_Image struct
Patch by chrisburel, posted on Google code issue 31.
-rw-r--r--libass/ass.h7
-rw-r--r--libass/ass_render.c22
2 files changed, 20 insertions, 9 deletions
diff --git a/libass/ass.h b/libass/ass.h
index 022668b..bd32458 100644
--- a/libass/ass.h
+++ b/libass/ass.h
@@ -44,6 +44,13 @@ typedef struct ass_image {
int dst_x, dst_y; // Bitmap placement inside the video frame
struct ass_image *next; // Next image, or NULL
+
+ enum {
+ IMAGE_TYPE_CHARACTER,
+ IMAGE_TYPE_OUTLINE,
+ IMAGE_TYPE_SHADOW
+ } type;
+
} ASS_Image;
/*
diff --git a/libass/ass_render.c b/libass/ass_render.c
index a580b29..de27641 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -240,7 +240,7 @@ static double y2scr_sub(ASS_Renderer *render_priv, double y)
static ASS_Image **render_glyph_i(ASS_Renderer *render_priv,
Bitmap *bm, int dst_x, int dst_y,
uint32_t color, uint32_t color2, int brk,
- ASS_Image **tail)
+ ASS_Image **tail, unsigned int type)
{
int i, j, x0, y0, x1, y1, cx0, cy0, cx1, cy1, sx, sy, zx, zy;
Rect r[4];
@@ -308,6 +308,7 @@ static ASS_Image **render_glyph_i(ASS_Renderer *render_priv,
lbrk - r[j].x0, r[j].y1 - r[j].y0,
bm->stride, dst_x + r[j].x0, dst_y + r[j].y0, color);
if (!img) break;
+ img->type = type;
*tail = img;
tail = &img->next;
}
@@ -317,6 +318,7 @@ static ASS_Image **render_glyph_i(ASS_Renderer *render_priv,
r[j].x1 - lbrk, r[j].y1 - r[j].y0,
bm->stride, dst_x + lbrk, dst_y + r[j].y0, color2);
if (!img) break;
+ img->type = type;
*tail = img;
tail = &img->next;
}
@@ -339,12 +341,12 @@ static ASS_Image **render_glyph_i(ASS_Renderer *render_priv,
*/
static ASS_Image **
render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y,
- uint32_t color, uint32_t color2, int brk, ASS_Image **tail)
+ uint32_t color, uint32_t color2, int brk, ASS_Image **tail, unsigned int type)
{
// Inverse clipping in use?
if (render_priv->state.clip_mode)
return render_glyph_i(render_priv, bm, dst_x, dst_y, color, color2,
- brk, tail);
+ brk, tail, type);
// brk is relative to dst_x
// color = color left of brk
@@ -399,6 +401,7 @@ render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y,
brk - b_x0, b_y1 - b_y0, bm->stride,
dst_x + b_x0, dst_y + b_y0, color);
if (!img) return tail;
+ img->type = type;
*tail = img;
tail = &img->next;
}
@@ -409,6 +412,7 @@ render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y,
b_x1 - brk, b_y1 - b_y0, bm->stride,
dst_x + brk, dst_y + b_y0, color2);
if (!img) return tail;
+ img->type = type;
*tail = img;
tail = &img->next;
}
@@ -716,7 +720,7 @@ static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x, int dst_y)
here_tail = tail;
tail =
render_glyph(render_priv, bm, pen_x, pen_y, info->c[3], 0,
- 1000000, tail);
+ 1000000, tail, IMAGE_TYPE_SHADOW);
if (last_tail && tail != here_tail && ((info->c[3] & 0xff) > 0))
render_overlap(render_priv, last_tail, here_tail);
@@ -750,7 +754,7 @@ static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x, int dst_y)
here_tail = tail;
tail =
render_glyph(render_priv, bm, pen_x, pen_y, info->c[2],
- 0, 1000000, tail);
+ 0, 1000000, tail, IMAGE_TYPE_OUTLINE);
if (last_tail && tail != here_tail && ((info->c[2] & 0xff) > 0))
render_overlap(render_priv, last_tail, here_tail);
@@ -781,19 +785,19 @@ static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x, int dst_y)
if (info->effect_timing > (info->bbox.xMax >> 6))
tail =
render_glyph(render_priv, bm, pen_x, pen_y,
- info->c[0], 0, 1000000, tail);
+ info->c[0], 0, 1000000, tail, IMAGE_TYPE_CHARACTER);
else
tail =
render_glyph(render_priv, bm, pen_x, pen_y,
- info->c[1], 0, 1000000, tail);
+ info->c[1], 0, 1000000, tail, IMAGE_TYPE_CHARACTER);
} else if (info->effect_type == EF_KARAOKE_KF) {
tail =
render_glyph(render_priv, bm, pen_x, pen_y, info->c[0],
- info->c[1], info->effect_timing, tail);
+ info->c[1], info->effect_timing, tail, IMAGE_TYPE_CHARACTER);
} else
tail =
render_glyph(render_priv, bm, pen_x, pen_y, info->c[0],
- 0, 1000000, tail);
+ 0, 1000000, tail, IMAGE_TYPE_CHARACTER);
info = info->next;
}
}