00001 #ifndef INTERPOLATE_AGGREGATED
00002 #define INTERPOLATE_AGGREGATED
00003
00004
00005
00006 static char *interpolate_shader =
00007 "uniform sampler2D tex;\n"
00008 "uniform vec2 pattern_offset;\n"
00009 "uniform vec2 pattern_size;\n"
00010 "uniform vec2 pixel_size;\n"
00011 "uniform mat3 color_matrix;\n"
00012 "\n"
00013 "void main()\n"
00014 "{\n"
00015 " vec2 pixel_coord = gl_TexCoord[0].st;\n"
00016 " vec2 pattern_coord = pixel_coord;\n"
00017 " vec3 result;\n"
00018 " pattern_coord -= pattern_offset;\n"
00019 " pattern_coord = fract(pattern_coord / pattern_size);\n"
00020 " if(pattern_coord.x >= 0.5)\n"
00021 " {\n"
00022 " if(pattern_coord.y >= 0.5)\n"
00023 " {\n"
00024
00025
00026
00027
00028
00029 " vec2 pixel1 = pixel_coord - vec2(pixel_size.x, 0.0);\n"
00030 " vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n"
00031 " vec2 pixel3 = pixel_coord + vec2(pixel_size.x, 0.0);\n"
00032 " vec2 pixel4 = pixel_coord + vec2(0.0, pixel_size.y);\n"
00033 " result = vec3((texture2D(tex, pixel1).r + \n"
00034 " texture2D(tex, pixel3).r) / 2.0, \n"
00035 " texture2D(tex, pixel_coord).g, \n"
00036 " (texture2D(tex, pixel2).b + \n"
00037 " texture2D(tex, pixel4).b) / 2.0);\n"
00038 " }\n"
00039 " else\n"
00040 " {\n"
00041
00042
00043
00044
00045
00046 " vec2 pixel1 = pixel_coord - pixel_size;\n"
00047 " vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n"
00048 " vec2 pixel3 = pixel_coord + vec2(pixel_size.x, -pixel_size.y);\n"
00049 " vec2 pixel4 = pixel_coord - vec2(pixel_size.x, 0.0);\n"
00050 " vec2 pixel5 = pixel_coord + vec2(pixel_size.x, 0.0);\n"
00051 " vec2 pixel6 = pixel_coord + vec2(-pixel_size.x, pixel_size.y);\n"
00052 " vec2 pixel7 = pixel_coord + vec2(0.0, pixel_size.y);\n"
00053 " vec2 pixel8 = pixel_coord + pixel_size;\n"
00054 " result = vec3((texture2D(tex, pixel1).r + \n"
00055 " texture2D(tex, pixel3).r + \n"
00056 " texture2D(tex, pixel6).r + \n"
00057 " texture2D(tex, pixel8).r) / 4.0, \n"
00058 " (texture2D(tex, pixel4).g + \n"
00059 " texture2D(tex, pixel2).g + \n"
00060 " texture2D(tex, pixel5).g + \n"
00061 " texture2D(tex, pixel7).g) / 4.0, \n"
00062 " texture2D(tex, pixel_coord).b);\n"
00063 " }\n"
00064 " }\n"
00065 " else\n"
00066 " {\n"
00067 " if(pattern_coord.y >= 0.5)\n"
00068 " {\n"
00069
00070
00071
00072
00073
00074 " vec2 pixel1 = pixel_coord - pixel_size;\n"
00075 " vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n"
00076 " vec2 pixel3 = pixel_coord + vec2(pixel_size.x, -pixel_size.y);\n"
00077 " vec2 pixel4 = pixel_coord - vec2(pixel_size.x, 0.0);\n"
00078 " vec2 pixel5 = pixel_coord + vec2(pixel_size.x, 0.0);\n"
00079 " vec2 pixel6 = pixel_coord + vec2(-pixel_size.x, pixel_size.y);\n"
00080 " vec2 pixel7 = pixel_coord + vec2(0.0, pixel_size.y);\n"
00081 " vec2 pixel8 = pixel_coord + pixel_size;\n"
00082 " result = vec3(\n"
00083 " texture2D(tex, pixel_coord).r, \n"
00084 " (texture2D(tex, pixel4).g + \n"
00085 " texture2D(tex, pixel2).g + \n"
00086 " texture2D(tex, pixel5).g + \n"
00087 " texture2D(tex, pixel7).g) / 4.0, \n"
00088 " (texture2D(tex, pixel1).b + \n"
00089 " texture2D(tex, pixel3).b + \n"
00090 " texture2D(tex, pixel6).b + \n"
00091 " texture2D(tex, pixel8).b) / 4.0);\n"
00092 " }\n"
00093 " else\n"
00094 " {\n"
00095
00096
00097
00098
00099
00100 " vec2 pixel1 = pixel_coord - vec2(pixel_size.x, 0.0);\n"
00101 " vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n"
00102 " vec2 pixel3 = pixel_coord + vec2(pixel_size.x, 0.0);\n"
00103 " vec2 pixel4 = pixel_coord + vec2(0.0, pixel_size.y);\n"
00104 " result = vec3(\n"
00105 " (texture2D(tex, pixel2).r + \n"
00106 " texture2D(tex, pixel4).r) / 2.0, \n"
00107 " texture2D(tex, pixel_coord).g, \n"
00108 " (texture2D(tex, pixel1).b + \n"
00109 " texture2D(tex, pixel3).b) / 2.0);\n"
00110 " }\n"
00111 " }\n"
00112 "\n"
00113 "\n"
00114 " gl_FragColor = vec4(result * color_matrix, 1.0);\n"
00115 "}\n";
00116
00117
00118 #define INTERPOLATE_COMPILE(shader_stack, current_shader) \
00119 { \
00120 shader_stack[current_shader++] = interpolate_shader; \
00121 }
00122
00123 #define INTERPOLATE_UNIFORMS(frag) \
00124 { \
00125 int x_offset = get_output()->get_params()->get("INTERPOLATEPIXELS_X", (int)0); \
00126 int y_offset = get_output()->get_params()->get("INTERPOLATEPIXELS_Y", (int)0); \
00127 float color_matrix[9]; \
00128 char string[BCTEXTLEN]; \
00129 string[0] = 0; \
00130 get_output()->get_params()->get("DCRAW_MATRIX", string); \
00131 sscanf(string, \
00132 "%f %f %f %f %f %f %f %f %f", \
00133 &color_matrix[0], \
00134 &color_matrix[1], \
00135 &color_matrix[2], \
00136 &color_matrix[3], \
00137 &color_matrix[4], \
00138 &color_matrix[5], \
00139 &color_matrix[6], \
00140 &color_matrix[7], \
00141 &color_matrix[8]); \
00142 glUniformMatrix3fv(glGetUniformLocation(frag, "color_matrix"), \
00143 1, \
00144 0, \
00145 color_matrix); \
00146 glUniform2f(glGetUniformLocation(frag, "pattern_offset"), \
00147 (float)x_offset / get_output()->get_texture_w(), \
00148 (float)y_offset / get_output()->get_texture_h()); \
00149 glUniform2f(glGetUniformLocation(frag, "pattern_size"), \
00150 2.0 / get_output()->get_texture_w(), \
00151 2.0 / get_output()->get_texture_h()); \
00152 glUniform2f(glGetUniformLocation(frag, "pixel_size"), \
00153 1.0 / get_output()->get_texture_w(), \
00154 1.0 / get_output()->get_texture_h()); \
00155 }
00156
00157
00158 #endif