cbFilt:llä on siis mahdollista laskea punaisen, vihreän tai sinisen väriarvon arvo suodattimien läpi. Suodattimia ovat muunmuassa:
- SoftLight
HardLight
Difference
Multiply
Average
Screen_
Lighten
Darken
Negation
Exclusion
Overlay
ColorDodge
Itse "kirjasto":
Code: Select all
'+-----------------------+
'| cbFilt |
'+-----------------------+
' Converted from BlitzMax
' example app
' By misthema 2011
'+----------EN-----------+
' These filter functions
' should be used with
' byte values (0-255, red
' green or blue).
' Example:
' softRed = SoftLight(Red1,Red2)
'+----------FI-----------+
' Näitä funktioita tulisi
' käyttää tavuluvuilla
' (0-255 väliltä, punainen,
' vihreä tai sininen).
' Esimerkki:
' softRed = SoftLight(Red1,Red2)
'~-----------------------~
'+---------------+
'| RGB functions |
'+---------------+
' Soft Light Filter
Function SoftLight(a%,b%)
Dim c%
c=a*b Shr 8
Return (c+a*(255-((255-a)*(255-b) Shr 8)-c) Shr 8)
End Function
' Hard Light Filter
Function HardLight(a%,b%)
If b<128 Then Return (a*b) Shr 7 Else Return 255-((255-b)*(255-a) Shr 7)
End Function
' Difference Filter
Function Difference(a%,b%)
Return Abs(a-b)
End Function
' Multiply Filter
Function Multiply(a%,b%)
Return (a*b) Shr 8
End Function
' Average Filter
Function Average(a%,b%)
Return (a+b) Shr 1
End Function
' Screen Filter
Function Screen_(a%,b%)
Return 255-((255-a)*(255-b) Shr 8)
End Function
' Lighten Filter
Function Lighten(a%,b%)
If a>b Then Return a Else Return b
End Function
' Darken Filter
Function Darken(a%,b%)
If a<b Then Return a Else Return b
End Function
' Negative Filter
Function Negation(a%,b%)
Return 255-Abs(255-a-b)
End Function
' Exclusion Filter
Function Exclusion(a%,b%)
Return a+b-(a*b Shr 7)
End Function
' Overlay Filter
Function Overlay(a%,b%)
If a<128 Then Return (a*b) Shr 7 Else Return 255-((255-a)*(255-b) Shr 7)
End Function
' Color Burn Filter
Function ColorDodge(a%,b%)
If b=255 Then
Return 255
Else
c%=RoundDown((a Shl 8)/(255-b))
If c>255 Then Return 255 Else Return c
EndIf
End Function
'+-----------------+
'| Pixel function |
'+-----------------+
Const PIX_RANDOM = 0
Const PIX_SOFTLIGHT = 1
Const PIX_HARDLIGHT = 2
Const PIX_DIFFERENCE = 3
Const PIX_MULTIPLY = 4
Const PIX_AVERAGE = 5
Const PIX_SCREEN = 6
Const PIX_LIGHTEN = 7
Const PIX_DARKEN = 8
Const PIX_NEGATION = 9
Const PIX_EXCLUSION = 10
Const PIX_OVERLAY = 11
Const PIX_COLORDODGE = 12
Function PixelFilter(a%,b%,filter)
r1 As Byte = ((a% Shl 8) Shr 24)
g1 As Byte = ((a% Shl 16) Shr 24)
b1 As Byte = ((a% Shl 24) Shr 24)
r2 As Byte = ((b% Shl 8) Shr 24)
g2 As Byte = ((b% Shl 16) Shr 24)
b2 As Byte = ((b% Shl 24) Shr 24)
If filter=0 Then filter=(Rand(240) Mod 12)+1
Select filter
Case 1
r3=SoftLight(r1,r2)
g3=SoftLight(g1,g2)
b3=SoftLight(b1,b2)
Case 2
r3=HardLight(r1,r2)
g3=HardLight(g1,g2)
b3=HardLight(b1,b2)
Case 3
r3=Difference(r1,r2)
g3=Difference(g1,g2)
b3=Difference(b1,b2)
Case 4
r3=Multiply(r1,r2)
g3=Multiply(g1,g2)
b3=Multiply(b1,b2)
Case 5
r3=Average(r1,r2)
g3=Average(g1,g2)
b3=Average(b1,b2)
Case 6
r3=Screen_(r1,r2)
g3=Screen_(g1,g2)
b3=Screen_(b1,b2)
Case 7
r3=Lighten(r1,r2)
g3=Lighten(g1,g2)
b3=Lighten(b1,b2)
Case 8
r3=Darken(r1,r2)
g3=Darken(g1,g2)
b3=Darken(b1,b2)
Case 9
r3=Negation(r1,r2)
g3=Negation(g1,g2)
b3=Negation(b1,b2)
Case 10
r3=Exclusion(r1,r2)
g3=Exclusion(g1,g2)
b3=Exclusion(b1,b2)
Case 11
r3=Overlay(r1,r2)
g3=Overlay(g1,g2)
b3=Overlay(b1,b2)
Case 12
r3=ColorDodge(r1,r2)
g3=ColorDodge(g1,g2)
b3=ColorDodge(b1,b2)
EndSelect
Return r3 Shl 16 + g3 Shl 8 + b3
End Function
Code: Select all
'Include the cbFilt
Include "cbFilt.CB"
set = LoadImage("tileset.bmp")
tex = MakeImage(32,32)
tex2 = MakeImage(32,32)
CopyBox 2*32,0,32,32,0,0,Image(set),Image(tex)
CopyBox 2*32,2*32,32,32,0,0,Image(set),Image(tex2)
iw = ImageWidth(tex)
ih = ImageHeight(tex)
' Dim the tables needed for every image etc.
Dim images(13)
Dim dest_pix(4)
Dim src_pix1(iw,ih,3)
Dim src_pix2(iw,ih,3)
images(0) = CloneImage(tex)
' +---------------------------+
' | The fun starts here! (tm) |
' +---------------------------+
For i=1 To 12
images(i)=CloneImage(tex)
Lock(Image(tex))
Lock(Image(tex2))
Lock(Image(images(i)))
For x=0 To iw-1
For y=0 To ih-1
pix = GetPixel2(x,y,Image(tex)) ' Get pixel from first image
Color 0,0,pix ' Put it as current color
src_pix1(x,y,0)=getRGB(RED) 'Get RED value
src_pix1(x,y,1)=getRGB(GREEN) 'Get GREEN value
src_pix1(x,y,2)=getRGB(BLUE) 'Get BLUE value
pix = GetPixel2(x,y,Image(tex2)) ' Get pixel from second image
Color 0,0,pix ' Same as above
src_pix2(x,y,0)=getRGB(RED)' Same as above
src_pix2(x,y,1)=getRGB(GREEN)' Same as above
src_pix2(x,y,2)=getRGB(BLUE)' Same as above
For k=0 To 2
Select i ' Select image and go through red green and blue
Case 1 ' First for SoftLight filter
dest_pix(k)=SoftLight(src_pix1(x,y,k),src_pix2(x,y,k))
Case 2 ' Second for HardLight filter
dest_pix(k)=HardLight(src_pix1(x,y,k),src_pix2(x,y,k))
Case 3 ' Third for Difference filter
dest_pix(k)=Difference(src_pix1(x,y,k),src_pix2(x,y,k))
Case 4 ' And so on...
dest_pix(k)=Multiply(src_pix1(x,y,k),src_pix2(x,y,k))
Case 5
dest_pix(k)=Average(src_pix1(x,y,k),src_pix2(x,y,k))
Case 6
dest_pix(k)=Screen_(src_pix1(x,y,k),src_pix2(x,y,k))
Case 7
dest_pix(k)=Lighten(src_pix1(x,y,k),src_pix2(x,y,k))
Case 8
dest_pix(k)=Darken(src_pix1(x,y,k),src_pix2(x,y,k))
Case 9
dest_pix(k)=Negation(src_pix1(x,y,k),src_pix2(x,y,k))
Case 10
dest_pix(k)=Exclusion(src_pix1(x,y,k),src_pix2(x,y,k))
Case 11
dest_pix(k)=Overlay(src_pix1(x,y,k),src_pix2(x,y,k))
Case 12
dest_pix(k)=ColorDodge(src_pix1(x,y,k),src_pix2(x,y,k))
EndSelect
Next k
' Put the red, green and blue to an integer pixel value
dest_pix(3) = dest_pix(0) Shl 16 + dest_pix(1) Shl 8 + dest_pix(2)
' Put the pixel in the destination image
PutPixel2 x,y,dest_pix(3),Image(images(i))
Next y
Next x
Unlock(Image(tex))
Unlock(Image(tex2))
Unlock(Image(images(i)))
Next i
' +---------------------------+
' | The fun ends here :< (tm) |
' +---------------------------+
img = 0
Dim txt As String
'Resize images for better view
ResizeImage tex,64,64
ResizeImage tex2,64,64
For i=0 To 12
ResizeImage images(i),64,64
Next i
Repeat
Color 255,0,255
img=img+(KeyHit(cbkeyup)-KeyHit(cbkeydown))
If img>12 Then img=12
If img<0 Then img=0
DrawImage tex,0,0
DrawImage tex2,80,0
DrawImage images(img),160,0
CenterText 72,32,"+",2
CenterText 152,32,"=",2
Select img
Case 0
txt="-No filter-"
Case 1
txt="SoftLight()"
Case 2
txt="HardLight()"
Case 3
txt="Difference()"
Case 4
txt="Multiply()"
Case 5
txt="Average()"
Case 6
txt="Screen_()"
Case 7
txt="Lighten()"
Case 8
txt="Darken()"
Case 9
txt="Negation()"
Case 10
txt="Exclusion()"
Case 11
txt="Overlay()"
Case 12
txt="ColorDodge()"
EndSelect
Text 10,80,"Filter ("+img+"/12): "+txt
Color 128,32,128
Text 10,100,"Use arrows up/down to "
Text 10,110,"change between filters."
DrawScreen()
Forever
Code: Select all
'Include the cbFilt
Include "cbFilt.CB"
set = LoadImage("tileset.bmp")
tex = MakeImage(32,32)
tex2 = MakeImage(32,32)
CopyBox 2*32,0,32,32,0,0,Image(set),Image(tex)
CopyBox 2*32,2*32,32,32,0,0,Image(set),Image(tex2)
iw = ImageWidth(tex)
ih = ImageHeight(tex)
' Dim the tables needed for every image etc.
Dim images(13)
Dim pix1 As integer
Dim pix2 As integer
images(0) = CloneImage(tex)
' +---------------------------+
' | The fun starts here! (tm) |
' +---------------------------+
For i=1 To 12
images(i)=CloneImage(tex)
Lock(Image(tex))
Lock(Image(tex2))
Lock(Image(images(i)))
For x=0 To iw-1
For y=0 To ih-1
pix1 = GetPixel2(x,y,Image(tex)) ' Get pixel from first image
pix2 = GetPixel2(x,y,Image(tex2)) ' Get pixel from second image
Select i ' Select image
Case 1 ' First for SoftLight filter
dest_pix=PixelFilter(pix1,pix2,i)
Case 2 ' Second for HardLight filter
dest_pix=PixelFilter(pix1,pix2,i)
Case 3 ' Third for Difference filter
dest_pix=PixelFilter(pix1,pix2,i)
Case 4 ' And so on...
dest_pix=PixelFilter(pix1,pix2,i)
Case 5
dest_pix=PixelFilter(pix1,pix2,i)
Case 6
dest_pix=PixelFilter(pix1,pix2,i)
Case 7
dest_pix=PixelFilter(pix1,pix2,i)
Case 8
dest_pix=PixelFilter(pix1,pix2,i)
Case 9
dest_pix=PixelFilter(pix1,pix2,i)
Case 10
dest_pix=PixelFilter(pix1,pix2,i)
Case 11
dest_pix=PixelFilter(pix1,pix2,i)
Case 12
dest_pix=PixelFilter(pix1,pix2,i)
EndSelect
' Put the pixel in the destination image
PutPixel2 x,y,dest_pix,Image(images(i))
Next y
Next x
Unlock(Image(tex))
Unlock(Image(tex2))
Unlock(Image(images(i)))
Next i
' +---------------------------+
' | The fun ends here :< (tm) |
' +---------------------------+
img = 0
Dim txt As String
'Resize images for better view
ResizeImage tex,64,64
ResizeImage tex2,64,64
For i=0 To 12
ResizeImage images(i),64,64
Next i
Repeat
Color 255,0,255
img=img+(KeyHit(cbkeyup)-KeyHit(cbkeydown))
If img>12 Then img=12
If img<0 Then img=0
DrawImage tex,0,0
DrawImage tex2,80,0
DrawImage images(img),160,0
CenterText 72,32,"+",2
CenterText 152,32,"=",2
Select img
Case 0
txt="-No filter-"
Case 1
txt="SoftLight()"
Case 2
txt="HardLight()"
Case 3
txt="Difference()"
Case 4
txt="Multiply()"
Case 5
txt="Average()"
Case 6
txt="Screen_()"
Case 7
txt="Lighten()"
Case 8
txt="Darken()"
Case 9
txt="Negation()"
Case 10
txt="Exclusion()"
Case 11
txt="Overlay()"
Case 12
txt="ColorDodge()"
EndSelect
Text 10,80,"Filter ("+img+"/12): "+txt
Color 128,32,128
Text 10,100,"Use arrows up/down to "
Text 10,110,"change between filters."
DrawScreen()
Forever