Code archives/Graphics/Pixel/Color blend modes
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| View graphic representations: https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/index.htm View time comparisons: https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/times.txt View descriptions of each blend mode: https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/summary.txt The following code archive entries are imported: colorspace.bmx http://blitzbasic.com/codearcs/codearcs.php?code=2953 (alt. https://dl.dropbox.com/u/10116881/blitz/code/colorspace.bmx) Blend modes are handled in such a way that adding your own is very trivial. A blend function is in the format: PixelBlend_MyBlendFunc ( top_red:Int , top_green:Int , top_blue:Int , bottom_red:Int , bottom_green:Int , bottom_blue:Int , resulting_red:Int Var , resulting_green:Int Var , resulting_blue:Int Var ) Then simply use it via SetPixelBlend ( PixelBlend_MyBlendFunc ) PixelBlend_Alpha is the default blend mode. You can also isolate the effects of a blend mode to any combination of the RGB channels and prevent the alpha channel from being altered. Unaffected channels will use the bottom value. Here's an example: SetPixelBlend ( PixelBlend_Alpha , PBCHANNELS_R | PBCHANNELS_G ) Which would include the A, R, and G channels. PBCHANNELS_ONLYR | PBCHANNELS_ONLYG would include R and G without A. All the available channels are PBCHANNELS_NONE, PBCHANNELS_R , PBCHANNELS_G , PBCHANNELS_B , PBCHANNELS_ONLYR , PBCHANNELS_ONLYG , PBCHANNELS_ONLYB , PBCHANNELS_A , PBCHANNELS_RGB , PBCHANNELS_ALL. The default is PBCHANNELS_ALL. It is not recommended that you exclude the alpha channel. When calling WritePixelAlpha or BlendPixels, you can use the mask argument as an extra alpha argument. The default value, 255, is exactly as opaque as the source pixel. You can increase or decrease the value to scale it up or down. | |||||
' --+-----------------------------------------------------------------------------------------+--
' | This code was originally written by Sophie Kirschner (sophiek@pineapplemachine.com) |
' | It is released as public domain. Please don't interpret that as liberty to claim credit |
' | that isn't yours, or to sell this code when it could otherwise be obtained for free |
' | because that would be a really shitty thing of you to do. |
' --+-----------------------------------------------------------------------------------------+--
' While this code is public domain, I really did work quite hard on it and would appreciate if you didn't claim undue credit
' Standard Photoshop algorithms were used whereever available.
' You can view a complete summary of blending modes at https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/summary.txt
Rem
View graphic representations:
https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/index.htm
View time comparisons:
https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/times.txt
View descriptions of each blend mode:
https://dl.dropbox.com/u/10116881/program/blendexamples/blitzpage/summary.txt
The following code archive entries are imported:
colorspace.bmx
http://blitzbasic.com/codearcs/codearcs.php?code=2953 (alt. https://dl.dropbox.com/u/10116881/blitz/code/colorspace.bmx)
Blend modes are handled in such a way that adding your own is very trivial. A blend function is in the format:
PixelBlend_MyBlendFunc ( top_red:Int , top_green:Int , top_blue:Int , bottom_red:Int , bottom_green:Int , bottom_blue:Int , resulting_red:Int Var , resulting_green:Int Var , resulting_blue:Int Var )
Then simply use it via SetPixelBlend ( PixelBlend_MyBlendFunc )
PixelBlend_Alpha is the default blend mode.
You can also isolate the effects of a blend mode to any combination of the RGB channels and prevent the alpha channel from being altered. Unaffected channels will use the bottom value. Here's an example:
SetPixelBlend ( PixelBlend_Alpha , PBCHANNELS_R | PBCHANNELS_G )
Which would include the A, R, and G channels.
PBCHANNELS_ONLYR | PBCHANNELS_ONLYG would include R and G without A.
All the available channels are PBCHANNELS_NONE, PBCHANNELS_R , PBCHANNELS_G , PBCHANNELS_B , PBCHANNELS_ONLYR , PBCHANNELS_ONLYG , PBCHANNELS_ONLYB , PBCHANNELS_A , PBCHANNELS_RGB , PBCHANNELS_ALL. The default is PBCHANNELS_ALL. It is not recommended that you exclude the alpha channel.
When calling WritePixelAlpha or BlendPixels, you can use the mask argument as an extra alpha argument. The default value, 255, is exactly as opaque as the source pixel. You can increase or decrease the value to scale it up or down.
EndRem
SuperStrict
Import brl.pixmap
Import "colorspace.bmx" ' http://blitzbasic.com/codearcs/codearcs.php?code=2953
' example program
Rem
SetPixelBlend PixelBlend_Multiply ' try experimenting with different blend modes by placing them here!
' first, let's load an example image to use
Local base:TPixmap=LoadPixmap(LoadBank("http::dl.dropbox.com/u/10116881/program/blendexamples/giftbox.png"))
Assert base,"Failed to load example image! You might not be connected to the internet, or the dropbox server might be down."
' and now let's make the pixmap we want to overlay on top of it
Local gradient:TPixmap=CreatePixmap(base.width,base.height,PF_RGBA8888)
For Local x%=0 Until gradient.width
For Local y%=0 Until gradient.height
gradient.WritePixel x,y,$ff00ff00|((Int(x*255/Float(gradient.width))) Shl 16)|(255-Int(y*255/Float(gradient.width)))
Next
Next
' and blend the first onto the bottom using the blend mode specified just a bit ago
Local blended:TPixmap=CopyPixmap(base)
For Local x%=0 Until gradient.width
For Local y%=0 Until gradient.height
WritePixelAlpha blended,x,y,gradient.ReadPixel(x,y)
Next
Next
' make the graphics window
AppTitle="Pixel blend example"
Graphics base.width*2,base.height*2
Repeat
Cls
DrawPixmap blended,base.width/2,0
DrawPixmap base,0,base.height
DrawPixmap gradient,base.width,base.height
Flip
If KeyDown(key_escape) Or AppTerminate() Then End
Forever
EndRem
Global pixblendfunc%(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)=PixelBlend_Alpha
Function SetPixelBlend(blendfunc%(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var),channels%=PBCHANNELS_ALL)
pixblendfunc=blendfunc
PBCHANNELS=channels
End Function
Function WritePixelAlpha(target:TPixmap,x%,y%,argb%,mask%=$ff)
Local on%=target.ReadPixel(x,y)
target.WritePixel x,y,BlendPixels(argb,on,mask)
End Function
Const PBCHANNELS_NONE%= %0000
Const PBCHANNELS_R%= %1100
Const PBCHANNELS_G%= %1010
Const PBCHANNELS_B%= %1001
Const PBCHANNELS_ONLYR%= %0100
Const PBCHANNELS_ONLYG%= %0010
Const PBCHANNELS_ONLYB%= %0001
Const PBCHANNELS_A%= %1000
Const PBCHANNELS_RGB%= %0111
Const PBCHANNELS_ALL%= %1111
Global PBCHANNELS%=PBCHANNELS_ALL
Function BlendPixels%(argb1%,argb2%,mask%=$ff,channels%=-1)
If channels=-1 Then channels=PBCHANNELS
Local a1%=(argb1 Shr 24)
If mask=0
Return argb2
ElseIf mask<$ff
a1=mask*a1/255
ElseIf mask>$ff
a1=mask*a1/255
If a1>$ff Then a1=$ff
EndIf
If a1=0 Or channels=PBCHANNELS_NONE Then Return argb2
Local alpha%,a2%=(argb2 Shr 24)
If channels&PBCHANNELS_A Then
alpha=$ff-((($ff-a1)*($ff-a2))/255)
Else
alpha=a2
EndIf
Local ret_r%,ret_g%,ret_b%
Local on_r%=(argb2 Shr 16)&$ff
Local on_g%=(argb2 Shr 8)&$ff
Local on_b%=argb2&$ff
If channels&PBCHANNELS_RGB Then
pixblendfunc( (argb1 Shr 16)&$ff,(argb1 Shr 8)&$ff,argb1&$ff, ..
on_r,on_g,on_b, ..
ret_r,ret_g,ret_b )
Local as%=$ff-a1
If channels&PBCHANNELS_ONLYR Then
ret_r=(ret_r*a1+on_r*as)/255
Else
ret_r=on_r
EndIf
If channels&PBCHANNELS_ONLYG Then
ret_g=(ret_g*a1+on_g*as)/255
Else
ret_g=on_g
EndIf
If channels&PBCHANNELS_ONLYB Then
ret_b=(ret_b*a1+on_b*as)/255
Else
ret_b=on_b
EndIf
Else
ret_r=on_r
ret_g=on_g
ret_b=on_b
EndIf
Return (alpha Shl 24)|(ret_r Shl 16)|(ret_g Shl 8)|ret_b
End Function
' Function PixelBlend_Template(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Function PixelBlend_Alpha(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1
g=g1
b=b1
End Function
Function PixelBlend_Lighten(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(r1,r2)
g=Max(g1,g2)
b=Max(b1,b2)
End Function
Function PixelBlend_Darken(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(r1,r2)
g=Min(g1,g2)
b=Min(b1,b2)
End Function
Function PixelBlend_Exclusion(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1+r2-r1*r2/127.5
g=g1+g2-g1*g2/127.5
b=b1+b2-b1*b2/127.5
End Function
Function PixelBlend_Difference(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Abs(r1-r2)
g=Abs(g1-g2)
b=Abs(b1-b2)
End Function
Function PixelBlend_Contrast(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,Min(255,r2+r1-127))
g=Max(0,Min(255,g2+g1-127))
b=Max(0,Min(255,b2+b1-127))
End Function
Function PixelBlend_HardContrast(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r2>127
r=Max(0,Min(255,r2+r1-127))
Else
r=Max(0,Min(255,r2-r1+127))
EndIf
If g2>127
g=Max(0,Min(255,g2+g1-127))
Else
g=Max(0,Min(255,g2-g1+127))
EndIf
If b2>127
b=Max(0,Min(255,b2+b1-127))
Else
b=Max(0,Min(255,b2-b1+127))
EndIf
End Function
Function PixelBlend_Multiply(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1*r2/255
g=g1*g2/255
b=b1*b2/255
End Function
Function PixelBlend_Screen(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1+r2-r1*r2/255
g=g1+g2-g1*g2/255
b=b1+b2-b1*b2/255
End Function
Function PixelBlend_Overlay(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r2<128
r=2*r1*r2/255
Else
r=(255-2*(255-r1)*(255-r2)/255)
EndIf
If g2<128
g=2*g1*g2/255
Else
g=(255-2*(255-g1)*(255-g2)/255)
EndIf
If b2<128
b=2*b1*b2/255
Else
b=(255-2*(255-b1)*(255-b2)/255)
EndIf
End Function
Function PixelBlend_Softlight(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1>127.5
r=r2+(255-r2)*((r1-127.5)/127.5)*(0.5-Abs(r1-127.5)/255.0)
Else
r=r2-r2*((127.5-r1)/127.5)*(0.5-Abs(r2-127.5)/255.0)
EndIf
If g1>127.5
g=g2+(255-g2)*((g1-127.5)/127.5)*(0.5-Abs(g1-127.5)/255.0)
Else
g=g2-g2*((127.5-g1)/127.5)*(0.5-Abs(g2-127.5)/255.0)
EndIf
If b1>127.5
b=b2+(255-b2)*((b1-127.5)/127.5)*(0.5-Abs(b1-127.5)/255.0)
Else
b=b2-b2*((127.5-b1)/127.5)*(0.5-Abs(b2-127.5)/255.0)
EndIf
End Function
Function PixelBlend_HardLight(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1<128
r=2*r1*r2/255
Else
r=(255-2*(255-r1)*(255-r2)/255)
EndIf
If g1<128
g=2*g1*g2/255
Else
g=(255-2*(255-g1)*(255-g2)/255)
EndIf
If b1<128
b=2*b1*b2/255
Else
b=(255-2*(255-b1)*(255-b2)/255)
EndIf
End Function
Function PixelBlend_Dodge(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1=255 r=255 Else r=Min(255,((r2 Shl 8)/(255-r1)))
If g1=255 g=255 Else g=Min(255,((g2 Shl 8)/(255-g1)))
If b1=255 b=255 Else b=Min(255,((b2 Shl 8)/(255-b1)))
End Function
Function PixelBlend_Burn(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1=0 r=0 Else r=Max(0,(255-((255-r2) Shl 8)/r1))
If g1=0 g=0 Else g=Max(0,(255-((255-g2) Shl 8)/g1))
If b1=0 b=0 Else b=Max(0,(255-((255-b2) Shl 8)/b1))
End Function
Function PixelBlend_ChemicalDodge(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+Max(0,r2-255+r1))
g=Min(255,g2+Max(0,g2-255+g1))
b=Min(255,b2+Max(0,b2-255+b1))
End Function
Function PixelBlend_ChemicalBurn(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-Max(0,r2-r1))
g=Max(0,g2-Max(0,g2-g1))
b=Max(0,b2-Max(0,b2-b1))
End Function
Function PixelBlend_Raise(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+Min(r1,r2))
g=Min(255,g2+Min(g1,g2))
b=Min(255,b2+Min(b1,b2))
End Function
Function PixelBlend_Lower(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-Min(255-r1,r2))
g=Max(0,g2-Min(255-g1,g2))
b=Max(0,b2-Min(255-b1,b2))
End Function
Function PixelBlend_Over(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=((r1*r1)+(r1*r2))/510
g=((g1*g1)+(g1*g2))/510
b=((b1*b1)+(b1*b2))/510
End Function
Function PixelBlend_Under(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=((r2*r2)+(r1*r2))/510
g=((g2*g2)+(g1*g2))/510
b=((b2*b2)+(b1*b2))/510
End Function
Function PixelBlend_Reflect(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r2=255 r=255 Else r=Min(255,r1*r1/(255-r2))
If g2=255 g=255 Else g=Min(255,g1*g1/(255-g2))
If b2=255 b=255 Else b=Min(255,b1*b1/(255-b2))
End Function
Function PixelBlend_Reflex(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1=255 r=255 Else r=Min(255,(r2*r2/(255-r1)))
If g1=255 g=255 Else g=Min(255,(g2*g2/(255-g1)))
If b1=255 b=255 Else b=Min(255,(b2*b2/(255-b1)))
End Function
Function PixelBlend_Freeze(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=255-r1;g=255-g1;b=255-b1
If r2=0 r=0 Else r=Max(0,255-r*r/r2)
If g2=0 g=0 Else g=Max(0,255-g*g/g2)
If b2=0 b=0 Else b=Max(0,255-b*b/b2)
End Function
Function PixelBlend_Heat(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=255-r2;g=255-g2;b=255-b2
If r1=0 r=0 Else r=Max(0,255-r*r/r1)
If g1=0 g=0 Else g=Max(0,255-g*g/g1)
If b1=0 b=0 Else b=Max(0,255-b*b/b1)
End Function
Function PixelBlend_Singe(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r2*Abs(255-r1-r2)/255
g=g2*Abs(255-g1-g2)/255
b=b2*Abs(255-b1-b2)/255
End Function
Function PixelBlend_PinLight(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1<128
r=Min(2*r1,r2)
Else
r=Max(2*(r1-128),r2)
EndIf
If g1<128
g=Min(2*g1,g2)
Else
g=Max(2*(g1-128),g2)
EndIf
If b1<128
b=Min(2*b1,b2)
Else
b=Max(2*(b1-128),b2)
EndIf
End Function
Function PixelBlend_VividLight(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
If r1=0
r=0
ElseIf r1=255
r=255
ElseIf r1<128
r=Max(0,(255-((255-r2) Shl 8)/r1))
Else
r=Min(255,((r2 Shl 8)/(255-r1)))
EndIf
If g1=0
g=0
ElseIf g1=255
g=255
ElseIf g1<128
g=Max(0,(255-((255-g2) Shl 8)/g1))
Else
g=Min(255,((g2 Shl 8)/(255-g1)))
EndIf
If b1=0
b=0
ElseIf b1=255
b=255
ElseIf b1<128
b=Max(0,(255-((255-b2) Shl 8)/b1))
Else
b=Min(255,((b2 Shl 8)/(255-b1)))
EndIf
End Function
Function PixelBlend_HardMix(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_VividLight r1,g1,b1,r2,g2,b2,r,g,b
If r<128 r=0 Else r=255
If g<128 g=0 Else g=255
If b<128 b=0 Else b=255
End Function
Const pbt553%=255*255*255
Function PixelBlend_SoftMix(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r2*r1*r1*r1/pbt553
g=g2*g1*r1*g1/pbt553
b=b2*b1*r1*b1/pbt553
End Function
Function PixelBlend_Additive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+r1)
g=Min(255,g2+g1)
b=Min(255,b2+b1)
End Function
Function PixelBlend_Subtractive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-r1)
g=Max(0,g2-g1)
b=Max(0,b2-b1)
End Function
Function PixelBlend_AdditiveInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+($ff-r1))
g=Min(255,g2+($ff-g1))
b=Min(255,b2+($ff-b1))
End Function
Function PixelBlend_SubtractiveInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-($ff-r1))
g=Max(0,g2-($ff-g1))
b=Max(0,b2-($ff-b1))
End Function
Function PixelBlend_Stamp(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,Min(255,r2+r1+r1-255))
g=Max(0,Min(255,g2+g1+g1-255))
b=Max(0,Min(255,b2+b1+b1-255))
End Function
Function PixelBlend_Brush(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local r3%,g3%,b3%
PixelBlend_BrushUp r1,g1,b1,r2,g2,b2,r3,g3,b3
PixelBlend_BrushDown r1,g1,b1,r2,g2,b2,r,g,b
r=(r+r3)/2
g=(g+g3)/2
b=(b+b3)/2
End Function
Function PixelBlend_BrushUp(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local l1%=r1*3+g1*6+b1
Local l2%=r2*3+g2*6+b2
r=(r1*l2+r2*l1)/5100
g=(g1*l2+g2*l1)/5100
b=(b1*l2+b2*l1)/5100
End Function
Function PixelBlend_BrushDown(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local l1%=r1*3+g1*6+b1
Local l2%=r2*3+g2*6+b2
r=(r1*l1+r2*l2)/5100
g=(g1*l1+g2*l2)/5100
b=(b1*l1+b2*l2)/5100
End Function
Function PixelBlend_Exponentiate(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r2^(r1/255.0)
g=g2^(g1/255.0)
b=b2^(b1/255.0)
End Function
Const log255#=5.5412635451584258
Function PixelBlend_Logarithmic(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2*Log(r1)/log255)
g=Max(0,g2*Log(g1)/log255)
b=Max(0,b2*Log(b1)/log255)
End Function
Function PixelBlend_Quench(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=(r2*($ff-r1)+r1*r1)/255
g=(g2*($ff-g1)+g1*g1)/255
b=(b2*($ff-b1)+b1*b1)/255
End Function
Function PixelBlend_Fence(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r2*(r1+r2)/510
g=g2*(g1+g2)/510
b=b2*(b1+b2)/510
End Function
Function PixelBlend_Fade(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local s2%=r2+g2+b2,s1%=r1+g1+b1
r=(r2+s2)*(r1+s1)/4080
g=(g2+s2)*(g1+s1)/4080
b=(b2+s2)*(b1+s1)/4080
End Function
Function PixelBlend_Bake(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local s1%=r1+g1+b1
r=((r2*s1)+(r1*s1))/2040
g=((g2*s1)+(g1*s1))/2040
b=((b2*s1)+(b1*s1))/2040
End Function
Function PixelBlend_Broil(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local s2%=r2+g2+b2
r=((r2*s2)+(r1*s2))/2040
g=((g2*s2)+(g1*s2))/2040
b=((b2*s2)+(b1*s2))/2040
End Function
Function PixelBlend_Dress(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-Abs(r2-r1))
g=Max(0,g2-Abs(g2-g1))
b=Max(0,b2-Abs(b2-b1))
End Function
Function PixelBlend_Strip(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,(r2*Abs(r1-127)) Shr 7)
g=Min(255,(g2*Abs(g1-127)) Shr 7)
b=Min(255,(b2*Abs(b1-127)) Shr 7)
End Function
Function PixelBlend_Bless(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+(r1*r1*r2/65025))
g=Min(255,g2+(g1*g1*g2/65025))
b=Min(255,b2+(b1*b1*b2/65025))
End Function
Function PixelBlend_Curse(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r1=255-r1;g1=255-g1;b1=255-b1
r=Max(0,r2-(r1*r1*(255-r2)/65025))
g=Max(0,g2-(g1*g1*(255-g2)/65025))
b=Max(0,b2-(b1*b1*(255-b2)/65025))
End Function
Function PixelBlend_Shine(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2*(r1/127.5))
g=Min(255,g2*(g1/127.5))
b=Min(255,b2*(b1/127.5))
End Function
Function PixelBlend_Inhale(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=255-r1;g=255-g1;b=255-b1
r=Max(0,Min(255,r2-(r)*(r/127.5-1)))
g=Max(0,Min(255,g2-(g)*(g/127.5-1)))
b=Max(0,Min(255,b2-(b)*(b/127.5-1)))
End Function
Function PixelBlend_Exhale(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,Min(255,r2+r1*(r1/127.5-1)))
g=Max(0,Min(255,g2+g1*(g1/127.5-1)))
b=Max(0,Min(255,b2+b1*(b1/127.5-1)))
End Function
Function PixelBlend_Breathe(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Inhale r1,g1,b1,r2,g2,b2,r1,g1,b1
PixelBlend_Exhale r1,g1,b1,r2,g2,b2,r,g,b
End Function
Function PixelBlend_Vivify(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,Min(255,r2+r1+r1-g1-b1))
g=Max(0,Min(255,g2+g1+g1-r1-b1))
b=Max(0,Min(255,b2+b1+b1-g1-r1))
End Function
Function PixelBlend_MeanVivify(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,Min(255,r2+r1-(g1+b1)/2))
g=Max(0,Min(255,g2+g1-(r1+b1)/2))
b=Max(0,Min(255,b2+b1-(g1+r1)/2))
End Function
Function PixelBlend_Polish(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Overlay r1,g1,b1,r2,g2,b2,r2,g2,b2
PixelBlend_BrushUp r1,g1,b1,r2,g2,b2,r,g,b
End Function
Function PixelBlend_Wash(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local s%=r1+g1+b1
r=Min(255,r2+((s+r1) Shr 2))
g=Min(255,g2+((s+g1) Shr 2))
b=Min(255,b2+((s+b1) Shr 2))
End Function
Function PixelBlend_Glow(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local r3%,g3%,b3%
PixelBlend_Shine r1,g1,b1,r2,g2,b2,r3,g3,b3
PixelBlend_Hardlight r1,g1,b1,r2,g2,b2,r,g,b
r=Max(r,r3)
g=Max(g,g3)
b=Max(b,b3)
End Function
Function PixelBlend_SoftGlow(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Softlight r1,g1,b1,r2,g2,b2,r2,g2,b2
PixelBlend_Screen r1,g1,b1,r2,g2,b2,r,g,b
End Function
Function PixelBlend_HardGlow(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Multiply r1,g1,b1,r2,g2,b2,r2,g2,b2
PixelBlend_Additive r1,g1,b1,r2,g2,b2,r,g,b
End Function
Function PixelBlend_Soften(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Overlay r1,g1,b1,r2,g2,b2,r,g,b
PixelBlend_Softlight r,g,b,r2,g2,b2,r,g,b
End Function
Function PixelBlend_Mean(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=(r1+r2) Shr 1
g=(g1+g2) Shr 1
b=(b1+b2) Shr 1
End Function
Function PixelBlend_Modulo(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r2 Mod (r1+1)
g=g2 Mod (g1+1)
b=b2 Mod (b1+1)
End Function
Function PixelBlend_Multiplicative(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r1*r2)
g=Min(255,g1*g2)
b=Min(255,b1*b2)
End Function
Const PBAng#=180#/256#
Function PixelBlend_Sine(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Abs(Sin(r1*PBAng))*r2
g=Abs(Sin(g1*PBAng))*g2
b=Abs(Sin(b1*PBAng))*b2
End Function
Function PixelBlend_Cosine(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Abs(Cos(r1*PBAng))*r2
g=Abs(Cos(g1*PBAng))*g2
b=Abs(Cos(b1*PBAng))*b2
End Function
Function PixelBlend_Tangent(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,Max(0,r2+Tan(r1*PBAng-90)*32))
g=Min(255,Max(0,g2+Tan(g1*PBAng-90)*32))
b=Min(255,Max(0,b2+Tan(b1*PBAng-90)*32))
End Function
Function PixelBlend_SoftTangent(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,Max(0,r2+Tan(r1*PBAng-90)*8))
g=Min(255,Max(0,g2+Tan(g1*PBAng-90)*8))
b=Min(255,Max(0,b2+Tan(b1*PBAng-90)*8))
End Function
Function PixelBlend_HardTangent(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,Max(0,r2+Tan(r1*PBAng-90)*128))
g=Min(255,Max(0,g2+Tan(g1*PBAng-90)*128))
b=Min(255,Max(0,b2+Tan(b1*PBAng-90)*128))
End Function
Function PixelBlend_Intensify(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Min(255,r2+((r1*r2) Shr 8))
g=Min(255,g2+((g1*g2) Shr 8))
b=Min(255,b2+((b1*b2) Shr 8))
End Function
Function PixelBlend_Detensify(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-(255-((r1*r2) Shr 8)))
g=Max(0,g2-(255-((g1*g2) Shr 8)))
b=Max(0,b2-(255-((b1*b2) Shr 8)))
End Function
Function PixelBlend_DetensifyInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=Max(0,r2-((r1*r2) Shr 8))
g=Max(0,g2-((g1*g2) Shr 8))
b=Max(0,b2-((b1*b2) Shr 8))
End Function
Function PixelBlend_Hue(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val1[0],val2[1],val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Saturation(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val1[1],val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Saturate(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],Min(1,val2[1]+val1[1]),val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Desaturate(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],Max(0,val2[1]-(1-val1[1])),val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_DesaturateInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],Max(0,val2[1]-val1[1]),val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_MixSaturation(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],(val2[1]+val1[1])/2.0,val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Lightness(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val2[1],val1[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_MixLightness(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val2[1],(val2[2]+val1[2])/2.0])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Value(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsvtorgb([val2[0],val2[1],val1[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_MinValue(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsvtorgb([val2[0],val2[1],Min(val2[2],val1[2])])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_MaxValue(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsvtorgb([val2[0],val2[1],Max(val2[2],val1[2])])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_MixValue(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsvtorgb([val2[0],val2[1],(val2[2]+val1[2])/2.0])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Chroma(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohcl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohcl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hcltorgb([val2[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Color(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val1[0],val1[1],val2[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_ChromaColor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohcl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohcl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hcltorgb([val1[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Grayness(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val1[1],val1[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_ChromaGrayness(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohcl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohcl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hcltorgb([val2[0],val1[1],val1[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Shade(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val1[0],val2[1],val1[2]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_ChromaShade(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohcl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohcl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hcltorgb([val1[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Illuminative(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val2[1],Min(1,val2[2]+val1[2])])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Deluminative(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val2[1],Max(0,val2[2]-(1-val1[2]))])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_DeluminativeInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtohsl([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtohsl([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=hsltorgb([val2[0],val2[1],Max(0,val2[2]-val1[2])])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Cyan(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val2[0],val1[1],val1[2],val2[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Magenta(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val1[0],val2[1],val1[2],val2[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Yellow(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val1[0],val1[1],val2[2],val2[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Black(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val2[0],val2[1],val2[2],val1[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_BlackAndCyan(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val2[0],val1[1],val1[2],val1[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_BlackAndMagenta(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val1[0],val2[1],val1[2],val1[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_BlackAndYellow(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtocmyk([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtocmyk([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=cmyktorgb([val1[0],val1[1],val2[2],val1[3]])
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEX(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val1[0],val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEY(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val2[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEZ(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val2[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEXY(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val1[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEYZ(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val2[0],val1[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_CIEXZ(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val1[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_XYZMultiply(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val1[0]*val2[0],val1[1]*val2[1],val1[2]*val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_XYZAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val1[0]+val2[0],val1[1]+val2[1],val1[2]+val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_XYZSubtractiveInverted(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoxyz([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoxyz([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=xyztorgb([val2[0]-(1-val1[0]),val2[1]-(1-val1[1]),val2[2]-(1-val1[2])])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabL(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val1[0],val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabA(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val2[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabB(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val2[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabLA(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val1[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabAB(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val2[0],val1[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabLB(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([val1[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LabColorAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtolab([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtolab([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=labtorgb([(val1[0]+val2[0])/2.0,val1[1]+val2[1],val1[2]+val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Luma(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val1[0],val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0]+val1[0],val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaSubtractive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0]-val1[0],val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Crave(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val1[0]*val2[0],(val2[1]+val1[1])/2.0,(val2[2]+val1[2])/2.0])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_InPhase(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Quadrature(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_Liven(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
PixelBlend_Quadrature r1,g1,b1,r2,g2,b2,r2,g2,b2
PixelBlend_Multiply r1,g1,b1,r2,g2,b2,r,g,b
End Function
Function PixelBlend_InPhaseAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val1[1]+val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_QuadratureAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val2[1],val1[2]+val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaAndInPhase(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val1[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaAndQuadrature(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val1[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_YIQColor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val1[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_UChrominance(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_VChrominance(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_UChrominanceAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val1[1]+val2[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_VChrominanceAdditive(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val2[1],val1[2]+val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaAndUChrominance(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val1[0],val1[1],val2[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_LumaAndVChrominance(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val1[0],val2[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_YUVColor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val1[1],val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_YIQChannelSwap(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyiq([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyiq([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yiqtorgb([val2[0],val2[2]+val1[1],val2[1]+val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Function PixelBlend_YUVChannelSwap(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local val1#[]=rgbtoyuv([r1/255.0,g1/255.0,b1/255.0])
Local val2#[]=rgbtoyuv([r2/255.0,g2/255.0,b2/255.0])
Local ret#[]=yuvtorgb([val2[0],val2[2]+val1[1],val2[1]+val1[2]])
PBLimRGB ret
r=ret[0]*255;g=ret[1]*255;b=ret[2]*255
End Function
Const pbdiv7255#=0.0274509806
Function PixelBlend_Reduce(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
Local rv%=Int(r1*pbdiv7255)
Local gv%=Int(g1*pbdiv7255)
Local bv%=Int(b1*pbdiv7255)
r=(r2 Shr rv) Shl rv
g=(g2 Shr gv) Shl gv
b=(b2 Shr bv) Shl bv
End Function
Function PixelBlend_And(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1 & r2
g=g1 & g2
b=b1 & b2
End Function
Function PixelBlend_Or(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1 | r2
g=g1 | g2
b=b1 | b2
End Function
Function PixelBlend_Xor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=r1 ~ r2
g=g1 ~ g2
b=b1 ~ b2
End Function
Function PixelBlend_Nand(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=$ff~(r1 & r2)
g=$ff~(g1 & g2)
b=$ff~(b1 & b2)
End Function
Function PixelBlend_Nor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=$ff~(r1 | r2)
g=$ff~(g1 | g2)
b=$ff~(b1 | b2)
End Function
Function PixelBlend_Xnor(r1%,g1%,b1%,r2%,g2%,b2%,r% Var,g% Var,b% Var)
r=$ff~(r1 ~ r2)
g=$ff~(g1 ~ g2)
b=$ff~(b1 ~ b2)
End Function
Function PBLimRGB(rgb#[])
rgb[0]=Min(1,Max(0,rgb[0]))
rgb[1]=Min(1,Max(0,rgb[1]))
rgb[2]=Min(1,Max(0,rgb[2]))
End Function |
Comments
| ||
| This is really cool! |
Code Archives Forum