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 :

Composant TGIFViewer


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    C'est comme avec TImage et les antibiotiques le "Stretch" n'est pas automatique . Rajouter une option AutoStretch est facilement faisable, pourquoi pas !
    Ou si le compo détecte que l'image est plus grande que l'espace disponible pour l'afficher, il coche tout seul "Adapter" et le fait.

    Citation Envoyé par BeanzMaster Voir le message
    J'ai peut-être une erreur dans les noms de fichier minuscules/majuscule.
    Surement !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure TMainForm.DoOnTranslate(Sender: TObject; Const Folder, Lang, FallbackLang: String);
    Begin
    //jpt  LangManager.Translate('uGIFViewer');
      LangManager.Translate('uGifViewer');
      LangManager.Translate('uFastBitmap');
     //jpt Translations.TranslateUnitResourceStrings('uGIFViewer', Folder + 'uGIFViewer.'+Lang+'.po', Lang, FallbackLang);
     // Translations.TranslateUnitResourceStrings('uGifViewer', Folder + 'uGifViewer.'+Lang+'.po', Lang, FallbackLang);
     // Translations.TranslateUnitResourceStrings('uFastBitmap', Folder + 'uFastBitmap.'+Lang+'.po', Lang, FallbackLang);
    End;
    Mais pas suffisant :
    Citation Envoyé par BeanzMaster Voir le message
    EDIT : J'ai oublié de le spécifier dans l'annonce, il faut copier le dossier languages dans le dossier de sortie de l'executable
    il manque ".fr" je ne sais pas pourquoi. J'ai rajouté du ShowMessage dans Procedure TGVTranslate.Translate(Const anUnitName: String); et voilà le résultat :
    Nom : pagaille_langage.png
Affichages : 374
Taille : 13,1 Ko
    ---
    Nom : fichier_lang_inexistant.png
Affichages : 377
Taille : 14,8 Ko

    Citation Envoyé par BeanzMaster Voir le message
    Pour ce genre d'image tu n'as pas le choix que de choisir le bond fond. Sinon la solution c'est de retoucher l'animation avec Gimp. Avec ces 2 là cela le ferai il n'y a pas beaucoup d'images pour l'animation. Avec animaux suffit juste un petit coup de gomme sur la dernière image.
    Hors de question que j'aille trifouiller dans un fichier, qui doit rester tel que son auteur l'a concu (non mais t'imagines, si "Les Misérables" ne te convient pas, tu le récris ? Ou tu modifies une partoche de Mozart ? Ou tu repeins La Joconde ? ) et c'est à l'ihm de s'adapter, ce que fait d'ailleurs le viewer de Linux, qui est blanc, tout comme l'aperçu sous XP.

    Citation Envoyé par BeanzMaster Voir le message
    Voilà j'espère que tu arrives à me comprendre, ce n'est pas évident d'expliquer certaines choses comme ça
    Ça va, on va dire que c'est ta cuisine interne et comme au restaurant, je n'ai pas à passer derrière pour aller soulever le couvercle des casseroles,

    Bon, j'ai des .gif à démonter pour aller voir comment c'est fichu dedans et essayer de comprendre ce qui manque à TGifAnim pour bien rendre les fichiers avec Disposal à 1 (Newton, Odessa, SmallColour), qui n'a pas été implémenté...

  2. #22
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Hello

    Citation Envoyé par jurassic pork Voir le message
    hello,
    Félicitations pour ton composant !
    Juste une suggestion :
    Il serait peut-être bien d'inclure dans les fichiers de la démo GifView au moins un gif animé. Je te propose le fpclogo

    Pièce jointe 391210

    En pièce jointe le logo en gif animé et aussi le lrs (pour peut être remplacer la ressource de l'autre démo GifRes).

    Ami calmant, J.P
    Excellente suggestion JP je vais faire ça
    • "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

    Mes projets sur Github - Blog - Site DVP

  3. #23
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Mais pas suffisant :

    il manque ".fr" je ne sais pas pourquoi. J'ai rajouté du ShowMessage dans Procedure TGVTranslate.Translate(Const anUnitName: String); et voilà le résultat :
    Bizarre j'ai testé hier soir sous linux et je n'ai pas eu besoin de rajouter ce "fr" la langue de ton os est-elle anglaise par defaut (en premier) ?
    • "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

    Mes projets sur Github - Blog - Site DVP

  4. #24
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Sinon voila une petite discussion provenant du forum anglais Traduite avec google ( Yoodle pas parler français super bien ) :

    Salut, wp
    Citation de: wp on Aujourd'hui à 01:15:01
    Mon problème est que vous semblez introduire trop de matériel non apparenté dans le paquet gifviewer qui n'est pas absolument nécessaire ou qui pourrait avoir une utilisation plus générale.

    Qu'est-ce que tu veux?

    Fournir un gifviewer? Puis les unités

    - gvTranslate (des choses similaires se trouvent dans LCLTranslator)
    LCLTranslator n'ont pas vraiment le même but. LCLTranslator a besoin de plus de travail pour être utilisé tel quel et rapidement
    Je l'ai inclus après les suggestions d'Alextp pour traduire la chaîne de franchise en anglais pour la communauté en général
    Citation de: wp on Aujourd'hui à 01:15:01
    - Typeshelpers (grand chevauchement avec les assistants de type construits dans fpc maintenant)
    Je l'ai inclus parce que l'un des testeurs. Utilise une ancienne version de Lazarus mais je peux facilement la supprimer en remplaçant 'ToString' par 'IntToStr' ou en vous déplaçant vers le dossier de la démo de gifview.

    Citation de: wp on Aujourd'hui à 01:15:01
    Ou voulez-vous fournir un paquet polyvalent avec des utilitaires de traduction, un bitmap rapide, des aides de type supplémentaires et - bien sûr - un visualisateur GIF? Ensuite, vous devriez nommer le paquet différemment et souligner son caractère multi-usage.
    Je veux juste partager mon travail. Et je suis d'accord avec vous gvTranslate, et TypesHelpers ne sont pas vraiment nécessaire ici
    Citation de: wp on Aujourd'hui à 01:15:01
    Quelques autres commentaires:
    Je vois deux fichiers .po dans votre dossier de paramètres régionaux. Les traducteurs n'aiment pas ça. Habituellement, ils préfèrent un seul fichier po par paquet.
    Je ne le savais pas. Lazarus génère automatiquement un fichier PO pour une unité. Où puis-je définir cette option? et comment le gérer pour la traduction?
    Citation de: wp on Aujourd'hui à 01:15:01
    - et probablement de même que uFastBitmap n'est pas nécessaires.(parce que je suis plutôt sûr que vous pouvez peindre le gif aussi avec les routines de fcl-image)
    Citation de: wp on Aujourd'hui à 01:15:01
    Saviez-vous que, contrairement à Delphi, fpc a déjà intégré le support gif (unité fpreadgif dans les paquets de dossiers sources / fp-image / src de l'installation de fpc)? Je n'ai pas comparé, mais je suis plutôt certain qu'il y a beaucoup de chevauchement avec votre unité. Pourquoi écrire de nouveau quand c'est déjà là?
    PS : En plus Delphi à un support intégrer du GIF depuis la version 2010 si je me souviens bien et c'est avec le TGIFImage qui à été donné par son auteur à Embarcadero à l'epoque

    Oui je le sais. Mais FPReadGIF ne prend pas en charge l'animation et ne fonctionne pas correctement comme avec le format BMP par exemple où beaucoup de fichiers ne sont pas supportés correctement. Même problème avec TGA, XPM et PCX. PNG fonctionne bien, mais pas complet. Le seul format qui est gérer correctement est JPG.
    Mon unité n'a pas beaucoup de chevauchement. Mais beaucoup de chose ont améliore la façon de lire et de supporter le format GIF. Vous pouvez tester, vous verrez qu'avec beaucoup de GIF dans Imagetestsuite que FPC ne peut pas les lire correctement avec FCL-Image.

    Je pense que la solution graphique FPC et LAzarus doit être repensée. Juste voir une petite partie dans mon code pourquoi je ne peux pas gérer la transparence avec TBitmap (juste sous linux) et doit utiliser TLazIntfImage à la place? Lazarus a de gros problèmes avec la gestion Bitmap. Pas FCL directement, mais je pense que ce n'était pas un bon choix pour gérer la couleur en 64 bits (TFPColor) par défaut. FCL-Image n'est pas assez optimisé, la gestion des erreurs n'est pas bonne, beaucoup de bogues sont présents entre et avec LCL RawImage / TBitmap.

    Je suis d'accord avec ce numéro (http://michellcomputing.co.uk/blog/2...ndling-part-1/). Pour TFastBitmap j'aurais pu faire comme ici http://michellcomputing.co.uk/blog/2...itmaps-part-2/ Mais pas vraiment nécessaire.
    Je pense que les graphismes sont une partie importante du développement. Et beaucoup de travail doit être fait à ce niveau, pour être utilisé correctement. Il est trop confus et a trop de bogues cachés et inattendus

    C'est mon sentiment et mon opinion. mais je pense que les équipes devraient se concentrer sur tous ces petits détails et petits bugs persistants de version en version, pour donner plus de stabilité, surtout pour pouvoir compiler correctement sans avoir à protéger le code de {$ IFDEF} sur les choses de base (Je pense à TListView par exemple, ou comme ici avec l'utilisation de TLazIntfImage sous Linux), plutôt que de vouloir ressembler à Delphi. Delphi est Delphi. FPC / Lazarus est FPC / Lazarus c'est tout

    Tout cela, bien sûr, n'enlève rien à la qualité et au travail des développeurs FPC et Lazarus, pour nous donner du plaisir à coder
    Citation de: wp on Aujourd'hui à 01:15:01
    S'il vous plaît ne vous méprenez pas sur ces mots critiques - je pense vraiment que vos unités sont un excellent travail.
    Pas de problème, c'est avec des discussions comme celle-ci que nous pouvons aller de l'avant

    Merci et meilleures salutations

    Jérôme
    • "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

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Bizarre j'ai testé hier soir sous linux et je n'ai pas eu besoin de rajouter ce "fr" la langue de ton os est-elle anglaise par defaut (en premier) ?
    Comment répondre à cette question ? Il y a 5 ans, quand j'ai installé Debian, le processus d'install m'a demandé quel clavier j'avais puis quel langage je voulais utiliser, j'ai répondu 105 touches Azerty et français et pas plus, et depuis je vis (plutôt bien) avec ça.

    Quant à l'autre post, j'ai eu l'impression de me reconnaître, là :
    Je l'ai inclus parce que l'un des testeurs utilise une ancienne version de Lazarus mais je peux facilement la supprimer en remplaçant 'ToString' par 'IntToStr' ou en vous déplaçant vers le dossier de la démo de gifview.
    Vrai ou faux ?
    Si c'est moi, alors je vais t'avouer un truc : je n'utilise pas du tout ce helper qui ne veut pas compiler et je remplace systématiquement .ToString par IntToStr.
    C'est très facile, j'ai trouvé le truc : dans les 2 fichiers concernés (umainform.pas et uGifViewer.pas) je fais "rechercher/remplacer .ToString par )", et ensuite je compile, et à chaque ligne où ça s'arrête en erreur, devant la variable concernée, je n'ai qu'à poser par coller (l'ayant au préalable copiée) la chaîne "IntToStr(", ça va très vite (d'autant plus que j'ai remarqué qu'il y en avait moins à faire dans la dernière version), juste penser à virer l'appel dans le uses de chaque fichier.

    Maintenant, si tu veux revenir à IntToStr, ça me simplifiera la vie, mais je ne suis pas seul sur Terre.

  6. #26
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Nouvelle mise à jour :

    Suppression de l'unité TypesHelpers
    Ajout de la propriété AutoStretchMode à TGifViewer
    Ajout de l'événement OnStretchModeChanged à TGifViewer
    Ajout de la traduction en anglais pour quelques commentaires
    Création d'une seule unité resource "resourcestring" pour la traduction du package au lieu de 1 fichier par unité
    Mise à jour de la démo GifView
    Mise à jour de la démo de GifRes
    Déplacement de l'unité gvTranslate vers le dossier de démonstration GifView
    • "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

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Ola !

    Bug : à la première ouverture du projet Démo, bim :
    Nom : paquet_manquant.png
Affichages : 372
Taille : 14,7 Ko

    Bon, j'ai supprimé la dépendance dans l'inspecteur de projet et ça le fait, mais ça surprend,

    Bug : après avoir ouvert une trop grande image (qui s'adapte automatiquement, parfait ! ), ouvrir une petite image qui n'a donc pas besoin d'adaptation l'adapte quand même,
    Nom : balle_agrandie.png
Affichages : 343
Taille : 74,5 Ko

    Pour moi, un fonctionnement normal et automatique serait le mode "Les plus grandes", en fait.
    Mais il manque toujours cette information comme quoi l'image trop grande a été stretchée, ou une image normale est affichée en 1/1 ; du coup ça m'oblige à contrôler chaque image avec le viewer de Linux (qui m'affiche les tailles) et ça n'est pas pratique du tout.

    Tu penseras à rajouter un "s" aux 2 items de la combo d'adaptation ? Merci,

    Et tu nous a gardé cet affreux "Languages" en haut à droite...

    Bug : et à propos de langages, ça ne fonctionne toujours pas chez moi : hors EDI je choisis "en", le binaire se ferme et se relance, il est en "fr"...
    Tu t'embrouilles avec ce truc qui n'a rien à faire avec les gif, tu devrais le virer.

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut Besoin d'explication à propos de PutImage
    Yep !

    J'ai une question, mais d'abord le contexte :
    quand je regarde les petites lignes d'aide à propos de cette procédure, je lis, à peine récrit :
    Citation Envoyé par PutImage
    Copie (en utilisant Scanline) une image source "Src" depuis la position "SrcX,SrcY" et de dimensions "SrcWidth,SrcHeight" dans le TFastBitmap à la position "DstX,DstY en suivant le "Mode" TFastBitmapDrawMode :
    - dmSet : Copie brute de l'image
    - dmAlpha : Copie les pixels de l'image source en mixant les couleurs avec celles du TFastBitmap en fonction de leur valeur Alpha
    - dmAlphaCheck : Copie les pixels de l'image source seulement si le pixel n'est pas invisible. Les autres pixels sont copiés de la façon que le mode dmAlpha
    Note : les dimensions et les positions entre le TFastBitmap et l'image source sont automatiquement ajustées si besoin.
    Reprenons le 3e cas du "Mode" :
    - dmAlphaCheck : Copie les pixels de l'image source seulement si le pixel n'est pas invisible. Les autres pixels sont copiés de la façon que le mode dmAlpha

    Transformons ça en deux phrases (puisqu'il y a un point au milieu) :
    1- Copie les pixels de l'image source seulement si le pixel n'est pas invisible.

    Dit autrement (en enlevant les deux négations) :
    1- Copie les pixels de l'image source seulement si le pixel est visible.

    Ce qui revient à dire, pour la phrase 2 :
    2- Les autres pixels (les invisibles) sont copiés de la (même [?]) façon que le mode dmAlpha

    Question : c'est quoi un pixel invisible ? Ceux présents dans une partie de l'image non visible (recouverte par une autre fenêtre par ex.) ?

    Ce qui reviendrait à dire que s'il y avait un bouton avec TFastBitmap.SaveToFile et que la moitié de l'image en question ne soit pas visible, le fichier généré n'aurait pas toutes les données correctes ?

    Je ne comprends pas bien, merci pour le retour.

  9. #29
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut
    Citation Envoyé par Jipété Voir le message
    Ola !

    Bug : à la première ouverture du projet Démo, bim :

    Bon, j'ai supprimé la dépendance dans l'inspecteur de projet et ça le fait, mais ça surprend,
    Cette erreur est normale si tu avais déjà installer le paquet. Juste une re-compilation du paquet suffit. C'est un oubli de ma part ici, je l'avais rajouter pour régénérer les fichier PO pour la traduction. Ici les objets sont créé dynamiquement donc pas besoin d'avoir la paquet dans les dépendances.

    Citation Envoyé par Jipété Voir le message
    Bug : après avoir ouvert une trop grande image (qui s'adapte automatiquement, parfait ! ), ouvrir une petite image qui n'a donc pas besoin d'adaptation l'adapte quand même,

    Pour moi, un fonctionnement normal et automatique serait le mode "Les plus grandes", en fait.

    Ce n'est pas un bug, le "Automatique" comme terme est mal choisi. J'ai remplacé la propriété "smAutomatic" par "smStretchAll" .
    Citation Envoyé par Jipété Voir le message
    Mais il manque toujours cette information comme quoi l'image trop grande a été stretchée, ou une image normale est affichée en 1/1 ; du coup ça m'oblige à contrôler chaque image avec le viewer de Linux (qui m'affiche les tailles) et ça n'est pas pratique du tout.
    Tu n'as pas fait attention mais l'état de la checkbox "Adapter" change. Après comme je te l'ai dis c'est une démo pas un outils final. Fais les changement comme tu le souhaites.

    Citation Envoyé par Jipété Voir le message
    Tu penseras à rajouter un "s" aux 2 items de la combo d'adaptation ? Merci,

    Et tu nous a gardé cet affreux "Languages" en haut à droite...
    Merci j'ai corrigé. Merci.

    Citation Envoyé par Jipété Voir le message
    Bug : et à propos de langages, ça ne fonctionne toujours pas chez moi : hors EDI je choisis "en", le binaire se ferme et se relance, il est en "fr"...
    Tu t'embrouilles avec ce truc qui n'a rien à faire avec les gif, tu devrais le virer.
    Idem chez moi sous Linux en mode débogage l'application ne se relance pas automatique. C'est bon si je lance le pogramme manuellement.
    La traduction pour en anglais reste une bonne chose et l'appliquer avec le composant de Gilles simplifie grandement la vie.
    • "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

    Mes projets sur Github - Blog - Site DVP

  10. #30
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Yep !

    J'ai une question, mais d'abord le contexte :
    quand je regarde les petites lignes d'aide à propos de cette procédure, je lis, à peine récrit :

    Reprenons le 3e cas du "Mode" :
    - dmAlphaCheck : Copie les pixels de l'image source seulement si le pixel n'est pas invisible. Les autres pixels sont copiés de la façon que le mode dmAlpha

    Transformons ça en deux phrases (puisqu'il y a un point au milieu) :
    1- Copie les pixels de l'image source seulement si le pixel n'est pas invisible.

    Dit autrement (en enlevant les deux négations) :
    1- Copie les pixels de l'image source seulement si le pixel est visible.

    Ce qui revient à dire, pour la phrase 2 :
    2- Les autres pixels (les invisibles) sont copiés de la (même [?]) façon que le mode dmAlpha

    Question : c'est quoi un pixel invisible ? Ceux présents dans une partie de l'image non visible (recouverte par une autre fenêtre par ex.) ?

    Ce qui reviendrait à dire que s'il y avait un bouton avec TFastBitmap.SaveToFile et que la moitié de l'image en question ne soit pas visible, le fichier généré n'aurait pas toutes les données correctes ?

    Je ne comprends pas bien, merci pour le retour.
    Invisible = 100% transparent = Composante Alpha = 0

    Cette phrase me convient bien : Copie les pixels de l'image source seulement si le pixel est visible (Alpha <> 0) je vais modifié le commentaire. Merci.

    A tellement vouloir essayé de bien expliqué j'embrouille le monde

    Comme le disais mon père
    "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre.
    Et il rajoute :
    Et donner des explications peut-être beaucoup plus difficile qu'il y parait
    • "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

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Yep !

    Citation Envoyé par BeanzMaster Voir le message
    Cette erreur est normale si tu avais déjà installé le paquet.
    Quand j'ai vu arriver la 1re version et l'info comme quoi on n'était pas obligé d'installer le compo pour utiliser la démo, j'ai dit "chouette !" et en avant. D'où la surprise ce matin.
    Bon, c'est anecdotique.


    Citation Envoyé par BeanzMaster Voir le message
    Tu n'as pas fait attention mais l'état de la checkbox "Adapter" change.
    Exact, désolé.


    Citation Envoyé par BeanzMaster Voir le message
    Idem chez moi sous Linux en mode débogage l'application ne se relance pas automatique.
    Ça on le savait.

    Citation Envoyé par BeanzMaster Voir le message
    C'est bon si je lance le programme manuellement.
    Pas chez moi : je lance le prog manuellement, il affiche "fr", je change en "en" il se ferme et se relance en "fr", et je viens de re-tester à l'instant, c'est confirmé.





    Citation Envoyé par BeanzMaster Voir le message
    Invisible = 100% transparent = Composante Alpha = 0

    Cette phrase me convient bien : Copie les pixels de l'image source seulement si le pixel est visible (Alpha <> 0) je vais modifié le commentaire. Merci.
    Désolé mais je ne comprends absolument rien, au contraire...

    Tu n'as répondu qu'à moitié à ma question demandant ce qu'est un pixel invisible : oui, ça peut être un pixel présent dans le dispositif d'affichage avec sa composante alpha à 0, mais ça peut aussi être un pixel dont alpha est <> de 0 donc visible, mais masqué par une autre fenêtre.
    En résumé, masqué ou alpha à 0 --> pixel invisible mais pour le code ce n'est pas pareil.
    Pour prendre une image, un fantôme dans une pièce est invisible, et quelqu'un en chair et en os caché sous le lit est également invisible. Tu vois le truc ? Ce mot ayant deux sens, il ne faudrait plus l'utiliser : je propose pixel caché (derrière une autre fenêtre) et pixel transparent.
    Ce qui fait qu'on pourra avoir des pixels transparents et cachés, ce qui sera quand même mieux que des pixels invisibles et invisibles, nan ?

    Copie les pixels de l'image source seulement si le pixel n'est pas invisible... -->
    Copie le(s) pixel(s) de l'image source seulement s'il(s) est(sont) visible(s), sinon utilise le mode dmAlpha.
    C'est ça ?
    Si oui, les pixels avec alpha à 0 vont être copiés en mixant leur byte alpha avec le byte alpha du TFastBitmap et donc risquer de les faire apparaître, et les autres pixels avec alpha <> 0 vont être copiés comment ? Sans tenir compte de leur alpha ?

    Tu vois bien que rien n'est clair.

    D'un autre côté, je n'ai peut-être pas besoin de comprendre ça, mais
    1- je n'ai pas trouvé cette info dans les specs GIF ;
    2- si j'utilise ton compo et qu'un jour il faut remettre les mains dans le cambouis, j'ai besoin de tout comprendre.

    Car c'est suffisamment le bazar comme ça, avec des compos qui ne suivent pas les specs.

    Pour la question de l'autre sujet, va me falloir un peu de temps...

  12. #32
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Yop !
    Citation Envoyé par Jipété Voir le message
    Pas chez moi : je lance le prog manuellement, il affiche "fr", je change en "en" il se ferme et se relance en "fr", et je viens de re-tester à l'instant, c'est confirmé.
    Ok je pense avoir une idée.
    Dans le projet pourrais-tu juste rajouter un label et dau début de l'évènement OnShow de la form rajouté cela stp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label.Caption := LangManager.OSLanguage;
    Peux tu me donner la valeur affichée ? si c'est "fr" c'est que ton OS à sa langue définit par défaut en français et là il y un truc qui joue pas avec ton OS. Si c'est "en" je crois avoir la solution


    Citation Envoyé par Jipété Voir le message
    Désolé mais je ne comprends absolument rien, au contraire...

    Tu n'as répondu qu'à moitié à ma question demandant ce qu'est un pixel invisible : oui, ça peut être un pixel présent dans le dispositif d'affichage avec sa composante alpha à 0, mais ça peut aussi être un pixel dont alpha est <> de 0 donc visible, mais masqué par une autre fenêtre.

    En résumé, masqué ou alpha à 0 --> pixel invisible mais pour le code ce n'est pas pareil.
    Pour prendre une image, un fantôme dans une pièce est invisible, et quelqu'un en chair et en os caché sous le lit est également invisible. Tu vois le truc ? Ce mot ayant deux sens, il ne faudrait plus l'utiliser : je propose pixel caché (derrière une autre fenêtre) et pixel transparent.
    Ce qui fait qu'on pourra avoir des pixels transparents et cachés, ce qui sera quand même mieux que des pixels invisibles et invisibles, nan ?
    Tendis que je vois le mot invisible (zut alors j'arrive a voir un truc qui ne se voit pas ) toi tu tu as le petit Larousse qui se ramène en courant. .
    Blague à part tu te complique la vie prend le mot dans son contexte, ici je ne parle pas de fantôme ou d'une autre chose je parle de pixel. Un pixel qui est invisble est un pixel 100% transparent. Un pixel 100% transparent par définition à son canal Alpha à Zero. Un Pixel "visible" est un pixel dont le canal Alpha est supérieur à 0 (il y transparence mais il est "visible). Ca ce n'est pas moi qui est décidé de cette norme.

    Que viens faire ta fenêtre ici ? on parle des pixels au format RGBA présent dans les données de l'image. Petite question un pixel 100% transparent tu le définirais avec quel terme ? Caché ? Masqué ?

    Citation Envoyé par Jipété Voir le message
    Copie les pixels de l'image source seulement si le pixel n'est pas invisible... -->
    Copie le(s) pixel(s) de l'image source seulement s'il(s) est(sont) visible(s), sinon utilise le mode dmAlpha.
    C'est ça ?
    Si oui, les pixels avec alpha à 0 vont être copiés en mixant leur byte alpha avec le byte alpha du TFastBitmap et donc risquer de les faire apparaître, et les autres pixels avec alpha <> 0 vont être copiés comment ? Sans tenir compte de leur alpha ?

    Tu vois bien que rien n'est clair.
    D'accord avec toi ce n'est pas très clair. Il faut que je remanie mes commentaires

    dmAlpha : Copie et mixe tous les pixels en tenant compte de la valeur du canal alpha dans la source et la destination
    dmAlphaCheck : Copie et mixe uniquement les pixels de l'image source dont le canal alpha est supérieur à 0

    Exemple avec dmAlpha
    Le pixel source a une valeur alpha 255 (donc opaque) la valeur alpha du pixel de destination est zero (donc "invisible" vu que nos écrans ne sont pas translucide comme des fenêtre il est matérialisé en noir) La valeur final du pixel sera le pixel source avec pour valeur alpha 255.

    Prenons l'inverse

    Le pixel source à une valeur alpha 0. Le pixel dans la destination à une valeur alpha 255 Alors le pixel final sera le pixel de la destination

    Le mode dmAlphaCheck est identique au mode dmAlpha

    Le pixel est traité (mixé) seulement si le pixel source à une valeur Alpha différente de zero. Ce qui revient a dire que le pixel final sera le pixel de la destination (c'est une question d'optimisation) On n'appel pas la fonction Blend.

    Citation Envoyé par Jipété Voir le message
    D'un autre côté, je n'ai peut-être pas besoin de comprendre ça, mais
    1- je n'ai pas trouvé cette info dans les specs GIF ;
    2- si j'utilise ton compo et qu'un jour il faut remettre les mains dans le cambouis, j'ai besoin de tout comprendre.
    Tu en as besoins dans tous les cas du "DisposalMode" Sauf dmErase qui efface le fond avant d'afficher l'image (Pour suivre les spécifications du format gif à la lettre il faut travailler également en tenant compte des valeurs du "DisposalMode" de l'image précédente surtout si c'est "dmKeep". Chose que je n'ai pas faite car cela complique énormément la procedure de rendu et qui ne fait qu'apporter de la confusion)

    La description du format gif en ce qui concerne les images c'est Une "Graphic Context Extension" suivie d'un "Image Descriptor" suivie des données compressée.
    La confusion se fait à cause de l'image de départ (voir mon autre réponse dans l'autre post, piouf)

    Step 1: Copy destination to backup buffer
    Always executed before first frame and only once.
    Done in constructor.

    J'espère que tu comprend un peu mieux expliqué comme ça.

    Citation Envoyé par Jipété Voir le message
    Car c'est suffisamment le bazar comme ça, avec des compos qui ne suivent pas les specs.

    Pour la question de l'autre sujet, va me falloir un peu de temps...
    Ce n'est pas les compos ce sont surtout tous ces logiciels créateur de gif, qui ne suivent pas les recommandations.
    • "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

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Ok je pense avoir une idée.
    Dans le projet pourrais-tu juste rajouter un label et au début de l'évènement OnShow de la form rajouter cela stp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Label.Caption := LangManager.OSLanguage;
    Peux tu me donner la valeur affichée ?
    C'est rien ! C'est vide, à tel point que j'ai testé ainsi, histoire de ne pas être fou,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TMainForm.FormShow(Sender: TObject);
    Begin
    // Label7 posé en haut à gauche sur Panel6
      Label7.Caption := LangManager.OSLanguage;
      Label7.Caption := 'test'; // pour tester, histoire de ne pas mourir idiot
      if LangManager.Language = 'fr' then cbxLang.ItemIndex := 0 else cbxLang.ItemIndex := 1;
    end;
    et que dans ce contexte je vois bien le mot "test" affiché.
    Oui, j'en suis là, tellement tout barre en quenouilles...



    Citation Envoyé par BeanzMaster Voir le message
    Tandis que je vois le mot invisible (zut alors j'arrive à voir un truc qui ne se voit pas ) toi tu tu as le petit Larousse qui se ramène en courant. .
    Blague à part tu te compliques la vie prend le mot dans son contexte, [ --snip--]
    (j'étudierai le reste plus tard, s'il me reste du temps avant le tombeau, lis ci-après tu vas comprendre où passe mon temps précieux)

    Les mots ont une importance capitale, bon sang !

    Regarde ce qu'on trouve dans les 15 possibilités de CopyMode ; en rapprochant ces deux-là et en les extrayant de cette liste indigeste, on voit tout de suite (c'est moi qui rajoute "[Dst]") les différences de comportements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     1: cm := cmDstInvert;  // Inverts the image on the [Dst] canvas and ignores the source.
    12: cm := cmSrcInvert;  // Combines the image on the [Dst] canvas and the source bitmap with XOR operator.
    Ce qui m'a mis la puce à l'oreille (sale bête !), c'est de m'arracher les cheveux devant des images qui n'avaient aucun sens, regarde, sous XP et Laz 1.8.2 à g. la source à dr. la destination, et de haut en bas le programme en mode départ, puis après le choix 1 et enfin après le choix 12 :
    Nom : compar_dstinvert_srcinvert.png
Affichages : 381
Taille : 31,1 Ko

    Quand on compare simplement les mots DstInvert et SrcInvert, on ne s'attendrait pas à une telle différence de rendu, enfin, moi, en tout cas, je ne m'y attendais pas.

    Après, je passe des heures à chercher un bug dans mon code alors qu'il n'y en a pas.

    En plus, dans tout le blabla d'explication des 15 options de CopyMode, il faut traduire "the image" par "the colors of the image sans tenir compte de sa géométrie".

    Allez, on va conclure avec le choix 11, "SrcErase", qui, comme son nom ne l'indique surtout pas, "Inverts the image on the [Dst] canvas and combines the result with the source bitmap with AND operator".
    Nom : srcerase.png
Affichages : 325
Taille : 18,9 Ko

    "Erase", ça dit bien ce que ça veut dire, non ? Hé bien ça ne le fait pas : le colorpicker montre la zone entre le E et le L dans la destination.

    Je t'admire d'avoir réussi à mener à bien ton compo dans ce contexte, j'admire Johann et son BGRA, il y a plein de gens que j'admire et moi je reste planté là comme une poule qui aurait trouvé un couteau, face à des mots qui ne font pas ce qu'ils expriment...

  14. #34
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut,
    Citation Envoyé par Jipété Voir le message
    C'est rien ! C'est vide, à tel point que j'ai testé ainsi, histoire de ne pas être fou,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TMainForm.FormShow(Sender: TObject);
    Begin
    // Label7 posé en haut à gauche sur Panel6
      Label7.Caption := LangManager.OSLanguage;
      Label7.Caption := 'test'; // pour tester, histoire de ne pas mourir idiot
      if LangManager.Language = 'fr' then cbxLang.ItemIndex := 0 else cbxLang.ItemIndex := 1;
    end;
    et que dans ce contexte je vois bien le mot "test" affiché.
    Oui, j'en suis là, tellement tout barre en quenouilles...
    Bizarre surtout que la fonction provient du wiki http://wiki.freepascal.org/Translati...e_syst.C3.A8me



    Citation Envoyé par Jipété Voir le message
    Les mots ont une importance capitale, bon sang !
    Je suis d'accord avec toi mais un mot peux avoir plusieurs sens, il faut tenir compte du contexte. Tu es trop cartésien (ce n'est pas une critique, cela à du bon aussi), mais tu cherches trop la complications des fois. Restes simple et la logique suivra.

    Citation Envoyé par Jipété Voir le message
    Regarde ce qu'on trouve dans les 15 possibilités de CopyMode ; en rapprochant ces deux-là et en les extrayant de cette liste indigeste, on voit tout de suite (c'est moi qui rajoute "[Dst]") les différences de comportements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     1: cm := cmDstInvert;  // Inverts the image on the [Dst] canvas and ignores the source.
    12: cm := cmSrcInvert;  // Combines the image on the [Dst] canvas and the source bitmap with XOR operator.
    Ce qui m'a mis la puce à l'oreille (sale bête !), c'est de m'arracher les cheveux devant des images qui n'avaient aucun sens, regarde, sous XP et Laz 1.8.2 à g. la source à dr. la destination, et de haut en bas le programme en mode départ, puis après le choix 1 et enfin après le choix 12 :

    Quand on compare simplement les mots DstInvert et SrcInvert, on ne s'attendrait pas à une telle différence de rendu, enfin, moi, en tout cas, je ne m'y attendais pas.

    Après, je passe des heures à chercher un bug dans mon code alors qu'il n'y en a pas.

    En plus, dans tout le blabla d'explication des 15 options de CopyMode, il faut traduire "the image" par "the colors of the image sans tenir compte de sa géométrie".

    Allez, on va conclure avec le choix 11, "SrcErase", qui, comme son nom ne l'indique surtout pas, "Inverts the image on the [Dst] canvas and combines the result with the source bitmap with AND operator".

    "Erase", ça dit bien ce que ça veut dire, non ? Hé bien ça ne le fait pas : le colorpicker montre la zone entre le E et le L dans la destination.
    Je suis totalement d'accord avec il y a des cas comme ici ou sa manque clairement de clarté. Et les termes choisis inappropriés ou incomplet. Le meiux c'est de faire comme tu l'as fait il faut expérimenter.

    Citation Envoyé par Jipété Voir le message
    Je t'admire d'avoir réussi à mener à bien ton compo dans ce contexte, j'admire Johann et son BGRA, il y a plein de gens que j'admire et moi je reste planté là comme une poule qui aurait trouvé un couteau, face à des mots qui ne font pas ce qu'ils expriment...
    [/Quote]
    Merci du compliment, mon truc c'est que lorsque je tombe sur un problème je le divise en plusieurs petits problèmes. J'analyse et j'essaye d'être le plus logique possible (sans trop tenir compte des informations que je trouve, pour ne pas m'embrouiller l'esprit). Je prend l'exemple du format GIF avec sons "DisposalMode" dans le fichier tu peux avoir une palette global avec un index défini pour la couleur du fond, puis tu as x images Si l'indice de couleur de fond est présent on efface avant avec celle-ci (quelle soit transparente ou pas) . La 1ere image de l'animation doit forcément être afficher, si elle contient des partie transparente alors on gère. Si non on affiche simplement l'image complète et ainsi de suite.

    Pour le graphisme, le mieux que je puisse te conseiller c'est de partir de la classe TFastBitmap et de jouer avec TColor24 et TColor32 pour tester et comprendre tout ces petits trucs. Dans le PDF que tu as mis en lien (dans l'autre discussion il me semble) les différents mode sont relativement bien expliquer. Je te donne un exemple facile pour compléter TFastBitmap

    Imaginons on veux pouvoir dessiner un rectangle plein.
    La solution est plutôt facile. Nous avons plusieurs choix :

    - Remplir Pixel par Pixel la surface définie par X1,Y1, Largeur, Hauteur (ou bien X1,Y1,X2,Y2)
    - Remplir la surface ligne par ligne. Ce qui nécessite de pouvoir dessiner des lignes horizontales ou verticales.

    Exemple dessinons une ligne horizontale

    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
    Type
      TFastBitmap = Class
      public
        procedure HLine(X,Y,X2 : Integer; aColor : TColor32);
     
    procedure HLine(X,Y,X2 : Integer; aColor : TColor32);
    Var
     PixelPtr : PColor32; // Pointer dans le buffer (FData)
     W,I : Integer;
    begin
      PixelPtr := GetPixelPtr(X,Y); // on se place 
      if X2 > FWidth then X2 := FWidth -1; // Il faudrait d'abord tester si X>X2 inverser si besoin et également tester si X<0
      W := X2 - X;
      I:=0; // Attention on commence à zero 
      While I<W do  // plus rapide que for..to..do  et on parcours jusqu'a W-1 car on commence à zero
      begin
         PixelPtr^:= aColor; // on assigne notre couleur
         inc(I);  // on incremente le compteur
         Inc(PixelPtr); // On avance de un pixel
      end;
    end;
    C'est très basique ici. Je n'ai plus le temps mais je t'enverrai un mp ce soir sur le sujet, pour les couleurs sur les opérateurs and, not, or.....

    Bonne fin de journée
    • "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

    Mes projets sur Github - Blog - Site DVP

  15. #35
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    J'espère que vous ne m'en voudrez pas de m'incruster dans vos échanges très instructifs (perso, j'apprends pas mal de choses concernant le graphisme). Je n'ai pas encore pratiqué / essayé, mais mon cahier de prise de notes se remplit

    Concernant le pb de traduction rencontré par Jipété :

    Citation Envoyé par BeanzMaster Voir le message
    Bizarre surtout que la fonction provient du wiki http://wiki.freepascal.org/Translati...e_syst.C3.A8me
    Le code sur le wiki utilise, pour Linux, la recherche de la valeur de la variable d'environnement LC_CTYPE via la fonction GetEnvironmentVariable. Sur mon Ubuntu 16.04 LTS, la variable locale est bien renseignée (LC_CTYPE="fr_FR.UTF-8"), variable visualisable avec la commande "locale".

    Je n'ai pas encore regardé plus en détail pourquoi, mais la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetEnvironmentVariable('LC_CTYPE')
    renvoie une chaîne vide ... Le pb vient donc plus précisément de cette fonction qui ne renvoie pas le contenu de la variable locale "LC_CTYPE"

    J'ai remplacé la variable "LC_CTYPE" par "LANG" et la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetEnvironmentVariable('LANG')
    me renvoie une chaîne contenant "fr_FR.UTF-8" qui est la même chose que la variable locale LC_CTYPE.

    Dans le code du wiki, en remplaçant "LC_CTYPE" par "LANG", la fonction GetOSLanguage renvoie "fr", ce qui correspond bien aux 2 premiers caractères du contenu de la variable locale LC_CTYPE.

    D'ailleurs, je ne comprends pas trop pourquoi ils ont utilisé LC_CTYPE au lieu de LANG

    Désolé pour cette incursion dans vos échanges.

    Bonne soirée.

    Cdt

    Laurent

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Bizarre surtout que la fonction provient du wiki http://wiki.freepascal.org/Translati...e_syst.C3.A8me
    Non, c'est normal, j'ai récupéré le bout de code, l'ai collé dans un bouton, l'ai exécuté et ça retourne vide,

    Alors j'ai fait la dernière manip possible, dans une console, echo $LC_CTYPE et ça aussi ça retourne vide.
    Et je ne sais pas pourquoi, et n'ai vraiment pas envie de chercher : il doit y avoir un paramètre à la onc planqué dans un coin, ça va encore demander des heures, je ne les ai pas.
    Fermez le ban.


    Quant au TFastBitmap, je t'avouerai franchement que quand je vois des lignes de code avec chapeau (^), ça me file des boutons...

    En plus, je suis en train de reprendre à zéro toute ma cuisine basée sur ScanLine (j'avais fait de jolis dégradés ily a un ou deux ans) car j'ai découvert qu'il suffit de vouloir utiliser des tailles pas orthodoxes pour que tout parte en vrac et en avant les traits verticaux colorés sur toute la largeur de l'image, genre joli dégradé avec cible en 64x128 et tout en vrac si 65x127.
    Je sens qu'il va encore falloir jouer du padding...

    On reparlera du gif quand je pourrai faire rentrer un fichier bmp dans un timage en passant par Scanline. D'ici là, je ne sors pas de ce truc.
    Cent fois sur le métier remets-toi à l'ouvrage, qu'il disait, le monsieur.
    Citation Envoyé par BeanzMaster Voir le message
    Bonne fin de journée
    Exténué, sur les rotules, et les yeux qui ne voient plus rien.
    À part ça, ça va

    Citation Envoyé par inforock Voir le message
    Bonsoir,

    J'espère que vous ne m'en voudrez pas de m'incruster dans vos échanges très instructifs (perso, j'apprends pas mal de choses concernant le graphisme). Je n'ai pas encore pratiqué / essayé, mais mon cahier de prise de notes se remplit

    Concernant le pb de traduction rencontré par Jipété : [...]
    Ah ben voilà, les grands esprits se rencontrent,

    Tu es le bienvenu et ces forums appartiennent à tous, nous n'en sommes pas propriétaires, sauf si ça se mesure aux gouttes de sueur, de sang et de larmes,

    Citation Envoyé par inforock Voir le message
    D'ailleurs, je ne comprends pas trop pourquoi ils ont utilisé LC_CTYPE au lieu de LANG
    Parce que c'est des boulets !
    Pour se coucher moins bête, les deux premiers points du chapitre 3.1, et par curiosité le chapitre 3.3, par curiosité car en ce qui me concerne, le fichier cité est vide.

  17. #37
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Chez moi aussi, cette commande echo $LC_CTYPE fait juste un saut de ligne comme résultat ...

    Merci pour le lien chapitre 3.1

    Toujours est-il qu'apparemment, la fonction GetEnvironmentVariable a un soucis pour lire le contenu des variables locales LC_xxxxx. Je viens d'essayer avec LC_NUMERIC et LC_TIME ... même punition : chaîne vide en retour !

    D'ailleurs, à priori, d'autres ont eu aussi des problèmes pour avoir les valeurs des variables d'environnement (vu sur le forum de freepascal) https://forum.lazarus.freepascal.org...?topic=37239.0 ...

    J'ai essayé la fonction GetEnvironmentVariableUTF8 (au cas où) et même résultat : chaîne vide avec une variable LC_xxxxxx

    Si j'ai un peu de temps, j'essaierais d'approfondir durant le week-end.

    Bonne soirée.

    Cdt

    Laurent

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par inforock Voir le message
    Toujours est-il qu'apparemment, la fonction GetEnvironmentVariable a un soucis pour lire le contenu des variables locales LC_xxxxx. Je viens d'essayer avec LC_NUMERIC et LC_TIME ... même punition : chaîne vide en retour !

    Ne pas confondre la cause et l'effet : c'est parce que la variable est vide dans l'environnement Linux que le programme qui s'appuie sur GetEnvironmentVariable affiche une ligne vide.

  19. #39
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

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

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut Laurent
    Citation Envoyé par inforock Voir le message
    Bonsoir,

    J'espère que vous ne m'en voudrez pas de m'incruster dans vos échanges très instructifs (perso, j'apprends pas mal de choses concernant le graphisme). Je n'ai pas encore pratiqué / essayé, mais mon cahier de prise de notes se remplit
    .....
    Désolé pour cette incursion dans vos échanges.
    Aucun soucis, bien au contraire le partage de ces problèmes ou astuces font avancer. Et plus on est, plus on rit Bienvenue dans nos sombre problèmes lié au vaudou

    Citation Envoyé par inforock Voir le message
    Le code sur le wiki utilise, pour Linux, la recherche de la valeur de la variable d'environnement LC_CTYPE via la fonction GetEnvironmentVariable. Sur mon Ubuntu 16.04 LTS, la variable locale est bien renseignée (LC_CTYPE="fr_FR.UTF-8"), variable visualisable avec la commande "locale".

    Je n'ai pas encore regardé plus en détail pourquoi, mais la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetEnvironmentVariable('LC_CTYPE')
    renvoie une chaîne vide ... Le pb vient donc plus précisément de cette fonction qui ne renvoie pas le contenu de la variable locale "LC_CTYPE"

    J'ai remplacé la variable "LC_CTYPE" par "LANG" et la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GetEnvironmentVariable('LANG')
    me renvoie une chaîne contenant "fr_FR.UTF-8" qui est la même chose que la variable locale LC_CTYPE.

    Dans le code du wiki, en remplaçant "LC_CTYPE" par "LANG", la fonction GetOSLanguage renvoie "fr", ce qui correspond bien aux 2 premiers caractères du contenu de la variable locale LC_CTYPE.

    D'ailleurs, je ne comprends pas trop pourquoi ils ont utilisé LC_CTYPE au lieu de LANG
    Merci pour les infos. Je suis un "débutant" sous Linux je ne me suis jamais penché sur genre de chose (encore). Je vais modifié la routine.

    Citation Envoyé par inforock Voir le message
    Bonsoir,

    Chez moi aussi, cette commande echo $LC_CTYPE fait juste un saut de ligne comme résultat ...

    Merci pour le lien chapitre 3.1

    Toujours est-il qu'apparemment, la fonction GetEnvironmentVariable a un soucis pour lire le contenu des variables locales LC_xxxxx. Je viens d'essayer avec LC_NUMERIC et LC_TIME ... même punition : chaîne vide en retour !

    D'ailleurs, à priori, d'autres ont eu aussi des problèmes pour avoir les valeurs des variables d'environnement (vu sur le forum de freepascal) https://forum.lazarus.freepascal.org...?topic=37239.0 ...

    J'ai essayé la fonction GetEnvironmentVariableUTF8 (au cas où) et même résultat : chaîne vide avec une variable LC_xxxxxx
    Merci pour le lien dans tous les cas sur mon Mac la variable de Langue est bien lue et s'affiche avec la routine du Wiki.

    Citation Envoyé par inforock Voir le message
    Si j'ai un peu de temps, j'essaierais d'approfondir durant le week-end.
    Merci. De mon coté je vais allez jeter un œil dans le code de GetEnvironmentVariable

    Citation Envoyé par Jipété Voir le message
    Quant au TFastBitmap, je t'avouerai franchement que quand je vois des lignes de code avec chapeau (^), ça me file des boutons...

    En plus, je suis en train de reprendre à zéro toute ma cuisine basée sur ScanLine (j'avais fait de jolis dégradés ily a un ou deux ans) car j'ai découvert qu'il suffit de vouloir utiliser des tailles pas orthodoxes pour que tout parte en vrac et en avant les traits verticaux colorés sur toute la largeur de l'image, genre joli dégradé avec cible en 64x128 et tout en vrac si 65x127.
    Je sens qu'il va encore falloir jouer du padding...

    On reparlera du gif quand je pourrai faire rentrer un fichier bmp dans un timage en passant par Scanline. D'ici là, je ne sors pas de ce truc.
    Si tu n'aime pas le ^ tu es mal barré avec Scanline pour le format BMP tu peux toujours regarder dans mon unité BZImageFileBMP.pas elle bourrée de petits commentaires qui te seront utiles. Et pour infos c'est gràce à une de nos discussions ici que j'ai pu y arriver A Bientôt sur un nouveau sujet "made in Jipete"

    Bonne fin de soirée. Je suis claqué je me suis pris 100 couverts aujourd'hui
    • "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

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Merci pour le lien dans tous les cas sur mon Mac la variable de Langue est bien lue et s'affiche avec la routine du Wiki.
    Parce qu'elle est renseignée dans l'OS.

    Tiens, tu devrais rajouter un truc genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      fbl := Copy(GetEnvironmentVariable('LC_CTYPE'), 1, 2);
      if fbl = '' then
       fbl := Copy(GetEnvironmentVariable('LANG'), 1, 2);
      if fbl = '' then signale_erreur_et_invalide_la possibilité_de_changer_de_langage
    De mon côté, en utilisant LANG dans gvtranslate le label de test est bien rempli avec 'fr' mais basculer la combo sur 'en' ne change pas le fait que l'appli redémarre en 'fr'.
    Go figure...

    J'ai rajouté ça showmessage(inttostr(Application.ParamCount) +' '+Language); à la fin du gvlanguage.Create;, compil, exécution hors EDI, ça donne "0 fr" je modifie en "en" ça redémarre et ça donne "3 en", cool, sauf que la combobox affiche toujours "fr".


    Citation Envoyé par BeanzMaster Voir le message
    Citation Envoyé par Lipété:10336850
    Je sens qu'il va encore falloir jouer du padding...
    Si tu n'aimes pas le ^ tu es mal barré avec Scanline pour le format BMP tu peux toujours regarder dans mon unité BZImageFileBMP.pas elle est bourrée de petits commentaires qui te seront utiles.
    Même pas besoin, j'ai retrouvé une vieille procédure StretchDown notée "AndNotor" () qui fonctionne du feu de Dieu et qui, contrairement à son nom, peut aussi faire du StretchUp, testé avec un fichier tordu de 177x111, tout juste bon à planter mes vieilles routines et là, nickel chrome !

    Plus qu'à y adapter la prise en compte du canal alpha et mon bonheur sera complet !

    Cadeau (procédure adaptée en fonction + prise en compte D7/Fpc par ma pomme) :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
      function StretchDown(var BmpS, BmpD: TBitmap): boolean;// Andnotor
      var
        PS, PD: PByte;
        WidthS, WidthD: integer;
        PaddingD :integer;
        NbBytes, IncX, IncY, X, Y: integer;
        StepX, StepY :integer;
      begin
        Result := False;
        //Largeur d'une ligne y compris Padding
        {$IFDEF FPC}
        widthS := uint(bmpS.RawImage.GetLineStart(1)) - uint(bmpS.RawImage.GetLineStart(0));
        widthD := uint(bmpD.RawImage.GetLineStart(1)) - uint(bmpD.RawImage.GetLineStart(0));
        {$ELSE} // D7
        WidthS := integer(BmpS.Scanline[0]) -integer(BmpS.Scanline[1]);
        WidthD := integer(BmpD.Scanline[0]) -integer(BmpD.Scanline[1]);
        {$ENDIF}
     
        try
          //Nombre d'octets par pixel
          NbBytes := WidthS div BmpS.Width;
     
          //Calcul du pas
          StepX := (BmpS.Width  shl 16) div BmpD.Width;
          StepY := (BmpS.Height shl 16) div BmpD.Height;
     
          //Calcul des alignements
          PaddingD := WidthD mod BmpD.Width;
     
          //Début du tableau de pixels
          {$IFDEF FPC}
          bmpD.BeginUpdate();
          PS := bmpS.RawImage.GetLineStart(0);
          PD := bmpD.RawImage.GetLineStart(0);
          {$ELSE} // D7
          PS := bmpS.Scanline[BmpS.Height -1];
          PD := bmpD.Scanline[BmpD.Height -1];
          {$ENDIF}
     
          for Y := 0 to BmpD.Height -1 do begin
            IncY := (Y *StepY) shr 16 *WidthS;
            inc(PS, IncY);
            for X := 0 to BmpD.Width -1 do begin
              IncX := (X *StepX) shr 16 *NbBytes;
              inc(PS, IncX);
              Move(PS^, PD^, NbBytes);
              dec(PS, IncX);
              inc(PD, NbBytes);
            end;
            dec(PS, IncY);
            inc(PD, PaddingD);
          end;
          Result := True;
        finally
          {$IFDEF FPC}
          bmpD.EndUpdate();
          {$ENDIF}
        end;
      end;
    Citation Envoyé par BeanzMaster Voir le message
    je me suis pris 100 couverts aujourd'hui
    À dresser à préparer à servir à faire la vaisselle ? Vi, je compatis,
    Bon week-end, repose-toi,

Discussions similaires

  1. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  2. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  3. Réponses: 18
    Dernier message: 03/06/2010, 10h09
  4. [Tests] Annonces de composants, extensions, frameworks etc.
    Par Community Management dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 06/01/2009, 13h33
  5. [Joomla!] Composant Joomla pour annonces de ventes
    Par young077 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 07/08/2007, 02h32

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