precision mediump float;
 varying vec2 interp_tc;
 varying vec2 real_coord;
 uniform sampler2D y_tex;
 uniform sampler2D u_tex;
 uniform sampler2D v_tex;
uniform float exposureValue;

vec2 singleStepOffset = vec2(0.00156, 0.00277);
mediump float params = 1.0;
const highp vec3 W = vec3(0.299,0.587,0.114);
vec2 blurCoordinates[20];

float hardLight(float color) {
	if(color <= 0.5)
		color = color * color * 2.0;
	else
		color = 1.0 - ((1.0 - color)*(1.0 - color) * 2.0);
	return color;
}

float greenValue(vec2 coord) {
   return texture2D(y_tex, coord).r - 0.344 * (texture2D(y_tex, coord).r - 0.5) - 0.714 * (texture2D(y_tex, coord).r - 0.5);
}

void main() {
   float r2 = (real_coord.x - 0.5) * (real_coord.x - 0.5) + (real_coord.y - 0.5)*(real_coord.y - 0.5);
   if (r2 > 0.25) 
       gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
   else { 
      float y = texture2D(y_tex, interp_tc).r;
      float u = texture2D(u_tex, interp_tc).r - 0.5;
      float v = texture2D(v_tex, interp_tc).r - 0.5;
      centralColor = vec3(y + 1.403 * v, 
                           y - 0.344 * u - 0.714 * v, 
                           y + 1.77 * u);
      float r = centralColor.r;
      float g = centralColor.g;
      float b = centralColor.b;
      float Y  = 0.0 + 0.299 * r + 0.587 * g + 0.114 * b;
      float Cb = 0.5 - 0.169 * r - 0.331 * g + 0.5   * b;
      float Cr = 0.5 + 0.5   * r - 0.419 * g - 0.081 * b;
      if ((Cb > 0.3008 && Cb < 0.5273 && Cr > 0.5078 && Cr < 0.6836) || Y > 0.7 ) {
        blurCoordinates[0] = interp_tc.xy + singleStepOffset * vec2(0.0, -10.0); 
        blurCoordinates[1] = interp_tc.xy + singleStepOffset * vec2(0.0, 10.0); 
        blurCoordinates[2] = interp_tc.xy + singleStepOffset * vec2(-10.0, 0.0);
        blurCoordinates[3] = interp_tc.xy + singleStepOffset * vec2(10.0, 0.0); 
        blurCoordinates[4] = interp_tc.xy + singleStepOffset * vec2(5.0, -8.0); 
        blurCoordinates[5] = interp_tc.xy + singleStepOffset * vec2(5.0, 8.0); 
        blurCoordinates[6] = interp_tc.xy + singleStepOffset * vec2(-5.0, 8.0); 
        blurCoordinates[7] = interp_tc.xy + singleStepOffset * vec2(-5.0, -8.0); 
        blurCoordinates[8] = interp_tc.xy + singleStepOffset * vec2(8.0, -5.0); 
        blurCoordinates[9] = interp_tc.xy + singleStepOffset * vec2(8.0, 5.0); 
        blurCoordinates[10] = interp_tc.xy + singleStepOffset * vec2(-8.0, 5.0); 
        blurCoordinates[11] = interp_tc.xy + singleStepOffset * vec2(-8.0, -5.0); 
        blurCoordinates[12] = interp_tc.xy + singleStepOffset * vec2(0.0, -6.0); 
        blurCoordinates[13] = interp_tc.xy + singleStepOffset * vec2(0.0, 6.0); 
        blurCoordinates[14] = interp_tc.xy + singleStepOffset * vec2(6.0, 0.0); 
        blurCoordinates[15] = interp_tc.xy + singleStepOffset * vec2(-6.0, 0.0); 
        blurCoordinates[16] = interp_tc.xy + singleStepOffset * vec2(-4.0, -4.0); 
        blurCoordinates[17] = interp_tc.xy + singleStepOffset * vec2(-4.0, 4.0); 
        blurCoordinates[18] = interp_tc.xy + singleStepOffset * vec2(4.0, -4.0); 
        blurCoordinates[19] = interp_tc.xy + singleStepOffset * vec2(4.0, 4.0);;
         float sampleColor = centralColor.g * 20.0;
         sampleColor += greenValue(blurCoordinates[0]);
         sampleColor += greenValue(blurCoordinates[1]);
         sampleColor += greenValue(blurCoordinates[2]);
         sampleColor += greenValue(blurCoordinates[3]);
         sampleColor += greenValue(blurCoordinates[4]);
         sampleColor += greenValue(blurCoordinates[5]);
         sampleColor += greenValue(blurCoordinates[6]);
         sampleColor += greenValue(blurCoordinates[7]);
         sampleColor += greenValue(blurCoordinates[8]);
         sampleColor += greenValue(blurCoordinates[9]);
         sampleColor += greenValue(blurCoordinates[10]);
         sampleColor += greenValue(blurCoordinates[11]);
         sampleColor += greenValue(blurCoordinates[12]) * 2.0;
         sampleColor += greenValue(blurCoordinates[13]) * 2.0;
         sampleColor += greenValue(blurCoordinates[14]) * 2.0;
         sampleColor += greenValue(blurCoordinates[15]) * 2.0;
         sampleColor += greenValue(blurCoordinates[16]) * 2.0;
         sampleColor += greenValue(blurCoordinates[17]) * 2.0;
         sampleColor += greenValue(blurCoordinates[18]) * 2.0;
         sampleColor += greenValue(blurCoordinates[19]) * 2.0;
         sampleColor += sampleColor / 48.0;
         float highPass = centralColor.g - sampleColor + 0.5;
         for(int i = 0; i < 5; i++)
         {
             highPass = hardLight(highPass);
         }
         float luminance = dot(centralColor, W);
         float alpha = pow(luminance, params);
         vec3 smoothColor = centralColor + (centralColor-vec3(highPass))*alpha*0.1;
         processedColor = vec3(exposureValue * mix(smoothColor.rgb, max(smoothColor, centralColor), alpha));
      } else {
         processedColor = exposureValue * centralColor;
      }
      gl_FragColor = vec4(processedColor.r, processedColor.g, processedColor.b, 1.);;
   }
 };