{"id":1362,"date":"2009-11-17T22:23:06","date_gmt":"2009-11-17T21:23:06","guid":{"rendered":"http:\/\/www.alphak.net\/news\/?p=1362"},"modified":"2014-09-21T15:53:29","modified_gmt":"2014-09-21T13:53:29","slug":"le-pixel-infernal","status":"publish","type":"post","link":"https:\/\/www.alphak.net\/news\/2009\/11\/le-pixel-infernal\/","title":{"rendered":"Le pixel infernal"},"content":{"rendered":"<p>Dans <a href=\"\/news\/2009\/11\/le-recyclage-cest-lavenir\/\" target=\"_self\">l&rsquo;article pr\u00e9c\u00e9dent<\/a>, je d\u00e9taillais mes premi\u00e8res \u00e9tapes de la transformation d&rsquo;un vieil ordinateur portable en <strong>horloge Pong<\/strong>, \u00e0 savoir l&rsquo;installation d&rsquo;un <strong>Damn Small Linux<\/strong> sur le syst\u00e8me.<\/p>\n<p>L&rsquo;\u00e9tape suivante n&rsquo;est pas de tout repos, puisqu&rsquo;il faut maintenant afficher \u00e0 l&rsquo;\u00e9cran les <strong>graphismes<\/strong> de mon choix. En l&rsquo;occurrence, un terrain, deux raquettes carr\u00e9es, une balle carr\u00e9e, et un score qui \u00e9volue en fonction de l&rsquo;heure. Mais ne pla\u00e7ons pas la charrue avant les b\u0153ufs, autant commencer doucement, et tenter d&rsquo;afficher dans un premier temps <strong>un modeste pixel<\/strong>.<\/p>\n<p>Car \u00e0 ce stade, DSL d\u00e9marre en mode console.<\/p>\n<div id=\"attachment_1364\" style=\"width: 235px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00119.JPG\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1364\" class=\"size-medium wp-image-1364\" title=\"Elle est belle, ma console, elle est belle !\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00119-225x300.jpg\" alt=\"Elle est belle, ma console, elle est belle !\" width=\"225\" height=\"300\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00119-225x300.jpg 225w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00119-576x768.jpg 576w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00119.JPG 600w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><p id=\"caption-attachment-1364\" class=\"wp-caption-text\">Elle est belle, ma console, elle est belle !<\/p><\/div>\n<p>Apr\u00e8s un peu de <strong>nettoyage <\/strong>dans les scripts de d\u00e9marrage de DSL, j&rsquo;obtiens beaucoup moins d&rsquo;erreurs lors du boot. \u00c0 terme, mon but est d&rsquo;avoir un affichage le <strong>moins verbeux possible<\/strong> pendant le boot, histoire de donner \u00e0 la future horloge un petit c\u00f4t\u00e9<em> appliance<\/em>. Comprenez par l\u00e0 que les messages affich\u00e9s pendant la phase de d\u00e9marrage sont totalement inutiles aux yeux des non-informaticiens, il sera donc int\u00e9ressant d&rsquo;en diminuer le nombre, tout en gardant la possibilit\u00e9 de les afficher moyennant la manipulation appropri\u00e9e (un param\u00e8tre pass\u00e9 au noyau, par exemple). Mais ceci est purement <strong>cosm\u00e9tique <\/strong>et ne constitue pas la priorit\u00e9 n\u00b01.<\/p>\n<p>Nous sommes donc en mode console. Le mode console, c&rsquo;est une division de l&rsquo;\u00e9cran en 80 colonnes et 25 lignes, chaque case situ\u00e9e \u00e0 leur intersection pouvant afficher exactement <strong>un caract\u00e8re<\/strong>, ni plus ni moins. C&rsquo;est donc fait pour afficher du <strong>texte<\/strong>, de mani\u00e8re (quasi) exclusive.<\/p>\n<p>Alors, gr\u00e2ce \u00e0 des bidouilles comme <strong>figlet<\/strong>, d\u00e9j\u00e0 utilis\u00e9 <a href=\"\/news\/2009\/01\/lhorloge-pong-inutile-donc-indispensable\/\" target=\"_self\">sur mon minitel<\/a>, il est possible de dessiner avec les caract\u00e8res de la console, mais on est tr\u00e8s loin de ma\u00eetriser ce qui sera affich\u00e9 <strong>au pixel pr\u00e8s<\/strong>.<\/p>\n<div id=\"attachment_1363\" style=\"width: 235px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00112.JPG\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1363\" class=\"size-medium wp-image-1363\" title=\"Mince, figlet me dit que je devrais aller me coucher !\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00112-225x300.jpg\" alt=\"Mince, figlet me dit que je devrais aller me coucher !\" width=\"225\" height=\"300\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00112-225x300.jpg 225w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00112-576x768.jpg 576w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00112.JPG 600w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><p id=\"caption-attachment-1363\" class=\"wp-caption-text\">Mince, figlet me dit que je devrais aller me coucher !<\/p><\/div>\n<p>Alors, comment diable afficher <strong>un simple pixel<\/strong> sur l&rsquo;\u00e9cran ? Linux utilise g\u00e9n\u00e9ralement un serveur <strong>X11<\/strong> pour tout ce qui touche au mode graphique. C&rsquo;est sur X11 que vient se greffer le <strong>gestionnaire de fen\u00eatres<\/strong> qui affiche \u00e0 l&rsquo;utilisateur un bureau ergonomique et color\u00e9. Bien que le gestionnaire de fen\u00eatres sur DSL soit extr\u00eamement l\u00e9ger, le pauvre portable avec ses 8 Mo de RAM n&rsquo;a pas les ressources suffisantes pour en profiter. J&rsquo;ai quand m\u00eame fait le test pour rigoler, je peux afficher un bureau (640&#215;480, 16 couleurs) en moins de 3 minutes, le tout \u00e9tant suivi par une <strong>interminable <\/strong>p\u00e9riode de swap, pendant laquelle il est inutile d&rsquo;esp\u00e9rer lancer la moindre commande. En d\u00e9finitive, on abandonne compl\u00e8tement l&rsquo;id\u00e9e.<\/p>\n<div id=\"attachment_1366\" style=\"width: 310px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00124.JPG\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1366\" class=\"size-medium wp-image-1366 \" title=\"Le bureau, c'est possible, \u00e0 condition d'avoir l'\u00e9ternit\u00e9 devant soi...\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00124-300x225.jpg\" alt=\"Le bureau, c'est possible, \u00e0 condition d'avoir le temps...\" width=\"300\" height=\"225\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00124-300x225.jpg 300w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00124-768x576.jpg 768w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00124.JPG 800w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-1366\" class=\"wp-caption-text\">Le bureau, c&rsquo;est possible, \u00e0 condition d&rsquo;avoir l&rsquo;\u00e9ternit\u00e9 devant soi&#8230;<\/p><\/div>\n<p>Dans mon cas, le salut ne sera pas apport\u00e9 par X11. Il me faut quelque chose de <strong>plus l\u00e9ger<\/strong> pour afficher mon pixel. Quelque chose qui me permette de programmer des applications graphiques sans passer par X11. Quelque chose comme <a href=\"http:\/\/www.svgalib.org\/\" target=\"_blank\">SVGAlib<\/a>.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1374\" title=\"Caution - Geek content\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/geek-content-small.png\" alt=\"Caution - Geek content\" width=\"136\" height=\"158\" \/><\/p>\n<p style=\"text-align: center;\"><span style=\"color: #800080;\">Attention, \u00e0 partir d&rsquo;ici, \u00e7a devient un poil plus technique. Le passage qui va suivre est susceptible de d\u00e9clencher des naus\u00e9es, voire des vomissements, chez les non-informaticiens. Je d\u00e9cline toute responsabilit\u00e9.<\/span><\/p>\n<p>SVGAlib est une <strong>biblioth\u00e8que graphique de bas niveau<\/strong> pour Linux. Tout \u00e0 fait dans l&rsquo;esprit de ce dont j&rsquo;ai besoin. En plus, le site fourmille d&rsquo;exemples. Je recopie le code permettant d&rsquo;afficher un simple pixel \u00e0 l&rsquo;\u00e9cran et le compile dans la foul\u00e9e.<\/p>\n<pre class=\"prettyprint\">#include &lt;stdlib.h&gt;\r\n#include &lt;vga.h&gt;\r\n\r\nint main(void)\r\n{\r\n\tvga_init();\r\n\tvga_setmode(G320x200x256); &#47;&#47; Passe l&#39;\u00e9cran en r\u00e9solution 320x200, 256 couleurs\r\n\tvga_setcolor(4); &#47;&#47; On s\u00e9lectionne la couleur rouge\r\n\tvga_drawpixel(10, 10); &#47;&#47; On dessine le fameux pixel\r\n\r\n\tsleep(5); &#47;&#47; On attend 5 secondes...\r\n\tvga_setmode(TEXT); &#47;&#47; On repasse en mode console\r\n\r\n\treturn EXIT_SUCCESS; &#47;&#47; Et on sort fi\u00e8rement dans la bonne humeur\r\n}<\/pre>\n<p>\u00c0 ce stade, transf\u00e9rer le programme compil\u00e9 pour le tester sur le portable est une activit\u00e9 relativement <strong>chronophage<\/strong>. Rappelez-vous : pas de lecteur CD, pas de carte r\u00e9seau.<\/p>\n<p>Je d\u00e9cide donc d&rsquo;installer une copie de DSL dans une <strong>machine virtuelle<\/strong> (qui elle est \u00e9quip\u00e9e d&rsquo;une carte r\u00e9seau virtuelle) et sur laquelle je peux transf\u00e9rer mes versions compil\u00e9es \u00e0 grands coups de <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Netcat\" target=\"_blank\">netcat<\/a>.<\/p>\n<p>Bien que la compilation (en environnement Debian) se passe sans trop de probl\u00e8mes bloquants, la premi\u00e8re ex\u00e9cution du programme dans la machine virtuelle ne se termine pas par un franc succ\u00e8s. Les libs SVGA sont <strong>absentes <\/strong>par d\u00e9faut dans DSL. Qui pourrait en faire un reproche, s&rsquo;agissant d&rsquo;une distrib all\u00e9g\u00e9e ?<\/p>\n<p>\u00c0 tout hasard, je choisis de <strong>copier les libs<\/strong> de ma Debian dans DSL. Cette solution barbare fait lamentablement planter le programme avec pour toute sortie la c\u00e9l\u00e8bre <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Erreur_de_segmentation\" target=\"_blank\">Segmentation Fault<\/a>. Je ne saurais pas expliquer exactement pourquoi, il existe de nombreuses raisons pour que cette op\u00e9ration ne fonctionne pas. Les libs ne sont pas optimis\u00e9es pour 486, elles ne sont pas compil\u00e9es pour fonctionner sur un noyau 2.4, elles sont compil\u00e9es avec des options propres \u00e0 Debian, etc&#8230; Un coup dans l&rsquo;eau.<\/p>\n<p>\u00c0 cet instant, je suis confront\u00e9 au <strong>moment d&rsquo;angoisse<\/strong> que tout d\u00e9veloppeur a connu, quand il sait que toutes les solutions simples n&rsquo;ont pas fonctionn\u00e9, et qu&rsquo;il va falloir sortir <strong>l&rsquo;artillerie lourde<\/strong> sans savoir dans quelle direction tirer. J&rsquo;en profite pour remercier tipeon, qui a toujours de bonnes id\u00e9es lorsque je lance des appels \u00e0 l&rsquo;aide \u00e0 la cantonade sur les forums \ud83d\ude09<\/p>\n<p>Je commence \u00e0 envisager de <strong>cross-compiler<\/strong> ces libs moi-m\u00eame, quand, au d\u00e9tour d&rsquo;une recherche sur le net, entre deux sites pornographiques, je d\u00e9couvre sur <a href=\"http:\/\/ftp.cc.uoc.gr\/mirrors\/linux\/damnsmalllinux\/mydsl\/apps\/\" target=\"_blank\">cette page<\/a> un <strong>visualiseur d&rsquo;images<\/strong> utilisant SVGAlib et port\u00e9 sur DSL : <strong>ZGV<\/strong>. Les libs \u00e9tant comprises dans l&rsquo;archive, je les d\u00e9ploie sur ma machine virtuelle, relance mon programme, et constate avec le plus grand bonheur un \u00e9cran vierge, \u00e0 l&rsquo;exception d&rsquo;un petit pixel <strong><span style=\"color: #ff0000;\">rouge<\/span><\/strong> en haut \u00e0 gauche de l&rsquo;\u00e9cran. Bingo ! \ud83d\ude42<\/p>\n<p style=\"text-align: center;\"><em>C&rsquo;est un petit pixel pour le geek, mais un bitmap g\u00e9ant pour la communaut\u00e9.<\/em><\/p>\n<p>\u00c0 partir de ce moment, le concept est d\u00e9montr\u00e9, il est donc possible d&rsquo;utiliser SVGAlib pour afficher <strong>de mani\u00e8re instantan\u00e9e<\/strong> \u00e0 peu pr\u00e8s <strong>n&rsquo;importe quel graphisme<\/strong> sur commande \u00e0 partir de la console. La preuve avec ce second exemple qui sera plus parlant qu&rsquo;un b\u00eate pixel rouge :<\/p>\n<div id=\"attachment_1365\" style=\"width: 235px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00122.JPG\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-1365\" class=\"size-medium wp-image-1365\" title=\"Un joli d\u00e9grad\u00e9 de bleu, merci SVGAlib !\" src=\"http:\/\/cdn.alphak.net\/news\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00122-225x300.jpg\" alt=\"Un joli d\u00e9grad\u00e9 de bleu, merci SVGAlib !\" width=\"225\" height=\"300\" srcset=\"https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00122-225x300.jpg 225w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00122-576x768.jpg 576w, https:\/\/cdn.alphak.net\/wp-content\/uploads\/sites\/2\/2009\/11\/DSC00122.JPG 600w\" sizes=\"(max-width: 225px) 100vw, 225px\" \/><\/a><p id=\"caption-attachment-1365\" class=\"wp-caption-text\">Un joli d\u00e9grad\u00e9 de bleu, merci SVGAlib !<\/p><\/div>\n<p>Voila qui termine la partie qui \u00e0 mon sens pouvait poser <strong>le plus de difficult\u00e9s<\/strong>. Le reste, bien que pas forc\u00e9ment \u00e9vident au premier abord, pourra se r\u00e9sumer \u00e0 un peu de programmation et un peu de bon sens. Mais je ne manquerai pas de le d\u00e9tailler.<\/p>\n<p>\u00c0 bient\u00f4t pour la suite des aventures du laptop qui ne voulait pas mourir \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dans <a href=\"\/news\/2009\/11\/le-recyclage-cest-lavenir\/\" target=\"_self\">l&rsquo;article pr\u00e9c\u00e9dent<\/a>, je d\u00e9taillais mes premi\u00e8res \u00e9tapes de la transformation d&rsquo;un vieil ordinateur portable en <strong>horloge Pong<\/strong>, \u00e0 savoir l&rsquo;installation d&rsquo;un <strong>Damn Small Linux<\/strong> sur le syst\u00e8me.<\/p>\n<p>L&rsquo;\u00e9tape suivante n&rsquo;est pas de tout repos, puisqu&rsquo;il faut maintenant afficher \u00e0 l&rsquo;\u00e9cran les <strong>graphismes<\/strong> de mon choix. En l&rsquo;occurrence, un terrain, deux raquettes carr\u00e9es, une balle carr\u00e9e, et un score qui \u00e9volue en fonction de l&rsquo;heure. Mais ne pla\u00e7ons pas la charrue avant les b\u0153ufs, autant commencer doucement, et tenter d&rsquo;afficher dans un premier temps <strong>un modeste pixel<\/strong>.<\/p>\n<p>Car \u00e0 ce stade, DSL d\u00e9marre en mode console.<\/p>\n\t<div class=\"post-teaser-block\">\r\n\t\t<div class=\"teaserHellip\">\r\n\t\t\t<span class=\"teaserLeft\">[<\/span><span class=\"teaserCenter\">&hellip;<\/span><span class=\"teaserRight\">]<\/span>\r\n\t\t<\/div>\r\n\t\t<div class=\"teaserText\">\r\n\t\t\t<a href=\"https:\/\/www.alphak.net\/news\/2009\/11\/le-pixel-infernal\/\" title=\"Le pixel infernal\" rel=\"bookmark\"><span class=\"teaserlink\">Lire la suite de l'article&nbsp;<i class=\"fa fa-chevron-right\"><\/i><\/span><\/a>\r\n\t\t<\/div>\r\n\t\t<a class=\"teaserLink\" href=\"https:\/\/www.alphak.net\/news\/2009\/11\/le-pixel-infernal\/\" title=\"Le pixel infernal\" rel=\"bookmark\"><\/a>\r\n\t<\/div>\r\n","protected":false},"author":1,"featured_media":1363,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[142,17],"tags":[343,193,113,58,191,114,192],"class_list":["post-1362","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bricolage","category-projet-arcade","tag-code","tag-graphisme","tag-horloge","tag-linux","tag-pixel","tag-pong","tag-svga"],"_links":{"self":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1362"}],"collection":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/comments?post=1362"}],"version-history":[{"count":4,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1362\/revisions"}],"predecessor-version":[{"id":2903,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/posts\/1362\/revisions\/2903"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media\/1363"}],"wp:attachment":[{"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/media?parent=1362"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/categories?post=1362"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.alphak.net\/news\/wp-json\/wp\/v2\/tags?post=1362"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}