diff options
-rw-r--r-- | libass/ass.h | 2 | ||||
-rw-r--r-- | libass/ass_bitmap.c | 12 | ||||
-rw-r--r-- | libass/ass_bitmap.h | 3 | ||||
-rw-r--r-- | libass/ass_render.c | 54 | ||||
-rw-r--r-- | libass/ass_render.h | 6 |
5 files changed, 29 insertions, 48 deletions
diff --git a/libass/ass.h b/libass/ass.h index 17af8cb..b797a97 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -23,7 +23,7 @@ #include <stdarg.h> #include "ass_types.h" -#define LIBASS_VERSION 0x01102000 +#define LIBASS_VERSION 0x01102001 /* * A linked list of images produced by an ass renderer. diff --git a/libass/ass_bitmap.c b/libass/ass_bitmap.c index f6e2022..a2dc293 100644 --- a/libass/ass_bitmap.c +++ b/libass/ass_bitmap.c @@ -630,18 +630,6 @@ void sub_bitmaps_c(uint8_t *dst, intptr_t dst_stride, } } -void restride_bitmap_c(uint8_t *dst, intptr_t dst_stride, - uint8_t *src, intptr_t src_stride, - intptr_t width, intptr_t height) -{ - uint8_t* end = dst + dst_stride * height; - while (dst < end) { - memcpy(dst, src, width); - dst += dst_stride; - src += src_stride; - } -} - void mul_bitmaps_c(uint8_t *dst, intptr_t dst_stride, uint8_t *src1, intptr_t src1_stride, uint8_t *src2, intptr_t src2_stride, diff --git a/libass/ass_bitmap.h b/libass/ass_bitmap.h index 64b3466..852cb0b 100644 --- a/libass/ass_bitmap.h +++ b/libass/ass_bitmap.h @@ -80,9 +80,6 @@ void add_bitmaps_c(uint8_t *dst, intptr_t dst_stride, void sub_bitmaps_c(uint8_t *dst, intptr_t dst_stride, uint8_t *src, intptr_t src_stride, intptr_t height, intptr_t width); -void restride_bitmap_c(uint8_t *dst, intptr_t dst_stride, - uint8_t *src, intptr_t src_stride, - intptr_t width, intptr_t height); void mul_bitmaps_c(uint8_t *dst, intptr_t dst_stride, uint8_t *src1, intptr_t src1_stride, uint8_t *src2, intptr_t src2_stride, diff --git a/libass/ass_render.c b/libass/ass_render.c index f33e4d2..0cc1848 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -90,7 +90,6 @@ ASS_Renderer *ass_renderer_init(ASS_Library *library) priv->mul_bitmaps_func = mul_bitmaps_c; priv->be_blur_func = be_blur_c; #endif - priv->restride_bitmap_func = restride_bitmap_c; #if CONFIG_RASTERIZER #if CONFIG_LARGE_TILES @@ -450,18 +449,22 @@ render_glyph(ASS_Renderer *render_priv, Bitmap *bm, int dst_x, int dst_y, tmp = dst_x - clip_x0; if (tmp < 0) { b_x0 = -tmp; + render_priv->state.has_clips = 1; } tmp = dst_y - clip_y0; if (tmp < 0) { b_y0 = -tmp; + render_priv->state.has_clips = 1; } tmp = clip_x1 - dst_x - bm->w; if (tmp < 0) { b_x1 = bm->w + tmp; + render_priv->state.has_clips = 1; } tmp = clip_y1 - dst_y - bm->h; if (tmp < 0) { b_y1 = bm->h + tmp; + render_priv->state.has_clips = 1; } if ((b_y0 >= b_y1) || (b_x0 >= b_x1)) @@ -572,7 +575,7 @@ static void blend_vector_clip(ASS_Renderer *render_priv, int aleft, atop, bleft, btop; unsigned char *abuffer, *bbuffer, *nbuffer; - render_priv->state.has_vector_clip = 1; + render_priv->state.has_clips = 1; abuffer = cur->bitmap; bbuffer = clip_bm->buffer; @@ -667,6 +670,8 @@ static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x, int dst_y) CombinedBitmapInfo *info = &text_info->combined_bitmaps[i]; if (!info->bm_s || (info->shadow_x == 0 && info->shadow_y == 0)) continue; + if (render_priv->state.border_style == 4) + continue; pen_x = dst_x + info->pos.x + @@ -732,29 +737,6 @@ static ASS_Image *render_text(ASS_Renderer *render_priv, int dst_x, int dst_y) *tail = 0; blend_vector_clip(render_priv, head); - for (ASS_Image* cur = head; cur; cur = cur->next) { - unsigned w = cur->w, - h = cur->h, - s = cur->stride; - if(w + 31 < (unsigned)cur->stride){ // Larger value? Play with this. - // Allocate new buffer and add to free list - unsigned align = (w >= 32) ? 32 : ((w >= 16) ? 16 : 1); - unsigned ns = ass_align(align, w); - uint8_t* nbuffer = ass_aligned_alloc(align, ns * cur->h); - if (!nbuffer) continue; - free_list_add(render_priv, nbuffer); - - // Copy - render_priv->restride_bitmap_func(nbuffer, ns, - cur->bitmap, s, - w, h); - cur->w = w; - cur->h = h; - cur->stride = ns; - cur->bitmap = nbuffer; - } - } - return head; } @@ -834,7 +816,7 @@ init_render_context(ASS_Renderer *render_priv, ASS_Event *event) render_priv->state.event = event; render_priv->state.style = render_priv->track->styles + event->Style; render_priv->state.parsed_tags = 0; - render_priv->state.has_vector_clip = 0; + render_priv->state.has_clips = 0; reset_render_context(render_priv, render_priv->state.style); render_priv->state.wrap_style = render_priv->track->WrapStyle; @@ -2568,6 +2550,24 @@ ass_render_event(ASS_Renderer *render_priv, ASS_Event *event, event_images->event = event; event_images->imgs = render_text(render_priv, (int) device_x, (int) device_y); + if (render_priv->state.border_style == 4) { + void *nbuffer = ass_aligned_alloc(1, event_images->width * event_images->height); + if (nbuffer) { + free_list_add(render_priv, nbuffer); + memset(nbuffer, 0xFF, event_images->width * event_images->height); + ASS_Image *img = my_draw_bitmap(nbuffer, event_images->width, + event_images->height, + event_images->width, + event_images->left, + event_images->top, + render_priv->state.c[3]); + if (img) { + img->next = event_images->imgs; + event_images->imgs = img; + } + } + } + ass_shaper_cleanup(render_priv->shaper, text_info); free_render_context(render_priv); @@ -2887,7 +2887,7 @@ static int ass_detect_change(ASS_Renderer *priv) ASS_Image *img, *img2; int diff; - if (priv->cache_cleared || priv->state.has_vector_clip) + if (priv->cache_cleared || priv->state.has_clips) return 2; img = priv->prev_images_root; diff --git a/libass/ass_render.h b/libass/ass_render.h index 355421f..8e15ad5 100644 --- a/libass/ass_render.h +++ b/libass/ass_render.h @@ -232,7 +232,7 @@ typedef struct { ASS_Event *event; ASS_Style *style; int parsed_tags; - int has_vector_clip; + int has_clips; // clips that conflict with cache change detection ASS_Font *font; double font_size; @@ -316,9 +316,6 @@ typedef void (*BitmapMulFunc)(uint8_t *dst, intptr_t dst_stride, typedef void (*BEBlurFunc)(uint8_t *buf, intptr_t w, intptr_t h, intptr_t stride, uint16_t *tmp); -typedef void (*RestrideBitmapFunc)(uint8_t *dst, intptr_t dst_stride, - uint8_t *src, intptr_t src_stride, - intptr_t width, intptr_t height); struct ass_renderer { ASS_Library *library; @@ -360,7 +357,6 @@ struct ass_renderer { BitmapBlendFunc sub_bitmaps_func; BitmapMulFunc mul_bitmaps_func; BEBlurFunc be_blur_func; - RestrideBitmapFunc restride_bitmap_func; FreeList *free_head; FreeList *free_tail; |