vec4 RGBtoHSL(in vec4 o) {
	float MAX = max(max(o.r, o.g), o.b);
	float MIN = min(min(o.r, o.g), o.b);
	float h;
	if(MAX==MIN) { h=0.0; }
	else if(o.r>o.g && o.r>o.b){h=60.0*(o.g-o.b)/(MAX-MIN)+360.0;}
	else if(o.g>o.b){h=60.0*(o.b-o.r)/(MAX-MIN)+120.0;}
	else {h=60.0*(o.r-o.g)/(MAX-MIN)+240.0;}
	float s, l=0.5*(MAX+MIN);
	if(MAX==MIN){s=0.0;} else if(l<=0.5){s=(MAX-MIN)/(2.0*l);} else {s=(MAX-MIN)/(2.0-2.0*l);}
	return vec4(h, s, l, o.a);
}
vec4 HSLtoRGB(in vec4 o) {
	float q = (o[2]<0.5) ? o[2]*(1.0+o[1]) : o[2]+o[1]-(o[2]*o[1]);
	float p = 2.0*o[2] - q;
	float hk = o[0]/360.0;
	vec4 ret; vec3 t; t.r = hk+1.0/3.0, t.g = hk, t.b = hk-1.0/3.0;
	for(int i=0; i<3; i++) {
		if(t[i]<0.0) t[i]+=1.0; if(t[i]>1.0) t[i]-=1.0;
		if(t[i]<1.0/6.0){ ret[i]=p+((q-p)*6.0*t[i]); }
		else if(t[i]<0.5){ ret[i]=q; }
		else if(t[i]<2.0/3.0){ ret[i]=p+((q-p)*6.0*(2.0/3.0-t[i])); }
		else{ ret[i]=p; }
	}
	ret[3] = o[3];
	return ret;
}

in float dh, ds, dl;
void main(void) {
	vec4 hsl = RGBtoHSL(getPix());
	hsl[0] = mod(hsl[0]+dh/2.0/PI*360.0, 360.0);
	hsl[1] = hsl[1]+ds;
	hsl[2] = hsl[2]+dl;
	pix(HSLtoRGB(hsl));
}
