/* This function takes the RGB components of the image and converts them into YCoCg. 3 components will be re-ordered to CoYCg (for optimum DXT1 compression), while 4 components will be ordered CoCgAY (for DXT5 compression). */ int convert_RGB_to_YCoCg ( unsigned char* orig, int width, int height, int channels ) { int i; /* error check */ if( (width < 1) || (height < 1) || (channels < 3) || (channels > 4) || (orig == NULL) ) { /* nothing to do */ return -1; } /* do the conversion */ if( channels == 3 ) { for( i = 0; i < width*height*3; i += 3 ) { int r = orig[i+0]; int g = (orig[i+1] + 1) >> 1; int b = orig[i+2]; int tmp = (2 + r + b) >> 2; /* Co */ orig[i+0] = clamp_byte( 128 + ((r - b + 1) >> 1) ); /* Y */ orig[i+1] = clamp_byte( g + tmp ); /* Cg */ orig[i+2] = clamp_byte( 128 + g - tmp ); } } else { for( i = 0; i < width*height*4; i += 4 )
void texture_draw(rs_texture_t *dest, rs_texture_t *src, int x, int y, int mode) { int i; // y int j; // x int k; // color component int istart = (y < 0) ? -y : 0; int iend = src->h - (( (y + src->h) > dest->h) ? (y + src->h - dest->h) : 0); int jstart = (x < 0) ? -x : 0; int jend = src->w - (( (x + src->w) > dest->w) ? (x + src->w - dest->w) : 0); int ishift = 0; int jshift = 0; float a; // alpha value if (mode & DRAW_TILED_FLAG) { jshift = x; ishift = y; x = y = istart = jstart = 0; iend = dest->h; jend = dest->w; }; mode = mode & DRAW_MODE_MASK; int modvalue = (src->w*src->h*4); if (mode == DRAW_MODE_REPLACE) { for (i = istart; i < iend; i++) { for (j = jstart; j < jend; j++) { for (k = 0; k < 4; k++) { dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue]; }; }; }; } else if (mode == DRAW_MODE_ADDITIVE) { for (i = istart; i < iend; i++) { for (j = jstart; j < jend; j++) { for (k = 0; k < 3; k++) { // Alpha channel is not added dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = clamp_byte( dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] + src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue] ); }; }; }; } else if (mode == DRAW_MODE_MULT) { for (i = istart; i < iend; i++) { for (j = jstart; j < jend; j++) { for (k = 0; k < 3; k++) { // Alpha channel is not added dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = clamp_byte( dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] * src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue] / 255 ); }; }; }; } else if (mode == DRAW_MODE_ALPHA) { for (i = istart; i < iend; i++) { for (j = jstart; j < jend; j++) { for (k = 0; k < 3; k++) { a = (1.0 * src->data[ (4*(i*src->w + j) + 3) % modvalue ] / 255.0); dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] = (unsigned char) ( (1.0-a) * dest->data[ 4 * ( (y+i)*dest->w + (x+j) ) + k ] + a*src->data[ (4*((i+ishift)*src->w + j + jshift) + k) % modvalue] ); }; }; }; }; };