FontName corruption?

BlitzPlus Forums/BlitzPlus Beginners Area/FontName corruption?

_PJ_(Posted 2015) [#1]
My debug log when reaching the UnInitialiseTitleTypeface() function, reports the UI_TIT_GAD_FONT_NAME as the same as Str(UI_TIT_GAD_TYPEFACE)

There's no logical reason why this should happen and certainly nowhere in the entire program is UI_TIT_GAD_FONT_NAME set to equal ANYTHING OTHER than the FontName() of a font handle OR A null string.

The only thing I can think is that somehow, the actual memory addresses are being affected?


Function PickTitleFont()
	Local NewFont=RequestFont()
	
	If (Not(NewFont))
		Debug("TITLE (PICK TYPEFACE): Invalid / null selection or request cancelled. No Typeface change applied.")
		Return
	End If
	
	Debug("TITLE (PICK TYPEFACE): Picked 0x"+Str(NewFont))
	Local PickedName$=FontName(NewFont)
	
	If (UI_TIT_GAD_TYPEFACE)
		If (PickedName=UI_TIT_GAD_FONT_NAME)
			If (FontSize(NewFont)=FontSize(UI_TIT_GAD_TYPEFACE))
				If (FontStyle(NewFont)=FontStyle(UI_TIT_GAD_TYPEFACE))
					If (FontAscent(NewFont)=FontAscent(UI_TIT_GAD_TYPEFACE))
						If (FontDescent(NewFont)=FontDescent(UI_TIT_GAD_TYPEFACE))
							FreeFont NewFont
							Debug("TITLE (PICK TYPEFACE): Selection is identical to current Typeface. No change applied.")
							Return
						End If
					End If
				End If 
			End If
		End If
		
		Debug("TITLE (PICK TYPEFACE): Plugging memory leaks for previous Typeface 0x"+Str(UI_TIT_GAD_TYPEFACE))
		UnInitialiseTitleTypeface
		
	End If
	
	UI_TIT_GAD_TYPEFACE=NewFont
	UI_TIT_GAD_FONT_NAME=PickedName
	UI_TIT_GAD_FONT_FLAGS=GetFontFlags(NewFont)
	
	Debug("TITLE (PICK TYPEFACE): Loaded new Typeface "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))
	
	SetTitle
	UpdateWYSIWYG
End Function


Function UnInitialiseTitleTypeface()
	If (UI_TIT_GAD_TYPEFACE)
		Debug("INIT (TITLE): Release Typeface Data "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" 0x"+Str(UI_TIT_GAD_TYPEFACE))
		UI_TIT_GAD_FONT_NAME=""
		FreeFont UI_TIT_GAD_TYPEFACE
		UI_TIT_GAD_TYPEFACE=0
	End If
End Function




DEBUG Output:
11:16:00       | TITLE (PICK TYPEFACE): Picked 0x52211760
11:16:00       | TITLE (PICK TYPEFACE): Plugging memory leaks for previous Typeface 0x52240776
11:16:00       | INIT (TITLE): Release Typeface Data "52240776" 0x52240776




An almost identical couple of functions that deal with a separtate text gadget and its associated font and parameters is below - I never encounter the same issue with this part:

Function PickTextFont()
	Local NewFont=RequestFont()
	
	If (Not(NewFont))
		Debug("TEXT (PICK TYPEFACE): Invalid / null selection or request cancelled. No typeface change applied.")
		Return
	End If
	
	Debug("TEXT (PICK TYPEFACE): Picked 0x"+Str(NewFont))
	Local PickedName$=FontName(NewFont)
	
	If (TEXT_TYPEFACE)
		If (PickedName=TEXT_FONT_NAME)
			If (FontSize(NewFont)=FontSize(TEXT_TYPEFACE))
				If (FontStyle(NewFont)=FontStyle(TEXT_TYPEFACE))
					;If (FontAscent(NewFont)=FontAscent(TEXT_TYPEFACE))
					;	If (FontDescent(NewFont)=FontDescent(TEXT_TYPEFACE))
							FreeFont NewFont
							Debug("TEXT (PICK TYPEFACE): Selection is identical to current Typeface. No change applied.")
							Return
					;	End If
					;End If
				End If 
			End If
		End If
		
		Debug("TEXT (PICK TYPEFACE): Plugging memory leaks for previous Typeface 0x"+Str(TEXT_TYPEFACE))
		UnInitialiseTextTypeface
		
	End If
	
	TEXT_TYPEFACE=NewFont
	TEXT_FONT_NAME=PickedName
	TEXT_FONT_FLAGS=GetFontFlags(TEXT_TYPEFACE)
	
	Debug("TEXT (PICK TYPEFACE): Loaded new Typeface "+Chr(34)+TEXT_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(TEXT_TYPEFACE))+" to reference: 0x"+Str(TEXT_TYPEFACE)+" with flags: 0x"+Str(TEXT_FONT_FLAGS))
	UpdateTextParams
End Function

Function UnInitialiseTextTypeface()
	If (TEXT_TYPEFACE)
		Debug("INIT (TEXT): Release Typeface data "+Chr(34)+TEXT_FONT_NAME+Chr(34)+" 0x"+Str(TEXT_TYPEFACE))
		FreeFont TEXT_TYPEFACE
		TEXT_TYPEFACE=0
		TEXT_FONT_NAME=""
		TEXT_FONT_FLAGS=0
	End If
End Function



Floyd(Posted 2015) [#2]
The mistaken name "52240776" is a font handle converted to a string. Somewhere this was assigned instead of a font name.

I would look for places where a value is assigned to UI_TIT_GAD_FONT_NAME and DebugLog that immediately, looking for numbers rather than names.


_PJ_(Posted 2015) [#3]
Hi Floyd, thanks for the quick response.
I know there was quite a large code block and it may not have been clear enough but I DID mention in the original post that
"nowhere in the entire program is UI_TIT_GAD_FONT_NAME set to equal ANYTHING OTHER than the FontName() of a font handle OR A null string."

(Incidentally, in case it's not obvious) UI_TIT_GAD_FONT_NAME is of course, a Global string variable


_PJ_(Posted 2015) [#4]
Okay, I've found the root point at where the corruption occurs.
It was at the point at which a new font is set and text area updated:


As you can see I put a few very noticeable checks in:
Function SetTitleFont()
	
	Debug("TEST::::::::: Current Font: "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" 0x"+Str(UI_TIT_GAD_TYPEFACE))
	
	Local CurrentString$=TextAreaText(UI_TIT_GAD_TEXTBOX)
	
	SetTextAreaFont UI_TIT_GAD_TEXTBOX,UI_TIT_GAD_TYPEFACE
	
	UI_TIT_GAD_FONT_NAME=FontName(UI_TIT_GAD_TYPEFACE)
	;UI_TIT_GAD_FONT_FLAGS=GetFontFlags(UI_TIT_GAD_TYPEFACE)
	
	Debug("TEST::::::::: Current Font: "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" 0x"+Str(UI_TIT_GAD_TYPEFACE))
	
	SetTextAreaText UI_TIT_GAD_TEXTBOX,CurrentString
	
	Debug("TITLE (SET TYPEFACE): Typeface Set to "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))
	
End Function


And the resulting debug output:

| TITLE (UPDATE): Lock textbox gadget 0x51947360
16:18:03       | TESTING:::::::::::::: FONTNAME Blitz
16:18:03       | TESTING:::::::::::::: FONTNAME Blitz
16:18:03       | TESTING:::::::::::::: FONTNAME ´†
16:18:03       | TITLE (SET TYPEFACE): Typeface Set to "TITLE (SET TYPEFACE): Typeface Set to "68 With Dimens" Size: 27 to reference: 0x51947712 with flags: 0x1
16:18:03       | TESTING:::::::::::::: FONTNAME èª 5ET TYPEFACE): Typeface Set to "TITLE (SET TYPEFACE): Typeface Set to "68 With Dimens
16:18:03       | 



So you can see something VERY odd is happening here, and I can only suspect it may be something to do with the compiler running in debug mode and the debugging output perhaps eating into some memory that it maybe shouldn't???

Possibly something to do with the memory space for the default 'built-in' Blitz font?


Floyd(Posted 2015) [#5]
Why does debug code say TEST: while the output says TESTING: ?


_PJ_(Posted 2015) [#6]
Sorry I was using a separate snippet with duplicate functions to try and reproduce the error, I had posted the wrong snippetr or the wrong output, but it shouldn't make any difference ultimately. It shouldn't matter to the point of the topic because the debug output is just a string that is written to the file. The word "TEST" or "TESTING" is really just that literal and has no bearing on the actual issue.

It's quite irrelevant considering the problem is to do with the variable which holds the FontName() value is being 'overwritten' with other data.

_

Anyway, there is an element of inconsistency in trying to reproduce the error faithfully.

I Have posted a full debug output (until it finally crashed since the Font Handle no longer pointed to a valid object)



And the relevant "Title" functions:




_PJ_(Posted 2015) [#7]
If you look particularly between:

18:14:30       | TITLE (SET TYPEFACE): Typeface Set to "Œ" Size: 10 to reference: 0x46966976 with flags: 0x1
18:14:30       | TITLE (SET COLOUR): Colours set to FOREGROUND: 13717545 BACKGROUND: -1
18:14:30       | TITLE (UPDATE): UnLock textbox gadget 0x46966624
18:14:30       | WYSIWYG (TITLE): Release memory for 0x46930544
18:14:30       | WYSIWYG (TITLE): Image created 0x46931336 With Dimensions: 24 x 15
18:14:30       | WYSIWYG: Updating Display
18:14:30       | TEMPLATE: Drawing Template Front at 487 , 0 Dims: 460 x 648
18:14:30       | TEMPLATE: Drawing Template Rear at 0 , 0 Dims: 460 x 648
18:14:30       | TEMPLATE: Drawing Template Spine at 459 , 0 Dims: 29 x 648
18:14:30       | WYSIWYG (TITLE): Drawing Image at 471.85 , 324.094
18:14:36       | UI (TITLE MENU): FontPicker selected
18:14:49       | TITLE (PICK TYPEFACE): Picked 0x46967392
18:14:49       | TITLE (PICK TYPEFACE): Plugging memory leaks for previous Typeface 0x46966976
18:14:49       | INIT (TITLE): Release Typeface Data "INIT (TITLE): Release Typeface Data "" 0x46966976


Already it is clear that there is something happening to the memory for the variable UI_TIT_GAD_FONT_NAME


_PJ_(Posted 2015) [#8]
I apologise for making numerous posts. I didn;t want to edit earlier ones since it may just confuse the issue further due to the logical flow of my investigations.

From what I can gather in trying to reproduce the error and narrow down precisely where the issue occurs I think it may be at the point of the "title image update" in which the textbox text is copied onto an image buffer so that it may be rotated and displayed vertically.

Somewhere during this process the font in memory is somehow corrupted and therefore FoontName is not returned accurately.

I suspect now, that perhaps it may be something to do with the use of the same font handle across different buffers AND the TextAreaGadget?
I understand normally that SetFont requires a valid graphics buffer, whilst SetTextAreaFont only requires the gadget despite them both referring to the same Loaded font handle...


_PJ_(Posted 2015) [#9]
Floyd's gone rather quiet recently, and I'm no further to solving this issue - I only seem to find the problem becoming stranger.

I made a few adjustments to prevent the TextArea gadget from being accessed when the GraphicsBuffer() is set to the ImageBuffer() and also added a few more debug checks on the actual result of FontName() at various places:

Here's the Title-specific functions now, with the added debug checks [see especially "UpdateTitleParams()"]
and the relevant debug output:

Const DEF_TIT_TEXT$="Default"
Const TIT_WYSIWYG_IMAGE_FLAG_DYNAMIC=2

Global TIT_WYSIWYG_IMAGE%

Function InitialiseTitle()
	Debug("INIT: Initialise Title")
	InitialiseTitleTextArea
	InitialiseTitleEditButton
	InitialiseTitleTypeface
	InitialiseTitleText
	SetTitle
	CompleteTitleInitialisation
End Function

Function SetTitle()
	UpdateTitleParams
	UpdateTitleImage
End Function

Function InitialiseTitleTextArea()
	Debug("INIT (TITLE): Initialise textbox gadget dimensions")
	
;	If (UI_TIT_GAD_TEXTBOX)
;		Debug("TITLE: Release previous textbox gadget 0x"+Str(UI_TIT_GAD_TEXTBOX))
;		FreeGadget UI_TIT_GAD_TEXTBOX
;		UI_TIT_GAD_TEXTBOX=0
;	End If
	
	Local W=(GUIDELINE_HEIGHT*CANVAS_Y_RATIO)-2
	Local H=(((GUIDELINE_SPINE_WIDTH*CANVAS_X_RATIO)-2)*1.5)
	
	UI_TIT_GAD_TEXTBOX=CreateTextArea(0,0,W,H,UI_MAIN_WINDOW,UI_TIT_WORDWRAP)
	Debug("TITLE: Textbox gadget reference 0x"+Str(UI_TIT_GAD_TEXTBOX)+" created with dims: "+Str(W)+" X "+Str(H))
End Function

Function InitialiseTitleEditButton()
;	SetGenericFont
	
	UI_GAD_BUTTON_X=CANVAS_OFFSET_X
	UI_GAD_BUTTON_Y=CANVAS_OFFSET_Y + (GUIDELINE_SPINE_WIDTH*CANVAS_X_RATIO)*2
	UI_GAD_BUTTON_W=StringWidth(UI_TIT_GAD_BUTTON_TEXT)*1.5
	UI_GAD_BUTTON_H=StringHeight(UI_TIT_GAD_BUTTON_TEXT)*1.5
	UI_TIT_GAD_BUTTON=CreateButton(UI_TIT_GAD_BUTTON_TEXT,UI_GAD_BUTTON_X,UI_GAD_BUTTON_Y,UI_GAD_BUTTON_W,UI_GAD_BUTTON_H,UI_MAIN_WINDOW)
	HideGadget UI_TIT_GAD_BUTTON
	
;	UnSetGenericFont
End Function

Function InitialiseTitleText()
	SetTextAreaText UI_TIT_GAD_TEXTBOX,DEF_TIT_TEXT$
End Function

Function InitialiseTitleTypeface()
	Debug("INIT (TITLE): Initialise Typeface")
	
	Local Size=(GUIDELINE_SPINE_WIDTH*CANVAS_X_RATIO)
	If (Not(GetTemplateSlimline()))
		Size=Size*0.5
	End If
	
	UI_TIT_GAD_TYPEFACE=LoadFont(FONT_DEFAULT_TYPEFACE,Size);*FONT_DEF_LINE_SPACING#)
	UI_TIT_GAD_FONT_NAME=FontName(UI_TIT_GAD_TYPEFACE)
	UI_TIT_GAD_FONT_FLAGS=GetFontFlags(UI_TIT_GAD_TYPEFACE)
	
	Debug("INIT (TITLE): Loaded new Typeface "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))
End Function

Function CompleteTitleInitialisation()
	HideGadget UI_TIT_GAD_TEXTBOX
	Debug("INIT (TITLE): Title Initialised")
End Function

Function UnInitialiseTitleTypeface()
	If (UI_TIT_GAD_TYPEFACE)
		Debug("INIT (TITLE): Release Typeface Data "+Chr(34)+UI_TIT_GAD_FONT_NAME$+Chr(34)+" 0x"+Str(UI_TIT_GAD_TYPEFACE))
		UI_TIT_GAD_FONT_NAME$=""
		FreeFont UI_TIT_GAD_TYPEFACE
		UI_TIT_GAD_TYPEFACE=0
	End If
End Function

Function SetTitleColours()
	Local TextR=Red(UI_TIT_GAD_COLOUR)
	Local TextG=Green(UI_TIT_GAD_COLOUR)
	Local TextB=Blue(UI_TIT_GAD_COLOUR)
	
	Local BackR=Red(TEMPLATE_SPINE_COLOUR)
	Local BackG=Green(TEMPLATE_SPINE_COLOUR)
	Local BackB=Blue(TEMPLATE_SPINE_COLOUR)
	
	SetTextAreaColor UI_TIT_GAD_TEXTBOX, TextR, TextG, TextB, FONT_FORE_FLAG
	SetTextAreaColor UI_TIT_GAD_TEXTBOX, BackR, BackG, BackB, FONT_BACK_FLAG
	
	Debug("TITLE (SET COLOUR): Colours set to FOREGROUND: "+Str(UI_TIT_GAD_COLOUR)+" BACKGROUND: "+Str(TEMPLATE_SPINE_COLOUR))
	
End Function

Function ClearTitle()
	If (GetTitleClear())
		Debug("TITLE (CLEAR): Title Text already null")
	Else
		SetTitleClear
	End If
End Function

Function PickTitleColour()
	Local Col=RequestColor(Red(UI_TIT_GAD_COLOUR),Green(UI_TIT_GAD_COLOUR),Blue(UI_TIT_GAD_COLOUR))
	
	Local RGB=RGBa(RequestedRed(),RequestedGreen(),RequestedBlue())
	If (Not(Col))
		Debug("TITLE (PICK COLOUR): Pick cancelled")
	Else
		Debug("TITLE (PICK COLOUR): Picked "+Str(RGB))
	End If
	
	If (RGB<>UI_TIT_GAD_COLOUR)
		UI_TIT_GAD_COLOUR=RGB
		SetTitle
		UpdateWYSIWYG
		Return 
	End If
	
	Debug("TITLE (PICK COLOUR): No change in Colour")
End Function

Function PickTitleFont()
	
	Debug("TITLE (BEFORE PICK): Previous: "+FontName(UI_TIT_GAD_TYPEFACE))
	Local NewFont=RequestFont()
	
	If (Not(NewFont))
		Debug("TITLE (PICK CANCELLED): Previous "+FontName(UI_TIT_GAD_TYPEFACE))
		Debug("TITLE (PICK TYPEFACE): Invalid / null selection or request cancelled. No Typeface change applied.")
		Return
	End If
	
	Debug("TITLE (PICK TYPEFACE): Picked 0x"+Str(NewFont))
	
	Debug("TITLE (AFTER PICK): Previous: "+FontName(UI_TIT_GAD_TYPEFACE))
	
	Local PickedName$=FontName(NewFont)
	
	If (UI_TIT_GAD_TYPEFACE)
		If (PickedName=UI_TIT_GAD_FONT_NAME)
			If (FontSize(NewFont)=FontSize(UI_TIT_GAD_TYPEFACE))
				If (FontStyle(NewFont)=FontStyle(UI_TIT_GAD_TYPEFACE))
					If (FontAscent(NewFont)=FontAscent(UI_TIT_GAD_TYPEFACE))
						If (FontDescent(NewFont)=FontDescent(UI_TIT_GAD_TYPEFACE))
							FreeFont NewFont
							Debug("TITLE (PICK TYPEFACE): Selection is identical to current Typeface. No change applied.")
							Return
						End If
					End If
				End If 
			End If
		End If
		
		Debug("TITLE (PICK TYPEFACE): Plugging memory leaks for previous Typeface 0x"+Str(UI_TIT_GAD_TYPEFACE))
		UnInitialiseTitleTypeface
		
	End If
	
	UI_TIT_GAD_TYPEFACE=NewFont
	UI_TIT_GAD_FONT_NAME=PickedName
	UI_TIT_GAD_FONT_FLAGS=GetFontFlags(NewFont)
	
	Debug("TITLE (PICK TYPEFACE): Loaded new Typeface "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))
	
	SetTitle
	UpdateWYSIWYG
End Function

Function SetTitleFont()
	Debug("TITLE (SETFONT): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	SetTextAreaFont UI_TIT_GAD_TEXTBOX,UI_TIT_GAD_TYPEFACE
	
	UI_TIT_GAD_FONT_NAME$=FontName(UI_TIT_GAD_TYPEFACE)
	UI_TIT_GAD_FONT_FLAGS=GetFontFlags(UI_TIT_GAD_TYPEFACE)
	
	Debug("TITLE (SET TYPEFACE): Typeface Set to "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))
End Function

Function GetTitleClear()
	Return (TextAreaText(UI_TIT_GAD_TEXTBOX)="")
End Function

Function SetTitleClear()
	Debug("TITLE (RELEASE): Content released from: 0x"+Str(UI_TIT_GAD_TEXTBOX))
	SetTextAreaText UI_TIT_GAD_TEXTBOX,""
End Function

Function UpdateTitleParams()
	
	Debug("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	
	Debug("TITLE (UPDATE): Lock textbox gadget 0x"+Str(UI_TIT_GAD_TEXTBOX))
	LockTextArea UI_TIT_GAD_TEXTBOX
	Debug("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	SetTitleFont
	Debug("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	SetTitleColours
	Debug("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	UnlockTextArea UI_TIT_GAD_TEXTBOX
	
	Debug("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
	
	Debug("TITLE (UPDATE): UnLock textbox gadget 0x"+Str(UI_TIT_GAD_TEXTBOX))
End Function

Function UpdateTitleImage()
	ClearTitleWYSIWYGImage
	Local TextString$=RemoveInvalidTitleCharacters(TextAreaText(UI_TIT_GAD_TEXTBOX))
	
	If (Replace(TextString," ","")<>"")
		
		Local Buffer=GraphicsBuffer()
		
		Local Image=CreateImage(1,1,1,TIT_WYSIWYG_IMAGE_FLAG_DYNAMIC)
		Local IBuffer=ImageBuffer(Image)
		
		SetBuffer(IBuffer)
		SetFont UI_TIT_GAD_TYPEFACE
		
		Debug("FONT: Main Typeface Set to "+Chr(34)+FontName(UI_TIT_GAD_TYPEFACE)+Chr(34)+" reference 0x"+Str(UI_TIT_GAD_TYPEFACE))
		
		Local W=StringWidth(TextString)
		Local H=StringHeight(TextString)
		
		If (W*H)
			If W>(GUIDELINE_HEIGHT*CANVAS_Y_RATIO) Then W=GUIDELINE_HEIGHT*CANVAS_Y_RATIO
			If H>(GUIDELINE_SPINE_WIDTH*CANVAS_X_RATIO)Then H=GUIDELINE_SPINE_WIDTH*CANVAS_X_RATIO
			SetBuffer(Buffer)
			
			ResizeImage Image,W,H
			
			TIT_WYSIWYG_IMAGE=Image
			
			SetBuffer(IBuffer)
			
			Local X=Floor(W Shr True)
			Local Y=Floor(H Shr True)
			
			LockBuffer IBuffer
			
			SetBufferColor(TEMPLATE_SPINE_COLOUR)
			
			If (UI_TIT_GAD_COLOUR=0) 
				;Fix for Masked 0,0,0
				SetColour(1)
			Else
				SetColour(UI_TIT_GAD_COLOUR)
			End If
			
			Text X,Y,TextString,True,True
			
			UnlockBuffer IBuffer
			
			SetBuffer(Buffer)
			
			RotateImage TIT_WYSIWYG_IMAGE,90
			MidHandle TIT_WYSIWYG_IMAGE
			
			Debug("WYSIWYG (TITLE): Image created 0x"+Str(TIT_WYSIWYG_IMAGE)+" With Dimensions: "+Str(W)+" x "+Str(H))
			
			Return
		Else
			FreeImage Image
			SetBuffer(Buffer)
			
		End If
	End If
		TIT_WYSIWYG_IMAGE=0
		Debug("WYSIWYG (TITLE): Image not created due to invalid dimensions: "+Str(W)+" x "+Str(H))
End Function

Function ClearTitleWYSIWYGImage()
	If (TIT_WYSIWYG_IMAGE)
		Debug("WYSIWYG (TITLE): Release memory for 0x"+Str(TIT_WYSIWYG_IMAGE))
		FreeImage TIT_WYSIWYG_IMAGE
		TIT_WYSIWYG_IMAGE=0
	Else
		Debug("WYSIWYG (TITLE): No memory to release")
	End If
End Function

Function DrawTitleImage()
	If (TIT_WYSIWYG_IMAGE)
		Local OFFSET_X=(GUIDELINE_REAR_WIDTH+(GUIDELINE_SPINE_WIDTH*0.5))
		Local OFFSET_Y=(GUIDELINE_HEIGHT*0.5)
		Local X#=GUIDELINE_X+OFFSET_X
		Local Y#=GUIDELINE_Y+OFFSET_Y
		
		X=X*CANVAS_X_RATIO
		Y=Y*CANVAS_Y_RATIO
		
		X=X-0.5	; Fix for floating point calculations and 0.5mm
		
		;FocusOnWYSIWYGBuffer()
		
		Debug("WYSIWYG (TITLE): Drawing Image at "+Str(X)+" , "+Str(Y))
		DrawImage TIT_WYSIWYG_IMAGE,X,Y
	End If
End Function

Function RemoveInvalidTitleCharacters$(Title$)
	Title=Trim(Title)
	Local Iter
	Local Check
	Local Ascii
	For Check= 0 To 31
		For Iter=Len(Title) To 1 Step -1
			Ascii=Asc(Mid(Title,Iter,1))
			If (Ascii=Check)
				Title=TrimStringMid(Title,Iter,1)
			End If
		Next
	Next
	Return Title
End Function

Function GetTitleFontFlags()
	Return (GetFontFlags(UI_TIT_GAD_TYPEFACE))
End Function


13:38:23       | INIT: Initialise Title
13:38:23       | INIT (TITLE): Initialise textbox gadget dimensions
13:38:23       | TITLE: Textbox gadget reference 0x52078448 created with dims: 646 X 37
13:38:23       | INIT (TITLE): Initialise Typeface
13:38:23       | INIT (TITLE): Loaded new Typeface "Blitz" Size: 27 to reference: 0x52078800 with flags: 0x1
13:38:23       | TITLE (UPDATE): Typeface is: Blitz
13:38:23       | TITLE (UPDATE): Lock textbox gadget 0x52078448
13:38:23       | TITLE (UPDATE): Typeface is: Blitz
13:38:23       | TITLE (SETFONT): Typeface is: TITLE



Floyd(Posted 2015) [#10]
I've gone quiet because I don't know what to say.

trying to reproduce the error and narrow down

That's the right attitude, but your posted code has grown to 324 lines and is still a fragment that nobody can actually run.


_PJ_(Posted 2015) [#11]
I thought it best to post the full "Title" functionality which show all the relevant functions and any SetFont or SetTextAreaFont (includiing any FreeFont) commands

I can try to produce a runnable snippet that contains the same features and hopefully reproduce the error, but as from my recent bug-forumm post - I think it is almost definitely related to changing buffers and fonts without a graphics window.


_PJ_(Posted 2015) [#12]
Okay here's a straightforward, procedural copy of all the relevant funcitonality which I only changed to remove calls to functions that were unnnecessary (such as getting the RGB colour components or determining certain sizes - which I'm pretty sure have no bearing on the issue)

This compiles as-is and will produce the error, but it is intermittent and inconsistent so you may need to compile a few times and check the last line of the ddebug output each time to see when it happens (should be within 20 times - at least, it was around 10 for me)

There's no logical explanation I can find as to why FontName should be giving a different result between each call at the end.


I really hope this highlights the issue I'm having and sorry it's not been easy to describe or narrow it down, but I do thank you for looking into it!

Global UI_MAIN_WINDOW=CreateWindow("Window",0,0,800,600)
Const UI_TIT_WORDWRAP=1

Const FONT_DEFAULT_TYPEFACE$="Blitz"

Const DEF_TIT_TEXT$="Movie"
Const TIT_WYSIWYG_IMAGE_FLAG_DYNAMIC=2
Global TIT_WYSIWYG_IMAGE%

Global UI_TIT_GAD_TEXTBOX
Global UI_TIT_GAD_BUTTON
Global UI_TIT_GAD_TYPEFACE
Global UI_TIT_GAD_FONT_NAME$
Global UI_TIT_GAD_FONT_FLAGS=1

Const FONT_FORE_FLAG=0
Const FONT_BACK_FLAG=1

DebugLog("INIT: Initialise Title")
DebugLog("INIT (TITLE): Initialise textbox gadget dimensions")

Local W=768
Local H=20

UI_TIT_GAD_TEXTBOX=CreateTextArea(0,0,W,H,UI_MAIN_WINDOW,UI_TIT_WORDWRAP)
DebugLog("TITLE: Textbox gadget reference 0x"+Str(UI_TIT_GAD_TEXTBOX)+" created with dims: "+Str(W)+" X "+Str(H))

UI_GAD_BUTTON_X=20
UI_GAD_BUTTON_Y=50
UI_GAD_BUTTON_W=50
UI_GAD_BUTTON_H=30
UI_TIT_GAD_BUTTON=CreateButton("OK",UI_GAD_BUTTON_X,UI_GAD_BUTTON_Y,UI_GAD_BUTTON_W,UI_GAD_BUTTON_H,UI_MAIN_WINDOW)
HideGadget UI_TIT_GAD_BUTTON

If (UI_TIT_GAD_TYPEFACE)
	DebugLog("INIT (TITLE): Release Typeface Data "+Chr(34)+UI_TIT_GAD_FONT_NAME$+Chr(34)+" 0x"+Str(UI_TIT_GAD_TYPEFACE))
	UI_TIT_GAD_FONT_NAME$=""
	FreeFont UI_TIT_GAD_TYPEFACE
	UI_TIT_GAD_TYPEFACE=0
End If

DebugLog("INIT (TITLE): Initialise Typeface")

Local Size=27

UI_TIT_GAD_TYPEFACE=LoadFont(FONT_DEFAULT_TYPEFACE,Size);*FONT_DEF_LINE_SPACING#)
UI_TIT_GAD_FONT_NAME=FontName(UI_TIT_GAD_TYPEFACE)

DebugLog("INIT (TITLE): Loaded new Typeface "+Chr(34)+UI_TIT_GAD_FONT_NAME+Chr(34)+" Size: "+Str(FontSize(UI_TIT_GAD_TYPEFACE))+" to reference: 0x"+Str(UI_TIT_GAD_TYPEFACE)+" with flags: 0x"+Str(UI_TIT_GAD_FONT_FLAGS))

SetTextAreaText UI_TIT_GAD_TEXTBOX,DEF_TIT_TEXT$

DebugLog("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))

DebugLog("TITLE (UPDATE): Lock textbox gadget 0x"+Str(UI_TIT_GAD_TEXTBOX))
LockTextArea UI_TIT_GAD_TEXTBOX
DebugLog("TITLE (UPDATE): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))

; SOMEHOW THE FONTNAME IS CORRUPTED BETWEEN THE LINE ABOVE AND THE LINE BELOW INTERMITTENTLY

DebugLog("TITLE (SETFONT): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))

; YOU MAY NEED TO RUN MULTIPLE TIMES FOR THE EFFECT TO BE APPARENT



Floyd(Posted 2015) [#13]
No idea what's happening, but this is amusing.

The first thing that happens is I get *****INTERNAL ERROR***** Attempt to release <unknown> object.

The error is apparently at the last line of code:
DebugLog("TITLE (SETFONT): Typeface is: "+FontName(UI_TIT_GAD_TYPEFACE))
If I delete that the INTERNAL ERROR goes away.

Now the good part, I replace the deleted line with
fname$ = FontName(UI_TIT_GAD_TYPEFACE)

and the error is back, except it is Attempt to retain <unknown> object.

I also thought LockTextArea UI_TIT_GAD_TEXTBOX might be to blame, since there is no matching UnLockTextArea. That must be mistake, but it doesn't seem to affect the release/retain error, whatever that is.


_PJ_(Posted 2015) [#14]
The Lock/UnLock doesn't actually seem to affect anything at all - there was initially an UnLock line (Can be put in again, even right after the Lock line), but since the "<unknown> object" error halts execution right there and then at the last line, I just removed everything afterwards.

Whilst also something intriguing and problematic, the <unknown object> errors aren't the reason for this thread, though it may be they are connected in some way - Did you at all repeat running the test a few times until you saw the FontName() returned (in the DebugLog) actually change and become corrupted?

At least, I am beginnning to feel slightly more reassured it's not just my code!

Any and all suggestions for alternative methods gladly appreciated!!!


Floyd(Posted 2015) [#15]
I think I saw "Blitz" change to "TITLE", but not sure since I got distracted by the internal error, which I still don't understand.

As for the Lock/Unlock I think the general advice is to lock, do whatever it was you wanted to the buffer and then immediately unlock. This is to avoid possible interactions with other commands. They may seem unrelated but who knows.

My only other vague advice is that you are not using the normal form of a BlitzPlus program with GUI elements. Maybe that's causing trouble.

What I mean by normal form is this general structure:
Set things up

Repeat
   Wait for event
   Deal with event
Forever
If you haven't done it already take a look at the BlitzPlus User Guide. To find it click the Home icon in the IDE, just below the menu bar. You may want to start with Appendix A1 which summarizes some differences from previous Blitzes.

Disclaimer: Despite the fact that I'm here handing out advice I really don't know a lot about the features of BlitzPlus which were not already in Blitz3D.


_PJ_(Posted 2015) [#16]
"I think I saw "Blitz" change to "TITLE", but not sure"
Yes, that would be it.
Incidentally, it seems to sometimes actually take on the value of something like "TITLE (SETFONT): Typeface is:" - which is interestingly the string passed to the debuglog.

There may be a connection, since (part of my initial suspicion) if you remove references to FontName within the DebugLines, the "<unknown object>" error disappears:
Global UI_MAIN_WINDOW=CreateWindow("Window",0,0,800,600)
Const UI_TIT_WORDWRAP=1

Const FONT_DEFAULT_TYPEFACE$="Blitz"

Const DEF_TIT_TEXT$="Movie"
Const TIT_WYSIWYG_IMAGE_FLAG_DYNAMIC=2
Global TIT_WYSIWYG_IMAGE%

Global UI_TIT_GAD_TEXTBOX
Global UI_TIT_GAD_BUTTON
Global UI_TIT_GAD_TYPEFACE
Global UI_TIT_GAD_FONT_NAME$
Global UI_TIT_GAD_FONT_FLAGS=1

Const FONT_FORE_FLAG=0
Const FONT_BACK_FLAG=1

Local W=768
Local H=20

UI_TIT_GAD_TEXTBOX=CreateTextArea(0,0,W,H,UI_MAIN_WINDOW,UI_TIT_WORDWRAP)

UI_GAD_BUTTON_X=20
UI_GAD_BUTTON_Y=50
UI_GAD_BUTTON_W=50
UI_GAD_BUTTON_H=30
UI_TIT_GAD_BUTTON=CreateButton("OK",UI_GAD_BUTTON_X,UI_GAD_BUTTON_Y,UI_GAD_BUTTON_W,UI_GAD_BUTTON_H,UI_MAIN_WINDOW)
HideGadget UI_TIT_GAD_BUTTON

Local Size=10;27

UI_TIT_GAD_TYPEFACE=LoadFont(FONT_DEFAULT_TYPEFACE,Size);*FONT_DEF_LINE_SPACING#)
UI_TIT_GAD_FONT_NAME=FontName(UI_TIT_GAD_TYPEFACE)

SetTextAreaText UI_TIT_GAD_TEXTBOX,DEF_TIT_TEXT$

x$=FontName(UI_TIT_GAD_TYPEFACE)
DebugLog(x)
stop




"As for the Lock/Unlock I think the general advice is to lock, do whatever it was you wanted to the buffer and then immediately unlock. This is to avoid possible interactions with other commands. They may seem unrelated but who knows."
Yes, I pretty much tried this, but didn't seem to affect anything at all.




"My only other vague advice is that you are not using the normal form of a BlitzPlus program with GUI elements. Maybe that's causing trouble."

In my actual program, this is how the program flow operates, only prior to the loop, the initial defaults and gadgets need to be set up and the functions here represent a small part of that. The main window and menu system initialisation are elsewhere in my program code and function correctly, but do not seem to be a factor in this issue.


_PJ_(Posted 2015) [#17]
I think there might be some workaround for this issue if QueryObject(hn,3) is used for the font.
I'm working on it and will update as I have more info...