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

Lazarus Pascal Discussion :

Équivalent à CopyMemory() pour Lazarus [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 14
    Points : 9
    Points
    9
    Par défaut Équivalent à CopyMemory() pour Lazarus
    Bonjour à tous,

    J'aimerai savoir s'il existe un équivalent à la fonction CopyMemory() de Delphi sous Windows pour Lazarus sous Linux. Si non, quelle pourrait être la solution de remplacement ?

    Bonne journée à tous,

    Slander

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 48
    Points : 55
    Points
    55
    Par défaut
    System.Move

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Bonjour,

    je remonte ce vieux topic parce que google me l'a remonté, malheureusement j'ai le don pour trouver des discussions moisies...
    Qu'on en juge :
    Citation Envoyé par theodp Voir le message
    System.Move
    Déjà, avec une réponse aussi laconique, le pauvre OP a dû souffrir, et on constate que la discussion n'est pas résolue...
    Essayons donc tous ensemble de trouver une solution (pas pour l'OP, ça a dû être résolu, vous pensez, 7 ans déjà...).

    La doc MSDN indique pour le CopyMemory :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void CopyMemory(
      _In_       PVOID  Destination,
      _In_ const VOID   *Source,
      _In_       SIZE_T Length
    );
    Méfiance avec l'utilisation de move car on trouve dans systemh.inc la ligne Procedure Move(const source; var dest; count:SizeInt);
    Bonjour les inversions source et destination, alors attention lors de l'écriture du code !

    Bon, je mets ça en place dans mon code (System.Move(aPixels, SrcBmp.ScanLine[SrcBmp.Height -1], IMAGE_HEIGHT*IMAGE_WIDTH*SizeOf(TRGBQuad));, voir là pour les détails), évidemment je me prends un AV (sinon je ne serais pas là), je continue à fouiller, voilà que je trouve une discussion sympatoche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var
      gbuff: Pointer;
    ...
      GetMem(gbuff, s);
      {$ifdef Win32}
      CopyMemory(gbuff, FImage.Bits, s);
      {$endif}
     
      {$ifdef Linux}
      Move(FImage.Bits, gbuff, s);
      {$endif}
    The code work well under Windows but under Linux I get an exception on Move instruction.

    [réponse :]

    Move procedure from RTL takes dereferenced pointers as arguments, so you'll need to use it this way:
    Move(FImage.Bits^, gbuff^, s);
    J'essaye avec mon code, ça ne compile pas à cause des chapeaux ("illegal qualifier" sur la source)...
    Je les enlève tous les deux, ça compile mais AV à l'exécution.
    Je ne remets que le second, ça compile mais AV à l'exécution.
    Et cerise sur le gâteau, contrairement à ce que disait le posteur de cette discussion ("The code work well under Window"), j'ai testé et gagné les AV's sous.. Windows !
    Voilà... Même pas j'essaye sous Linux.

    Si quelqu'un a une idée, il est le bienvenu.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    CopyMemory travaille avec des pointeurs, Move avec des instances

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Move(aPixels, SrcBmp.ScanLine[SrcBmp.Height -1]^, IMAGE_HEIGHT*IMAGE_WIDTH*SizeOf(TRGBQuad))
    il ne faut pas lui donner l'adresse de la ScanLine mais la données pointée

    (en supposant que aPixels est un tableau statique)

    ceci dit, ça ne fonctionnera que si le bitmap est en 32bits
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    CopyMemory travaille avec des pointeurs, Move avec des instances

    System.Move(aPixels, SrcBmp.ScanLine[SrcBmp.Height -1]^, IMAGE_HEIGHT*IMAGE_WIDTH*SizeOf(TRGBQuad))

    il ne faut pas lui donner l'adresse de la ScanLine mais la donnée pointée
    Merci pour les explications, mais tu n'as pas lu mon post jusqu'au bout :
    Citation Envoyé par Jipété Voir le message
    J'essaye avec mon code, ça ne compile pas à cause des chapeaux ("illegal qualifier" sur la source)...
    Je les enlève tous les deux, ça compile mais AV à l'exécution.
    Je ne remets que le second, ça compile mais AV à l'exécution.
    Citation Envoyé par Paul TOTH Voir le message
    ceci dit, ça ne fonctionnera que si le bitmap est en 32bits
    Comme ça, tu veux dire ? C'est en place, c'est en place...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        with SrcBmp do begin
          SrcBmp.PixelFormat:=pf32bit;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre averti

    Homme Profil pro
    Diverses
    Inscrit en
    Février 2014
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    Points : 428
    Points
    428
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ceci dit, ça ne fonctionnera que si le bitmap est en 32bits
    Et si les lignes se suivent en mémoire.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    après j'ai envie de dire, quel est l'intérêt ?

    si tu veux utiliser le ScanLine d'un Bitmap tu peux le faire directement

    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
     
    const
      W = 256;
      H = 256;
    type
      TPixels = array[0..H - 1, 0..W - 1, 0..3] of Byte;
      PPixels = ^TPixels;
    var
      Bmp   : TBitmap;
      Pixels: PPixels;
      x, y  : Integer;
    begin
      Bmp := TBitmap.Create;
      Bmp.pixelFormat := pf32Bit;
      Bmp.SetSize(W, H);
      Bmp.BeginUpdate;
      Pixels := Bmp.ScanLine[0]; // manifestement sous Lazarus il faut prendre ScanLine[0] 
     
      for x := 0 to W - 1 do
      begin
        for y := 0 to H - 1 do
        begin
          Pixels^[y, x, 0] := x + y; // blue
          Pixels^[y, x, 1] := x - y; // green
          Pixels^[y, x, 2] := x + x; // red
          Pixels^[y, x, 3] := 255;   // alpha
        end;
      end;
     
      Bmp.EndUpdate();
      Image1.Picture.Graphic := Bmp;
      Bmp.Free;
    end;
    étrangement sous Lazarys c'est ScanLine[0] qui pointe sur le début du bitmap et non ScanLine[H - 1] comme sous Delphi (Bitmap avec la tête en bas)

    ce qui se confirme dans le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    function TRawImage.GetLineStart(ALine: Cardinal): PByte;
    begin
      Result := Data;
      if Result = nil then Exit;
      if ALine = 0 then Exit;
      Inc(Result, ALine * Description.BytesPerLine);
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Coucou me revoilou !

    Citation Envoyé par Paul TOTH Voir le message
    si tu veux utiliser le ScanLine d'un Bitmap tu peux le faire directement
    étrangement sous Lazarys c'est ScanLine[0] qui pointe sur le début du bitmap et non ScanLine[H - 1] comme sous Delphi (Bitmap avec la tête en bas)
    C'est bien noté, surtout la seconde ligne !
    Merci pour le bout de code, qui fonctionne tip-top, mais ne répond pas à ma problématique :
    Citation Envoyé par Paul TOTH Voir le message
    après j'ai envie de dire, quel est l'intérêt ?
    J'en vois deux :
    - un général, qui est de répondre à la question du fil, "par quoi remplacer le CopyMemory de Windows ?" sous Lazarus où cette API n'a pas été traduite ; je croyais avoir trouvé, mais...

    - un plus particulier et adapté au problème sur lequel je rame en ce moment, et pour lequel j'ai préparé, grâce au code de Cirec d'hier soir, un petit montage :
    Nom : copymem.jpg
Affichages : 571
Taille : 38,3 Ko

    À gauche l'image générée par son code directement sur la fiche, on voit en haut un bouton "btn_Go" qui va CopyMemoryer grâce au coup de main d'Andnotor de ce matin vers un TBitmap pour affichage dans un TImage, masqué par l'affichage du programme sous XP (bordure bleue) en cours d'avancement.

    Je voudrais faire la même chose sous Linux et le premier écueil c'est que SetDIBitsToDevice n'y existe pas, pour voir avec mes yeux à quoi ressemblent les données calculées et pour vérifier que la recopie (même en mettant deux secondes) est bonne dans le TImage (ben vi, si je ne peux pas voir la source, je ne peux pas savoir si ce que je vois dans le TImage après la copie est juste).

    Alors on va dire que j'y suis presque, puisque ce qu'on voit sur la partie droite de cette copie d'écran, c'est ce qui est généré par Lazarus dans XP (partie gauche = hier sous D7/w2k). Quand ça tournera correctement dans XP, je testerai sous Linux.
    J'y suis presque, dis-je, car l'image devrait faire 640x480 (ne pas tenir compte de l'image "Cirec" qui a été faite en mode 480x480) : dans ce qu'on voit, les couleurs sont bonnes et en place, la grande question c'est : mais où est passé le reste ? Et comment faire pour tout faire afficher ?

    Comment j'ai fait pour en arriver là ? Un bout du code de Cirec adapté par Andnotor :
    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
    with SrcBmp do begin
      SrcBmp.PixelFormat:=pf32bit;
      SrcBmp.Width := IMAGE_WIDTH;
      SrcBmp.Height:= IMAGE_HEIGHT;
    end;
     
    SrcBmp.BeginUpdate();
    for y := 0 to IMAGE_HEIGHT -1 do
      System.Move(aPixels[y], SrcBmp.ScanLine[y]^, IMAGE_WIDTH*SizeOf(TRGBQuad));
    SrcBmp.EndUpdate();
     
    {//D7-w2k
        for y := 0 to IMAGE_HEIGHT -1 do
          CopyMemory(SrcBmp.ScanLine[y], @aPixels[y], IMAGE_WIDTH*SizeOf(TRGBQuad));
    }
     
        Image123.Picture.Graphic := SrcBmp;
      finally
        SrcBmp.Free;
      end;
    Je ne sais plus trop quoi tenter...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SrcBmp.BeginUpdate();
    for y := 0 to IMAGE_HEIGHT -1 do
      System.Move(aPixels[y], SrcBmp.ScanLine[y]^, IMAGE_WIDTH*SizeOf(TRGBQuad));
    SrcBmp.EndUpdate();
    Je ne sais plus trop quoi tenter...
    Ce soir, pour lâcher un peu le code, j'ai lu la traduction (trouvée par gogol mais disponible quelque part sur dvlp) faite par nono40 de l'excellent article d'efg sur cette mystérieuse Scanline...
    Bien m'en a pris car à un moment je suis tombé sur un passage qui m'a obligé à relancer l'ide, à transformer l'horreur ci-dessus en tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SrcBmp.BeginUpdate();
    Move(Pixels^[0], SrcBmp.ScanLine[0]^,  IMAGE_WIDTH*IMAGE_HEIGHT*(SizeOf(Byte)*4)); 
    SrcBmp.EndUpdate();
    et...
    et......
    et BINGO !
    Mon TImage 640x480 s'est toute remplie de losanges bicolores en 1 toute petite milliseconde, et ce, aussi bien sous Linux que sous Windows (10 millisecondes pour les fenêtres -- le fait à la machine virtuelle ?) !

    Les images demain, il faut encore que j'adapte çà au vieux couple D7/w2k, le seul qui me permette de voir le dessin sur la form et dans le TImage, car, mine de rien, le rendu des couleurs n'est pas le même entre XP et Debian

    À chaque jour suffit sa peine, et ce soir le monsieur l'est bien content !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Les images demain, il faut encore que j'adapte çà au vieux couple D7/w2k, le seul qui me permette de voir le dessin sur la form et dans le TImage, car, mine de rien, le rendu des couleurs n'est pas le même entre XP et Debian
    On est demain, les images sont arrivées, les problèmes ont trouvé des solutions, tout est expliqué ici en suivant ce lien.

    Bonne journée, dommage que je ne puisse pas cliquer sur
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Bonne journée, dommage que je ne puisse pas cliquer sur
    C'est fait.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 725
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 725
    Points : 15 124
    Points
    15 124
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    C'est fait.
    Grand merci !
    Même si je ne suis pas à l'initiative de cette discussion, si jamais un jour quelqu'un cherche...

    J'en profite pour apporter une minuscule clarification à ça :

    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Move(Pixels^[0], SrcBmp.ScanLine[0]^,  IMAGE_WIDTH*IMAGE_HEIGHT*(SizeOf(Byte)*4));
    J'ai écrit SrcBmp et avec un nom pareil on pourrait croire que c'est la source des données, alors que c'est la destination du move ! (Bon ça sera la source pour le remplissage du TImage, ceci explique cela )
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. [Lazarus] Connaissez-vous un équivalent à IdHTTP d'Indy pour Lazarus ?
    Par [ZiP] dans le forum Lazarus
    Réponses: 3
    Dernier message: 13/03/2013, 18h30
  2. Y a-t-il un équivalent à 'EasyPHP' pour 'PostgreSQL' ?
    Par manicle dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/04/2009, 17h03
  3. Réponses: 2
    Dernier message: 16/01/2008, 18h07
  4. équivalent filedialog pour access 2000
    Par kirua2150 dans le forum VBA Access
    Réponses: 6
    Dernier message: 22/05/2007, 18h13
  5. équivalent Access pour Mac
    Par ivan7 dans le forum Access
    Réponses: 7
    Dernier message: 06/02/2006, 23h54

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