diff options
author | wm4 <wm4@nowhere> | 2013-03-20 01:19:13 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-03-20 01:39:24 +0100 |
commit | 085666a08f4f287e5c3575c64397265599d06fa9 (patch) | |
tree | 670cd3b01cf34509b7ad386d490d9bbc62ee7a64 | |
parent | fc3b05f3178a88e5af1e994d91e43fdb0fda1059 (diff) | |
download | libass-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.h | 7 | ||||
-rw-r--r-- | libass/ass_render.c | 22 |
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; } } |