Seite 8 von 12

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

Verfasst: 24.07.2011 20:59
von c4s
Echt fein was du da auf die Beine gestellt hast. Ich kann einiges davon gebrauchen. Also auch von mir ein großes Lob! :allright:

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

Verfasst: 24.07.2011 21:00
von Falko
+1 :allright:

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

Verfasst: 27.08.2011 02:36
von STARGÅTE
Tachchen Danilo,

ich nutze nun dein Include aktiv für ein Projekt und die Arbeit damit ist auch toll :allright:

Leider bin ich auf ein kleines Hindernis gestoßen, von dem ich hoffe, dass man es irgendwie umgehen kann:
Zeichnet man mehrere halbtransparente Linien an einander (wie auch immer), so kommt an an den Collisionspunkten zu hässlichen AntiAliasing-Fehlern (überlagerung oder löcher). Ich weiß das es dafür eigentlich Pfade gibt bzw. Polygone, jedoch gibt es auch mal die Situation, dass ich eine Box mit einer Linie verbinden will.
Die Frage ist nun, ob es bei GDI+ auch die möglichkeit gibt, Elemente "gleichzeitig" zeichnen zu lassen, also als Gruppe, als wären sie ein Element?

Wenn ja, könntest du das noch einbinden?

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

Verfasst: 27.08.2011 06:49
von Danilo
STARGÅTE hat geschrieben:Die Frage ist nun, ob es bei GDI+ auch die möglichkeit gibt, Elemente "gleichzeitig" zeichnen zu lassen, also als Gruppe, als wären sie ein Element?
Kannst Du vielleicht mal ein Beispiel schreiben, wo man sehen kann, was
Du ungefähr machen möchtest? Verstehe es noch nicht so ganz, also z.B.
Box mit Linie verbinden oder so...?

Nicht-geschlossene Elemente (z.B. Punkte, Linien) kann man mit Paths
und gClosePath() zu einer Gruppe verbinden, so als wären sie ein Element.

Beispiel mit 2 Linien, die automatisch zu einer geschlossenen Figur verbunden werden:

Code: Alles auswählen

EnableExplicit

XIncludeFile "gDrawing.pbi"

Define img

Procedure Draw(image)
    If gStartDrawing( ImageOutput(image) )
        gClear(RGBA($80,$80,$80,$FF))
        gSetPenSize(2)

        gDrawingMode(#PB_2DDrawing_Path)
            gLine(300,100,0, 100)
            gLine(400,250,0,-100)
            gClosePath()
        gDrawingMode(#PB_2DDrawing_Default)
            gDrawPath(#PB_Default,RGBA($FF,$FF,$00,$FF))   ; draw current path with yellow color
        gDrawingMode(#PB_2DDrawing_Outlined)
            gDrawPath(#PB_Default,RGBA($00,$00,$00,$FF))   ; draw current path outlined with black color

        gStopDrawing()
    EndIf
EndProcedure

If gInit()

    img = CreateImage(#PB_Any,800,600)
    Draw(img)

    OpenWindow(#PB_Any,0,0,800,600,"gDrawing",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ImageGadget(#PB_Any,0,0,800,600,ImageID( img ))
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow

    gEnd()
EndIf
Oder hier ein Beispiel mit "mehrere halbtransparente Linien an einander (wie auch immer)":

Code: Alles auswählen

EnableExplicit

XIncludeFile "gDrawing.pbi"

Define img
Global i

Procedure Draw(image)
    If gStartDrawing( ImageOutput(image) )
        gClear(RGBA($80,$80,$80,$FF))
        gSetPenSize(3)

        gLineXY(100,200,420,500,$FF000000) ; 2 schwarze Linien
        gLineXY(400,200,120,500,$FF000000)

        gSetPenSize(1)
        gDrawingMode(#PB_2DDrawing_Path)
            For i = 0 To 300
                gLineXY(100+i,200,120+i,500) ; mehrere Linien an einander
                gLineXY(121+i,500,101+i,200)
            Next i
            gClosePath()

        gDrawingMode(#PB_2DDrawing_Default)
            gDrawPath(#PB_Default,RGBA($FF,$FF,$00,$80)) ; zeichne "mehrere halbtransparente Linien an einander (wie auch immer)"

        gStopDrawing()
    EndIf
EndProcedure

If gInit()

    img = CreateImage(#PB_Any,800,600)
    Draw(img)

    OpenWindow(#PB_Any,0,0,800,600,"gDrawing",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    ImageGadget(#PB_Any,0,0,800,600,ImageID( img ))
    Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow

    gEnd()
EndIf

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

Verfasst: 27.08.2011 15:49
von STARGÅTE
Erst mal danke für die beiden Beispiele, aber irgendwie ist gClosePath() nicht das richtige, weil es alle offnenen Ende zusammen fügt.

Hier mal ein ganz einfaches Beispiel:

Wie kann ich ein Kreuz mit zwei Linien zeichnen, ohne das die Mitte dunkler wird, ohne "stückeln zu müssen":

Code: Alles auswählen

Enumeration
	#Image
EndEnumeration

IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"

gInit()

CreateImage(#Image, 600, 600, 32|#PB_Image_Transparent)

gStartDrawing(ImageOutput(#Image))
  gClear($FFFFFFFF)
  gSetPenSize(50)
  gLineXY(100,100,500,500,$80000000)
  gLineXY(500,100,100,500,$80000000)
gStopDrawing()


SetClipboardImage(#Image)


OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

gEnd()

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

Verfasst: 27.08.2011 16:18
von Danilo
STARGÅTE hat geschrieben:Erst mal danke für die beiden Beispiele, aber irgendwie ist gClosePath() nicht das richtige, weil es alle offnenen Ende zusammen fügt.

Hier mal ein ganz einfaches Beispiel:

Wie kann ich ein Kreuz mit zwei Linien zeichnen, ohne das die Mitte dunkler wird, ohne "stückeln zu müssen":
Danke, nun weiß ich was Du meinst. Dafür bräuchte man sowas wie gLines() um mehrere
Linien mit einmal zu zeichnen.
Ist noch auf der ToDo-Liste, allerdings schon eine Weile nichts mehr gemacht:

Code: Alles auswählen

gLines(), gLinesXY(), gBoxes(), gBeziers(), gCurves(), gClosedCurves()
Also Funktionen um mehrere Figuren auf einmal zu zeichnen.

Für den Moment ein kleiner Workaround:

Code: Alles auswählen

Enumeration
   #Image
EndEnumeration

;IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"

gInit()

CreateImage(#Image, 600, 600, 32|#PB_Image_Transparent)

gStartDrawing(ImageOutput(#Image))
  gClear($FFFFFFFF)
  gSetPenSize(50)
  gDrawingMode(#PB_2DDrawing_Path)
  gLineXY(100,100,500,500)
  gLineXY(500,500,300,300) ; zurueck zum mittelpunkt
  gLineXY(500,100,100,500)
  gDrawingMode(#PB_2DDrawing_Outlined)
  gDrawPath(#PB_Default,$80000000) ; zeichne "mehrere halbtransparente Linien an einander (wie auch immer)"

gStopDrawing()


SetClipboardImage(#Image)


OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

gEnd()

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

Verfasst: 27.08.2011 16:33
von STARGÅTE
Ah alles klar.

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

Verfasst: 27.08.2011 23:12
von STARGÅTE
Muss noch mal einen kleinen Bug melden:

Wie es aussieht, wird bei gTextWidth() nicht der TextAntialiasMode beachtet:

Code: Alles auswählen

Enumeration
   #Image
EndEnumeration

; IncludePath "C:\Includes\PureBasic"
XIncludeFile "gDrawing.pbi"

gInit()

CreateImage(#Image, 740, 600, 32|#PB_Image_Transparent)

Define Text.s = "Das ist ein ganz langer Text, von dem die Breite ermittelt wird"
gStartDrawing(ImageOutput(#Image))
	gSetFont("Arial", 24)
	gClear($FFFFFFFF)
	gSetTextAntialiasMode(#TextAntialiasMode_SystemDefault)
	gBox(0, 0, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
	gDrawText(0, 0, Text, $FF000000)
	gSetTextAntialiasMode(#TextAntialiasMode_ClearTypeGridFit)
	gBox(0, 60, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
	gDrawText(0, 60, Text, $FF000000)
	gSetTextAntialiasMode(#TextAntialiasMode_AntiAlias)
	gBox(0, 120, gTextWidth(Text), gTextHeight(Text), $FFC0C0C0)
	gDrawText(0, 120, Text, $FF000000)
gStopDrawing()


SetClipboardImage(#Image)


OpenWindow(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#PB_Any, 0, 0, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow

gEnd()
Bild

Es wird immer die Breite von #TextAntialiasMode_AntiAlias zurück gegeben.

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

Verfasst: 28.08.2011 19:36
von Danilo
STARGÅTE hat geschrieben:Muss noch mal einen kleinen Bug melden:

Wie es aussieht, wird bei gTextWidth() nicht der TextAntialiasMode beachtet:
[...]
Bild

Es wird immer die Breite von #TextAntialiasMode_AntiAlias zurück gegeben.
Vielen Dank, STARGÅTE!

Probier mal bitte mit gDrawing_v0.81b.zip und sage bitte ob es nun besser passt. Danke!

Dabei sind ohne Antialiasing immernoch ein paar Pixel mehr da, aber jetzt nur ein paar wenige, auch bei großen Fonts (stört das noch?).
Dein erster BugReport wäre damit auch behoben, daß gDrawText() gegenüber DrawText() zuviel Abstand hat.

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

Verfasst: 28.08.2011 20:07
von STARGÅTE
Jo, danke, scheint nun besser zu sein.
Dein erster BugReport wäre damit auch behoben
Jo, danke dafür.
Nun kann ich besser Texte stückeln, da nun z.B. gTextWidth("AB")+gTextWidth("CD") gelcih gTextWidth("ABCD") ist.

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 ?^^

Ansonsten muss ich n Punkt anhängen und dann die Breite wieder abziehen, dass geht ja nun ^^