[Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

STARGÅTE hat geschrieben:Was mich jedoch noch wundert ist: abschließende Leerzeichen gehen nicht mit in die Breite ein.
gTextWidth("A") = gTextWidth("A ")
Klar, sie werden ja nicht angezeigt, aber trotzdem haben sie eine Länge und gerade wenn man (wie ich) einen Cursor anzeigen lassen will, brauche ich auch diese Leerzeichen.

Gibt es da vielleicht noch n Flag ?^^
Bitte nochmal runterladen, geht nun. Bei irgendwelchen weiteren Auffälligkeiten bitte sagen, Danke. :)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

:allright:

Echt super diese schnelle Umsetzung. Funktioniert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

So, an dieser stelle möchte ich mal etwas "zurückgeben".

Hier mal ein Beispiel für das Darstellen von Texten mit StyleSheets (ähnlich dem RTF-Format).
Mit Hilfe des gDrawing-Includes ist es nun einfacher die Schrift on-the-fly zu ändern.

Hier mal ein Beispiel:
Syntax : "\IA\i\-Quadrat\0 = \B50\b \C2cm\+2\c\0\n\Im\i\-e\0 = \C19,109\c×10\u\+31\0 \C2kg"
Bild

Code: Alles auswählen

EnableExplicit

XIncludeFile "gDrawing.pbi"

CompilerIf Defined(CharacterArray, #PB_Structure) = #False
	Structure CharacterArray
		c.c[0]
	EndStructure
CompilerEndIf

Structure StyledTextFont
	Name.s
	Size.f
	Style.i
	Color.l
EndStructure

Structure StyledTextInclude
	Name.s
	Size.f
	Style.i
	Array Color.l(9)
EndStructure

Global StyledTextInclude.StyledTextInclude

Procedure SetStyledTextFont(Name.s, Size.f, Style.i=0, ColorList.s="$FF000000")
	Protected Index.i, LastIndex.i
	With StyledTextInclude
		\Name      = Name
		\Size      = Size
		\Style     = Style
		For Index = 0 To 9
			\Color(Index) = Val(StringField(ColorList, Index+1, ","))
		Next 
	EndWith
EndProcedure


Procedure DrawStyledText(X.f, Y.f, Text.s)
	
	Protected *Character.CharacterArray = @Text, String.s
	Protected Font.StyledTextFont
	Protected Start.i, Index.i = -1
	Protected ShiftX.f, ShiftY.f, ShiftV.f
	
	If Not *Character : ProcedureReturn #False : EndIf
	
	Font\Name  = StyledTextInclude\Name
	Font\Size  = StyledTextInclude\Size
	Font\Style = StyledTextInclude\Style
	Font\Color = StyledTextInclude\Color(0)
	
	Repeat
		With Font
			gSetFont(\Name, \Size, \Style)
			gSetPenColor(\Color)
			Repeat
				Index + 1
				Select *Character\c[Index]
					Case '\'
						Select *Character\c[Index+1]
							Case '\'
								String = PeekS(@*Character\c[Start], Index-Start+1)
							Default
								String = PeekS(@*Character\c[Start], Index-Start)
						EndSelect
						gDrawText(X+ShiftX, Y+ShiftY+ShiftV, String)
						ShiftX + gTextWidth(String)
						Select *Character\c[Index+1]
							Case 'C'
								\Color = StyledTextInclude\Color(*Character\c[Index+2]-'0')
								Index + 1
							Case 'c'
								\Color = StyledTextInclude\Color(0)
							Case 'B'
								\Style | #PB_Font_Bold
							Case 'b'
								\Style & ~#PB_Font_Bold
							Case 'U'
								\Style | #PB_Font_Underline
							Case 'u'
								\Style & ~#PB_Font_Underline
							Case 'I'
								\Style | #PB_Font_Italic
							Case 'i'
								\Style & ~#PB_Font_Italic
							Case '+'
								\Size = StyledTextInclude\Size * 0.7
								ShiftV = -StyledTextInclude\Size * 0.1
							Case '-'
								\Size = StyledTextInclude\Size * 0.7
								ShiftV = StyledTextInclude\Size * 0.4
							Case '0'
								\Size = StyledTextInclude\Size
								ShiftV = 0
							Case 'n'
								ShiftY + gTextHeight("|")*1.1
								ShiftX = 0
						EndSelect
						Index + 1
						Start = Index+1
						Break
					Case #NUL
						gDrawText(X+ShiftX, Y+ShiftY+ShiftV, PeekS(@*Character\c[Start], Index-Start))
						Break 2
				EndSelect
			EndWith
		ForEver
		
	ForEver
	
EndProcedure



Enumeration
	#Window
	#Gadget
EndEnumeration

gInit()

OpenWindow(#Window, 0, 0, 250, 100, "StyledText", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CanvasGadget(#Gadget, 0, 0, WindowWidth(#Window), WindowHeight(#Window))

gStartDrawing(CanvasOutput(#Gadget))
	gSetTextAntialiasMode(#TextAntialiasMode_ClearTypeGridFit)
	SetStyledTextFont("Arial", 24, #Null, "$FF000000,$FF008040,$FFC04000")
	DrawStyledText(10, 10, "\IA\i\-Quadrat\0 = \B50\b \C2cm\+2\c\0\n\Im\i\-e\0 = \C19,109\c×10\u\+31\0 \C2kg")
gStopDrawing()

Repeat
Until WaitWindowEvent() = #PB_Event_CloseWindow
Funktionen wie StyledTextWidth() und StyledTextHeight() uvm. folgen später :lol:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8679
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von NicTheQuick »

Dafür wäre vielleicht ein neuer Thread mit Verweise auf diesen hier besser geeignet, oder?
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

Hallo Danilo,

bitte entferne aus der Include die Konstante: #PB_Font_Default
Die existiert in PB 4.60 RC2 nicht mehr.

Desweiteren habe ich ein Problem wenn ich die Beispiele mit Windows 7 64Bit starten will.
Dort gibt mir gInit() immer 0 zurück. Weißt du woran das liegen könnte?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

STARGÅTE hat geschrieben:Desweiteren habe ich ein Problem wenn ich die Beispiele mit Windows 7 64Bit starten will.
Dort gibt mir gInit() immer 0 zurück. Weißt du woran das liegen könnte?
Habe auch Windows7 64bit und läuft mit PB 32bit. Oder meinst Du PureBasic 64bit?
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

Jo PB-64Bit, deswegen habe ich mir ja Windows 7 zugelegt ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

Bitte ändere folgende Struktur, gleich am Anfang:

Code: Alles auswählen

Structure GdiplusStartupInput
    GdiPlusVersion.l
    *DebugEventCallback.DebugEventProc
    SuppressBackgroundThread.i
    SuppressExternalCodecs.i
EndStructure
Also die 2 letzten Einträge von .l nach .i ändern, dann geht es.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von STARGÅTE »

Oke, "gehen" tut es dann, jedoch meldet mit der Purifier dann eine "Overflow in the global data block".

Muss ich noch irgendwo eine Bufferlänge ändern?
Edit: Ich vermute GdiplusStartup_ ist das problem
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: [Windows] 2DDrawing Befehle mit AntiAliasing durch GDI+

Beitrag von Danilo »

STARGÅTE hat geschrieben:Oke, "gehen" tut es dann, jedoch meldet mit der Purifier dann eine "Overflow in the global data block".

Muss ich noch irgendwo eine Bufferlänge ändern?
Edit: Ich vermute GdiplusStartup_ ist das problem

Code: Alles auswählen

__gdiplusToken.i  ; ändern (von .l nach .i)

Prototype GdiplusShutdown(token.i) ; ändern (von .l nach .i)

Hab noch nie mit 64bit probiert, wegen dem Bug mit PB 64bit damals.
Danke für die Meldungen!
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Antworten