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

Composants FMX Delphi Discussion :

FMX.PathData, encore un bug rigolo


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut FMX.PathData, encore un bug rigolo
    Bonjour,

    Je ne peux m'empêcher de partager cette petite "découverte".
    Voilà un PathData qui est censé dessiner un cœur
    d="M 10,30 A 20,20 0,0,1 50,30 A 20,20 0,0,1 90,30 Q 90,60 50,90 Q 10,60 10,30 z"
    Nom : Capture.PNG
Affichages : 395
Taille : 4,6 Ko
    et ce que j'obtiens
    Nom : Capture_1.PNG
Affichages : 413
Taille : 6,0 Ko
    c'est une histoire de Q (la commande des courbes de Bézier, n'ayez pas l'esprit mal tourné ) mal interprété.
    le path est transformé en :
    "M10,30 C10.0000019073486,18.9542999267578 18.9543075561523,9.99999809265137 30.0000038146973,10 C41.0456924438477,9.99999809265137 50,18.9542999267578 50,29.9999961853027 C50,18.9543037414551 58.9543037414551,9.99999809265137 70,9.99999809265137 C81.0456924438477,9.99999809265137 90,18.9543037414551 90,29.9999980926514 Z"

    Voire même pas du tout dans certains cas ! par exemple :
    "M10 80 Q 95 10 180 80" est interprété en "M10 80"

    Andnotor n'avait peut-être pas tord avec cette remarque dans ce post
    Citation Envoyé par Andnotor
    c'est un stagiaire qui a fait ça ?
    Ne tirons pas sur ce stagiaire sous peine d'avoir à nous payer un composant tiers mais, bon, encore une soumission au contrôle qualité Embarcadero en perspective

    rapporté https://quality.embarcadero.com/browse/RSP-27211

  2. #2
    Membre expérimenté Avatar de Galet
    Homme Profil pro
    Consultant/Programmeur Robotique industrielle
    Inscrit en
    Mars 2010
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant/Programmeur Robotique industrielle

    Informations forums :
    Inscription : Mars 2010
    Messages : 325
    Par défaut
    Bon, mais passer du cœur au Q c'est pas très original finalement ...

  3. #3
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 542
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 542
    Billets dans le blog
    10
    Par défaut
    Bonjour à tous. A priori il ne sait pas interpréter certaines commandes. Si tu lui passe suniquement des lignes tout va bien.
    Exemple du papillon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    M407.556182861328,219.116287231445 L400.98291015625,200.491455078125 L399.982971191406,181.492263793945 L402.482849121094,167.492858886719 L397.483062744141,151.493545532227 L387.483489990234,137.494140625 L367.484344482422,116.495040893555 L332.985809326172,87.4962768554688 L289.487670898438,55.4976348876953 L259.488952636719,34.9985046386719 L229.990203857422,21.4990844726563 L208.991104125977,18.4992141723633 L196.491638183594,19.499174118042 L183.992156982422,24.4989643096924 L176.992462158203,32.9986038208008 L171.99267578125,40.4982833862305 L169.492782592773,51.9977951049805 L169.492782592773,65.9972076416016 L172.992630004883,84.9963836669922 L179.992340087891,110.495300292969 L187.991989135742,133.494323730469 L195.991653442383,153.49348449707 L203.491333007813,167.992858886719 L214.990844726563,183.492202758789 L224.490432739258,191.491851806641 L235.489974975586,197.491607666016 L245.489547729492,200.991455078125 L254.989135742188,201.491439819336 L268.988555908203,200.991455078125 L282.487976074219,197.491607666016 L291.987548828125,195.491683959961 L300.987182617188,194.491729736328 L278.488128662109,201.991409301758 L260.488891601563,210.991027832031 L241.489715576172,225.490417480469 L227.990295410156,242.989669799805 L216.490783691406,261.988861083984 L211.490997314453,272.988403320313 L209.991058349609,282.987976074219 L209.991058349609,294.487487792969 L211.490997314453,306.486968994141 L215.490814208984,317.486511230469 L221.990539550781,328.986022949219 L230.990158081055,341.485473632813 L238.489837646484,350.985076904297 L249.489379882813,360.984649658203 L261.988830566406,369.484283447266 L273.988342285156,374.984069824219 L285.987823486328,378.98388671875 L296.487365722656,379.983856201172 L304.986999511719,379.983856201172 L315.486572265625,377.483947753906 L325.486145019531,371.484222412109 L341.985443115234,359.984710693359 L358.984710693359,346.485260009766 L370.984191894531,335.485748291016 L382.983673095703,322.486297607422 L391.483337402344,311.486755371094 L397.483062744141,299.987243652344 L401.982879638672,289.987670898438 L403.482818603516,276.988220214844 L406.982666015625,251.989303588867 L408.482604980469,234.990020751953 L410.482513427734,223.490509033203 L407.556182861328,219.116317749023 Z

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Sauf que, mon objectif est plutôt de charger des fichiers SVG qui fonctionnent pas d'en faire

    en fouillant dans les sources effectivement il y a soucis
    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
     
    procedure TPathData.SetPathString(const Value: string);
    ... 
              's':
                begin
                  CurvePoint2 := GetPointFromString(PathString, Pos);
                  SmoothCurveToRel(CurvePoint2, GetPointFromString(PathString, Pos));
                  while HasRelativeOffset(PathString, Pos) do
                  begin
                    CurvePoint2 := GetPointFromString(PathString, Pos);
                    SmoothCurveToRel(CurvePoint2, GetPointFromString(PathString, Pos));
                  end;
                end;
              'H': HLineTo(StrToFloat(GetNumberFromString(PathString, Pos), USFormatSettings));
              'h': HLineToRel(StrToFloat(GetNumberFromString(PathString, Pos), USFormatSettings));
              'V': VLineTo(StrToFloat(GetNumberFromString(PathString, Pos), USFormatSettings));
              'v': VLineToRel(StrToFloat(GetNumberFromString(PathString, Pos), USFormatSettings));
              'Q', 'q':
                begin
                  GetPointFromString(PathString, Pos);
                  GetPointFromString(PathString, Pos);
                  // Il devrait y avoir un appel à des fonctions ici 
                end;
              'T', 't': GetPointFromString(PathString, Pos);
                        // et là 
              'A', 'a':
    Il manque les instructions de dessin, le fait qu'elles manquent ne fait qu'ignorer (mal) les points qui suivent, pourtant il y a fonction et procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        procedure CalculateBezierCoefficients(const Bezier: TCubicBezier; out AX, BX, CX, AY, BY, CY: Single);
        function PointOnBezier(const StartPoint: TPointF; const AX, BX, CX, AY, BY, CY, T: Single): TPointF;
        function CreateBezier(const Bezier: TCubicBezier; const PointCount: Integer): TPolygon;
    AMHA CreateBezier qui crée un TPolygon est la piste que je vais suivre


    J'arrive déjà à charger pas mal de drapeaux trouvés sur Wikipédia, je suis maintenant sur les commandes de transformation (transform) et c'est à ce moment là que j'ai découvert ce Qcas.

    Pour ce qui est des transformations j'ai encore deux inconnues : l'application d'une matrice ( matrix( )), même si le code semble juste je n'ai aucun effet
    ou plutôt si mais mal, je dois avoir un problème avec l'interprétation des points ("matrix(-1.91966e-016 -0.92707 1.03324 -1.6837e-016 17.2415 320.298)"), cela va faire plaisir @Andnotor j'ai trouvé des exponentielles
    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
    if Pos('matrix(',transform)>0 then
     begin
        p:=Pos('matrix(',transform)+Length('matrix(');
        GetNumbers(Copy(transform,p,Pos(')',transform,p)-p), Numbers);
        M.m11:=Numbers.Dequeue;
        M.m12:=Numbers.Dequeue;
        M.m13:=Numbers.Dequeue;
        M.m21:=Numbers.Dequeue;
        M.m22:=Numbers.Dequeue;
        M.m23:=Numbers.Dequeue;
        M.m31:=0;
        M.m32:=0;
        M.m33:=1;
        Cible.Data.ApplyMatrix(M);
     end;
    et la rotation rotate()
    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
     
    if Pos('rotate(',transform)>0 then
     begin
        p:=Pos('rotate(',transform)+Length('rotate(');
        GetNumbers(Copy(transform,p,Pos(')',transform,p)-p), Numbers);
        // à mon avis il faut peut-être utiliser l'équivalent d'un scale
        { ici, comment je traite Scale -- fonctionne pour le drapeau de la Barbade Scale(-1,1) fait "tourner" une moitié de trident (effet de reflexion) 
          if Pos('scale(',transform)>0 then
        begin
          p:=Pos('scale(',transform)+Length('scale(');
          GetNumbers(Copy(transform,p,Pos(')',transform,p)-p), Numbers);
          if Numbers.Count=1 then Cible.Data.Scale(Numbers.Dequeue,0)
                             else Cible.Data.Scale(Numbers.Dequeue,Numbers.Dequeue);
          Numbers.Clear;
        end;
        }
        Numbers.Clear;
     end;
    Après je m'attaquerai aux noeuds g (pas les points c'est pour continuer sur le côté grivois )

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bravo Sergio tu es un Master
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    j'ai des doutes sur le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if Pos('matrix(',transform)>0 then
     begin
        p:=Pos('matrix(',transform)+Length('matrix(');
        GetNumbers(Copy(transform,p,Pos(')',transform,p)-p), Numbers);
        ....
     end;
    pourquoi faire deux fois l’opération du pos
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     D:=  Pos('matrix(',transform); // Ici 
     if D >0 then
     begin
        D := D + Length('matrix(');
        F := Pos(')',transform,D)-D;
        if  F > 0 Then 
          GetNumbers(Copy(transform,D,F), Numbers)
        else 
          Raise Ecxeption.create('parenthèse fermante non trouvée'); 
        ....
     end;

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par anapurna Voir le message
    J'ai des doutes sur le code, pourquoi faire deux fois l’opération du pos
    Tu peux j'ai moi-même des doutes, et il faut que j'améliore cette partie, mais déjà tu n'as pas tous les éléments en main, en particulier la fonction getnumbers qui fourni un TQueue<Single> (pour l'instant mais cela risque de changer)

    pour expliquer cette partie, dans l'attribut "transform" on peut trouver :
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <rect x="20" y="20" width="50" height="50"
          style="fill: #3333cc"
          transform="matrix(0.5253,0.85,-0.85,0.5253,100,20)"
            />
    l'objectif de getnumbers est d'obtenir les 6 points.
    Bon, là l'exemple est "simple" puisque chaque chiffre est séparé par une virgule ce qui héla n'est pas toujours le cas il peut y avoir l'espace comme séparation ou, pire, un mix
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <rect x="20" y="20" width="50" height="50"
          style="fill: #3333cc"
          transform="matrix(0.5253,0.85 -0.85,0.5253 100,20)"
            />
    Comme il s'agit de tests ma procédure getnumbers, loin d'être parfaite me permet quand même d'obtenir la matrice que je dois appliquer.

    En parlant de matrice à appliquer , j'ai peur que TPathData.ApplyMatrix ne soit elle aussi boguée

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <svg xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink">
     
    <rect x="20" y="20" width="50" height="50"
          style="fill: #cc3333"/>
     
    <rect x="20" y="20" width="50" height="50"
          style="fill: #3333cc"
          transform="matrix(0.5253,0.85,-0.85,0.5253,100,20)"
            />    
    </svg>
    Nom : Capture.PNG
Affichages : 307
Taille : 9,6 Ko


    nota : mon précédent code #4 était faux quant aux points à initialiser, j'ai modifié ainsi
    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
    if Pos('matrix(',transform)>0 then
     begin
        PS:=Pos('matrix(',transform)+Length('matrix(');
        GetNumbers(Copy(transform,PS,Pos(')',transform,PS)-PS), Numbers);
        M.m11:=Numbers.Dequeue;
        M.m12:=Numbers.Dequeue;
        M.m13:=0;
        M.m21:=Numbers.Dequeue;
        M.m22:=Numbers.Dequeue;
        M.m23:=0;
        M.m31:=Numbers.Dequeue;
        M.m32:=Numbers.Dequeue;
        M.m33:=0;
        Cible.Data.ApplyMatrix(M);
     end;
    C'est en fouillant GitHub (https://github.com/ekot1/DelphiSVG), que j'ai trouvé les points à initialiser. (Si je n'utilise pas ces composants là c'est parce qu'il y a TPath )

    Dans ces sources, j'ai même trouvé le principe de la rotation (en passant par les matrices justement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if Pos('rotate(',transform)>0 then
     begin
        PS:=Pos('rotate(',transform)+Length('rotate(');
        GetNumbers(Copy(transform,PS,Pos(')',transform,PS)-PS), Numbers);
        a:=DegToGrad(Numbers.Dequeue)/100;
        x:=Numbers.Dequeue;
        y:=Numbers.Dequeue;
        M:=TMatrix.CreateTranslation(X, Y);
        M:= TMatrix.CreateRotation(A) * M;
        M:= TMatrix.CreateTranslation(-X, -Y) * M;
        Cible.Data.ApplyMatrix(M);
        Numbers.Clear;
     end;
    Sauf que, évidemment le résultat n'est pas encore là !
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?xml version="1.0" encoding="UTF-8"?>
    <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1350" height="900">
    	<rect width="1350" height="900" fill="#fff"/>
     
    	<g id="ermine">
            <path id="s" d="M 300,167.5 l -9,-13.5 l 9,-22.5 l 9,22.5 z" fill="#000"/>
    		<use xlink:href="#s" transform="rotate(-90 300,167.5)" fill="#000"/>
    		<use xlink:href="#s" transform="rotate(90 300,167.5)" fill="#000"/>
    	    <path d="M 300,167.5 l 40.5,99 l -31.5,-13.5 l -9,18 l -9,-18 l -31.5,13.5 z"/>
    	</g>
     </svg>
    Voilà la gueule de mon hermine
    Nom : Capture.PNG
Affichages : 313
Taille : 5,4 Ko
    pour le drapeau breton, c'est pas gagné
    Vous remarquerez quand même que j'ai commencé à traiter les groupes.

    Bon, cela avance par à coups mais ça avance, il y aurait matière à plusieurs billets un par étape franchies mais j'aimerais finaliser avant (si je peux)
    Plusieurs drapeaux (source wikipédia)
    simples France, Belgique, Pays Bas (en bref les drapeaux à bandes simples)
    avec utilisation de scale et uses Barbades
    mais aussi plus complexes (aux prix des rapports de bogues et solutions possibles) Albanie, Angola, Kyrgyzstan sont déjà dessinés sans soucis
    les étoiles (Maroc, Algérie, Europe, USA, Cuba ...) me posent encore problèmes : épaisseur des traits pour le Maroc, remplissage des étoiles pour les autres (c'est une demande déjà faite par un autre que moi mais je ne retrouve plus le n° du rapport)

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    bravo Sergio tu es un Master
    Bof, c'est mon pc qui est nommé MASTER (d'où le pseudo lors de sa création début 2017, sergio étant pris et ne voulant pas avoir un numéro j'ai opté pour le nom du poste idiot non, cela semble prétentieux ) moi je tente simplement de pousser à fond FMX.PathData. Quand on me promet du SVG ou du moins un dessin utilisant des chemins avec la notation SVG respectant la norme 1.1
    TPath définit des formes de type chemin 2D représentant des groupes de courbes et de lignes connectées.
    J'ai envie d'aller plus loin c'est Jim McKeith qui m'a poussé avec ces billets
    http://delphi.org/2019/02/delphis-bi...ittle-svg-fun/
    http://delphi.org/2019/04/animated-p...-grace-hopper/

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 635
    Billets dans le blog
    65
    Par défaut problème de Q résolu
    Bonjour,

    Plusieurs problèmes ont été résolus dont tous ceux concernant les courbes de Bézier ou non, en fouillant plus en profondeur dans le portail Qualité le bogue avait déjà été indiqué mais surtout une solution proposée pour la version 10.2.2
    https://github.com/chinawsb/fmxfixes...-version.patch

    Nom : Capture.PNG
Affichages : 288
Taille : 5,9 Ko

    Patch efficace ! Pourquoi cela n'a-t-il pas été appliqué

    Je passe donc le sujet en quitte à en ouvrir un autre sur les matrices de transformation pour les instructions de transformation rotate, skewx, skewy. Quoiqu'il y ait une petite avancée dans mes recherches,
    Nom : Capture.PNG
Affichages : 294
Taille : 1,4 Ko
    je me battrai car dans tous ces essais j'ai perdu la couleur blanche de la plupart de mes "dessins"
    Une fois que j'aurai retrouvé ce blanc éclatant (je ne vous dis pas comment le drapeau du Japon devient terne, il va me falloir une bonne lessive) j'ai encore quelques idées qui pourrait arranger cette hermine : c'est certainement ma méthode de traitement de groupe qui est mauvaise (un autre sujet ou pas )

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

Discussions similaires

  1. et encore un bug de Maple !
    Par vosges88 dans le forum Maple
    Réponses: 1
    Dernier message: 07/07/2017, 15h36
  2. Réponses: 2
    Dernier message: 29/06/2011, 14h13
  3. Encore un bug dans WPF ? :aie:
    Par smyley dans le forum Windows Presentation Foundation
    Réponses: 8
    Dernier message: 10/07/2008, 11h41
  4. [FLASH MX2004] Encore un bug dans flash ?
    Par Lorenzo77 dans le forum Flash
    Réponses: 3
    Dernier message: 04/12/2006, 08h04
  5. [XHTML] Internet Explorer Bug encore ???
    Par Risike dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 04/05/2006, 22h24

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