diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 21323d49..d0aa744f 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -98,9 +98,36 @@ void GlRenderer::initShaders() { mPrograms.reserve((int)RT_None); +#define COMMON_TOTAL_LENGTH strlen(STR_GRADIENT_FRAG_COMMON_VARIABLES) + \ + strlen(STR_GRADIENT_FRAG_COMMON_FUNCTIONS) + +#define LINEAR_TOTAL_LENGTH strlen(STR_LINEAR_GRADIENT_VARIABLES) + \ + strlen(STR_LINEAR_GRADIENT_MAIN) + \ + COMMON_TOTAL_LENGTH + 1 + +#define RADIAL_TOTAL_LENGTH strlen(STR_RADIAL_GRADIENT_VARIABLES) + \ + strlen(STR_RADIAL_GRADIENT_MAIN) + \ + COMMON_TOTAL_LENGTH + 1 + + char linearGradientFragShader[LINEAR_TOTAL_LENGTH]; + snprintf(linearGradientFragShader, LINEAR_TOTAL_LENGTH, "%s%s%s%s", + STR_GRADIENT_FRAG_COMMON_VARIABLES, + STR_LINEAR_GRADIENT_VARIABLES, + STR_GRADIENT_FRAG_COMMON_FUNCTIONS, + STR_LINEAR_GRADIENT_MAIN + ); + + char radialGradientFragShader[RADIAL_TOTAL_LENGTH]; + snprintf(radialGradientFragShader, RADIAL_TOTAL_LENGTH, "%s%s%s%s", + STR_GRADIENT_FRAG_COMMON_VARIABLES, + STR_RADIAL_GRADIENT_VARIABLES, + STR_GRADIENT_FRAG_COMMON_FUNCTIONS, + STR_RADIAL_GRADIENT_MAIN + ); + mPrograms.push(new GlProgram(COLOR_VERT_SHADER, COLOR_FRAG_SHADER)); - mPrograms.push(new GlProgram(GRADIENT_VERT_SHADER, LINEAR_GRADIENT_FRAG_SHADER)); - mPrograms.push(new GlProgram(GRADIENT_VERT_SHADER, RADIAL_GRADIENT_FRAG_SHADER)); + mPrograms.push(new GlProgram(GRADIENT_VERT_SHADER, linearGradientFragShader)); + mPrograms.push(new GlProgram(GRADIENT_VERT_SHADER, radialGradientFragShader)); mPrograms.push(new GlProgram(IMAGE_VERT_SHADER, IMAGE_FRAG_SHADER)); // compose Renderer diff --git a/src/renderer/gl_engine/tvgGlShaderSrc.cpp b/src/renderer/gl_engine/tvgGlShaderSrc.cpp index 8243a058..d35d5a3f 100644 --- a/src/renderer/gl_engine/tvgGlShaderSrc.cpp +++ b/src/renderer/gl_engine/tvgGlShaderSrc.cpp @@ -20,7 +20,6 @@ * SOFTWARE. */ -#include #include "tvgGlShaderSrc.h" #define TVG_COMPOSE_SHADER(shader) #shader @@ -75,12 +74,12 @@ const char* GRADIENT_VERT_SHADER = TVG_COMPOSE_SHADER( ); -std::string STR_GRADIENT_FRAG_COMMON_VARIABLES = TVG_COMPOSE_SHADER( +const char* STR_GRADIENT_FRAG_COMMON_VARIABLES = TVG_COMPOSE_SHADER( const int MAX_STOP_COUNT = 16; \n in vec2 vPos; \n ); -std::string STR_GRADIENT_FRAG_COMMON_FUNCTIONS = TVG_COMPOSE_SHADER( +const char* STR_GRADIENT_FRAG_COMMON_FUNCTIONS = TVG_COMPOSE_SHADER( float gradientStep(float edge0, float edge1, float x) \n { \n // linear \n @@ -170,7 +169,7 @@ std::string STR_GRADIENT_FRAG_COMMON_FUNCTIONS = TVG_COMPOSE_SHADER( } \n ); -std::string STR_LINEAR_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( +const char* STR_LINEAR_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( layout(std140) uniform GradientInfo { \n vec4 nStops; \n vec2 gradStartPos; \n @@ -180,7 +179,7 @@ std::string STR_LINEAR_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( } uGradientInfo; \n ); -std::string STR_LINEAR_GRADIENT_MAIN = TVG_COMPOSE_SHADER( +const char* STR_LINEAR_GRADIENT_MAIN = TVG_COMPOSE_SHADER( out vec4 FragColor; \n void main() \n { \n @@ -195,7 +194,7 @@ std::string STR_LINEAR_GRADIENT_MAIN = TVG_COMPOSE_SHADER( } \n ); -std::string STR_RADIAL_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( +const char* STR_RADIAL_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( layout(std140) uniform GradientInfo { \n vec4 nStops; \n vec4 centerPos; \n @@ -205,7 +204,7 @@ std::string STR_RADIAL_GRADIENT_VARIABLES = TVG_COMPOSE_SHADER( } uGradientInfo ; \n ); -std::string STR_RADIAL_GRADIENT_MAIN = TVG_COMPOSE_SHADER( +const char* STR_RADIAL_GRADIENT_MAIN = TVG_COMPOSE_SHADER( out vec4 FragColor; \n \n mat3 radial_matrix(vec2 p0, vec2 p1) \n @@ -314,23 +313,6 @@ std::string STR_RADIAL_GRADIENT_MAIN = TVG_COMPOSE_SHADER( } ); -std::string STR_LINEAR_GRADIENT_FRAG_SHADER = -STR_GRADIENT_FRAG_COMMON_VARIABLES + -STR_LINEAR_GRADIENT_VARIABLES + -STR_GRADIENT_FRAG_COMMON_FUNCTIONS + -STR_LINEAR_GRADIENT_MAIN; - -const char* LINEAR_GRADIENT_FRAG_SHADER = STR_LINEAR_GRADIENT_FRAG_SHADER.c_str(); - -std::string STR_RADIAL_GRADIENT_FRAG_SHADER = -STR_GRADIENT_FRAG_COMMON_VARIABLES + -STR_RADIAL_GRADIENT_VARIABLES + -STR_GRADIENT_FRAG_COMMON_FUNCTIONS + -STR_RADIAL_GRADIENT_MAIN; - -const char* RADIAL_GRADIENT_FRAG_SHADER = STR_RADIAL_GRADIENT_FRAG_SHADER.c_str(); - - const char* IMAGE_VERT_SHADER = TVG_COMPOSE_SHADER( uniform float uDepth; \n layout (location = 0) in vec2 aLocation; \n diff --git a/src/renderer/gl_engine/tvgGlShaderSrc.h b/src/renderer/gl_engine/tvgGlShaderSrc.h index 94716751..bc793168 100644 --- a/src/renderer/gl_engine/tvgGlShaderSrc.h +++ b/src/renderer/gl_engine/tvgGlShaderSrc.h @@ -26,8 +26,12 @@ extern const char* COLOR_VERT_SHADER; extern const char* COLOR_FRAG_SHADER; extern const char* GRADIENT_VERT_SHADER; -extern const char* LINEAR_GRADIENT_FRAG_SHADER; -extern const char* RADIAL_GRADIENT_FRAG_SHADER; +extern const char* STR_GRADIENT_FRAG_COMMON_VARIABLES; +extern const char* STR_GRADIENT_FRAG_COMMON_FUNCTIONS; +extern const char* STR_LINEAR_GRADIENT_VARIABLES; +extern const char* STR_LINEAR_GRADIENT_MAIN; +extern const char* STR_RADIAL_GRADIENT_VARIABLES; +extern const char* STR_RADIAL_GRADIENT_MAIN; extern const char* IMAGE_VERT_SHADER; extern const char* IMAGE_FRAG_SHADER; extern const char* MASK_VERT_SHADER;