1. #41
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 227
    Points : 486
    Points
    486

    Par défaut

    Citation Envoyé par Jipété Voir le message
    La grande question (pour moi), c'est pourquoi on passe par gbPixmap et pas par gbBitmap dans le case de RawImage_FromBitmap...
    On trouve, dans Gtk2Def, les lignes suivantes :
    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
      PGDIObject = ^TGDIObject;
      TGDIObject = record
        //...
        case GDIType: TGDIType of
          gdiBitmap: (
            Depth: integer;
            SystemVisual : Boolean;
            Visual : PGDKVisual;
            Colormap : PGDKColormap;
            case GDIBitmapType: TGDIBitmapType of // TGDIBitmapType = (gbBitmap, gbPixmap, gbPixbuf);
              gbBitmap: (GDIBitmapObject: PGdkBitmap); // pixmap with depth 1
              gbPixmap: (GDIPixmapObject: record // normal pixmap
                          Image: PGdkPixmap;     // imagedata
                          Mask: PGdkBitmap;      // the mask for images with 1 bit alpha and pixmap not supporting alpha
                        end);
              gbPixbuf: (GDIPixbufObject: PGdkPixbuf);
          );
    La solution serait peut-être du côté de TGDIBitmapType mais je n'ai pas trouvé ce qui le déterminait.
    La réponse, je suppose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gbBitmap: (GDIBitmapObject: PGdkBitmap); // pixmap with depth 1
    ce qui signifie que les donnée sont codé sur 8bits (1 octet par pixel) c'est ce qu'utilise le "MaskHandle" comme format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mask: PGdkBitmap;      // the mask for images with 1 bit
    gbPixmap est renvoyé car on lui passe les 2 Handles : Bitmap et Mask. Dans quel cas est renvoyé "gbPixbuf" ? aucune idée.

    Plus je te regarde creuser et plus je croie fortement à un problème lié à la gestion de la mémoire et des différents "buffer" dans la gestion des bitmaps FCL ? ou LCL ? je pencherai plus du coté de la LCL.
    Pourquoi je dis ça ? J'arrive comme je l'ai dis, a créer une image de 32000x32000x32 (4Go) et juste petite info mon "buffer" c'est un simple type PByte alloué avec ReAllocMem

    Citation Envoyé par Jipété Voir le message
    La on voie bien que l'erreur c'est la division par ZERO. C'est Msg qui est vide, donc maintenant ou est ce que la LCL va chercher ce Msg ?. Essayes juste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (length(Msg) div 10000) = 0 then
    On sait que ça donnera Zero comme resultat. Mais plus de SIGFPE. Juste pour tester. C'est peut-être un bug de la 1.4 qui à été corrigé sur les versions 1.6/1.8 ? Car chez moi dans la 1.6.4 à la ligne 860 de lclproc.pas j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure FreeThenNil(var obj);
    begin
      if Pointer(obj) <> nil then 
      begin
        TObject(obj).Free;
        Pointer(obj) := nil;
      end;
    end; // ------> LIGNE 860
     
    procedure RegisterInterfaceInitializationHandler(p: TProcedure);
    begin
      InterfaceInitializationHandlers.Add(p);
    end;
    EDIT :
    Citation Envoyé par Jipété Voir le message
    On peut rencontrer la valeur 122 (et peut-être d'autres, alors, à ce compte-là...), démonstration avec une routine dont l'origine remonte à l'ami Thierry William :
    122 signifie que tu as à faire un fichier BMP avec l'en-tête Version 4 :
    En-tête commune à tous les bmp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      TGLZBMPFileHeader = Packed Record // Taille 14 octets
        bfType: Array[0..1] Of Char; // bfType, Normalement Word; En déclarant un array of char on évite de se prendre les pieds avec  le "Little et Big Endian"
        bfSize: Longword;   // Taille totale du fichier
        bfReserved1: Word;  // Hospot X -> OS2x
        bfReserved2: Word;  // Hospot Y -> OS2x
        bfOffBits: Longword; // Position des données de l'image dans le fichier
      End;
    +
    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
      //En-tête BMP Windows V4
      //     biSize: LongWord;                // Taille de l'en-tête avec biSize = 108 octets
      TGLZWindowsBMPInfoHeaderV4 = Packed Record   // Ici Taille 104, biSize est lu avant
        biWidth: Longint;                // Largeur de l'image en pixels
        biHeight: Longint;               // Hauteur de l'image en pixels
        biPlanes: Word;                  // Nombre de Plans de couleur  = 1
        biBitCount: Word;                // Nombre de bits par pixel
        biCompression: Longword;         // Type de compression
        biSizeImage: Longword;           // Taille de l'image  AVEC LE PADDING peut être 0 si pas de compression, :zoubi:
        biXPelsPerMeter: Longint;        // hoizontal pixels per meter
        biYPelsPerMeter: Longint;        // vertical pixels per meter
        biClrUsed: Longword;             // Nombre de couleurs utilisées (0 = toutes)
        biClrImportant: Longword;        // Nombre de couleurs importantes (0 = toutes)
        biRedMask: Longword;             // Masque Couleur Rouge
        biGreenMask: Longword;           // Masque Couleur Vert
        biBlueMask: Longword;            // Masque Couleur Bleu
        biAlphaMask: Longword;           // Masque Couleur Alpha
        biCSType: Longword;              // Type de l'espace de couleur CIE
        biEndpoints: TGLZBMP_CIEXYZCoordTriple; // "Color space endpoints"
        biGammaRed: Longword;            // Correction Gamma Rouge
        biGammaGreen: Longword;          // Correction Gamma Vert
        biGammaBlue: Longword;           // Correction Gamma Bleu
      End;
    14+108 = 122

    ------------------------------
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  2. #42
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 770
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 770
    Points : 7 939
    Points
    7 939

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    La on voit bien que l'erreur c'est la division par ZERO. C'est Msg qui est vide, donc maintenant où est-ce que la LCL va chercher ce Msg ?.
    As-tu bien lu ce que j'ai écrit hier ?
    Citation Envoyé par Jipété Voir le message
    Ce qui est intéressant, c'est le commentaire lié à l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    {------------------------------------------------------------------------------
      procedure RaiseGDBException(const Msg: string);
     
      Raises an exception.
      Normally gdb does not catch fpc Exception objects, therefore this procedure
      raises a standard "division by zero" exception which is catched by gdb.
      This allows one to stop a program, without extra gdb configuration.
     ------------------------------------------------------------------------------}
    En gros l'erreur n'est pas une division par zéro, mais les programmeurs ont mis ça là pour arrêter le prog pour qu'on puisse aller trifouiller, mais où ? Nobody knows...
    Citation Envoyé par BeanzMaster Voir le message
    Citation Envoyé par Jipété Voir le message
    La solution serait peut-être du côté de TGDIBitmapType mais je n'ai pas trouvé ce qui le déterminait.
    La réponse, je suppose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gbBitmap: (GDIBitmapObject: PGdkBitmap); // pixmap with depth 1
    Et là tu n'as pas tenu compte du post suivant où je disais :
    Citation Envoyé par Jipété Voir le message
    Ben non, la solution est planquée Dieu seul sait où (Lazare ! Lève-toi et viens nous dire où Lazarus merdouille !) car je viens de faire un essai avec W = 4000 et H = 3000 et ça passe sans problèmes...

    Donc les limites sont fluctuantes (and mergitur si je peux me permettre ce jeu de mots [mais au point où on en est, why not ?]), aléatoires et pifomètriques...

    Citation Envoyé par BeanzMaster Voir le message
    122 signifie que tu as à faire un fichier BMP avec l'en-tête Version 4
    généré par Lazarus, hein, moi je me contente d'écrire bmp.SaveToStream(aStream);.
    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

  3. #43
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 227
    Points : 486
    Points
    486

    Par défaut

    Citation Envoyé par Jipété Voir le message
    As-tu bien lu ce que j'ai écrit hier ?
    Si, mais je n'ai pas fait le lien tout a l'heure avec le truc sur gdb

    Citation Envoyé par Jipété Voir le message
    Et là tu n'as pas tenu compte du post suivant où je disais :....
    W = 4000 et H = 3000 et ça passe sans problèmes...
    Si mais j'ai supposé que cela te renvoyait également un "gbPixmap"
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

  4. #44
    Expert éminent
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    5 770
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 770
    Points : 7 939
    Points
    7 939

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Si, mais je n'ai pas fait le lien tout a l'heure avec le truc sur gdb


    Citation Envoyé par BeanzMaster Voir le message
    Si mais j'ai supposé que cela te renvoyait également un "gbPixmap"
    Mais tout à fait !
    Citation Envoyé par Jipété Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          gbPixmap: begin // on passe ici
            Drawable := GdiBitmap^.GDIPixmapObject.Image; // Drawable = nil après exécution, mais <> nil avec 4000x3000
            Bitmap := GdiBitmap^.GDIPixmapObject.Mask; // Bitmap = nil après exécution
          end;
        end;
        Result := RawImage_FromDrawable(ARawImage, Drawable, Bitmap, ARect);
     
    // et enfin ça envoie dans gtk2widgetset.inc :
    function TGtk2WidgetSet.RawImage_FromDrawable(out ARawImage: TRawImage; ADrawable, AAlpha: PGdkDrawable; ARect: PRect): boolean;
    begin
      Result := False;
      if ADrawable = nil then
        RaiseGDBException('TGtk2WidgetSet.RawImage_FromDrawable'); // voilà l'erreur affichée ! Sauf que ce texte ne remonte pas, pour nous mettre sur la piste...
    Sauf qu'avec 4000x3000 ADrawable <> nil, donc pas d'exception.
    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

  5. #45
    Membre confirmé

    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 227
    Points : 486
    Points
    486

    Par défaut

    Comme tu l'as dis faut chercher du coté de GDIPixmapObject j'ai regardé dans la LCL ou on pouvais le trouver. Deja c'est exclusif à GTK, donc encore un truc qui fonctionne sous win mais pas avec linux/gtk2.
    De plus c'est assez confus. C'est une grosse variable qui passe de fonctions en fonctions, même avec un point de suivi ca risque d'être long et fastidieux pour trouver la source du problème. Le problème viendrait de la "conversion / creation " du bitmap vers le format de "GtkPixmap/PixBuf" (sous gtk c'est ça si je ne me trompe pas.)
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

Discussions similaires

  1. [HTML 5] Taille maximal d'une image
    Par Stefan0 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/11/2011, 17h01
  2. Fixer la taille maxi d'une image
    Par franck.thibault dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 14/08/2006, 13h00
  3. récupérer la taille totale d'une image avant chargement
    Par sorenson dans le forum JavaScript
    Réponses: 2
    Dernier message: 25/06/2006, 14h50
  4. Taille max d'une image
    Par Risike dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/05/2006, 17h16
  5. Taille maximal d'une chaine de caractère...
    Par nguthans dans le forum Syntaxe
    Réponses: 1
    Dernier message: 01/03/2006, 16h58

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