writing text to a pixmap

BlitzMax Forums/BlitzMax Beginners Area/writing text to a pixmap

Mordax_Praetorian(Posted 2009) [#1]
Hello

Work keeps throwing curve balls at me

I need a way to write a font onto a pixmap, the computers that the program is going to run on don't have proper graphics drivers, making use of graphics commands is impossible, but MAXGui and Pixmaps work ok, no regular images, and I doubt image buffers are going to work either (don't have one of the PCs handy to test with atm)

The reason I need to get everything into one image is so that I can call it up in MS Paint for printing, since GadgetPrint is far too temperamental for me to trust right now

I realise that one solution is to have a function that picks out letters individually from a string and writes them pixel by pixel to the pixmap, and while I already have a function that does this, the letters are only 5 pixels tall, which is too small for this purpose, and writing out a larger set of letters would be time consuming enough that I'd probably miss my deadline

If I get a working answer, then I'm happy to share the little font writing function, the letters are 5 pixels tall, and most characters are just 3 pixels wide, with some at 2 pixels, and just a few at 4 pixels, while tiny, the font is designed to be clearly legible, so its great when you have very little space to work with, I initially developed it to write onto 32*32 pixel icons when no other option was available and it worked a treat


klepto2(Posted 2009) [#2]
http://www.blitzbasic.com/codearcs/codearcs.php?code=2231


Space_guy(Posted 2009) [#3]
And also bruceys cairo module is great to work with when you want some advanced pixmap rendering.


Mordax_Praetorian(Posted 2009) [#4]
Thankyou

And as promised, heres the tiny font function

this is copied directly from the program I was using it in, where I need it to write either black (g=0) or green (g=1), and it returns the x ordinate where the next character should be placed

all characters are 5 pixels tall

Function WriteC(pix:TPixmap,c$,x,y,g=0)
	If g = 0
		b% = (255 Shl 24)|(0 Shl 16)|(0 Shl 8)|0
	Else
		b% = (255 Shl 24)|(0 Shl 16)|(128 Shl 8)|0
	EndIf
	Select Upper(c$)
		Case "A"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "B"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "C"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case "D"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "E"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case "F"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			Return x+3
		Case "G"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "H"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "I"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "J"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "K"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "L"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case "M"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "N"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+3,y,b)
			WritePixel(pix,x+3,y+1,b)
			WritePixel(pix,x+3,y+2,b)
			WritePixel(pix,x+3,y+3,b)
			WritePixel(pix,x+3,y+4,b)
			Return x+5
		Case "O"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "P"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y+1,b)
			Return x+4
		Case "Q"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			WritePixel(pix,x+3,y+4,b)
			Return x+5
		Case "R"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "S"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case "T"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			Return x+4
		Case "U"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "V"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "W"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "X"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "Y"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "Z"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+4,b)
			WritePixel(pix,x+3,y,b)
			WritePixel(pix,x+3,y+4,b)
			Return x+5
		Case "1"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "2"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
		Case "3"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+3,b)
			Return x+3
		Case "4"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			WritePixel(pix,x+3,y+3,b)
			Return x+5
		Case "5"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "6"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "7"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			Return x+4
		Case "8"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "9"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "0"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+4
		Case "-"
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x+1,y+2,b)
			Return x+3
		Case "+"
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			WritePixel(pix,x+2,y+2,b)
			Return x+4
		Case "="
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+3,b)
			Return x+3
		Case "*"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+3,b)
			Return x+3
		Case "/"
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			Return x+4
		Case ":"
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+3,b)
			Return x+2
		Case ","
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+3,b)
			Return x+3
		Case ";"
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+3,b)
			Return x+3
		Case "_"
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case "."
			WritePixel(pix,x,y+4,b)
			Return x+2
		Case "("
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			Return x+3
		Case ")"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y+1,b)
			WritePixel(pix,x+1,y+2,b)
			WritePixel(pix,x+1,y+3,b)
			Return x+3
		Case "?"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+1,b)
			Return x+3
		Case "!"
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+4,b)
			Return x+2
		Default
			WritePixel(pix,x,y,b)
			WritePixel(pix,x,y+1,b)
			WritePixel(pix,x,y+2,b)
			WritePixel(pix,x,y+3,b)
			WritePixel(pix,x,y+4,b)
			WritePixel(pix,x+1,y,b)
			WritePixel(pix,x+1,y+4,b)
			WritePixel(pix,x+2,y,b)
			WritePixel(pix,x+2,y+1,b)
			WritePixel(pix,x+2,y+2,b)
			WritePixel(pix,x+2,y+3,b)
			WritePixel(pix,x+2,y+4,b)
			Return x+4
	End Select
End Function



Jesse(Posted 2009) [#5]
You know you can condense your code to about 5 times or more if you use DefData/ReadData.


Mordax_Praetorian(Posted 2009) [#6]
I'm not really bothered with how long it takes to scroll through my code, it isn't a priority for me

The function is there and the function works, if nothing else then people can take the character set and use it for their own purposes


Jesse(Posted 2009) [#7]
I just thought it would more usefull by making it more flexible and smaller at the same time:

with overflow and wrapping protection. Not tested yet as I haven't had time.


CS_TBL(Posted 2009) [#8]
Sounds like a nice little code challenge..: create a function that returns a pixmap with a complete ASCII font, in as little code/bytes as possible.