00001 #ifndef COLORBALANCE_AGGREGATED
00002 #define COLORBALANCE_AGGREGATED
00003
00004 static char *colorbalance_get_pixel1 =
00005 "vec4 colorbalance_get_pixel()\n"
00006 "{\n"
00007 " return gl_FragColor;\n"
00008 "}\n";
00009
00010 static char *colorbalance_get_pixel2 =
00011 "uniform sampler2D tex;\n"
00012 "vec4 colorbalance_get_pixel()\n"
00013 "{\n"
00014 " return texture2D(tex, gl_TexCoord[0].st);\n"
00015 "}\n";
00016
00017
00018 static char *colorbalance_rgb_shader =
00019 "uniform vec3 colorbalance_scale;\n"
00020 "void main()\n"
00021 "{\n"
00022 " gl_FragColor = colorbalance_get_pixel();\n"
00023 " gl_FragColor.rgb *= colorbalance_scale;\n"
00024 "}\n";
00025
00026 static char *colorbalance_yuv_shader =
00027 "uniform vec3 colorbalance_scale;\n"
00028 "void main()\n"
00029 "{\n"
00030 " gl_FragColor = colorbalance_get_pixel();\n"
00031 YUV_TO_RGB_FRAG("gl_FragColor")
00032 " gl_FragColor.rgb *= colorbalance_scale;\n"
00033 RGB_TO_YUV_FRAG("gl_FragColor")
00034 "}\n";
00035
00036 static char *colorbalance_yuv_preserve_shader =
00037 "uniform vec3 colorbalance_scale;\n"
00038 "void main()\n"
00039 "{\n"
00040 " gl_FragColor = colorbalance_get_pixel();\n"
00041 " float y = gl_FragColor.r;\n"
00042 YUV_TO_RGB_FRAG("gl_FragColor")
00043 " gl_FragColor.rgb *= colorbalance_scale.rgb;\n"
00044 RGB_TO_YUV_FRAG("gl_FragColor")
00045 " gl_FragColor.r = y;\n"
00046 "}\n";
00047
00048 #define COLORBALANCE_COMPILE(shader_stack, current_shader, aggregate_prev) \
00049 { \
00050 if(aggregate_prev) \
00051 shader_stack[current_shader++] = colorbalance_get_pixel1; \
00052 else \
00053 shader_stack[current_shader++] = colorbalance_get_pixel2; \
00054 if(cmodel_is_yuv(get_output()->get_color_model())) \
00055 {\
00056 if(get_output()->get_params()->get("COLORBALANCE_PRESERVE", (int)0)) \
00057 shader_stack[current_shader++] = colorbalance_yuv_preserve_shader; \
00058 else \
00059 shader_stack[current_shader++] = colorbalance_yuv_shader; \
00060 } \
00061 else \
00062 shader_stack[current_shader++] = colorbalance_rgb_shader; \
00063 }
00064
00065 #define COLORBALANCE_UNIFORMS(shader) \
00066 glUniform3f(glGetUniformLocation(shader, "colorbalance_scale"), \
00067 get_output()->get_params()->get("COLORBALANCE_CYAN", (float)1), \
00068 get_output()->get_params()->get("COLORBALANCE_MAGENTA", (float)1), \
00069 get_output()->get_params()->get("COLORBALANCE_YELLOW", (float)1));
00070
00071 #endif
00072