From Directorforum Collaboration Wiki
--if a + b < 256 then begin
-- if b = 255 then
-- result := 255
-- else begin
-- c := (a SHL 7) DIV (255-b);
-- if c > 255 then result := 255 else result := c;
-- end;
--end
--else begin
-- // a cannot be zero here
-- c := 255 - (((255-b) SHL 7) DIV a);
-- if c < 0 then result := 0 else result := c;
--end;
-- ******* soft dodge mode *************
on softDodgeBlendMode (image1, image2)
theWidth = image1.width - 1
theHeight = image1.height - 1
theImage = image(theWidth + 1, theHeight + 1, 32)
theMultiplier = 127.0
repeat with x = 0 to theWidth
repeat with y = 0 to theHeight
theColour1 = image1.getPixel(point(x,y))
theColour2 = image2.getPixel(point(x,y))
theNewColour = color(0,0,0)
if theColour1.red + theColour2.red < 256 then
if theColour2.red = 255 then
theNewColour.red = 255
else
theNewColour.red = min ((theColour1.red * theMultiplier) / float(255 - theColour2.red), 255)
end if
else
-- cannot be zero here
theNewColour.red = max(255 - (((255 - theColour2.red) * theMultiplier) / float(theCOlour1.red)), 0)
end if
if theColour1.green + theColour2.green < 256 then
if theColour2.green = 255 then
theNewColour.green = 255
else
theNewColour.green = min ((theColour1.green * theMultiplier) / float(255 - theColour2.green), 255)
end if
else
-- cannot be zero here
theNewColour.green = max(255 - (((255 - theColour2.green) * theMultiplier) / float(theCOlour1.green)), 0)
end if
if theColour1.blue + theColour2.blue < 256 then
if theColour2.blue = 255 then
theNewColour.blue = 255
else
theNewColour.blue = min ((theColour1.blue * theMultiplier) / float(255 - theColour2.blue), 255)
end if
else
-- cannot be zero here
theNewColour.blue = max(255 - (((255 - theColour2.blue) * theMultiplier) / float(theCOlour1.blue)), 0)
end if
theImage.setPixel(point(x, y), theNewColour)
end repeat
end repeat
return theImage
end