ma fonction est comme un GpBitBlt, elle affiche une image a une certaine position, et tout ou juste une partie de l'image peut etre copié
px py pos a l'ecran
rpx rpy pos de debut de la copie ds l'image
sy hauteur de l'image
rsx rsy taille a copier depuis la pos de debut ds l'image
void bitblt(uchar*image,short px, short py, short sy, short rpx, short rpy, short rsx, short rsy)
{
short cpt, nb_long, dif, long_count, only_long=0, img_skip=0, scr_skip=1, img_mod4 ;
uchar *scr, *img_src=image ;
ulong *old, *_screen, *_img ;
static uchar *screen[2] = 0 ;
if(!screen[0]) // si on n'a pas déjà affecté les ecrans
{
screen[0] = (uchar*)gpDraw[0].ptbuffer ;
screen[1] = (uchar*)gpDraw[1].ptbuffer ;
}
// cliping
if(px<0) // gauche
{
if(px < (-rsx)) return ; // si trop a gauche pour que qq chose soit affiché, on quitte
rsx += px ; // on enleve l'erreur a la taille affiché
rpx -= px ; // on ajoute l'erreur au decalage x ds l'image
px=0 ;
}
if(py<0) // haut
{
if(py < (-rsy)) return ; // erreur trop importante -> quit
rsy += py ; // on retire l'erreur de la partie affiché
rpy -= py ; // on ajoute l'erreur au decalage y ds l'image
py=0 ;
}
if(px+rsx>320) // droite
{
if(px > 319) return ; // trop a droite, on quite
rsx = 320 - px ; // la partie affichée sera de pos_x jusqu'au bord droit de l'ecran
}
if(py+rsy>240) // bas
{
if(py > 239) return ; // trop bas pour voir qq chose, quit
rsy = 240 - py ; // on affichera de la pos_y jusq'au bas de l'ecran
}
// on deplace les pointeur d'ecran et d'image pour la copie
scr = screen[nflip] + (px*240) + 240 - (py+rsy) ;
img_src += (rpx*sy) + sy - (rsy+rpy) ;
nb_long = rsy>>2 ; // calcul du nb de long a copier par colone (8 bit)
dif = rsy%4 ; // nb d'octets restant a copier apres la copie par long (0-3)
if(!dif) only_long=1 ; // si aucun octet restant, on affichera que des long
if(rpy||(sy!=rsy)) // si l'on doit se deplacer ds l'image apres la copie de la colone, on calcule la valeur de saut
{
img_skip = rpy + (sy-(rpy+rsy)) ; // nb d'octet a sauter
img_mod4 = img_skip%4 ; // on peut deplacer direct le long* ? si ui == 0
}
else // si aucun deplacement necessaire apres la copie
{ if(only_long) // si que des long a afficher
{ if(sy==240) // si la hauteur de l'image == 240
{
// on affichera tout en 1 seule passe
nb_long *= rsx ;
rsx=0 ;
scr_skip=0 ;
} else if(rsy==240) scr_skip=0 ; // on aura a sauter ds l'image mais pas ds l'ecran
}
}
if(key_pressed&16)
{
char teub[300] ;
sprintf(teub,"px %i py %i rpx %i rpy %i\nsy %i rsx %i rsy %i\ndif %i long %i %i\ndec : scr %i img %i\nskip : scr %i img %i %i",px,py,rpx,rpy,sy,rsx,rsy,dif,nb_long,only_long,scr - (screen[nflip]),img_src - image,scr_skip*60,img_skip,img_mod4) ;
MsgBox(teub) ;
}
_screen = (ulong*)scr ;
_img = (ulong*)img_src ;
do{ // blit
old = _screen ;
long_count=nb_long ;
while(long_count--) { *(_screen++) = *(_img++) ; } ; // affichage par long
if(!only_long) // si qq chose a afficher apres la copie par long
{
short cpt ;
uchar *img = (uchar*)_img ; // pointeur de char sur l'image
scr = (uchar*)_screen ; // pointeur de char sur l'ecran
for(cpt=0;cpt<dif;cpt++) *(scr++) = *(img++) ; // on copie les 'dif' octets
_screen = (ulong*)scr ; // on actualise le pointeur d'ecran
}
if(img_skip) // si on doit se deplacer ds l'image apres la copie de la colone
{
if(img_mod4) _img = (ulong*)(((uchar*)_img) + img_skip) ;
else _img += img_skip>>2 ; // deplacement rapide par long si multiple de 4
}
if(scr_skip) _screen = old+60 ; // on deplace le pointeur d'ecran d'une colone (60*4=240 pixels) par raport a l'ancien
} while(rsx--) ; // pour chaque colone à afficher
}
g compilé un fxe utilisant la fonction : http://procvor.free.fr/template.fxe
L afficher les info du blit (clipping, b de long a copier ect...)
R changer d'image
fleches : deplacer l'image
select effacer le buffer d'ecran courant
sur gp lors d'un cliping haut ou bas ca plante direct, alignement, sur geepee, l'image est tres mal affiché (sauf 1 fois sur 4, surement qt on deplace directement le long*), on dirais que sa saute pas ds l'image a la fin des colones ou un truc du genre
en clipping droite/gauche ca marche..
voila ... moi je suis largué lol j comprend plus rien si qq peut m'aider c pas de refu ^^'