sampler Tex0S;
float4x4 colorMatrix;

int nContrast;
int nBright;
float fGamma;

float4 hslMain(float2 texpos : TEXCOORD0 ) : COLOR
{
    float4 texcolor = tex2D(Tex0S, texpos);
    
    texcolor = mul(texcolor,colorMatrix);

    //bright
    float fStepB = floor(nBright * 0.01 * 128)/255.0f;
	
    texcolor.x += fStepB;
    texcolor.y += fStepB;
    texcolor.z += fStepB;


    //contrast
    double fStep = nContrast * 0.01;
    double fStepC = fStep;
    if (nContrast > 99) 
    {
	fStepC = fStep * fStep * fStep;
    }

    texcolor.x = floor((texcolor.x - 0.5) * 255 * fStepC)/255.0 + 0.5;	
    texcolor.x = (texcolor.x < 0.0f) ? 0.0 : (texcolor.x  > 1.0) ? 1.0 : texcolor.x;
  
    texcolor.y = floor((texcolor.y - 0.5) * 255 * fStepC)/255.0 + 0.5;	
    texcolor.y = (texcolor.y < 0.0f) ? 0.0 : (texcolor.y > 1.0) ? 1.0 : texcolor.y;

    texcolor.z = floor((texcolor.z - 0.5) * 255 * fStepC)/255.0  + 0.5;
    texcolor.z = (texcolor.z < 0.0f) ? 0.0 : (texcolor.z  > 1.0) ? 1.0 : texcolor.z;	

    //gamma
    double dinvgamma = 1 / fGamma;
 
    texcolor.x = pow(texcolor.x, dinvgamma);	
    texcolor.x = (texcolor.x < 0.0f) ? 0.0 : (texcolor.x  > 1.0) ? 1.0 : texcolor.x;
    
    texcolor.y = pow(texcolor.y, dinvgamma);	
    texcolor.y = (texcolor.y < 0.0f) ? 0.0 : (texcolor.y > 1.0) ? 1.0 : texcolor.y;

    texcolor.z = pow(texcolor.z, dinvgamma);
    texcolor.z = (texcolor.z < 0.0f) ? 0.0 : (texcolor.z  > 1.0) ? 1.0 : texcolor.z;

    return texcolor;
}