// 2xGLSL_Hq-Filter shader
// by guest(r) (guest.r@gmail.com)
// License: GNU-GPL

uniform sampler2D OGL2Texture;

const float mx = 0.325;     // start smoothing factor
const float k = -0.250;     // smoothing decrease factor
const float max_w = 0.25;   // max. smoothing weigth
const float min_w =-0.02;   // min smoothing/sharpening weigth
const float lum_add = 0.20; // effects smoothing

void main()
{

vec3 c00 = texture2D(OGL2Texture, gl_TexCoord[1].xy).xyz; 
vec3 c10 = texture2D(OGL2Texture, gl_TexCoord[1].zw).xyz; 
vec3 c20 = texture2D(OGL2Texture, gl_TexCoord[2].xy).xyz; 
vec3 c01 = texture2D(OGL2Texture, gl_TexCoord[4].zw).xyz; 
vec3 c11 = texture2D(OGL2Texture, gl_TexCoord[0].xy).xyz; 
vec3 c21 = texture2D(OGL2Texture, gl_TexCoord[2].zw).xyz; 
vec3 c02 = texture2D(OGL2Texture, gl_TexCoord[4].xy).xyz; 
vec3 c12 = texture2D(OGL2Texture, gl_TexCoord[3].zw).xyz; 
vec3 c22 = texture2D(OGL2Texture, gl_TexCoord[3].xy).xyz; 

const vec3 dt = vec3(1.0,1.0,1.0);

float k00=dot(abs(c00-c11),dt); 
float k20=dot(abs(c20-c11),dt);
float k02=dot(abs(c02-c11),dt);
float k22=dot(abs(c22-c11),dt);

float md1 = dot(abs(c00-c22),dt);
float md2 = dot(abs(c02-c20),dt);

float w1 = md2*k22;float w2 = md1*k02;
float w3 = md2*k00;float w4 = md1*k20;

float t1 = w1+w3; float t2 = w2+w4;

float ww = max(t1,t2)+0.001;

vec3 ct = (w1*c00+w2*c20+w3*c22+w4*c02+ww*c11)/(t1+t2+ww);

float lc = ct.r+ct.g+ct.b+lum_add;

w1 = (c10.r+c10.g+c10.b+lc)*0.2; 
w1 = clamp(k*dot(abs(ct-c10),dt)/w1+mx,min_w,max_w);

w2 = (c21.r+c21.g+c21.b+lc)*0.2; 
w2 = clamp(k*dot(abs(ct-c21),dt)/w2+mx,min_w,max_w);

w3 = (c12.r+c12.g+c12.b+lc)*0.2;
w3 = clamp(k*dot(abs(ct-c12),dt)/w3+mx,min_w,max_w);

w4 = (c01.r+c01.g+c01.b+lc)*0.2; 
w4 = clamp(k*dot(abs(ct-c01),dt)/w4+mx,min_w,max_w);

gl_FragColor.xyz = w1*c10 + w2*c21 + w3*c12 + w4*c01 + (1.0-w1-w2-w3-w4)*ct; 
}