Code archives/Miscellaneous/XPMFromPixmap:String[]()
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Coded this function for some icon functionality I was adding to MaxGUI.FLTKMaxGUI. BlitzMax *nix'ers may find it useful when calling XServer API that require X Pixmaps. It's not amazingly clean or fast, but it does the job... | |||||
Function XPMFromPixmap:String[](pPixmap:TPixmap)
Const charRange:Int = 16
Local x:Int, y:Int, i:Int, j:Int, tmpColor:Int, chrctsPerPixel:Int, tmpString$
Local width:Int = PixmapWidth(pPixmap), height:Int = PixmapHeight(pPixmap)
Local colormap:Int[][] = New Int[][height], colors:Int[], colorstrings:String[]
For y = 0 Until height
colormap[y] = New Int[width]
For x = 0 Until width
'Read color from pixel
tmpColor = ReadPixel(pPixmap,x,y)
'If less than 50% alpha, set a standard transparent color.
If (tmpColor Shr 24) < $80 Then tmpColor = $00000000
'Find the color if it has been used before.
For i = 0 Until colors.length
If colors[i] = tmpColor Then Exit
Next
'If it hasn't been found, add it to the end of the array.
If i = colors.length Then colors:+[tmpColor]
'And finally, update the colormap with the color index.
colormap[y][x] = i
Next
Next
chrctsPerPixel = (colors.length / charRange) + 1
colorstrings = New String[colors.length]
Local tmpResult:String[] = [width + " " + height + " " + colors.length + " " + chrctsPerPixel]
For i = 0 Until colors.length
Local tmpI:Int = i
For j = 0 Until chrctsPerPixel
colorstrings[i]:+Chr$("a"[0]+(tmpI Mod charRange))
tmpI:/charRange
Next
tmpString = colorstrings[i] + "~tc "
If (colors[i] Shr 24) <> $FF Then tmpString:+"None" Else tmpString:+"#"+_RGBHex(colors[i]&$FFFFFF)
tmpResult:+[tmpString]
Next
For y = 0 Until height
tmpString = ""
For x = 0 Until width
tmpString:+colorstrings[colormap[y][x]]
Next
tmpResult:+[tmpString]
Next
Return tmpResult
EndFunction
Function _RGBHex$( rgb:Int )
Local buf:Short[6]
For Local k:Int=5 To 0 Step -1
Local n:Int=(rgb&15)+Asc("0")
If n>Asc("9") n=n+(Asc("A")-Asc("9")-1)
buf[k]=n
rgb:Shr 4
Next
Return String.FromShorts( buf,buf.length )
End Function |
Comments
None.
Code Archives Forum