Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Roland Chastain »

Hallo zusammen!

Ich habe gesucht, wie man mit Cairo in einem SDL2-Fenster zeichnet.

Ich teile meine Arbeit mit Ihnen und hoffe, dass sie Sie interessieren wird.

Sie brauchen SDL2-for-Pascal.

Beispiele getestet unter Linux.
Dateianhänge
sdl2-cairo-beispiele.zip
(9.66 KiB) 34-mal heruntergeladen
grgula.png
grgula.png (29.43 KiB) 982 mal betrachtet
cardioid.png
cardioid.png (123.14 KiB) 982 mal betrachtet
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Mathias »

Cairo und SDL vertragen sich sehr gut.
Dazu habe ich auch noch ein kleines Beispiel:
https://github.com/sechshelme/Lazarus-D ... /SDL_Cairo

Mit GTK2 lässt es sich auch kombinieren:
https://github.com/sechshelme/Lazarus-D ... roggen.org

Ich habe dein Beispiel cardioid3.pas ausprobiert. Anscheinend hast du auch das unschöne schwarze nachziehen, wen du die Fenstergrösse veränderst.
Das Beispiel grgula.pas ist auch echt cool, sieht fast wie OpenGL aus, so wie es scheint, hast du dies alles selbst berechnet. Was ich dabei staune, das du keine Matrizen verwendet hast.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Roland Chastain »

Mathias hat geschrieben:
Mo 6. Feb 2023, 17:43
Mit GTK2 lässt es sich auch kombinieren:
https://github.com/sechshelme/Lazarus-D ... roggen.org
Sehr interessant. Danke!
Mathias hat geschrieben:
Mo 6. Feb 2023, 17:43
Ich habe dein Beispiel cardioid3.pas ausprobiert. Anscheinend hast du auch das unschöne schwarze nachziehen, wen du die Fenstergrösse veränderst.
Ja, genau.
Mathias hat geschrieben:
Mo 6. Feb 2023, 17:43
Das Beispiel grgula.pas ist auch echt cool, sieht fast wie OpenGL aus, so wie es scheint, hast du dies alles selbst berechnet. Was ich dabei staune, das du keine Matrizen verwendet hast.
Es war nicht wirklich ich, der es geschrieben hat. Ich habe es einfach angepasst. Das Originalprogramm stammt von dieser Seite: https://gorbem.hu/TP/Grafika.htm
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Roland Chastain »

Mathias hat geschrieben:
Mo 6. Feb 2023, 17:43
Anscheinend hast du auch das unschöne schwarze nachziehen, wen du die Fenstergrösse veränderst.
Eine einfache Lösung besteht darin, den Hintergrund schwarz zu malen. :)

Code: Alles auswählen

  cairo_set_source_rgb(LContext, 0.0, 0.0, 0.0);
  cairo_paint(LContext);
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Mathias »

Anscheinend hast du auch das unschöne schwarze nachziehen, wen du die Fenstergrösse veränderst.

Code: Alles auswählen

var
    gRenderer: PSDL_Renderer;
....
        SDL_SetRenderDrawColor(gRenderer, $00, $9F, $00, $FF);
        SDL_RenderClear(gRenderer);
   
        // Zeichne noch mehr

        SDL_RenderPresent(gRenderer);
So scheint das Problem auch weg zu sein.
Man müsste es nur noch mit cairo probieren.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Mathias »

Roland Chastain hat geschrieben:
Mo 6. Feb 2023, 19:07
Mathias hat geschrieben:
Mo 6. Feb 2023, 17:43
Anscheinend hast du auch das unschöne schwarze nachziehen, wen du die Fenstergrösse veränderst.
Eine einfache Lösung besteht darin, den Hintergrund schwarz zu malen. :)

Code: Alles auswählen

  cairo_set_source_rgb(LContext, 0.0, 0.0, 0.0);
  cairo_paint(LContext);
Ich habe noch dein Beispiel "cardioid3" modifiziert.
Jetzt ist es dort auch einiges besser geworden, was den schwarzen Rand anbelangt.

Code: Alles auswählen

//    SDL_SetRenderDrawColor(LRenderer, 0, 0, 0, 255);
    SDL_SetRenderDrawColor(LRenderer, $FF, $FF, $FF, 255);
    SDL_RenderClear(LRenderer);

    CairoDraw(LTexture, LRendererWidth, LRendererHeight);

    SDL_RenderCopy(LRenderer, LTexture, nil, nil);
    SDL_RenderPresent(LRenderer);
//    SDL_Delay(100);
  end;
Erstens hast du es selbst schwarz eingefärbt.
Zweitens macht das Delay Schwierigkeiten. Der Grund, der Fenstermanager vergrössert das Fenster in Echtzeit und du machst eine Pause, so gibt es eine Lücke, bis das Bild wieder weiss eingefärbt wird.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Roland Chastain
Beiträge: 156
Registriert: Sa 7. Jul 2012, 21:50
Wohnort: Saargemünd
Kontaktdaten:

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Roland Chastain »

Gut gesehen. Danke!
Petit poisson deviendra grand,
Pourvu que Dieu lui prête vie.

Mathias
Beiträge: 6164
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Zeichen mit Cairo in einem SDL2-Fenster (Beispiele)

Beitrag von Mathias »

Ich habe noch ein Cairo-Beispiel it nativen X11 gemacht.

https://github.com/sechshelme/Lazarus-D ... /X11_Cairo

Das interessante dabei, man kann zugucken wie er zeichnet.
X11 arbeitet ohne Buffer, da wird direkt auf den Bildschirm gezeichnet.
Bei SDL und meinem TBitmap-Beispiel wird in einen Buffer gerendert und diesen späterer auf den Bildschirm kopiert.
Was beim GTK2-Beispiel passiert, kann ich nicht sagen, da ich keine surface kreieren muss. Ich denke, da wird intern auch ein Buffer verwendet.

Es ist echt spannend, wo man cairo überall gebrauchen kann. Es ist sogar möglich in den surface direkt in ein *.png zu schreiben.

Ich habe schon gelesen, das Cairo auch GPU beschleunigt arbeiten kann. Aber wie das geht weis ich (noch) nicht. Evtl, macht es dies bei X11.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten