Convertir una fuente de MaxDuino de 8x8 a 8x16.
./conversor < fuente8x8 > fuente8x16
(los ficheiros son solamente la definición completa de la fuente desde la linea ifdef a endif
Exemplo. Passando esta fuente, el script de
Código: Seleccionar todo
#ifdef zxFont
const unsigned char myFont[][8] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // SPC
0x00,0x00,0x00,0x00,0x5F,0x00,0x00,0x00, // symbol '!'
...
0x00,0x42,0x42,0x76,0x08,0x08,0x00,0x00, // symbol '}'
0x00,0x00,0x04,0x02,0x04,0x02,0x00,0x00 // symbol '~'
};
#endif
... generará:
Código: Seleccionar todo
#ifdef zxFont8x16
const unsigned char myFont[]][16] PROGMEM = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,// SPC
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x00,0x00,0x00,// symbol '!'
...
0x00,0x0C,0x0C,0x3C,0xC0,0xC0,0x00,0x00,0x00,0x30,0x30,0x3F,0x00,0x00,0x00,0x00,// symbol '}'
0x00,0x00,0x30,0x0C,0x30,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00// symbol '~'
};
#endif
Después adicionas todo lo que he sido gerado a las fuentes 8x16.
El script:
Código: Seleccionar todo
#!/usr/bin/perl
# Expande una fuente de MaxDuino de 8x8 a 8x16, duplicando la misma en altura
while (<STDIN>)
{
s/ifdef\s+(.+?)(\s*)$/ifdef ${1}8x16${2}/; # transforma <font> => <font>8x16
s/\[\]\[8\]/[]][16]/; # transforma => [8] => [16]
if (! /(^(0x[0-9A-F]{2},*\s*){8})/i) # es lista de numeros?
{
# si no, imprime la linea
print;
}
else # transforma la lista
{
$line=$_;
$m=$1;
@vals=split(/,/); # parte los números por las comas y los guarda
for($v=0;$v<8;$v++) # expandir 8 COLUNAS
{
($h)= $vals[$v] =~/0x([0-9A-F]{2})/i; # tira parte hex de cada número
$vv=hex($h); # y lo convierte a decimal
$dvn=0; # nuevo valor de coluna (expandido a 16bit)
for ($sbit=7;$sbit>=0;$sbit--) # duplicar cada bit fuente en dos bits
{
$b=($vv >> $sbit) & 1 ; # obtiene el bit
$dvn=$dvn<<1; # y lo agrega dos veces, desplazando el valor a la izquierda
$dvn|=($b&1);
$dvn=$dvn<<1;
$dvn|=($b&1);
}
$nv[$v+8]=sprintf("0x%02X",$dvn>>8); # parte alta
$nv[$v]=sprintf("0x%02X",$dvn&0xff); # parte baja
}
$vs= join(',',@nv).( $m =~ /,\s*$/ ? ',' : ''); ## nueva string de datos, con coma final si ya existía
$line=~s/$m/$vs/; # reemplaza solo los datos en la línea
print $line; # imprime la linea
}
}