X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fplugins%2Finterpolate%2Faggregated.h;fp=cinelerra-5.1%2Fplugins%2Finterpolate%2Faggregated.h;h=42eb6c4c51aab54e61efcbe79191256e3b25c70a;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/plugins/interpolate/aggregated.h b/cinelerra-5.1/plugins/interpolate/aggregated.h new file mode 100644 index 00000000..42eb6c4c --- /dev/null +++ b/cinelerra-5.1/plugins/interpolate/aggregated.h @@ -0,0 +1,181 @@ + +/* + * CINELERRA + * Copyright (C) 2008 Adam Williams + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef INTERPOLATE_AGGREGATED +#define INTERPOLATE_AGGREGATED + +// Interpolation sections performed by other plugins + +static const char *interpolate_shader = +"uniform sampler2D tex;\n" +"uniform vec2 pattern_offset;\n" +"uniform vec2 pattern_size;\n" +"uniform vec2 pixel_size;\n" +"uniform mat3 color_matrix;\n" +"\n" +"void main()\n" +"{\n" +" vec2 pixel_coord = gl_TexCoord[0].st;\n" +" vec2 pattern_coord = pixel_coord;\n" +" vec3 result;\n" +" pattern_coord -= pattern_offset;\n" +" pattern_coord = fract(pattern_coord / pattern_size);\n" +" if(pattern_coord.x >= 0.5)\n" +" {\n" +" if(pattern_coord.y >= 0.5)\n" +" {\n" +/* Bottom right of pattern */ +/* Bottom right pixels are: */ +/* 2 */ +/* 1*3 */ +/* 4 */ +" vec2 pixel1 = pixel_coord - vec2(pixel_size.x, 0.0);\n" +" vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n" +" vec2 pixel3 = pixel_coord + vec2(pixel_size.x, 0.0);\n" +" vec2 pixel4 = pixel_coord + vec2(0.0, pixel_size.y);\n" +" result = vec3((texture2D(tex, pixel1).r + \n" +" texture2D(tex, pixel3).r) / 2.0, \n" +" texture2D(tex, pixel_coord).g, \n" +" (texture2D(tex, pixel2).b + \n" +" texture2D(tex, pixel4).b) / 2.0);\n" +" }\n" +" else\n" +" {\n" +/* Top right of pattern */ +/* Top right pixels are: */ +/* 123 */ +/* 4*5 */ +/* 678 */ +" vec2 pixel1 = pixel_coord - pixel_size;\n" +" vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n" +" vec2 pixel3 = pixel_coord + vec2(pixel_size.x, -pixel_size.y);\n" +" vec2 pixel4 = pixel_coord - vec2(pixel_size.x, 0.0);\n" +" vec2 pixel5 = pixel_coord + vec2(pixel_size.x, 0.0);\n" +" vec2 pixel6 = pixel_coord + vec2(-pixel_size.x, pixel_size.y);\n" +" vec2 pixel7 = pixel_coord + vec2(0.0, pixel_size.y);\n" +" vec2 pixel8 = pixel_coord + pixel_size;\n" +" result = vec3((texture2D(tex, pixel1).r + \n" +" texture2D(tex, pixel3).r + \n" +" texture2D(tex, pixel6).r + \n" +" texture2D(tex, pixel8).r) / 4.0, \n" +" (texture2D(tex, pixel4).g + \n" +" texture2D(tex, pixel2).g + \n" +" texture2D(tex, pixel5).g + \n" +" texture2D(tex, pixel7).g) / 4.0, \n" +" texture2D(tex, pixel_coord).b);\n" +" }\n" +" }\n" +" else\n" +" {\n" +" if(pattern_coord.y >= 0.5)\n" +" {\n" +/* Bottom left of pattern */ +/* Bottom left pixels are: */ +/* 123 */ +/* 4*5 */ +/* 678 */ +" vec2 pixel1 = pixel_coord - pixel_size;\n" +" vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n" +" vec2 pixel3 = pixel_coord + vec2(pixel_size.x, -pixel_size.y);\n" +" vec2 pixel4 = pixel_coord - vec2(pixel_size.x, 0.0);\n" +" vec2 pixel5 = pixel_coord + vec2(pixel_size.x, 0.0);\n" +" vec2 pixel6 = pixel_coord + vec2(-pixel_size.x, pixel_size.y);\n" +" vec2 pixel7 = pixel_coord + vec2(0.0, pixel_size.y);\n" +" vec2 pixel8 = pixel_coord + pixel_size;\n" +" result = vec3(\n" +" texture2D(tex, pixel_coord).r, \n" +" (texture2D(tex, pixel4).g + \n" +" texture2D(tex, pixel2).g + \n" +" texture2D(tex, pixel5).g + \n" +" texture2D(tex, pixel7).g) / 4.0, \n" +" (texture2D(tex, pixel1).b + \n" +" texture2D(tex, pixel3).b + \n" +" texture2D(tex, pixel6).b + \n" +" texture2D(tex, pixel8).b) / 4.0);\n" +" }\n" +" else\n" +" {\n" +/* Top left of pattern */ +/* Top left pixels are: */ +/* 2 */ +/* 1 3 */ +/* 4 */ +" vec2 pixel1 = pixel_coord - vec2(pixel_size.x, 0.0);\n" +" vec2 pixel2 = pixel_coord - vec2(0.0, pixel_size.y);\n" +" vec2 pixel3 = pixel_coord + vec2(pixel_size.x, 0.0);\n" +" vec2 pixel4 = pixel_coord + vec2(0.0, pixel_size.y);\n" +" result = vec3(\n" +" (texture2D(tex, pixel2).r + \n" +" texture2D(tex, pixel4).r) / 2.0, \n" +" texture2D(tex, pixel_coord).g, \n" +" (texture2D(tex, pixel1).b + \n" +" texture2D(tex, pixel3).b) / 2.0);\n" +" }\n" +" }\n" +"\n" +"\n" +" gl_FragColor = vec4(result * color_matrix, 1.0);\n" +"}\n"; + + +#define INTERPOLATE_COMPILE(shader_stack, current_shader) \ +{ \ + shader_stack[current_shader++] = interpolate_shader; \ +} + +#define INTERPOLATE_UNIFORMS(frag) \ +{ \ + int x_offset = get_output()->get_params()->get("INTERPOLATEPIXELS_X", (int)0); \ + int y_offset = get_output()->get_params()->get("INTERPOLATEPIXELS_Y", (int)0); \ + float color_matrix[9]; \ + for( int i=0; i<9; ++i ) color_matrix[i] = 0; \ + for( int i=0; i<3; ++i ) color_matrix[i*3 + i] = 1; \ + char string[BCTEXTLEN]; \ + string[0] = 0; \ + get_output()->get_params()->get("DCRAW_MATRIX", string); \ + sscanf(string, \ + "%f %f %f %f %f %f %f %f %f", \ + &color_matrix[0], \ + &color_matrix[1], \ + &color_matrix[2], \ + &color_matrix[3], \ + &color_matrix[4], \ + &color_matrix[5], \ + &color_matrix[6], \ + &color_matrix[7], \ + &color_matrix[8]); \ + glUniformMatrix3fv(glGetUniformLocation(frag, "color_matrix"), \ + 1, \ + 0, \ + color_matrix); \ + glUniform2f(glGetUniformLocation(frag, "pattern_offset"), \ + (float)x_offset / get_output()->get_texture_w(), \ + (float)y_offset / get_output()->get_texture_h()); \ + glUniform2f(glGetUniformLocation(frag, "pattern_size"), \ + 2.0 / get_output()->get_texture_w(), \ + 2.0 / get_output()->get_texture_h()); \ + glUniform2f(glGetUniformLocation(frag, "pixel_size"), \ + 1.0 / get_output()->get_texture_w(), \ + 1.0 / get_output()->get_texture_h()); \ +} + + +#endif