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 ^^'