This is an automated email from the git hooks/post-receive script. Git pushed a commit to branch master in repository ffmpeg.
commit 6300e340d3b1d9d30c216f475ca027038fed830d Author: Ayose <[email protected]> AuthorDate: Fri Dec 5 14:18:56 2025 +0000 Commit: Marton Balint <[email protected]> CommitDate: Sun Jan 4 13:42:20 2026 +0000 avfilter/vf_drawvg: skip conversions when a color is assigned to a variable. In libcairo, colors are defined as 4 separate components, and each one is double between 0 and 1. Before this commit, colors stored in variables (like `defhsla`) were converted to a `0xRRGGBBAA` value, which introduced some issues due to rounding errors. Now, when a color is assigned to a variable, the original values (a `double[4]`) are stored in a dedicated array (`color_vars`), so no conversion is needed. This change also reduces the cost of reading a color from a variable (no need for `av_be2ne32`, or the `color[i] / 255` operations). Signed-off-by: Ayose <[email protected]> --- libavfilter/vf_drawvg.c | 49 +++++++++++++++++++++++-------------------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/libavfilter/vf_drawvg.c b/libavfilter/vf_drawvg.c index 5d3008084c..5ef04ca616 100644 --- a/libavfilter/vf_drawvg.c +++ b/libavfilter/vf_drawvg.c @@ -972,7 +972,7 @@ static int vgs_parse_statement( if (vgs_token_is_string(&token, parser->var_names[i])) { arg.type = ARG_COLOR_VAR; - arg.variable = i; + arg.variable = i - VAR_U0; break; } } @@ -1333,6 +1333,9 @@ fail: /// Number of different states for the `randomg` function. #define RANDOM_STATES 4 +/// Cairo requires each color component to be a double. +typedef double cairo_color[4]; + /// Block assigned to a procedure by a call to the `proc` command. struct VGSProcedure { const struct VGSProgram *program; @@ -1375,6 +1378,9 @@ struct VGSEvalState { /// executing each statement. double vars[VAR_COUNT]; + /// Colors stored in variables. + cairo_color color_vars[USER_VAR_COUNT]; + /// State for each index available for the `randomg` function. FFSFC64 random_state[RANDOM_STATES]; @@ -1551,9 +1557,13 @@ static int vgs_eval_state_init( return AVERROR(ENOMEM); } - for (int i = 0; i < VAR_COUNT; i++) + for (int i = 0; i < FF_ARRAY_ELEMS(state->vars); i++) state->vars[i] = NAN; + for (int i = 0; i < FF_ARRAY_ELEMS(state->color_vars); i++) + for (int j = 0; j < FF_ARRAY_ELEMS(state->color_vars[i]); j++) + state->color_vars[i][j] = NAN; + return 0; } @@ -1802,7 +1812,7 @@ static int vgs_eval( } while(0) double numerics[MAX_COMMAND_PARAMS]; - double colors[MAX_COMMAND_PARAMS][4]; + cairo_color colors[MAX_COMMAND_PARAMS]; double cx, cy; // Current point. @@ -1828,24 +1838,16 @@ static int vgs_eval( // Compute arguments. for (int arg = 0; arg < statement->args_count; arg++) { - uint8_t color[4]; - const struct VGSArgument *a = &statement->args[arg]; switch (a->type) { case ARG_COLOR: - case ARG_COLOR_VAR: - if (a->type == ARG_COLOR) { - memcpy(color, a->color, sizeof(color)); - } else { - uint32_t c = av_be2ne32((uint32_t)state->vars[a->variable]); - memcpy(color, &c, sizeof(color)); - } + for (int i = 0; i < FF_ARRAY_ELEMS(colors[arg]); i++) + colors[arg][i] = ((double)a->color[i]) / 255.0; + break; - colors[arg][0] = (double)(color[0]) / 255.0, - colors[arg][1] = (double)(color[1]) / 255.0, - colors[arg][2] = (double)(color[2]) / 255.0, - colors[arg][3] = (double)(color[3]) / 255.0; + case ARG_COLOR_VAR: + memcpy(&colors[arg], &state->color_vars[a->variable], sizeof(cairo_color)); break; case ARG_EXPR: @@ -1981,16 +1983,11 @@ static int vgs_eval( b = numerics[3]; } - #define C(v, o) ((uint32_t)lround(av_clipd(v, 0, 1) * 255) << o) - - state->vars[user_var] = (double)( - C(r, 24) - | C(g, 16) - | C(b, 8) - | C(numerics[4], 0) - ); - - #undef C + double *const color_var = state->color_vars[user_var - VAR_U0]; + color_var[0] = r; + color_var[1] = g; + color_var[2] = b; + color_var[3] = numerics[4]; break; } _______________________________________________ ffmpeg-cvslog mailing list -- [email protected] To unsubscribe send an email to [email protected]
