1

g ecrit une fonction de blit, ca marche pas, j'en ai marre ...

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 ^^'
et la le mec il le pécho par le bras et il lui dit '

2

bon chui une quiche je reactualisais pas le pointeur sur l'image apres le decalage a la fin de la colone
ca s'affiche presque bien sur geepee mais tj un crash d'alignement sur gp :/
et la le mec il le pécho par le bras et il lui dit '

3

mon pauvre s est pas qui va te filer un coup demain mais bonne chance

4

-

5

ta fonction est ptet a 100 lieu de la mienne mais la tienne elle marche, et en + elle gere la transparence ^^

moi qui m'etait fié a ta signature lol 'ne calcule pas ce que tu connais déjà', à part sur gp donc smile

ca a l'air mechant l'asm arm ^^ g peur d'y toucher, il va me mordre :/
et la le mec il le pécho par le bras et il lui dit '

6

euh, un pointeur en long* peut il etre affecté ac une adresse non multiple de 4 ?
et la le mec il le pécho par le bras et il lui dit '

7

-

8

ok merci
et la le mec il le pécho par le bras et il lui dit '