Let’s take a look at the code.
Vibrance is computed from the amount (user input divided by 100) which is a value in [0,1]
float sw = sqrt((in[offs + l + 1] * in[offs + l + 1]) + (in[offs + l + 2] * in[offs + l + 2])) / 256.0;
float ls = 1.0 - ((amount * sw) * .25);
float ss = 1.0 + (amount * sw);
out[offs + l + 0] = in[offs + l + 0] * ls;
out[offs + l + 1] = in[offs + l + 1] * ss;
out[offs + l + 2] = in[offs + l + 2] * ss;
Can we go beyond 100%? Well as sw is smaller than 1, we can go up to 400% while still having ls >= 0.
But ls = 0 means all the image will become black.
Apart of that, I wonder why the sqrt is divided by 256. I don’t know the range of a and b of Lab in darktable, but if it is [-127,128], then the sqrt maximum possible value is sqrt(2*128*128) which is approximately equal to 181. So by dividing by 256, we get a value in [0,1/sqrt(2)]. So we could increase again the bound for the amount by a sqrt(2) factor.
So it seems that there is plenty of room above 100%, if it makes sense to have ls smaller than 0.75. In that case, we can change the slider range to allow values above 100%.
Also, please note again that I don’t know the range of a and b in darktable, so if someone knows it please don’t hesistate to tell us, as it influences the second computation (i.e. how large is 256 compared to the maximum chroma we can get)
Hope it can help