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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    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
    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 éclairé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    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.

  4. #4
    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
    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 confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 135
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 135
    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;

  6. #6
    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
    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

  7. #7
    Membre expérimenté

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

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    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.

+ 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