From 9b56ce4d5b4d61aa4ef9f0ecfb2f914262f4bd73 Mon Sep 17 00:00:00 2001 From: Robert Bragg Date: Thu, 1 Sep 2011 17:16:23 +0100 Subject: [PATCH] blend-strings: Make braces around blend factor optional for a blend string like: "RGBA=ADD(SRC_COLOR, SRC_COLOR * (DST_COLOR[A]))" it was awkward that we were requiring developers to explicitly put redundant brackets around the DST_COLOR[A] blend factor. The parser has been updated so now braces are only required for factors like "(1-SRC_COLOR[A])" Reviewed-by: Neil Roberts --- cogl/cogl-blend-string.c | 31 +++++++++++++++++++++++++++---- cogl/cogl-pipeline.h | 3 --- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/cogl/cogl-blend-string.c b/cogl/cogl-blend-string.c index 92c4cb14d..d5f48af83 100644 --- a/cogl/cogl-blend-string.c +++ b/cogl/cogl-blend-string.c @@ -482,6 +482,7 @@ parse_argument (const char *string, /* original user string */ const char *error_string = NULL; ParserArgState state = PARSER_ARG_STATE_START; gboolean parsing_factor = FALSE; + gboolean implicit_factor_brace; arg->source.is_zero = FALSE; arg->source.info = NULL; @@ -631,11 +632,21 @@ parse_argument (const char *string, /* original user string */ case PARSER_ARG_STATE_EXPECT_OPEN_PAREN: if (*p != '(') { - error_string = "Expected '(' before blend factor - the parser " - "currently requires that all blend factors " - "following a '*' be surrounded in brackets"; - goto error; + if (is_alphanum_char (*p)) + { + p--; /* compensate for implicit brace and ensure this + * char gets considered part of the blend factor */ + implicit_factor_brace = TRUE; + } + else + { + error_string = "Expected '(' around blend factor or alpha " + "numeric character for blend factor name"; + goto error; + } } + else + implicit_factor_brace = FALSE; parsing_factor = TRUE; state = PARSER_ARG_STATE_EXPECT_FACTOR; continue; @@ -676,6 +687,12 @@ parse_argument (const char *string, /* original user string */ case PARSER_ARG_STATE_MAYBE_MINUS: if (*p == '-') { + if (implicit_factor_brace) + { + error_string = "Expected ( ) braces around blend factor with " + "a subtraction"; + goto error; + } arg->factor.source.one_minus = TRUE; state = PARSER_ARG_STATE_EXPECT_COLOR_SRC_NAME; } @@ -687,6 +704,12 @@ parse_argument (const char *string, /* original user string */ continue; case PARSER_ARG_STATE_EXPECT_CLOSE_PAREN: + if (implicit_factor_brace) + { + p--; + state = PARSER_ARG_STATE_EXPECT_END; + continue; + } if (*p != ')') { error_string = "Expected closing parenthesis after blend factor"; diff --git a/cogl/cogl-pipeline.h b/cogl/cogl-pipeline.h index 9e68e8393..15b100cd3 100644 --- a/cogl/cogl-pipeline.h +++ b/cogl/cogl-pipeline.h @@ -522,9 +522,6 @@ cogl_pipeline_get_alpha_test_reference (CoglPipeline *pipeline); * <channel-mask>=ADD(SRC_COLOR*(<factor>), DST_COLOR*(<factor>)) * ]| * - * The brackets around blend factors are currently not - * optional! - * * This is the list of source-names usable as blend factors: * * SRC_COLOR: The color of the in comming fragment