IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec C & C++ Discussion :

[GTK+ 2] Dessiner du vectoriel


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut [GTK+ 2] Dessiner du vectoriel
    Bonjour à tous,

    Ma question est semble t'il une question de débutant. Désolé. En fait, je commence à bien connaitre GTK, mais je dois à présent développer du code qui trace des graphiques vectoriels dans un drawable. Il y a pas mal d'années, j’utilisais des GdkGC et autres gdk_gc_new() et gdk_draw_line(), etc. avec succès, mais le passage à GTK+ change tout (en mieux si j'ai bien saisi).

    Je cherche des des tutos pour apprendre à faire ça, donc apprendre les rudiments de cairo, donc. J'en ai trouve quelques uns, mais pas forcément vraiment explicites. Vous auriez des liens à me proposer ?

    Par ailleurs, je suis actuellement en 2.24.0 (pour des raisons de fuites mémoire dans des versions plus récentes - et ne souhaite pas trop passer en GTK 3, vu que je n'ai pas trop envie de reprendre tous mes codes pour migration..). J'ai bien essayé de compiler des codes d'essai, en linkant avec la cairo.lib, mais gdk_cairo_create() n'est pas une fonction reconnue, par exemple, par mon compilateur.

    Bref, je patauge, pour l'instant, et toute aide ou pointeur sur ce point me serait utile et me ferait gagner du temps.

    Merci d'avance aux gurus qui trainent sur ce forum.

    AMitiés à tous, Eric.

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Pourrais-tu nous montrer un bout de code pour qu'on comprenne ce que tu dessines exactement ? On pourra à partir de là te montrer comment faire avec cairo.

  3. #3
    Membre éclairé
    Profil pro
    Retraité
    Inscrit en
    Novembre 2009
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2009
    Messages : 331
    Par défaut
    Bonjour,

    Pour débuter avec Cairo, il y a cette introduction http://www.dil.univ-mrs.fr/~regis/CM-CAIRO/index.html
    Il y a aussi ceci http://zetcode.com/gfx/cairo/

    Normalement gdk_cairo_create() devrait être connue

    Pour pouvoir me servir de toutes les surfaces disponibles (Postscript, PDF et SVG), j'utilise l'en-tête suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include <gtk/gtk.h>
    #include <gdk/gdk.h>
    #include <cairo.h>
    #include <cairo-ps.h>
    #include <cairo-pdf.h>
    #include <cairo-svg.h>
    La compilation et l'édition de liens utilisent les variables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # GUI flags
    GUI_FLAGS=-pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  
     
    # GUI libraries
    GUI_LIBS= -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lcairo -lgio-2.0 -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0
    J'espère que tout ça peut te servir.

  4. #4
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Ok, merci.

    Oui, j'avais vu ces deux tutos. Merci pvincent !

    Pour gerald3d, voici ci-dessus un code que je viens d'écrire, qui - cette fois-ci - compile bien et ouvre une fenetre effectivement. Mais elle est complètement vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    /* travail avec cairo */
    #include <stdio.h>
    #include <cairo.h>
    #include <gtk/gtk.h>
     
    int main(int argc, char *argv[])
    {
        GtkWidget *window;
        GtkWidget *darea;
        gboolean on_expose_event(GtkWidget *, cairo_t *, gpointer);
        gtk_init(&argc, &argv);
        window=gtk_window_new(GTK_WINDOW_TOPLEVEL);
        darea=gtk_drawing_area_new();
        gtk_widget_set_size_request (darea, 400, 100);
        gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
        gtk_window_set_default_size(GTK_WINDOW(window), 400, 100);
        gtk_window_set_title(GTK_WINDOW(window), "GTK window");
        gtk_container_add(GTK_CONTAINER(window), darea);
        g_signal_connect(G_OBJECT(darea), "expose_event", G_CALLBACK(on_expose_event), NULL);
        g_signal_connect(window, "destroy", G_CALLBACK(gtk_main_quit), NULL);
        gtk_widget_show_all(window);
        gtk_main();
        return 0;
    }
    gboolean on_expose_event(GtkWidget *widget, cairo_t *cr, gpointer user_data)
    {
        cairo_set_source_rgb(cr, 0., .0, .0);
        cairo_select_font_face(cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
        cairo_set_font_size(cr, 10.0);
        cairo_move_to(cr, 10.0, 50.0);
        cairo_show_text(cr, "Hello World!");
        return FALSE;
    }
    Comprendre déjà où es le problème ici m'aiderait pas mal.

    Dans tous les cas, merci pour toute aide sur ce point. Une fois que j'aurais "décolé" je pense que la suite devrait aller rapidement. Je voudrais faire des plots x-y simples, en fait.

    Eric.

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    À mon avis tu écris en noir sur fond noir...
    Pour comprendre les mécanismes de cairo, il y a aussi ces pages:
    http://cairographics.org/samples/
    http://cairographics.org/tutorial/ (ou http://www.mono-lab.ch/?p=149 pour C#/Mono, mais en français)

    J'avais aussi codé un exemple de dessin de courbes avec cairo, mais c'est du GTK2. La conversion en GTK3 doit pas être compliquée, faut juste utiliser le signal "draw" au lieu de "expose-event", et plus besoin d'appeler gdk_cairo_create, le contexte cairo est founi en entrée de la callback.

  6. #6
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Décembre 2012
    Messages
    195
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : Décembre 2012
    Messages : 195
    Par défaut
    Citation Envoyé par liberforce Voir le message
    À mon avis tu écris en noir sur fond noir...
    Pour comprendre les mécanismes de cairo, il y a aussi ces pages:
    http://cairographics.org/samples/
    http://cairographics.org/tutorial/ (ou http://www.mono-lab.ch/?p=149 pour C#/Mono, mais en français)

    J'avais aussi codé un exemple de dessin de courbes avec cairo, mais c'est du GTK2. La conversion en GTK3 doit pas être compliquée, faut juste utiliser le signal "draw" au lieu de "expose-event", et plus besoin d'appeler gdk_cairo_create, le contexte cairo est founi en entrée de la callback.
    Si je remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     cairo_set_source_rgb(cr, 0., .0, .0);
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cairo_set_source_rgb(cr, 1., .2, .2);
    (à la ligne 23 de mon code), j'ai le même comportement (fenetre vide). Je suis pas en noir sur fond noir dans ce cas. Il y a un autre problème..

    Pour l'exemple de votre dessin de courbes avec cairo, ca ne compile pas chez moi (GTK 2). La fonction gdk_cairo_create() n'est pas référencée dans mon environnement de développement (codeblock) alors que j'ai bien un lien avec la cairo.lib..

    Bref, voilà où j'en suis, c'est-à-dire au même endroit..

    Eric.

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je viens de relire ton exemple de code, la raison est effectivement ailleurs...

    En GTK 2:
    • on utilise le signal "expose-event" pour dessiner
    • la signature de la callback associée à ce signal se trouve dans la doc: gboolean user_function (GtkWidget *widget, GdkEvent *event, gpointer user_data)

    Note qu'il n'y a pas de parmètre cairo, ici. Il faut donc passer par une phase de conversion GDK → cairo. C'est à ça que sert gdk_cairo_create: obtenir un contexte graphique cairo à partir d'un GdKDrawable (classe de base pour GdkWindow et GdkPixmap). La GdkWindow d'un widget (c'est à dire le buffer graphique, la fenêtre telle qu'elle est dessinée) s'obtient en appelant gtk_widget_get_window sur un GtkWidget.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GdkWindow *window =  gtk_widget_get_window(widget);
    cairo_t *cr = gdk_cairo_create (window);
    /* là tu peux manipuler ton contexte cairo, sans oublier de le libérer à la fin avec cairo_destroy */
    En GTK 3, l'intégration de cairo est plus poussée: plus de manipulation de GDK, on te founit directement le contexte cairo.
    En GTK 3:
    • on utilise le signal "draw" pour dessiner
    • la signature de la callback associée à ce signal se trouve dans la doc: gboolean user_function (GtkWidget *widget, CairoContext *cr, gpointer user_data)

    Bon, il y a un petit piège: le type CairoContext n'existe pas, le bon type dépend du langage utilisé. En C, c'est un cairo_t.

    Toi tu as fait un gros mix de GTK 2 et GTK 3, ça ne peut pas marcher. Tu utilises l'expose-event (GTK 2), mais avec une callback au format GTK3. Utilise la bonne signature de callback, celle de GTK 2.

    Tu ne devrais même pas avoir une fenêre vide, chez moi ça crashe au lancement ! Ensuite, gdk_cairo_create existe en GDK 2 et GDK 3, donc vérifie ton installation de GTK, car sur un GTK 2.24 ça doit fonctionner.

  8. #8
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par pvincent Voir le message
    La compilation et l'édition de liens utilisent les variables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # GUI flags
    GUI_FLAGS=-pthread -I/usr/include/gtk-2.0 -I/usr/lib/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/glib-2.0 -I/usr/lib/glib-2.0/include  
     
    # GUI libraries
    GUI_LIBS= -pthread -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lpangoft2-1.0 -lgdk_pixbuf-2.0 -lm -lpangocairo-1.0 -lcairo -lgio-2.0 -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lrt -lglib-2.0
    J'espère que tout ça peut te servir.
    Fais plutôt des appels directs à pkg-config pour gérer tout ça, c'est son boulot.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comportement de fenêtres GTK+ avec dessins
    Par Slookeur dans le forum GTK+ avec C & C++
    Réponses: 38
    Dernier message: 19/01/2011, 13h41
  2. gtk image + dessin
    Par syl_syl dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 23/05/2007, 16h01
  3. gtk image dessin
    Par syl_syl dans le forum GTK+ avec C & C++
    Réponses: 3
    Dernier message: 30/06/2006, 11h49
  4. Dessin vectoriel avec Python
    Par cboudy dans le forum PyQt
    Réponses: 2
    Dernier message: 04/04/2006, 21h38
  5. Dessin vectoriel
    Par Speed41 dans le forum Langage
    Réponses: 6
    Dernier message: 16/08/2004, 07h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo