Code archives/Miscellaneous/XPMFromPixmap:String[]()

This code has been declared by its author to be Public Domain code.

Download source code

XPMFromPixmap:String[]() by SebHoll2009
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