summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrcombs <rcombs@rcombs.me>2022-07-26 22:12:40 -0500
committerrcombs <rcombs@rcombs.me>2022-11-15 21:14:37 -0600
commitcc36da778afd1a6e94fda1f21c57648141182f29 (patch)
tree8c56a3bd0d60954858e1fef0604c41afbc8c7415
parent04d48faa652fe649a3d664b1640acfcea7f4b3e0 (diff)
downloadlibass-cc36da778afd1a6e94fda1f21c57648141182f29.tar.bz2
libass-cc36da778afd1a6e94fda1f21c57648141182f29.tar.xz
ass_render: move (font|border|blur)_scale to RenderContext
-rw-r--r--libass/ass_render.c64
-rw-r--r--libass/ass_render.h13
2 files changed, 39 insertions, 38 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index d155909..f749b38 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -673,8 +673,8 @@ static void blend_vector_clip(ASS_Renderer *render_priv, ASS_Image *head)
double m[3][3] = {{0}};
int32_t scale_base = lshiftwrapi(1, render_priv->state.clip_drawing_scale - 1);
double w = scale_base > 0 ? (1.0 / scale_base) : 0;
- m[0][0] = render_priv->screen_scale_x * w;
- m[1][1] = render_priv->screen_scale_y * w;
+ m[0][0] = render_priv->state.screen_scale_x * w;
+ m[1][1] = render_priv->state.screen_scale_y * w;
m[2][2] = 1;
m[0][2] = int_to_d6(render_priv->settings.left_margin);
@@ -1007,25 +1007,25 @@ static void init_font_scale(ASS_Renderer *render_priv)
font_scr_h = render_priv->fit_height;
}
- render_priv->screen_scale_x = font_scr_w / render_priv->track->PlayResX;
- render_priv->screen_scale_y = font_scr_h / render_priv->track->PlayResY;
+ render_priv->state.screen_scale_x = font_scr_w / render_priv->track->PlayResX;
+ render_priv->state.screen_scale_y = font_scr_h / render_priv->track->PlayResY;
ASS_Vector layout_res = ass_layout_res(render_priv);
- render_priv->blur_scale = font_scr_h / layout_res.y;
+ render_priv->state.blur_scale = font_scr_h / layout_res.y;
if (render_priv->track->ScaledBorderAndShadow) {
- render_priv->border_scale_x = render_priv->screen_scale_x;
- render_priv->border_scale_y = render_priv->screen_scale_y;
+ render_priv->state.border_scale_x = render_priv->state.screen_scale_x;
+ render_priv->state.border_scale_y = render_priv->state.screen_scale_y;
} else {
- render_priv->border_scale_x = font_scr_w / layout_res.x;
- render_priv->border_scale_y = render_priv->blur_scale;
+ render_priv->state.border_scale_x = font_scr_w / layout_res.x;
+ render_priv->state.border_scale_y = render_priv->state.blur_scale;
}
if (render_priv->state.apply_font_scale) {
- render_priv->screen_scale_x *= settings_priv->font_size_coeff;
- render_priv->screen_scale_y *= settings_priv->font_size_coeff;
- render_priv->border_scale_x *= settings_priv->font_size_coeff;
- render_priv->border_scale_y *= settings_priv->font_size_coeff;
- render_priv->blur_scale *= settings_priv->font_size_coeff;
+ render_priv->state.screen_scale_x *= settings_priv->font_size_coeff;
+ render_priv->state.screen_scale_y *= settings_priv->font_size_coeff;
+ render_priv->state.border_scale_x *= settings_priv->font_size_coeff;
+ render_priv->state.border_scale_y *= settings_priv->font_size_coeff;
+ render_priv->state.blur_scale *= settings_priv->font_size_coeff;
}
}
@@ -1153,8 +1153,8 @@ get_outline_glyph(ASS_Renderer *priv, GlyphInfo *info)
int32_t scale_base = lshiftwrapi(1, info->drawing_scale - 1);
double w = scale_base > 0 ? (1.0 / scale_base) : 0;
- scale.x = info->scale_x * w * priv->screen_scale_x / priv->par_scale_x;
- scale.y = info->scale_y * w * priv->screen_scale_y;
+ scale.x = info->scale_x * w * priv->state.screen_scale_x / priv->par_scale_x;
+ scale.y = info->scale_y * w * priv->state.screen_scale_y;
desc = 64 * info->drawing_pbo;
asc = val->asc - desc;
@@ -1325,7 +1325,7 @@ static void calc_transform_matrix(ASS_Renderer *render_priv,
z4[i] = x2[i] * sy + z3[i] * cy;
}
- double dist = 20000 * render_priv->blur_scale;
+ double dist = 20000 * render_priv->state.blur_scale;
z4[2] += dist;
double scale_x = dist * render_priv->par_scale_x;
@@ -1391,9 +1391,9 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info,
ol_key.type = OUTLINE_BOX;
ASS_DVector bord = {
- 64 * info->border_x * render_priv->border_scale_x /
+ 64 * info->border_x * render_priv->state.border_scale_x /
render_priv->par_scale_x,
- 64 * info->border_y * render_priv->border_scale_y,
+ 64 * info->border_y * render_priv->state.border_scale_y,
};
double width = info->hspacing_scaled + info->advance.x;
double height = info->asc + info->desc;
@@ -1432,10 +1432,10 @@ get_bitmap_glyph(ASS_Renderer *render_priv, GlyphInfo *info,
k->outline = info->outline;
double bord_x =
- 64 * render_priv->border_scale_x * info->border_x / tr->scale.x /
+ 64 * render_priv->state.border_scale_x * info->border_x / tr->scale.x /
render_priv->par_scale_x;
double bord_y =
- 64 * render_priv->border_scale_y * info->border_y / tr->scale.y;
+ 64 * render_priv->state.border_scale_y * info->border_y / tr->scale.y;
const ASS_Rect *bbox = &info->outline->cbox;
// Estimate bounding box half size after stroking
@@ -1547,12 +1547,12 @@ static void measure_text_on_eol(ASS_Renderer *render_priv, double scale, int cur
render_priv->text_info.height += scale * max_asc + scale * max_desc;
// For *VSFilter compatibility do biased rounding on max_border*
// https://github.com/Cyberbeing/xy-VSFilter/blob/xy_sub_filter_rc4@%7B2020-05-17%7D/src/subtitles/RTS.cpp#L1465
- render_priv->text_info.border_bottom = (int) (render_priv->border_scale_y * max_border_y + 0.5);
+ render_priv->text_info.border_bottom = (int) (render_priv->state.border_scale_y * max_border_y + 0.5);
if (cur_line == 0)
render_priv->text_info.border_top = render_priv->text_info.border_bottom;
// VSFilter takes max \bordx into account for collision, even if far from edge
render_priv->text_info.border_x = FFMAX(render_priv->text_info.border_x,
- (int) (render_priv->border_scale_x * max_border_x + 0.5));
+ (int) (render_priv->state.border_scale_x * max_border_x + 0.5));
}
@@ -2119,7 +2119,7 @@ static bool parse_events(ASS_Renderer *render_priv, ASS_Event *event)
info->reset_effect = render_priv->state.reset_effect;
// VSFilter compatibility: font glyphs use PlayResY scaling in both dimensions
info->font_size =
- fabs(render_priv->state.font_size * render_priv->screen_scale_y);
+ fabs(render_priv->state.font_size * render_priv->state.screen_scale_y);
info->be = render_priv->state.be;
info->blur = render_priv->state.blur;
info->shadow_x = render_priv->state.shadow_x;
@@ -2147,7 +2147,7 @@ static bool parse_events(ASS_Renderer *render_priv, ASS_Event *event)
if (!drawing_text.str) {
info->hspacing_scaled = double_to_d6(info->hspacing *
- render_priv->screen_scale_x / render_priv->par_scale_x *
+ render_priv->state.screen_scale_x / render_priv->par_scale_x *
info->scale_x);
fix_glyph_scaling(render_priv, info);
}
@@ -2371,10 +2371,10 @@ static void calculate_rotation_params(ASS_Renderer *render_priv, ASS_DRect *bbox
GlyphInfo *info = text_info->glyphs + i;
while (info) {
info->shift.x = info->pos.x + double_to_d6(device_x - center.x +
- info->shadow_x * render_priv->border_scale_x /
+ info->shadow_x * render_priv->state.border_scale_x /
render_priv->par_scale_x);
info->shift.y = info->pos.y + double_to_d6(device_y - center.y +
- info->shadow_y * render_priv->border_scale_y);
+ info->shadow_y * render_priv->state.border_scale_y);
info = info->next;
}
}
@@ -2495,11 +2495,11 @@ static void render_and_combine_glyphs(ASS_Renderer *render_priv,
filter->be = info->be;
int32_t shadow_mask;
- double blur_scale = render_priv->blur_scale * (2 / sqrt(log(256)));
+ double blur_scale = render_priv->state.blur_scale * (2 / sqrt(log(256)));
filter->blur = quantize_blur(info->blur * blur_scale, &shadow_mask);
if (flags & FILTER_NONZERO_SHADOW) {
- int32_t x = double_to_d6(info->shadow_x * render_priv->border_scale_x);
- int32_t y = double_to_d6(info->shadow_y * render_priv->border_scale_y);
+ int32_t x = double_to_d6(info->shadow_x * render_priv->state.border_scale_x);
+ int32_t y = double_to_d6(info->shadow_y * render_priv->state.border_scale_y);
filter->shadow.x = (x + (shadow_mask >> 1)) & ~shadow_mask;
filter->shadow.y = (y + (shadow_mask >> 1)) & ~shadow_mask;
} else
@@ -2745,9 +2745,9 @@ size_t ass_composite_construct(void *key, void *value, void *priv)
static void add_background(ASS_Renderer *render_priv, EventImages *event_images)
{
int size_x = render_priv->state.shadow_x > 0 ?
- lround(render_priv->state.shadow_x * render_priv->border_scale_x) : 0;
+ lround(render_priv->state.shadow_x * render_priv->state.border_scale_x) : 0;
int size_y = render_priv->state.shadow_y > 0 ?
- lround(render_priv->state.shadow_y * render_priv->border_scale_y) : 0;
+ lround(render_priv->state.shadow_y * render_priv->state.border_scale_y) : 0;
int left = event_images->left - size_x;
int top = event_images->top - size_y;
int right = event_images->left + event_images->width + size_x;
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 7034078..6438e48 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -283,6 +283,12 @@ typedef struct {
int apply_font_scale;
// whether this is assumed to be explicitly positioned
int explicit;
+
+ double screen_scale_x;
+ double screen_scale_y;
+ double border_scale_x;
+ double border_scale_y;
+ double blur_scale;
} RenderContext;
typedef struct {
@@ -320,12 +326,7 @@ struct ass_renderer {
double fit_width; // content frame width without zoom & pan (fit to screen & letterboxed)
ASS_Track *track;
long long time; // frame's timestamp, ms
- double screen_scale_x;
- double screen_scale_y;
- double par_scale_x; // x scale applied to e.g. glyphs to preserve text aspect ratio
- double border_scale_x;
- double border_scale_y;
- double blur_scale;
+ double par_scale_x; // x scale applied to all glyphs to preserve text aspect ratio
RenderContext state;
TextInfo text_info;