[bmx] ARGB type by elyobo [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:39

Previous topic - Next topic

BlitzBot

Title : ARGB type
Author : elyobo
Posted : 1+ years ago

Description : pixel to colour bytes

Code :
Code (blitzmax) Select
Strict

' Type ARGB permits conversion from individual colour bytes to colour pixel and back
' All original code by codename El Yobo.
' Free to use by any lifeform in the solar system or beyond.. NO GUARANTEES - it works for me.
' I guess multiplication by 256 also works..
' For BGRA just swap all the reds and blues - I think??!

Type ARGB
Field PColPixel:Int
Field PRed:Byte
Field PGreen:Byte
Field PBlue:Byte
Field PAlpha:Byte

Function MakeARGBc:ARGB(pixred:Byte, pixgreen:Byte, pixblue:Byte, pixalpha:Byte)
Local myARGB:ARGB = New ARGB
Local col:Int = Int pixred
col = col Shl 8
Local intnum:Int = Int  pixgreen
col = col~intnum
col = col Shl 8
intnum:Int = Int  pixblue
col = col~intnum
col = col Shl 8
intnum:Int = Int pixalpha
col = col~intnum
myARGB.PColPixel = col
myARGB.PRed = pixred
myARGB.PGreen = pixgreen
myARGB.PBlue = pixblue
myARGB.PAlpha = pixalpha

Return myARGB
End Function

Function MakeARGBp:ARGB(pixcolpixel:Int)
Local myARGB:ARGB = New ARGB
Local buf:Byte = 255
Local intnum:Int = 0
intnum = Int buf
myARGB.PAlpha = Byte (pixcolpixel&intnum)
myARGB.PBlue = Byte ((pixcolpixel Shr 8)&intnum)
myARGB.PGreen = Byte((pixcolpixel Shr 16)&intnum)
myARGB.PRed = Byte((pixcolpixel Shr 24)&intnum)
myARGB.PColPixel = pixcolpixel
Return myARGB
EndFunction

EndType

'In application..

Graphics 640, 480

Local colourX:ARGB

colourX = ARGB.MakeARGBc(34, 32, 234, 255)

Local pxmp:TPixmap = CreatePixmap(20, 20, PF_RGBA8888)

For Local i = 0 To 19
For Local j = 0 To 19

WritePixel(pxmp, i, j, colourX.PColPixel)

Next
Next

DrawPixmap(pxmp, 200, 200)
Flip
WaitKey()

Local colourY:ARGB = ARGB.MakeARGBp(234*23*123*245)

Print colourY.PRed
Print colourY.PGreen
Print colourY.PBlue
Print colourY.PAlpha

'and of course..

colourX = ARGB.MakeARGBp(colourX.PColPixel)

Print colourX.PRed
Print colourX.PGreen
Print colourX.PBlue
Print colourX.PAlpha


End


Comments :


UnderwoodNullium(Posted 1+ years ago)

 Thanks a lot man!  :)


Mordax_Praetorian(Posted 1+ years ago)

 No joke here man, your tutorial just saved my job, thankyou


Jesse(Posted 1+ years ago)

 Good luck keeping it Mordax. I just found out that it is not logically correct.I set it to draw a full black color(0,0,0,255) and it draws blue. At least it does it in my PC. I think it should be like this:
Type ARGB
Field PColPixel:Int
Field PRed:Byte
Field PGreen:Byte
Field PBlue:Byte
Field PAlpha:Byte

Function MakeARGBc:ARGB(pixred:Byte, pixgreen:Byte, pixblue:Byte, pixalpha:Byte)
Local myARGB:ARGB = New ARGB
myARGB.PColPixel = (pixalpha Shl 24)| (pixred Shl 16) | ( pixgreen Shl 8) | pixblue
myARGB.PRed = pixred
myARGB.PGreen = pixgreen
myARGB.PBlue = pixblue
myARGB.PAlpha = pixalpha
Return myARGB
End Function

Function MakeARGBp:ARGB(pixcolpixel:Int)
Local myARGB:ARGB = New ARGB
myARGB.PAlpha = (pixcolpixel Shr 24) & $FF
myARGB.PRed   = (pixcolpixel Shr 16) & $FF
myARGB.PGreen = (pixcolpixel Shr 8) & $FF
myARGB.PBlue  = (pixcolpixel & $FF)
myARGB.PColPixel = pixcolpixel
Return myARGB
EndFunction

EndType



Mordax_Praetorian(Posted 1+ years ago)

 umm, thats because 0,0,0,255 is blueAlpha,Red,Green,BlueBlue is the last number


_PJ_(Posted 1+ years ago)

 Actually, that is a good pioint, most of the blitz functions I see regarding colours have this ARGB format, however, it would be more logical in many cases when then retrieving the individual components, to have an Alpha parameter last. i.e. RGBa


Jesse(Posted 1+ years ago)

 @Mordax_Praetorian<div class="quote"> umm, thats because 0,0,0,255 is blueAlpha,Red,Green,BlueBlue is the last number </div>the problem is that the function says this:Function MakeARGBc:ARGB(pixred:Byte, pixgreen:Byte, pixblue:Byte, pixalpha:Byte)
which makes the 255 the alpha.@Maliceyes, it's odd how BlitMax refer to the format RGBA when it actually store the colors in ARGB. I did my own RGBA type for pixmaps and whatever for the BMFC competition. it extracts and replaces independent color components from pixels:
Type TRGBApixel
Field Red:Int
Field Green:Int
Field Blue:Int
Field Alpha:Int
Field ipixel:Int

Method Set(r:Int, g:Int, b:Int,A:Int)
Red = r
green = g
Blue = b
Alpha = a
ipixel = (A Shl 24) | ((r & $FF) Shl 16) | ((g & $FF) Shl 8) | (b & $FF)
End Method

Method iSet(i:Int)
Alpha = i Shr 24
Red = (i Shr 16) & $FF
Green = (i Shr 8) & $FF
Blue = i & $FF
ipixel = i
End Method

Method iGet:Int()
Return ipixel
End Method

Method GetAlpha:Int()
Return Alpha
End Method

Method SetAlpha(a:Int)
Alpha = a
ipixel = (ipixel & $00FFFFFF) | ((a & $FF) Shl 24)
End Method

Method getRed:Int()
Return Red
End Method

Method setRed(r:Int)
Red = r
ipixel = (ipixel & $FF00FFFF) | ((r & $FF) Shl 16)
End Method

Method getGreen:Int()
Return Green
End Method

Method setGreen(g:Int)
Green = g
ipixel = (ipixel & $FFFF00FF) | ((g & $FF) Shl 8)
End Method

Method getBlue:Int()
Return Blue
End Method

Method setBlue(b:Int)
Blue = b
ipixel = (ipixel & $FFFFFF00) | (b & $FF)
End Method

End Type



Macguffin(Posted 1+ years ago)

 This is excellent stuff, guys, and finally let me make sense of this stuff.  Thanks!


beanage(Posted 1+ years ago)

 Finally something like this appears in the code archives. Wonder why mark didnt include this functionality into max.. would have saved e some headaches^^ [/i]