[Linux] framebuffer et les séquences ANSI
Salutations !
Je suis en train de m'intéresser de près au "framebuffer", le mode console que l'on obtient en appuyant sur CTRL-ALT-F1 à F6.
J'ai fait un petit programme de "démonstration" qui est censé afficher des cadres de couleur pour rendre les applications de mes élèves plus jolies;
Le problème c'est que dans ma "librairie" j'utilise les codes d'échappement ANSI permettant d'afficher les couleurs au format RGB ça marche dans les consoles virtuelles de X mais par contre en framebuffer les couleurs sont "pourries" (d'un gris RGB(125,125,125) j'obtiens un turquoise). Par contre les codes couleur ANSI 'normaux" (le vert -- code 32 -- passe sans problème).
J'ai bien essayé fbgrab pour faire un screenshot du framebuffer mais l'image générée est pourrie elle aussi, illisible.
La question est la suivante: comme pourrais-je afficher les couleurs au format RGB en mode console (tty) ?
Le mode que j'ai sélectionné pour le framebuffer est 1400x1050 32bits (0x346).
Quand je fais un fbset voici ce qu'il m'indique:
Code:
1 2 3 4 5 6
| mode "1400x1050-77"
# D: 147.037 MHz, H: 83.166 kHz, V: 77.436 Hz
geometry 1400 1050 1400 1050 32
timings 6801 168 32 16 4 168 4
rgba 8/16,8/8,8/0,0/0
endmode |
Voici les deux fonctions que j'utilise pour "générer" mes séquences ANSI:
Code:
1 2 3 4 5 6 7 8 9 10 11
| char* getRGBString(struct s_RGB target)
{
char *pTmp=(char*)malloc(sizeof(char)*25); // \x1b[38;2;74;213;237;1m
sprintf(pTmp,"\x1b[38;2;%d;%d;%d%sm",target.Red,target.Green,target.Blue,target.bold?";1":"");
return pTmp;
}
struct s_RGB getRGB(short Red,short Green,short Blue,bool bold)
{
struct s_RGB tmp={Red,Green,Blue,bold?1:0};
return tmp;
} |
...et voici la définition de la structure:
Code:
1 2 3 4 5 6 7
| struct s_RGB
{
short Red;
short Green;
short Blue;
bool bold;
}; |