summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libass/ass.h2
-rw-r--r--libass/ass_bitmap.c12
-rw-r--r--libass/ass_bitmap.h3
-rw-r--r--libass/ass_render.c54
-rw-r--r--libass/ass_render.h6
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;