Forum Programmation.autre Juste afficher un point à l’écran

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
6
12
avr.
2025

Bonjour.
Je veux faire quelque chose qui me semblais extrêmement simple il y as 20 ans (ou 22 … 25 … 28 … Merde, je suis vieux) mais qui semble très compliqué aujourd’hui : Afficher un point de couleur à l’écran.

A l’époque, QuickBasic 4.5, MS-DOS et un ordinateur qui dépassais même (un peu) les 150 MHz. Trois lignes de codes suffisais à afficher un point. La porte ouverte à des armées de points de toute les couleurs avec pour seule limite l’imagination … et la résolution d’écran.

J’ai cru hier trouver mon saint graal avec un tout simple module GO pour écrire des points dans le framebuffer.
Le module tiens en trois fichiers et ne permet que trois choses :
- Se connecter sur /dev/fb0
- Renvoyer la résolution de l’affichage disponible
- Dessiner un point aux coordonnée X Y avec la couleur RGBA

Simple, minimaliste : Tout ce que je veux (avec les résolutions modernes à portée de main).
… sauf que /dev/fb0 existe plus (en tout cas pas sur la Fedora sur laquelle j’ai essayé), ça serais un vieux truc dépassé avec l’étiquette «Déprécié» depuis une décennie.

Soit, je veux bien.
Je suis pas forcément un très grand développeur, mais j’ai cette manie de coder avec la documentation et d’éviter tout ce qui est déprécié.

Mais comment on fait pour juste afficher un point de façon moderne, pérenne, durable … mais, et peu être surtout : Le plus sobrement possible.

Sans empiler les framework, toolkits et autres couches d’abstractions qui font de nos applications modernes des pachydermes (mais non j’ai rien contre PHP) prêt à engloutir la mémoire RAM par Gigaoctet.

J’arrive au bout de ce que je sais réfléchir moi même, mais peu être certains d’entre vous on ils eu des questions semblables.

--
Tout ceci s’inspire de quelques idée poussé par T.Nitot et Ploum

  • # Simple DirectMedia Layer

    Posté par  . Évalué à 7 (+7/-1).

    Je ne connais pas le contexte dans lequel tu as besoin d'un rendu graphique, mais SDL est peut-être une piste à étudier. Il y a un site avec des exemples, et en particulier un avec des primitives (code source en bas de page) pour te faire une idée. C'est un peu plus abstrait qu'un accès direct à une mémoire vidéo, mais sans être trop lourdingue et avec beaucoup d'avantages (portabilité…).

    • [^] # Re: Simple DirectMedia Layer

      Posté par  . Évalué à 1 (+1/-1).

      Désolé, j'ai cliqué sans le vouloir sur "inutile". Peut-on corriger le vote en un vote positif ?

    • [^] # Re: Simple DirectMedia Layer

      Posté par  (site web personnel) . Évalué à 4 (+2/-0).

      Je répond plus tardivement à cette piste du SDL, car elle est effectivement intéressante et qu’elle mérite que je prenne plus de temps pour y répondre.

      J’ai passé la soirée de dimanche entre «Pourquoi l’exemple il compile pas ?» et «Ça s’utilise comment "gcc" ?» pour qu’un gcc primitive.c -o prog -lSDL3 finisse par me créer un petit programme.

      Donc, oui, c’est une librairie d’abstraction, qui est notamment assez largement utilisé dans les jeux et les émulateurs (qui cherchent à afficher autre chose que les widgets de l’interface du système)

      Après c’est très portable, et du C est presque le graal du minimalisme (ou alors faut taper dans de l’assembleur … mais j’ai pas trop envie).

      Je continue à suivre la piste.

  • # Back to BASIC

    Posté par  . Évalué à 5 (+3/-0).

    Go étant un langage développé par Google pour l'utilisation en backend sur les serveurs, le graphisme / GUI n'est pas son point fort. Puisque tu évoques le QuickBASIC tu peux utiliser un de des cousins : FreeBASIC. C'est un compilateur BASIC multi plateforme (FreeBSD, Linux, Windows) compatible avec la syntaxe QuickBASIC y compris les fonctions graphiques.

    Titre de l'image

    • [^] # Re: Back to BASIC

      Posté par  (site web personnel) . Évalué à 4 (+2/-0).

      Je suis un peu touche à tout du numérique, dont différents langages informatiques.
      Je prend même un certain plaisir à faire du CSS … le coté graphiste qui s’exprime un peu.

      Le GO n’est qu’un des langages sur lesquels je bricole, plutôt celui avec lequel je travaille (et monte en compétence) en ce moment. Mais pas forcément celui que je tiens absolument à utiliser pour faire un projet différent.

      Il y as effectivement différents dialectes de BASIC, plus ou moins confidentiels, dont un «QB64» qui as quelques fork, qui se veux pleinement dans l’esprit du QuickBasic de l’époque.
      Il y as aussi Processing, pleinement orienté vers la création graphique.

      Je prend l’idée.
      Et je cherche peu être une simplicité, un coté très direct, qui n’existe plus vraiment.

    • [^] # Re: Back to BASIC

      Posté par  (site web personnel, Mastodon) . Évalué à 3 (+2/-0).

      De ce que je comprends son problème est qu'il y a toujours une fenêtre. On dessine dans une application qui est encapsulée dans une fenêtre. Pour ne pas avoir la fenêtre il faut aller au niveau au dessus. Peut être aller sur les tutos pour dessiner un Widget. Le problème c’est qu’il risque d’être dépendant d’un gestionnaire de fenêtre (Gnome ou KDE ou …)
      Sinon il faut aller au niveau du dessus. Un tutoriel Wayland pour faire sa surcouche…

      Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

      • [^] # Re: Back to BASIC

        Posté par  (site web personnel) . Évalué à 4 (+2/-0).

        Ce qui as changé depuis mes programmes sous Dos est effectivement qu’il y as une fenêtre. Et aujourd’hui les applications se séparent entre Non Graphique et Graphique.

        Je fait pas mal de petits programmes en GO ou Python, qui n’affichent rien.
        Parfois elles affichent quelques lignes dans le terminal, c’est assez simple dans de très nombreux langages.
        J’ai un programme que j’ai créer il y as peu (en GO) qui génère des rapports en PDF suite à son traitement.

        Mais quand on veux faire une application Graphique, il faut gérer un élément parmi plein d’autres, sa fenêtre parmi les autre des autres programmes, la tout dans une cohérence graphique cohérente. Et ça deviens vite compliqué : Beaucoup plus qu’un print() pour afficher une information dans un terminal.

        Même en GO, qui n’est pas vraiment fait pour, j’ai réussi à faire afficher un message d’erreur. Le bout de code fait un appel direct à l’api Win32, et reste assez simple pour que j’arrive à le comprendre.

        —-

        Ce que j’aimerais c’est avoir une toile vierge dans laquelle dessiner librement et simplement.
        Que cette toile soit une fenêtre ou plein écran, dans ou hors d’un compositeur Xorg ou Wayland … ça m’importe peu. Écrire directement dans la mémoire graphique (framebuffer), hors d’un compositeur, d’un gestionnaire de fenêtre, d’un bureau n’est pas un problème.
        Je ne cherche pas de vitesse, de possibilité avancée, ni autre chose.

        —-

        Oui, il y as plein d’idée que j’ai l’envie de voir naître derrière cette simplicité, et surtout beaucoup que je suis parfaitement incapable de développer tout seul.
        Mais pour l’ « Appel aux développeurs pour un projet (un peu) fou » j’attendrais de faire un journal sur le sujet :)

      • [^] # Go into console/term

        Posté par  (site web personnel, Mastodon) . Évalué à 3 (+1/-0).

        N’oublions pas que l’application qui est encapsulée dans une fenêtre était la fenêtre dans les années 70—80—90 ; et donc peut-être que la demande est de dessiner directement au niveau du terminale… Partant de cette supposition, j’oriente vers

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: Back to BASIC

      Posté par  (site web personnel, Mastodon) . Évalué à 5 (+4/-0). Dernière modification le 13 avril 2025 à 00:45.

      Sinon
      https://linuxfr.org/users/tarnyko/journaux/wayland-l-obsession-eternelle-du-carre-blanc

      Sous licence Creative common. Lisez, copiez, modifiez faites en ce que vous voulez.

  • # surpris

    Posté par  . Évalué à 1 (+1/-1).

    j'ai pas approfondi le sujet de suite, il me semble que cela fonctionne toujours et doit être en natif ou autre choses équivalent, c'est ce qui permet d'afficher les fameux OK en couleur en 1280x1024 au démarrage de linux, a defaut d'avoir perdu le petit linux qui s'affichait

    essaye lsmod | grep fb et regarde si c'est les option dans default ou qqpart sont bien active, cela depends peut etre de ta distribution, c'est laquelle ?

    • [^] # Re: surpris

      Posté par  . Évalué à 7 (+4/-0).

      si je ne me trompes pas le framebuffer se deactive quand le pilote graphique de la carte se lance pour gerer l'affichage en pleine resolution et afficher le prompt de login graphique, puis le bureau une fois la session ouverte.

      si on veut garder l'usage du framebuffer, il faudrait ne pas lancer d'interface graphique

      • [^] # Re: surpris

        Posté par  . Évalué à 1 (+1/-1).

        oui je pense que c'est cela, il faut démarrer en mode console car une fois X ou wayland lancé impossible de l'avoir de nouveau SAUF si x ou wayland se lance en frame buffer aussi, ca arrivé assez souvent avec les carte graphique dans les années 2000, pas de drivers -> pouf x en frame buffer et accessible en console

      • [^] # Re: surpris

        Posté par  . Évalué à 4 (+2/-0).

        Ce n'est pas comme ça que j'ai compris le fonctionnement …. il me semble que tu peux faire cohabiter frame buffer et X mais que justement il ne faut pas que X utilise le frame buffer. Tu switche entre X et frame buffer via ctrl+alt+Fn. Je voulais le tester d'ailleurs mais j'ai un problème de bascule via ctrl+alt+Fn (voir mon appel en forum).

    • [^] # Re: surpris

      Posté par  (site web personnel) . Évalué à 3 (+1/-0).

      La machine sur laquelle j’ai testé est fraichement installé sous Fedora.
      Les terminaux non graphiques (tty2/3/4) s’affiche dans la résolution native de l’écran, et donc assez loin de l’ancien standard des 80 colonnes. J’était justement passé sur un terminal non graphique (le CTRL + ALT + F2 fonctionne toujours :) ) pour essayer mon bout de librairie et éviter de rentrer en conflit avec un serveur graphique X ou Wayland.

      C’est suite à une erreur /dev/fb0 introuvable que j’ai constaté sa disparition.
      Mais peu être qu’il pourrais se retrouver soit sur une autre distribution, soit dans une installation plus minimaliste.

      • [^] # Re: surpris

        Posté par  (site web personnel) . Évalué à 4 (+1/-0).

        Ce n'est pas un problème de distribution, c'est un problème de pilotes.

        La pile graphique moderne est très complexe, pour des raisons de perfs un Framebuffer à l'ancienne n'est plus du tout d'actualité dans le noyau Linux et a été remplacé par DRM qui a un fonctionnement plus complexe.
        Seuls quelques pilotes pour des systèmes embarqués peuvent avoir encore un usage du framebuffer car les pilotes graphiques de ces appareils sont plus simples mais peut être qu'un jour ils seront évincés du noyau aussi.

        Du coup sur PC moderne tu n'as aucun moyen de retrouver ce framebuffer en l'état avec Linux.

        • [^] # Re: surpris

          Posté par  . Évalué à 0 (+0/-1).

          je me permet encore de douter il est probable que tu ai raison mais de ce que je vois un peu partout c'est toujours d'actualité (c'est tellement pratique!)

          https://www.kernelconfig.io/config_fb?q=&kernelversion=6.14.2&arch=x86

          mais peut être que rien n'est à jour !

          https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/drivers/video/fbdev?h=v6.14.2

          je reste persuadé que c'est du a sa configuration de fedora, il faut qu'il active son framebuffer device, j'ai su le faire il y a quelques années, peut etre voir coté chatgpt

          • [^] # Re: surpris

            Posté par  (site web personnel) . Évalué à 5 (+2/-0).

            mais peut être que rien n'est à jour !

            Tu montres juste que l'option existe dans le noyau, pas que les pilotes des cartes graphiques modernes dans un PC s'en servent.

            je reste persuadé que c'est du a sa configuration de fedora, il faut qu'il active son framebuffer device, j'ai su le faire il y a quelques années, peut etre voir coté chatgpt

            Par exemple dans ma Fedora Linux qui a une config noyau standard, l'option que tu pointes est bien activée.
            Le problème n'est donc pas là.

            • [^] # Re: surpris

              Posté par  . Évalué à 1 (+1/-1).

              si il a une carte Nvidia forcement c'est mort

              et concernant la fin de vie tu insiste, moi aussi ! depuis le début dans les sources du noyau lorsqu'une partie va être supprimé ou arrêter, il y a des annonces et c'est mentionné que cela va être retiré du noyau dans les sources concerné.

              dans tous fbdev/ il n'y en a aucune mention

              j'ai prouvé que c'etait viable, aurait tu un quelconque lien vers lkml ou un code source sur kernel.org qui PROUVE ce que tu dis ici ? la confiance n’empêche pas le contrôle et j'aimerais le contrôler.

              • [^] # Re: surpris

                Posté par  (site web personnel) . Évalué à 4 (+1/-0).

                j'ai prouvé que c'etait viable, aurait tu un quelconque lien vers lkml ou un code source sur kernel.org qui PROUVE ce que tu dis ici ?

                Tu n'as rien prouvé du tout.

                Le simple fait que ce ne soit pas dispo même quand l'option est active montre le contraire.

                La meilleure solution semble de récupérer un framebuffer virtuel via le sous-système DRM comme effectué ici : https://github.com/embear-engineering/drm-framebuffer
                Pas testé mais ça peut fonctionner, ça rempli le job voulu mais ne passe pas par l'ancienne interface et ajoute un peu de complexité pour obtenir le framebuffer.

                Évidemment cela ne peut pas fonctionner si un environnement graphique est lancé.

          • [^] # Double tranchant

            Posté par  (site web personnel) . Évalué à 4 (+2/-0).

            Ce que j’ai tendance à en comprendre, c’est que même si on peux encore le trouver (soit par une configuration, soit via une distribution qui as d’autres choix que Fedora), le FrameBuffer est plus proche de sa fin de vie qu’autre chose.

            Donc effectivement, pour jouer avec un écran et une vielle machine (même pas forcément connecté au réseau) ça doit encore être tout à fait fesable.

            Mais pour un projet qui pourrais se vouloir plus solide c’est peu être mieux d’éviter de se baser sur un truc en cour de disparition.

            —-
            Pour ma part n’ayant pas un projet spécifique mais plein d’idées, plus ou moins intelligente, ça peux convenir … ou pas … suivant les cas.

            Dans tout les cas ça fait avancer ma réflexion.

  • # Contexte

    Posté par  . Évalué à 3 (+0/-0). Dernière modification le 16 avril 2025 à 18:57.

    Mais comment on fait pour juste afficher un point de façon moderne, pérenne, durable … mais, et peu être surtout : Le plus sobrement possible.

    En fait, je pense que je n'ai pas connu l'époque où ça pouvait être intuitif, mais je n'arrive pas à comprendre ce que peut bien vouloir dire "afficher un point" sans plus de contexte. Afficher un point… où? Imaginons que je suis sous une distrib Linux quelconque, j'ai plusieurs bureaux, plusieurs fenêtres, des programmes qui tournent en arrière plan, des widgets qui restent au premier plan, etc. J'ouvre un (émulateur de) terminal et je lance "./affichepoint ", qu'est-ce qui est censé se passer?

    • l'émulateur de terminal devient tout noir sauf un pixel
    • une fenêtre blanche de 100x100 pixels (dont un qui n'est pas blanc) s'ouvre (pop-up) avec une barre classique du même style que les autres fenêtres de mon bureau
    • l'écran clignotte brutalement comme si on redémarrait le serveur graphique et on passe à un écran totalement noir (sauf un point) en faible résolution
    • rien ne se passe, sauf un point de l'écran qui change de couleur

    Les solutions logicielles pour chacune de ces options me semblent très différentes, ainsi que leur portabilité, la taille des dépendances, etc. Je pense que la notion de "dessiner des points sur l'écran" n'a pas de sens.

    À mon avis il y a deux couches qui n'ont rien à voir dans la question. La première est l'implémentation du champ de pixel (une matrice ou lattice) dont on va changer les valeurs. La deuxième couche est l'affichage de ce champ, qui va nécessairement faire appel à des bibliothèques graphiques en fonction du contexte. J'ai l'impression qu'à l'époque du framebuffer, on pouvait confondre les deux couches, parce qu'on pouvait modifier directement les zones de mémoire qui correspondaient aux pixels affichés, mais ça semble absurde avec une système fenêtré, personne ne souhaite que ça soit possible. Pour moi, tripoter les pixels en dehors de sa fenêtre, c'est comme tripoter la RAM en dehors de sa zone mémoire, c'est un comportement qui n'est absolument pas tolérable.

    Pour la solution, pourquoi ne pas carrément exporter le champ de pixel dans un format d'image (png?) qui pourra facilement être affiché avec le logiciel de son choix?

    • [^] # On parle d’un temps …

      Posté par  (site web personnel) . Évalué à 3 (+1/-0).

      Le premier IDE que j’ai véritablement utilisé est Microsoft QuickBasic qui fut édité entre 1985 et 1989. Il est assez représentatif des BASIC de l’époque (dont beaucoup était édité par Microsoft). La version que j’utilisais était un programme prévu pour MS-DOS, mais on trouvais des équivalent sur les ordinateurs Non PC des années 80.

      Deux ligne de code suffisent à afficher un point sur l’écran :
      SCREEN 12
      PSET (100,100)

      Le SCREEN12 correspond au VGA - Écran graphique en 640×480 en 16 couleurs configurable. Sous Windows l’affichage se fait en plein écran … sous DOS on est toujours en plein écran.
      Il faut que la carte graphique prenne en compte le mode voulu.
      Le QuickBasic avais 13 modes d’écran, avec leurs propres caractéristiques et pas tous avec des capacités graphiques.

      Le PSET (100,100) permet d’afficher un point aux coordonnées X = 100 & Y = 100, un troisième argument permettais de définir l’une des couleurs.

      D’un point à une image

      Afficher uniquement un point n’est pas très utile, et c’est en afficher plusieurs centaines qui est vraiment interessant. Certaines fonctions permettant quelques formes plus avancée : Ligne / Rectangle / Cercles.
      Même si du moment qu’on peux afficher un point, on peux créer des fonctions pour créer d’autres formes sur mesure.

      Dans les limites du mode d’affichage cela permet de créer ce que l’on veux comme graphismes, l’autre limite étant la dextérité du développeur.

      La différence avec ce qui se fait actuellement

      Aujourd’hui les framework graphiques dessinent des widgets, des éléments préconçus : Boutons, Listes, Étiquette, …
      C’est très bien pour avoir des interfaces cohérentes entre les différentes applications, des comportement semblables et les développeurs allergiques aux graphismes.

      J’ai plus l’âme d’un graphiste et cette envie de dessiner «Point par point» des choses à l’écran.

      Ce que je veux

      Dessiner des points, des lignes, des rectangles, … faire mes propres graphismes, détaché du système d’exploitation. Peu importe que cela soit dans une fenêtre ou en plein écran … j’aimerais juste pouvoir dépasser les 640×480 en 16 couleurs.

      De ce que j’ai essayé de la librairie SDL (suite au premier commentaire de ce message) elle fait plutôt ce que je veux : Afficher des points isolés et des triangles.
      À partir de ces essentiels, on peux coder des fonctions pour faire un peu tout ce que l’on veux comme graphismes, et inventer son bout de monde graphique.

      L’idée étant de pouvoir afficher quelque chose à l’écran, pas simplement de créer des images (Je me débrouille bien avec Inkscape pour cela)

      Quelques exemples

      Cela peux être du jeu (La librairie SDL gérant en plus les entrées), des animations, des interfaces, … ou plein d’autres choses.

      Des interfaces semblable à de l’embarqué, un compte à rebours pour le nouvel an qui s’affiche sur la TV, … laisser parler mon imagination …

      • [^] # Re: On parle d’un temps …

        Posté par  (site web personnel, Mastodon) . Évalué à 2 (+0/-0).

        Bref, retour à la DemoScene en gros

        “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: On parle d’un temps …

        Posté par  . Évalué à 1 (+0/-0).

        QBasic (et GwBasic au passage) permettaient effectivement un accès direct et facile au matériel, par contre ce n'est juste pas possible dans un contexte multi-taches.
        Imagine deux secondes différentes applications essayant chacune de configurer l'écran différemment (screen 0 et screen 12) qu'est-ce qui est censé se passer ?

        Maintenant il reste deux solutions:
        1. travailler bare-metal, c'est à dire sans OS en étant seul à utiliser le matériel. par contre il va falloir se coltiner la gestion dudit matériel qui s'est bien complexifié. Pour rappel un 8086 c'est (environ) 29000 transistors quand un processeur moderne contient en plus d'un milliard. Et ne parlons pas de la carte graphique.

        1. utiliser un framework du type libSDL qui va se charger de demander "poliment" à l'OS de lui réserver une part de l'écran voire l'écran entier. Dans le cas de libSDL on aura également accès aux accélérations matérielles (blitting par exemple).

        Bref deux salles, deux ambiances

        Les vrais naviguent en -42

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.