precision highp float;
varying vec2 uv0;
uniform sampler2D inputImageTexture;
uniform float scale;
uniform float offsetX;
uniform float offsetY;
uniform float radius;
uniform float ratio;
uniform int imageWidth;
uniform int imageHeight;


#define PI 3.14159265



float circle(float r, vec2 uv){ 
    return smoothstep(r-0.003,r+0.003,length(uv));
}

vec4 CircleMask(vec2 uv, vec2 center, float radius,float ratio){
    float isInCircle = 0.;
    vec2 res = uv;
    res.x -= center.x;
    res.y -= center.y;
    if (imageWidth < imageHeight){
        res.y = res.y/ratio;

    }else{
        res.x = res.x*ratio;
    }
    
    isInCircle = circle(radius,res);
    res.x += center.x;
    res.y += center.y;
    vec4 color = vec4(isInCircle,isInCircle,isInCircle,1.0);
    
    return color;
}
float roundedRectangle(vec2 uv, vec2 center,float ratio,float radius){
    vec2 res1 = uv;
    res1 -= center;
    if (imageWidth < imageHeight){
        res1.y = res1.y/ratio;

    }else{
        res1.x = res1.x*ratio;
    }
    res1 /= scale;
    res1 += center;
    if (res1.x < 0.0 || res1.x > 1. || res1.y < 0.0 || res1.y > 1.0) discard;
    vec2 res2 = res1.xy - vec2(0.5);
    float roundX = mod(res2.x,(0.5-radius/max(radius/0.25,scale))*2.*step(0.0,res2.x)-(0.5-radius/max(radius/0.25,scale)));
    float roundY = mod(res2.y,(0.5-radius/max(radius/0.25,scale))*2.*step(0.0,res2.y)-(0.5-radius/max(radius/0.25,scale)));
    float midX = step((0.5-radius/max(radius/0.25,scale)),abs(res2.x));
    float midY = step((0.5-radius/max(radius/0.25,scale)),abs(res2.y));
    float Rectmask = 1. - midX * midY * (smoothstep((radius-0.001)/max(radius/0.25,scale),(radius+0.001)/max(radius/0.25,scale),length(vec2(roundX,roundY))));
    // float finalMask = Rectmask * smoothstep(0.5/max(0.212,scale),0.497/max(0.212,scale),abs(res2.x)) * smoothstep(0.5/max(0.212,scale),0.497/max(0.212,scale),abs(res2.y));
    return Rectmask;


}
void main()
{
   
    vec2 uv2 = uv0;
    uv2 -= vec2(offsetX,offsetY);
    uv2 /= scale;
    uv2 += vec2(offsetX,offsetY);
    vec4 curColor = texture2D(inputImageTexture,vec2(uv2.x,uv2.y-0.05));
    // vec4 maskCol = CircleMask(uv0,vec2(offsetX,offsetY), 0.5*scale,ratio);
    // vec4 resultColor = curColor * (1.0 - maskCol.r);
    
    float roundedRectangleMask = roundedRectangle(uv0,vec2(offsetX,offsetY),ratio,radius);
    vec4 resultColor = curColor * roundedRectangleMask;
    gl_FragColor = resultColor;
}