ok thanks. I will do that because my code is too slow.
Here is my code, it can diplay an image in ANY position in pixel, not only byte boundary positions :
Code:
void LCD_DrawPic( const char __flash * pic, u8 w, u8 h, u8 x, u8 y )
{
u8 i, j, k, debut, fin=0, val, flag, padding=0, temp=0, offset, decal;
if( x%8 != 0 ) // pas aligné sur une adresse multiple de 8, on va afficher le début pixel par pixel
{
debut = x/8+1;
debut = debut * 8; // debut est aligné sur un multiple de 8
flag=1;
offset = debut-8;
}
else
{
flag = 0;
offset = x;
debut = x;
}
if( w%8 != 0 ) // y'a un padding (bourrage à la fin de chaque ligne)
{
fin = w/8+1;
padding = fin*8 - w;
}
// On commence par afficher en haut à gauche, ligne par ligne
for( i=0; i<h; i++ )
{
j=0;
// premiers pixels
if( flag==1 )
{
val = pic[ (h-1-i)*fin + j ]; // le BMP est stocké à l'envers
for( k=7; k>=(8-(debut-x)); k-- )
{
if( (val&(1<<k)) != 0 )
LCD_SetPixel( x+j*8+(7-k), y+i);
}
temp = val;
j=1;
}
for( ; j<fin-1; j++ )
{
val = pic[ (h-1-i)*fin + j ]; // le BMP est stocké à l'envers
if( flag == 1 )
{
temp = temp << (debut-x);
temp = temp | (val >> (8-(debut-x)));
}
else
{
temp = val;
}
LCD_SetGraphXY( offset+j*8, y+i );
LCD_Write_1_Data( temp, 0xC0 );
temp = val;
}
// dernier octet de la ligne
val = pic[ (h-1-i)*fin + j ]; // le BMP est stocké à l'envers
decal = 0;
if( flag == 1 )
{
// On affiche le reste de l'octet précédent
for( k=0; k<(8-(debut-x)); k++ )
{
if( (temp&(1<<k)) != 0 )
LCD_SetPixel( offset+j*8+((8-(debut-x))-k-1), y+i);
}
decal = (8-(debut-x));
}
// on affiche juste les pixels nécessaires, sans le bourrage
for( k=7; k>=padding; k-- )
{
if( (val&(1<<k)) != 0 )
LCD_SetPixel( offset+decal+j*8+(7-k), y+i);
}
}
}
Sorry for the non-english comments. Warning, the code is NOT optimized