MakinMagic Posted October 20, 2008 Share Posted October 20, 2008 Hi - could we please have more merge modes ? These would do nicely : color func Merge(color pbottom, color ptop) if @p_modeselect=="MMF Merge Modes" if @clamp float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.0 r = 0.0 elseif r>1.0 r = 1.0 endif if g<0.0 g = 0.0 elseif g>1.0 g = 1.0 endif if b<0.0 b = 0.0 elseif b>1.0 b = 1.0 endif ptop = rgba(r,g,b,alpha(ptop)) r = red(pbottom) g = green(pbottom) b = blue(pbottom) if r<0.0 r = 0.0 elseif r>1.0 r = 1.0 endif if g<0.0 g = 0.0 elseif g>1.0 g = 1.0 endif if b<0.0 b = 0.0 elseif b>1.0 b = 1.0 endif pbottom = rgba(r,g,b,alpha(pbottom)) endif if @p_mmfmergemode=="Exclusion" return rgba(red(pbottom) + red(ptop) - 2*red(pbottom)*red(ptop), \ green(pbottom) + green(ptop) - 2*green(pbottom)*green(ptop), \ blue(pbottom) + blue(ptop) - 2*blue(pbottom)*blue(ptop), \ alpha(ptop) ) elseif @p_mmfmergemode=="Fade Down" return rgba( red(ptop) * (1 - red(ptop) + red(pbottom)), \ green(ptop) * (1 - green(ptop) + green(pbottom)), \ blue(ptop) * (1 - blue(ptop) + blue(pbottom)), alpha(ptop) ) elseif @p_mmfmergemode=="Fade Up" return rgba(red(pbottom) + red(ptop)*(red(ptop) - red(pbottom)), \ green(pbottom) + green(ptop)*(green(ptop) - green(pbottom)), \ blue(pbottom) + blue(ptop)*(blue(ptop) - blue(pbottom)), \ alpha(ptop) ) elseif @p_mmfmergemode=="Contrast Down" return rgba( 0.5 + red(ptop)*(red(pbottom) - 0.5), \ 0.5 + green(ptop)*(green(pbottom) - 0.5), \ 0.5 + blue(ptop)*(blue(pbottom) - 0.5), alpha(ptop) ) elseif @p_mmfmergemode=="Contrast Up" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = r - 2.0*red(ptop)*r*(0.5 - r) else r = r + 2.0*red(ptop)*(1.0 - r)*(r - 0.5) endif if g<0.5 g = g - 2.0*green(ptop)*g*(0.5 - g) else g = g + 2.0*green(ptop)*(1.0 - g)*(g - 0.5) endif if b<0.5 b = b - 2.0*blue(ptop)*b*(0.5 - else b = b + 2.0*blue(ptop)*(1.0 - *(b - 0.5) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Dodge" ; Here we clamp the maximum returned to 1.0 because of the special case ; when the color channel in ptop is one (or more). float r = 1.0 - red(ptop) float g = 1.0 - green(ptop) float b = 1.0 - blue(ptop) if red(pbottom)<=0 r = 0.0 elseif r<=0.0 r = 1.0 else r = red(pbottom)/r if r>1.0 r = 1.0 endif endif if green(pbottom)<=0 g = 0 elseif g<=0.0 g = 1.0 else g = green(pbottom)/g if g>1.0 g = 1.0 endif endif if blue(pbottom)<=0 b = 0 elseif b<=0.0 b = 1.0 else b = blue(pbottom)/b if b>1.0 b = 1.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Burn" ; Here we clamp the minimum returned to 0 because of the special case ; when the color channel in ptop is zero (or less). float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<=0.0 r = 0.0 else r = 1.0 - (1.0 - red(pbottom))/r if r<0.0 r = 0.0 endif endif if g<=0.0 g = 0.0 else g = 1.0 - (1.0 - green(pbottom))/g if g<0.0 g = 0.0 endif endif if b<=0.0 b = 0.0 else b = 1.0 - (1.0 - blue(pbottom))/b if b<0.0 b = 0.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Negation" return rgba( 1.0 - abs(1.0 - red(ptop) - red(pbottom)), \ 1.0 - abs(1.0 - green(ptop) - green(pbottom)), \ 1.0 - abs(1.0 - blue(ptop) - blue(pbottom)), alpha(ptop) ) elseif @p_mmfmergemode=="Reflect" ; Here we clamp the maximum returned to 1.0 because of the special case ; when the color channel in ptop is one (or more). float r = 1.0 - red(ptop) float g = 1.0 - green(ptop) float b = 1.0 - blue(ptop) if red(pbottom)<=0 r = 0.0 elseif r<=0.0 r = 1.0 else r = sqr(red(pbottom))/r if r>1.0 r = 1.0 endif endif if green(pbottom)<=0 g = 0.0 elseif g<=0.0 g = 1.0 else g = sqr(green(pbottom))/g if g>1.0 g = 1.0 endif endif if blue(pbottom)<=0 b = 0.0 elseif b<=0.0 b = 1.0 else b = sqr(blue(pbottom))/b if b>1.0 b = 1.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Freeze" ; Here we clamp the minimum returned to 0 because of the special case ; when the color channel in ptop is zero (or less). float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<=0.0 r = 0.0 else r = 1.0 - sqr(1.0 - red(pbottom))/r if r<0.0 r = 0.0 endif endif if g<=0.0 g = 0.0 else g = 1.0 - sqr(1.0 - green(pbottom))/g if g<0.0 g = 0.0 endif endif if b<=0.0 b = 0.0 else b = 1.0 - sqr(1.0 - blue(pbottom))/b if b<0.0 b = 0.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Rev. Contrast Down" return rgba( 0.5 + (1.0 - red(ptop))*(red(pbottom) - 0.5), \ 0.5 + (1.0 - green(ptop))*(green(pbottom) - 0.5), \ 0.5 + (1.0 - blue(ptop))*(blue(pbottom) - 0.5), alpha(ptop) ) elseif @p_mmfmergemode=="Rev. Contrast Up" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = r - 2.0*(1.0 - red(ptop))*r*(0.5 - r) else r = r + 2.0*(1.0 - red(ptop))*(1.0 - r)*(r - 0.5) endif if g<0.5 g = g - 2.0*(1.0 - green(ptop))*g*(0.5 - g) else g = g + 2.0*(1.0 - green(ptop))*(1.0 - g)*(g - 0.5) endif if b<0.5 b = b - 2.0*(1.0 - blue(ptop))*b*(0.5 - else b = b + 2.0*(1.0 - blue(ptop))*(1.0 - *(b - 0.5) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Fade" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = 2.0 * r * (0.5 - r + red(pbottom)) else r = red(pbottom) + 2.0 * (r - 0.5)*(r - red(pbottom)) endif if g<0.5 g = 2.0 * g * (0.5 - g + green(pbottom)) else g = green(pbottom) + 2.0 * (g - 0.5)*(g - green(pbottom)) endif if b<0.5 b = 2.0 * b * (0.5 - b + blue(pbottom)) else b = blue(pbottom) + 2.0 * (b - 0.5)*(b - blue(pbottom)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Reverse Fade" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = red(pbottom) + 2.0 * r * (r - red(pbottom)) else r = red(pbottom) + 2.0 * (1.0 - r)*(r - red(pbottom)) endif if g<0.5 g = green(pbottom) + 2.0 * g * (g - green(pbottom)) else g = green(pbottom) + 2.0 * (1.0 - g)*(g - green(pbottom)) endif if b<0.5 b = blue(pbottom) + 2.0 * b * (b - blue(pbottom)) else b = blue(pbottom) + 2.0 * (1.0 - *(b - blue(pbottom)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Contrast" || @p_mmfmergemode=="Reverse Contrast" float r1 = red(ptop) float g1 = green(ptop) float b1 = blue(ptop) if @p_mmfmergemode=="Reverse Contrast" r1 = 1.0 - r1 g1 = 1.0 - g1 b1 = 1.0 - b1 endif if r1<0.5 r1 = 0.5 + 2.0 * r1 * (red(pbottom) - 0.5) else r1 = 2.0 * (r1 - 0.5) float r = red(pbottom) if r<0.5 r1 = r - 2.0*r1*r*(0.5 - r) else r1 = r + 2.0*r1*(1.0 - r)*(r - 0.5) endif endif if g1<0.5 g1 = 0.5 + 2.0 * g1 * (green(pbottom) - 0.5) else g1 = 2.0 * (g1 - 0.5) float g = green(pbottom) if g<0.5 g1 = g - 2.0*g1*g*(0.5 - g) else g1 = g + 2.0*g1*(1.0 - g)*(g - 0.5) endif endif if b1<0.5 b1 = 0.5 + 2.0 * b1 * (blue(pbottom) - 0.5) else b1 = 2.0 * (b1 - 0.5) float b = blue(pbottom) if b<0.5 b1 = b - 2.0*b1*b*(0.5 - else b1 = b + 2.0*b1*(1.0 - *(b - 0.5) endif endif return rgba(r1,g1,b1,alpha(ptop)) elseif @p_mmfmergemode=="Quantize" int nr = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + red(ptop)) - 1.0)) - 1 int ng = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + green(ptop)) - 1.0)) - 1 int nb = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + blue(ptop)) - 1.0)) - 1 return rgba(floor(red(pbottom)*(nr+0.999))/nr, \ floor(green(pbottom)*(ng+0.999))/ng, \ floor(blue(pbottom)*(nb+0.999))/nb,alpha(ptop)) elseif @p_mmfmergemode=="Reverse Quantize" int nr = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - red(ptop)) - 1.0)) - 1 int ng = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - green(ptop)) - 1.0)) - 1 int nb = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - blue(ptop)) - 1.0)) - 1 return rgba(floor(red(pbottom)*(nr+0.999))/nr, \ floor(green(pbottom)*(ng+0.999))/ng, \ floor(blue(pbottom)*(nb+0.999))/nb,alpha(ptop)) elseif @p_mmfmergemode=="Gamma" return rgba(red(pbottom)^(@mingamma+(@maxgamma-@mingamma)*red(ptop)), \ green(pbottom)^(@mingamma+(@maxgamma-@mingamma)*green(ptop)), \ blue(pbottom)^(@mingamma+(@maxgamma-@mingamma)*blue(ptop)), \ alpha(ptop)) elseif @p_mmfmergemode=="Inverse Gamma" return rgba(red(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*red(ptop))), \ green(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*green(ptop))), \ blue(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*blue(ptop))), \ alpha(ptop)) elseif @p_mmfmergemode=="Reverse Gamma" return rgba(red(pbottom)^(@mingamma+(@maxgamma-@mingamma)*(1.0-red(ptop))), \ green(pbottom)^(@mingamma+(@maxgamma-@mingamma)*(1.0-green(ptop))), \ blue(pbottom)^(@mingamma+(@maxgamma-@mingamma)*(1.0-blue(ptop))), \ alpha(ptop)) elseif @p_mmfmergemode=="Rev. Inv. Gamma" return rgba(red(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-red(ptop)))), \ green(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-green(ptop)))), \ blue(pbottom)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-blue(ptop)))), \ alpha(ptop)) elseif @p_mmfmergemode=="Combined Gamma" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = red(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-red(ptop))) else r = red(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(red(ptop)-0.5))) endif if g<0.5 g = green(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-green(ptop))) else g = green(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(green(ptop)-0.5))) endif if b<0.5 b = blue(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-blue(ptop))) else b = blue(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(blue(ptop)-0.5))) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Rev. Comb. Gamma" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = red(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-red(ptop)))) else r = red(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(red(ptop)-0.5)) endif if g<0.5 g = green(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-green(ptop)))) else g = green(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(green(ptop)-0.5)) endif if b<0.5 b = blue(pbottom)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-blue(ptop)))) else b = blue(pbottom)^(@mingamma+2.0*(@maxgamma-@mingamma)*(blue(ptop)-0.5)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Stamp" float r = red(pbottom) + 2.0*red(ptop) - 1.0 float g = green(pbottom) + 2.0*green(ptop) - 1.0 float b = blue(pbottom) + 2.0*blue(ptop) - 1.0 if r<0.0 r = 0.0 elseif r>1.0 r = 1.0 endif if g<0.0 g = 0.0 elseif g>1.0 g = 1.0 endif if b<0.0 b = 0.0 elseif b>1.0 b = 1.0 endif return RGBA(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Soft Dodge" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<=0 r = 0 elseif r+red(ptop)<=1.0 if red(ptop)>=1.0 r = 1.0 elseif (r = 0.5*r/(1.0 - red(ptop)))>1.0 r = 1.0 endif elseif (r = 1.0 - 0.5*(1.0 - red(ptop))/r)<0.0 r = 0.0 endif if g<=0 g = 0 elseif g+green(ptop)<=1.0 if green(ptop)>=1.0 g = 1.0 elseif (g = 0.5*g/(1.0 - green(ptop)))>1.0 g = 1.0 endif elseif (g = 1.0 - 0.5*(1.0 - green(ptop))/g)<0.0 g = 0.0 endif if b<=0 b = 0 elseif b+blue(ptop)<=1.0 if blue(ptop)>=1.0 b = 1.0 elseif (b = 0.5*b/(1.0 - blue(ptop)))>1.0 b = 1.0 endif elseif (b = 1.0 - 0.5*(1.0 - blue(ptop))/b)<0.0 b = 0.0 endif return RGBA(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Soft Burn" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<=0 r = 0 elseif r+red(pbottom)<=1.0 if red(pbottom)>=1.0 r = 1.0 elseif (r = 0.5*r/(1.0 - red(pbottom)))>1.0 r = 1.0 endif elseif (r = 1.0 - 0.5*(1.0 - red(pbottom))/r)<0.0 r = 0.0 endif if g<=0 g = 0 elseif g+green(pbottom)<=1.0 if green(pbottom)>=1.0 g = 1.0 elseif (g = 0.5*g/(1.0 - green(pbottom)))>1.0 g = 1.0 endif elseif (g = 1.0 - 0.5*(1.0 - green(pbottom))/g)<0.0 g = 0.0 endif if b<=0 b = 0 elseif b+blue(pbottom)<=1.0 if blue(pbottom)>=1.0 b = 1.0 elseif (b = 0.5*b/(1.0 - blue(pbottom)))>1.0 b = 1.0 endif elseif (b = 1.0 - 0.5*(1.0 - blue(pbottom))/b)<0.0 b = 0.0 endif return RGBA(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Dodge" ; Here we clamp the maximum returned to 1.0 because of the special case ; when the color channel in ptop is one (or more). float r = 1.0 - red(pbottom) float g = 1.0 - green(pbottom) float b = 1.0 - blue(pbottom) if red(ptop)<=0 r = 0 elseif r<=0.0 r = 1.0 else r = red(ptop)/r if r>1.0 r = 1.0 endif endif if green(ptop)<=0 g = 0 elseif g<=0.0 g = 1.0 else g = green(ptop)/g if g>1.0 g = 1.0 endif endif if blue(ptop)<=0 b = 0 elseif b<=0.0 b = 1.0 else b = blue(ptop)/b if b>1.0 b = 1.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Burn" ; Here we clamp the minimum returned to 0 because of the special case ; when the color channel in ptop is zero (or less). float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<=0.0 r = 0.0 else r = 1.0 - (1.0 - red(ptop))/r if r<0.0 r = 0.0 endif endif if g<=0.0 g = 0.0 else g = 1.0 - (1.0 - green(ptop))/g if g<0.0 g = 0.0 endif endif if b<=0.0 b = 0.0 else b = 1.0 - (1.0 - blue(ptop))/b if b<0.0 b = 0.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Glow" ; Here we clamp the maximum returned to 1.0 because of the special case ; when the color channel in ptop is one (or more). float r = 1.0 - red(pbottom) float g = 1.0 - green(pbottom) float b = 1.0 - blue(pbottom) if red(ptop)<=0 r = 0.0 elseif r<=0.0 r = 1.0 else r = sqr(red(ptop))/r if r>1.0 r = 1.0 endif endif if green(ptop)<=0 g = 0.0 elseif g<=0.0 g = 1.0 else g = sqr(green(ptop))/g if g>1.0 g = 1.0 endif endif if blue(ptop)<=0 b = 0.0 elseif b<=0.0 b = 1.0 else b = sqr(blue(ptop))/b if b>1.0 b = 1.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Heat" ; Here we clamp the minimum returned to 0 because of the special case ; when the color channel in ptop is zero (or less). float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<=0.0 r = 0.0 else r = 1.0 - sqr(1.0 - red(ptop))/r if r<0.0 r = 0.0 endif endif if g<=0.0 g = 0.0 else g = 1.0 - sqr(1.0 - green(ptop))/g if g<0.0 g = 0.0 endif endif if b<=0.0 b = 0.0 else b = 1.0 - sqr(1.0 - blue(ptop))/b if b<0.0 b = 0.0 endif endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Fade Down" return rgba( red(pbottom) * (1 - red(pbottom) + red(ptop)), \ green(pbottom) * (1 - green(pbottom) + green(ptop)), \ blue(pbottom) * (1 - blue(pbottom) + blue(ptop)), alpha(ptop) ) elseif @p_mmfmergemode=="Inv. Fade Up" return rgba(red(ptop) + red(pbottom)*(red(pbottom) - red(ptop)), \ green(ptop) + green(pbottom)*(green(pbottom) - green(ptop)), \ blue(ptop) + blue(pbottom)*(blue(pbottom) - blue(ptop)), \ alpha(ptop) ) elseif @p_mmfmergemode=="Inv. Contrast Down" return rgba( 0.5 + red(pbottom)*(red(ptop) - 0.5), \ 0.5 + green(pbottom)*(green(ptop) - 0.5), \ 0.5 + blue(pbottom)*(blue(ptop) - 0.5), alpha(ptop) ) elseif @p_mmfmergemode=="Inv. Contrast Up" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = r - 2.0*red(pbottom)*r*(0.5 - r) else r = r + 2.0*red(pbottom)*(1.0 - r)*(r - 0.5) endif if g<0.5 g = g - 2.0*green(pbottom)*g*(0.5 - g) else g = g + 2.0*green(pbottom)*(1.0 - g)*(g - 0.5) endif if b<0.5 b = b - 2.0*blue(pbottom)*b*(0.5 - else b = b + 2.0*blue(pbottom)*(1.0 - *(b - 0.5) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Rev. Con. Down" return rgba( 0.5 + (1.0 - red(pbottom))*(red(ptop) - 0.5), \ 0.5 + (1.0 - green(pbottom))*(green(ptop) - 0.5), \ 0.5 + (1.0 - blue(pbottom))*(blue(ptop) - 0.5), alpha(ptop) ) elseif @p_mmfmergemode=="Inv. Rev. Con. Up" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if r<0.5 r = r - 2.0*(1.0 - red(pbottom))*r*(0.5 - r) else r = r + 2.0*(1.0 - red(pbottom))*(1.0 - r)*(r - 0.5) endif if g<0.5 g = g - 2.0*(1.0 - green(pbottom))*g*(0.5 - g) else g = g + 2.0*(1.0 - green(pbottom))*(1.0 - g)*(g - 0.5) endif if b<0.5 b = b - 2.0*(1.0 - blue(pbottom))*b*(0.5 - else b = b + 2.0*(1.0 - blue(pbottom))*(1.0 - *(b - 0.5) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Fade" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = 2.0 * r * (0.5 - r + red(ptop)) else r = red(ptop) + 2.0 * (r - 0.5)*(r - red(ptop)) endif if g<0.5 g = 2.0 * g * (0.5 - g + green(ptop)) else g = green(ptop) + 2.0 * (g - 0.5)*(g - green(ptop)) endif if b<0.5 b = 2.0 * b * (0.5 - b + blue(ptop)) else b = blue(ptop) + 2.0 * (b - 0.5)*(b - blue(ptop)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Rev. Fade" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = red(ptop) + 2.0 * r * (r - red(ptop)) else r = red(ptop) + 2.0 * (1.0 - r)*(r - red(ptop)) endif if g<0.5 g = green(ptop) + 2.0 * g * (g - green(ptop)) else g = green(ptop) + 2.0 * (1.0 - g)*(g - green(ptop)) endif if b<0.5 b = blue(ptop) + 2.0 * b * (b - blue(ptop)) else b = blue(ptop) + 2.0 * (1.0 - *(b - blue(ptop)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Contrast" \ || @p_mmfmergemode=="Inv. Rev. Contrast" float r1 = red(pbottom) float g1 = green(pbottom) float b1 = blue(pbottom) if @p_mmfmergemode=="Inv. Rev. Contrast" r1 = 1.0 - r1 g1 = 1.0 - g1 b1 = 1.0 - b1 endif if r1<0.5 r1 = 0.5 + 2.0 * r1 * (red(ptop) - 0.5) else r1 = 2.0 * (r1 - 0.5) float r = red(ptop) if r<0.5 r1 = r - 2.0*r1*r*(0.5 - r) else r1 = r + 2.0*r1*(1.0 - r)*(r - 0.5) endif endif if g1<0.5 g1 = 0.5 + 2.0 * g1 * (green(ptop) - 0.5) else g1 = 2.0 * (g1 - 0.5) float g = green(ptop) if g<0.5 g1 = g - 2.0*g1*g*(0.5 - g) else g1 = g + 2.0*g1*(1.0 - g)*(g - 0.5) endif endif if b1<0.5 b1 = 0.5 + 2.0 * b1 * (blue(ptop) - 0.5) else b1 = 2.0 * (b1 - 0.5) float b = blue(ptop) if b<0.5 b1 = b - 2.0*b1*b*(0.5 - else b1 = b + 2.0*b1*(1.0 - *(b - 0.5) endif endif return rgba(r1,g1,b1,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Quantize" int nr = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + red(pbottom)) - 1.0)) - 1 int ng = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + green(pbottom)) - 1.0)) - 1 int nb = round(@qmax - (@qmax-@qmin)*(2.0/(1.0 + blue(pbottom)) - 1.0)) - 1 return rgba(floor(red(ptop)*(nr+0.999))/nr, \ floor(green(ptop)*(ng+0.999))/ng, \ floor(blue(ptop)*(nb+0.999))/nb,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Rev. Quantize" int nr = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - red(pbottom)) - 1.0)) - 1 int ng = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - green(pbottom)) - 1.0)) - 1 int nb = round(@qmax - (@qmax-@qmin)*(2.0/(2.0 - blue(pbottom)) - 1.0)) - 1 return rgba(floor(red(ptop)*(nr+0.999))/nr, \ floor(green(ptop)*(ng+0.999))/ng, \ floor(blue(ptop)*(nb+0.999))/nb,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Gamma" return rgba(red(ptop)^(@mingamma+(@maxgamma-@mingamma)*red(pbottom)), \ green(ptop)^(@mingamma+(@maxgamma-@mingamma)*green(pbottom)), \ blue(ptop)^(@mingamma+(@maxgamma-@mingamma)*blue(pbottom)), \ alpha(ptop)) elseif @p_mmfmergemode=="Inv. Inverse Gamma" return rgba(red(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*red(pbottom))), \ green(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*green(pbottom))), \ blue(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*blue(pbottom))), \ alpha(ptop)) elseif @p_mmfmergemode=="Inv. Reverse Gamma" return rgba(red(ptop)^(@mingamma+(@maxgamma-@mingamma)*(1.0-red(pbottom))), \ green(ptop)^(@mingamma+(@maxgamma-@mingamma)*(1.0-green(pbottom))), \ blue(ptop)^(@mingamma+(@maxgamma-@mingamma)*(1.0-blue(pbottom))), \ alpha(ptop)) elseif @p_mmfmergemode=="Inv. Rev. Inv. Gamma" return rgba(red(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-red(pbottom)))), \ green(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-green(pbottom)))), \ blue(ptop)^(1.0/(@mingamma+(@maxgamma-@mingamma)*(1.0-blue(pbottom)))), \ alpha(ptop)) elseif @p_mmfmergemode=="Inv. Combined Gamma" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = red(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-r)) else r = red(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(r-0.5))) endif if g<0.5 g = green(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-g)) else g = green(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(g-0.5))) endif if b<0.5 b = blue(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-) else b = blue(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(b-0.5))) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inv. Rev. Comb. Gamma" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if r<0.5 r = red(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-r))) else r = red(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(r-0.5)) endif if g<0.5 g = green(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-g))) else g = green(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(g-0.5)) endif if b<0.5 b = blue(ptop)^(1.0/(@mingamma+2.0*(@maxgamma-@mingamma)*(0.5-)) else b = blue(ptop)^(@mingamma+2.0*(@maxgamma-@mingamma)*(b-0.5)) endif return rgba(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Inverse Stamp" float r = red(ptop) + 2.0*red(pbottom) - 1.0 float g = green(ptop) + 2.0*green(pbottom) - 1.0 float b = blue(ptop) + 2.0*blue(pbottom) - 1.0 if r<0.0 r = 0.0 elseif r>1.0 r = 1.0 endif if g<0.0 g = 0.0 elseif g>1.0 g = 1.0 endif if b<0.0 b = 0.0 elseif b>1.0 b = 1.0 endif return RGBA(r,g,b,alpha(ptop)) elseif @p_mmfmergemode=="Brightness (Yiq)" float btop = 0.299*red(ptop) + 0.587*green(ptop) + 0.114*blue(ptop) float bbtm = 0.299*red(pbottom) + 0.587*green(pbottom) \ + 0.114*blue(pbottom) if bbtm==0 return RGBA(btop,btop,btop,alpha(ptop)) else pbottom = pbottom*(btop/bbtm) return RGBA(red(pbottom),green(pbottom),blue(pbottom),alpha(ptop)) endif elseif @p_mmfmergemode=="Colour (Inverse Yiq)" float btop = 0.299*red(ptop) + 0.587*green(ptop) + 0.114*blue(ptop) float bbtm = 0.299*red(pbottom) + 0.587*green(pbottom) \ + 0.114*blue(pbottom) if btop==0 return RGBA(bbtm,bbtm,bbtm,alpha(ptop)) else pbottom = ptop*(bbtm/btop) return RGBA(red(pbottom),green(pbottom),blue(pbottom),alpha(ptop)) endif elseif @p_mmfmergemode=="Brightness (Custom)" float btop = (@redlvl*red(ptop) + @greenlvl*green(ptop) \ + @bluelvl*blue(ptop))/(@redlvl + @greenlvl +@bluelvl) float bbtm = (@redlvl*red(pbottom) + @greenlvl*green(pbottom) \ + @bluelvl*blue(pbottom))/(@redlvl + @greenlvl +@bluelvl) if bbtm==0 return RGBA(btop,btop,btop,alpha(ptop)) else pbottom = pbottom*(btop/bbtm) return RGBA(red(pbottom),green(pbottom),blue(pbottom),alpha(ptop)) endif elseif @p_mmfmergemode=="Colour (Custom)" float btop = (@redlvl*red(ptop) + @greenlvl*green(ptop) \ + @bluelvl*blue(ptop))/(@redlvl + @greenlvl +@bluelvl) float bbtm = (@redlvl*red(pbottom) + @greenlvl*green(pbottom) \ + @bluelvl*blue(pbottom))/(@redlvl + @greenlvl +@bluelvl) if btop==0 return RGBA(bbtm,bbtm,bbtm,alpha(ptop)) else pbottom = ptop*(bbtm/btop) return RGBA(red(pbottom),green(pbottom),blue(pbottom),alpha(ptop)) endif elseif @p_mmfmergemode=="Pin Light" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if (r>=0.5 && rred(pbottom)) r = red(pbottom) endif if (g>=0.5 && ggreen(pbottom)) g = green(pbottom) endif if (b>=0.5 && bblue(pbottom)) b = blue(pbottom) endif return RGBA(r, g, b, alpha(ptop)) elseif @p_mmfmergemode=="Reverse Pin Light" float r = red(ptop) float g = green(ptop) float b = blue(ptop) if (r>=0.5 && r>red(pbottom)) || (r<0.5 && r r = red(pbottom) endif if (g>=0.5 && g>green(pbottom)) || (g<0.5 && g g = green(pbottom) endif if (b>=0.5 && b>blue(pbottom)) || (b<0.5 && b b = blue(pbottom) endif return RGBA(r, g, b, alpha(ptop)) elseif @p_mmfmergemode=="Inv. Pin Light" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if (r>=0.5 && rred(ptop)) r = red(ptop) endif if (g>=0.5 && ggreen(ptop)) g = green(ptop) endif if (b>=0.5 && bblue(ptop)) b = blue(ptop) endif return RGBA(r, g, b, alpha(ptop)) else;if @p_mmfmergemode=="Inv. Rev. Pin Light" float r = red(pbottom) float g = green(pbottom) float b = blue(pbottom) if (r>=0.5 && r>red(ptop)) || (r<0.5 && r r = red(ptop) endif if (g>=0.5 && g>green(ptop)) || (g<0.5 && g g = green(ptop) endif if (b>=0.5 && b>blue(ptop)) || (b<0.5 && b b = blue(ptop) endif return RGBA(r, g, b, alpha(ptop)) endif ; @p_mmfmergemode Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.