int ImagePuissanceDe2( int largpx, int hautpx, int nbc1px, unsigned char * image, int * largpx2, int * hautpx2, int * nbc1px2, unsigned char ** image2 ) //Pour glTexImage2D: largpx = 2**m + 2*border obligatoirement! >= 64 ou 66 //Pour glTexImage2D: hautpx = 2**n + 2*border obligatoirement! >= 64 ou 66 { //Calcul de m et l en imposant border=0 sur largpx int l, m; puissance2( largpx, largpx2, &m ); // largpx2 = 2 ** m //Calcul de n et h en imposant border=0 sur hautpx int h, n; puissance2( hautpx, hautpx2, &n ); // hautpx2 = 2 ** n //REDUCTION: 2**m x 2**n pixels sont imposes pour le tableau RGB image2 *image2 = NULL; if( *largpx2 <= 0 || *hautpx2 <= 0 || nbc1px <= 0 ) return 1; int k=0; int i,j; int p ; if( nbc1px >= 3 ) { *image2 = (unsigned char *)malloc(sizeof(unsigned char *)*(*largpx2) * (*hautpx2) * nbc1px); if( *image2 == NULL ) return 2; for ( i=0; i<*largpx2; i++) for ( j=0; j<*hautpx2; j++) { m = (i*hautpx+j) * nbc1px; for ( p=0; p<nbc1px; p++ ) (*image2)[k++] = image[ m + p ]; } *nbc1px2 = nbc1px; } else //On passe a 3 octets par pixel { *image2 = (unsigned char *) malloc(sizeof(unsigned char) * (*largpx2) * (*hautpx2) * 3); if( *image2 == NULL ) return 3; for ( i=0; i<*largpx2; i++) for ( j=0; j<*hautpx2; j++) { m = (i*hautpx+j) * nbc1px; for ( p=0; p<3; p++ ) (*image2)[k++] = image[ m ]; } *nbc1px2 = 3; } return 0; }
void exo2_putbit0(int * x, int n) { *x = *x ^ puissance2(n); }
void exo2_putbit1(int * x, int n) { *x = *x | puissance2(n); }