line text justify

BlitzPlus Forums/BlitzPlus Programming/line text justify

Ok, as I thought this would be a nice little function to write when I had a spare few minutes, I put one together.

The function I have written will accept an entire paragraph as one long text string and will display on screen as it needs to.

The code is below, but you can also download the source and bitmap font that I used from here.

; now for the function
;	p$ = paragraph text
;	y = y position on screen
;	x = x position on screen (optional - defaults to 0)
;	width = column width (optionl - defaults to screen width, as defined in constant)

Function ShowPara(p$,y,x#=0,width=scr_width)
	; check that BOTH optional parameters were used and amend width as necessary
	If x>0 And width=scr_width Then width=scr_width-x
	
	p=Trim(p)			; remove any spaces
	char_width=width/8		; work out number of chars (assume 8 pixel wide font)
	text_line$=Left(p,char_width)	; grab initial number of characters from string
	Repeat
		z=char_width		; z is used as the length of the current text line
		If Instr(text_line," ") Then	; check that there are spaces
			While Mid(text_line,z,1)<>" "	; and back track until one is found
				z=z-1		; length of text line is 1 less than where the space was found
			Wend
		EndIf
		
		text_line=Left(text_line,z-1)		; remove split word at end of line
		text_line=Trim(text_line)		; allow for double spaces by using Trim
		z=Len(text_line)			; adjust text length to account for any trimming
		p=Mid(p,z+2)				; remove this text from the paragraph text
		
		spaces=0				; counter for number of spaces in line
		For i=1 To Len(text_line)		; step through entire string
			If Mid(text_line,i,1)=" " Then spaces=spaces+1	; increase count of space found
		Next
		s#=8.0+(Float(width-z*8)/spaces)	; calculate width required for each space
		
		ShowText(x,y,text_line,s)	; show text on screen
		text_line=Left(p,char_width)	; fetch next row from paragraph
		y=y+8				; lower position of text on screen
		
	Until Len(text_line)<char_width		; keep going until next line is shorter than required width
	If Len(text_line)>0 Then ShowText(x,y,Trim(p)):y=y+8	; print last line if necessary
	
	Return y	; return y for additional position outside of function
End Function

; simple show text routine
Function ShowText(x#,y,t$,s#=8)
	For i=1 To Len(t)		; step through each character in turn
		char=Asc(Mid(t,i,1))-32	; calculate frame to display
		; if character is space (frame 0), then just increase x, otherwise print character
		If char=0 Then x=x+s Else DrawImage font,x,y,char:x=x+8
	Next
End Function

It may not be the best written way of doing things, but it works and is a starting point if you wish to adapt it.