kernel Levels < nameSpace : "anttikupila"; vendor : "Antti Kupila"; version : 1; description : "Levels filter"; > { parameter float2 red < minValue: float2(0,0); maxValue: float2(1,1); defaultValue: float2(0,1); >; parameter float2 green < minValue: float2(0,0); maxValue: float2(1,1); defaultValue: float2(0,1); >; parameter float2 blue < minValue: float2(0,0); maxValue: float2(1,1); defaultValue: float2(0,1); >; parameter float2 RGB < minValue: float2(0,0); maxValue: float2(1,1); defaultValue: float2(0.1,0.9); >; void evaluatePixel(in image3 src, out pixel3 dst) { pixel3 p = sampleNearest(src,outCoord()); float rgbdiff = RGB[1] - RGB[0]; p.r = ( (p.r - red[0])/(red[1] - red[0]) - RGB[0])/rgbdiff; p.g = ( (p.g - green[0])/(green[1] - green[0]) - RGB[0])/rgbdiff; p.b = ( (p.b - blue[0])/(blue[1] - blue[0]) - RGB[0])/rgbdiff; dst = p; } }