static byte *row1 = NULL, *row2 = NULL;
static int rowsize = 0;
-void R_ResampleTextureLerpLine(const byte *in, byte *out, int inwidth, int outwidth, int bytesperpixel)
-{
- int j, xi, oldx = 0, f, fstep, endx, lerp;
-#define LERPBYTE(i) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
+void R_ResampleTextureLerpLine( const byte *in, byte *out, int inwidth, int outwidth, int bytesperpixel ){
+ int j, xi, oldx = 0, f, fstep, endx, lerp;
+#define LERPBYTE( i ) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
- fstep = (int) (inwidth * 65536.0f / outwidth);
- endx = (inwidth - 1);
- if (bytesperpixel == 4) {
- for (j = 0, f = 0; j < outwidth; j++, f += fstep) {
- xi = f >> 16;
- if (xi != oldx) {
- in += (xi - oldx) * 4;
- oldx = xi;
- }
+ fstep = (int) ( inwidth * 65536.0f / outwidth );
+ endx = ( inwidth - 1 );
+ if ( bytesperpixel == 4 ) {
+ for ( j = 0,f = 0; j < outwidth; j++, f += fstep )
+ {
+ xi = f >> 16;
+ if ( xi != oldx ) {
+ in += ( xi - oldx ) * 4;
+ oldx = xi;
+ }
- if (xi < endx) {
- lerp = f & 0xFFFF;
- *out++ = (byte) ((((in[4] - in[0]) * lerp) >> 16) + in[0]);
- *out++ = (byte) ((((in[5] - in[1]) * lerp) >> 16) + in[1]);
- *out++ = (byte) ((((in[6] - in[2]) * lerp) >> 16) + in[2]);
- *out++ = (byte) ((((in[7] - in[3]) * lerp) >> 16) + in[3]);
- } else // last pixel of the line has no pixel to lerp to
- {
- *out++ = in[0];
- *out++ = in[1];
- *out++ = in[2];
- *out++ = in[3];
- }
- }
- } else if (bytesperpixel == 3) {
- for (j = 0, f = 0; j < outwidth; j++, f += fstep) {
- xi = f >> 16;
- if (xi != oldx) {
- in += (xi - oldx) * 3;
- oldx = xi;
- }
+ if ( xi < endx ) {
+ lerp = f & 0xFFFF;
+ *out++ = (byte) ( ( ( ( in[4] - in[0] ) * lerp ) >> 16 ) + in[0] );
+ *out++ = (byte) ( ( ( ( in[5] - in[1] ) * lerp ) >> 16 ) + in[1] );
+ *out++ = (byte) ( ( ( ( in[6] - in[2] ) * lerp ) >> 16 ) + in[2] );
+ *out++ = (byte) ( ( ( ( in[7] - in[3] ) * lerp ) >> 16 ) + in[3] );
+ }
+ else // last pixel of the line has no pixel to lerp to
+ {
+ *out++ = in[0];
+ *out++ = in[1];
+ *out++ = in[2];
+ *out++ = in[3];
+ }
+ }
+ }
+ else if ( bytesperpixel == 3 ) {
+ for ( j = 0, f = 0; j < outwidth; j++, f += fstep )
+ {
+ xi = f >> 16;
+ if ( xi != oldx ) {
+ in += ( xi - oldx ) * 3;
+ oldx = xi;
+ }
- if (xi < endx) {
- lerp = f & 0xFFFF;
- *out++ = (byte) ((((in[3] - in[0]) * lerp) >> 16) + in[0]);
- *out++ = (byte) ((((in[4] - in[1]) * lerp) >> 16) + in[1]);
- *out++ = (byte) ((((in[5] - in[2]) * lerp) >> 16) + in[2]);
- } else // last pixel of the line has no pixel to lerp to
- {
- *out++ = in[0];
- *out++ = in[1];
- *out++ = in[2];
- }
- }
- } else {
- globalOutputStream() << "R_ResampleTextureLerpLine: unsupported bytesperpixel " << bytesperpixel << "\n";
- }
+ if ( xi < endx ) {
+ lerp = f & 0xFFFF;
+ *out++ = (byte) ( ( ( ( in[3] - in[0] ) * lerp ) >> 16 ) + in[0] );
+ *out++ = (byte) ( ( ( ( in[4] - in[1] ) * lerp ) >> 16 ) + in[1] );
+ *out++ = (byte) ( ( ( ( in[5] - in[2] ) * lerp ) >> 16 ) + in[2] );
+ }
+ else // last pixel of the line has no pixel to lerp to
+ {
+ *out++ = in[0];
+ *out++ = in[1];
+ *out++ = in[2];
+ }
+ }
+ }
+ else
+ {
+ globalOutputStream() << "R_ResampleTextureLerpLine: unsupported bytesperpixel " << bytesperpixel << "\n";
+ }
}
/*
R_ResampleTexture
================
*/
-void R_ResampleTexture(const void *indata, int inwidth, int inheight, void *outdata, int outwidth, int outheight,
- int bytesperpixel)
-{
- if (rowsize < outwidth * bytesperpixel) {
- if (row1) {
- free(row1);
- }
- if (row2) {
- free(row2);
- }
+void R_ResampleTexture( const void *indata, int inwidth, int inheight, void *outdata, int outwidth, int outheight, int bytesperpixel ){
+ if ( rowsize < outwidth * bytesperpixel ) {
+ if ( row1 ) {
+ free( row1 );
+ }
+ if ( row2 ) {
+ free( row2 );
+ }
- rowsize = outwidth * bytesperpixel;
- row1 = (byte *) malloc(rowsize);
- row2 = (byte *) malloc(rowsize);
- }
+ rowsize = outwidth * bytesperpixel;
+ row1 = (byte *)malloc( rowsize );
+ row2 = (byte *)malloc( rowsize );
+ }
- if (bytesperpixel == 4) {
- int i, j, yi, oldy, f, fstep, lerp, endy = (inheight - 1), inwidth4 = inwidth * 4, outwidth4 = outwidth * 4;
- byte *inrow, *out;
- out = (byte *) outdata;
- fstep = (int) (inheight * 65536.0f / outheight);
-#define LERPBYTE(i) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
+ if ( bytesperpixel == 4 ) {
+ int i, j, yi, oldy, f, fstep, lerp, endy = ( inheight - 1 ), inwidth4 = inwidth * 4, outwidth4 = outwidth * 4;
+ byte *inrow, *out;
+ out = (byte *)outdata;
+ fstep = (int) ( inheight * 65536.0f / outheight );
+#define LERPBYTE( i ) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
- inrow = (byte *) indata;
- oldy = 0;
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- R_ResampleTextureLerpLine(inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel);
+ inrow = (byte *)indata;
+ oldy = 0;
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ R_ResampleTextureLerpLine( inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel );
- for (i = 0, f = 0; i < outheight; i++, f += fstep) {
- yi = f >> 16;
- if (yi < endy) {
- lerp = f & 0xFFFF;
- if (yi != oldy) {
- inrow = (byte *) indata + inwidth4 * yi;
- if (yi == oldy + 1) {
- memcpy(row1, row2, outwidth4);
- } else {
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- }
+ for ( i = 0, f = 0; i < outheight; i++,f += fstep )
+ {
+ yi = f >> 16;
+ if ( yi < endy ) {
+ lerp = f & 0xFFFF;
+ if ( yi != oldy ) {
+ inrow = (byte *)indata + inwidth4 * yi;
+ if ( yi == oldy + 1 ) {
+ memcpy( row1, row2, outwidth4 );
+ }
+ else{
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ }
- R_ResampleTextureLerpLine(inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel);
- oldy = yi;
- }
- j = outwidth - 4;
- while (j >= 0) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- LERPBYTE(3);
- LERPBYTE(4);
- LERPBYTE(5);
- LERPBYTE(6);
- LERPBYTE(7);
- LERPBYTE(8);
- LERPBYTE(9);
- LERPBYTE(10);
- LERPBYTE(11);
- LERPBYTE(12);
- LERPBYTE(13);
- LERPBYTE(14);
- LERPBYTE(15);
- out += 16;
- row1 += 16;
- row2 += 16;
- j -= 4;
- }
- if (j & 2) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- LERPBYTE(3);
- LERPBYTE(4);
- LERPBYTE(5);
- LERPBYTE(6);
- LERPBYTE(7);
- out += 8;
- row1 += 8;
- row2 += 8;
- }
- if (j & 1) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- LERPBYTE(3);
- out += 4;
- row1 += 4;
- row2 += 4;
- }
- row1 -= outwidth4;
- row2 -= outwidth4;
- } else {
- if (yi != oldy) {
- inrow = (byte *) indata + inwidth4 * yi;
- if (yi == oldy + 1) {
- memcpy(row1, row2, outwidth4);
- } else {
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- }
+ R_ResampleTextureLerpLine( inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel );
+ oldy = yi;
+ }
+ j = outwidth - 4;
+ while ( j >= 0 )
+ {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ LERPBYTE( 3 );
+ LERPBYTE( 4 );
+ LERPBYTE( 5 );
+ LERPBYTE( 6 );
+ LERPBYTE( 7 );
+ LERPBYTE( 8 );
+ LERPBYTE( 9 );
+ LERPBYTE( 10 );
+ LERPBYTE( 11 );
+ LERPBYTE( 12 );
+ LERPBYTE( 13 );
+ LERPBYTE( 14 );
+ LERPBYTE( 15 );
+ out += 16;
+ row1 += 16;
+ row2 += 16;
+ j -= 4;
+ }
+ if ( j & 2 ) {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ LERPBYTE( 3 );
+ LERPBYTE( 4 );
+ LERPBYTE( 5 );
+ LERPBYTE( 6 );
+ LERPBYTE( 7 );
+ out += 8;
+ row1 += 8;
+ row2 += 8;
+ }
+ if ( j & 1 ) {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ LERPBYTE( 3 );
+ out += 4;
+ row1 += 4;
+ row2 += 4;
+ }
+ row1 -= outwidth4;
+ row2 -= outwidth4;
+ }
+ else
+ {
+ if ( yi != oldy ) {
+ inrow = (byte *)indata + inwidth4 * yi;
+ if ( yi == oldy + 1 ) {
+ memcpy( row1, row2, outwidth4 );
+ }
+ else{
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ }
- oldy = yi;
- }
- memcpy(out, row1, outwidth4);
- }
- }
- } else if (bytesperpixel == 3) {
- int i, j, yi, oldy, f, fstep, lerp, endy = (inheight - 1), inwidth3 = inwidth * 3, outwidth3 = outwidth * 3;
- byte *inrow, *out;
- out = (byte *) outdata;
- fstep = (int) (inheight * 65536.0f / outheight);
-#define LERPBYTE(i) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
+ oldy = yi;
+ }
+ memcpy( out, row1, outwidth4 );
+ }
+ }
+ }
+ else if ( bytesperpixel == 3 ) {
+ int i, j, yi, oldy, f, fstep, lerp, endy = ( inheight - 1 ), inwidth3 = inwidth * 3, outwidth3 = outwidth * 3;
+ byte *inrow, *out;
+ out = (byte *)outdata;
+ fstep = (int) ( inheight * 65536.0f / outheight );
+#define LERPBYTE( i ) out[i] = (byte) ( ( ( ( row2[i] - row1[i] ) * lerp ) >> 16 ) + row1[i] )
- inrow = (byte *) indata;
- oldy = 0;
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- R_ResampleTextureLerpLine(inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel);
- for (i = 0, f = 0; i < outheight; i++, f += fstep) {
- yi = f >> 16;
- if (yi < endy) {
- lerp = f & 0xFFFF;
- if (yi != oldy) {
- inrow = (byte *) indata + inwidth3 * yi;
- if (yi == oldy + 1) {
- memcpy(row1, row2, outwidth3);
- } else {
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- }
+ inrow = (byte *)indata;
+ oldy = 0;
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ R_ResampleTextureLerpLine( inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel );
+ for ( i = 0, f = 0; i < outheight; i++,f += fstep )
+ {
+ yi = f >> 16;
+ if ( yi < endy ) {
+ lerp = f & 0xFFFF;
+ if ( yi != oldy ) {
+ inrow = (byte *)indata + inwidth3 * yi;
+ if ( yi == oldy + 1 ) {
+ memcpy( row1, row2, outwidth3 );
+ }
+ else{
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ }
- R_ResampleTextureLerpLine(inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel);
- oldy = yi;
- }
- j = outwidth - 4;
- while (j >= 0) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- LERPBYTE(3);
- LERPBYTE(4);
- LERPBYTE(5);
- LERPBYTE(6);
- LERPBYTE(7);
- LERPBYTE(8);
- LERPBYTE(9);
- LERPBYTE(10);
- LERPBYTE(11);
- out += 12;
- row1 += 12;
- row2 += 12;
- j -= 4;
- }
- if (j & 2) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- LERPBYTE(3);
- LERPBYTE(4);
- LERPBYTE(5);
- out += 6;
- row1 += 6;
- row2 += 6;
- }
- if (j & 1) {
- LERPBYTE(0);
- LERPBYTE(1);
- LERPBYTE(2);
- out += 3;
- row1 += 3;
- row2 += 3;
- }
- row1 -= outwidth3;
- row2 -= outwidth3;
- } else {
- if (yi != oldy) {
- inrow = (byte *) indata + inwidth3 * yi;
- if (yi == oldy + 1) {
- memcpy(row1, row2, outwidth3);
- } else {
- R_ResampleTextureLerpLine(inrow, row1, inwidth, outwidth, bytesperpixel);
- }
+ R_ResampleTextureLerpLine( inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel );
+ oldy = yi;
+ }
+ j = outwidth - 4;
+ while ( j >= 0 )
+ {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ LERPBYTE( 3 );
+ LERPBYTE( 4 );
+ LERPBYTE( 5 );
+ LERPBYTE( 6 );
+ LERPBYTE( 7 );
+ LERPBYTE( 8 );
+ LERPBYTE( 9 );
+ LERPBYTE( 10 );
+ LERPBYTE( 11 );
+ out += 12;
+ row1 += 12;
+ row2 += 12;
+ j -= 4;
+ }
+ if ( j & 2 ) {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ LERPBYTE( 3 );
+ LERPBYTE( 4 );
+ LERPBYTE( 5 );
+ out += 6;
+ row1 += 6;
+ row2 += 6;
+ }
+ if ( j & 1 ) {
+ LERPBYTE( 0 );
+ LERPBYTE( 1 );
+ LERPBYTE( 2 );
+ out += 3;
+ row1 += 3;
+ row2 += 3;
+ }
+ row1 -= outwidth3;
+ row2 -= outwidth3;
+ }
+ else
+ {
+ if ( yi != oldy ) {
+ inrow = (byte *)indata + inwidth3 * yi;
+ if ( yi == oldy + 1 ) {
+ memcpy( row1, row2, outwidth3 );
+ }
+ else{
+ R_ResampleTextureLerpLine( inrow, row1, inwidth, outwidth, bytesperpixel );
+ }
- oldy = yi;
- }
- memcpy(out, row1, outwidth3);
- }
- }
- } else {
- globalOutputStream() << "R_ResampleTexture: unsupported bytesperpixel " << bytesperpixel << "\n";
- }
+ oldy = yi;
+ }
+ memcpy( out, row1, outwidth3 );
+ }
+ }
+ }
+ else
+ {
+ globalOutputStream() << "R_ResampleTexture: unsupported bytesperpixel " << bytesperpixel << "\n";
+ }
}
// in can be the same as out
-void GL_MipReduce(byte *in, byte *out, int width, int height, int destwidth, int destheight)
-{
- int x, y, width2, height2, nextrow;
- if (width > destwidth) {
- if (height > destheight) {
- // reduce both
- width2 = width >> 1;
- height2 = height >> 1;
- nextrow = width << 2;
- for (y = 0; y < height2; y++) {
- for (x = 0; x < width2; x++) {
- out[0] = (byte) ((in[0] + in[4] + in[nextrow] + in[nextrow + 4]) >> 2);
- out[1] = (byte) ((in[1] + in[5] + in[nextrow + 1] + in[nextrow + 5]) >> 2);
- out[2] = (byte) ((in[2] + in[6] + in[nextrow + 2] + in[nextrow + 6]) >> 2);
- out[3] = (byte) ((in[3] + in[7] + in[nextrow + 3] + in[nextrow + 7]) >> 2);
- out += 4;
- in += 8;
- }
- in += nextrow; // skip a line
- }
- } else {
- // reduce width
- width2 = width >> 1;
- for (y = 0; y < height; y++) {
- for (x = 0; x < width2; x++) {
- out[0] = (byte) ((in[0] + in[4]) >> 1);
- out[1] = (byte) ((in[1] + in[5]) >> 1);
- out[2] = (byte) ((in[2] + in[6]) >> 1);
- out[3] = (byte) ((in[3] + in[7]) >> 1);
- out += 4;
- in += 8;
- }
- }
- }
- } else {
- if (height > destheight) {
- // reduce height
- height2 = height >> 1;
- nextrow = width << 2;
- for (y = 0; y < height2; y++) {
- for (x = 0; x < width; x++) {
- out[0] = (byte) ((in[0] + in[nextrow]) >> 1);
- out[1] = (byte) ((in[1] + in[nextrow + 1]) >> 1);
- out[2] = (byte) ((in[2] + in[nextrow + 2]) >> 1);
- out[3] = (byte) ((in[3] + in[nextrow + 3]) >> 1);
- out += 4;
- in += 4;
- }
- in += nextrow; // skip a line
- }
- } else {
- globalOutputStream() << "GL_MipReduce: desired size already achieved\n";
- }
- }
+void GL_MipReduce( byte *in, byte *out, int width, int height, int destwidth, int destheight ){
+ int x, y, width2, height2, nextrow;
+ if ( width > destwidth ) {
+ if ( height > destheight ) {
+ // reduce both
+ width2 = width >> 1;
+ height2 = height >> 1;
+ nextrow = width << 2;
+ for ( y = 0; y < height2; y++ )
+ {
+ for ( x = 0; x < width2; x++ )
+ {
+ out[0] = (byte) ( ( in[0] + in[4] + in[nextrow ] + in[nextrow + 4] ) >> 2 );
+ out[1] = (byte) ( ( in[1] + in[5] + in[nextrow + 1] + in[nextrow + 5] ) >> 2 );
+ out[2] = (byte) ( ( in[2] + in[6] + in[nextrow + 2] + in[nextrow + 6] ) >> 2 );
+ out[3] = (byte) ( ( in[3] + in[7] + in[nextrow + 3] + in[nextrow + 7] ) >> 2 );
+ out += 4;
+ in += 8;
+ }
+ in += nextrow; // skip a line
+ }
+ }
+ else
+ {
+ // reduce width
+ width2 = width >> 1;
+ for ( y = 0; y < height; y++ )
+ {
+ for ( x = 0; x < width2; x++ )
+ {
+ out[0] = (byte) ( ( in[0] + in[4] ) >> 1 );
+ out[1] = (byte) ( ( in[1] + in[5] ) >> 1 );
+ out[2] = (byte) ( ( in[2] + in[6] ) >> 1 );
+ out[3] = (byte) ( ( in[3] + in[7] ) >> 1 );
+ out += 4;
+ in += 8;
+ }
+ }
+ }
+ }
+ else
+ {
+ if ( height > destheight ) {
+ // reduce height
+ height2 = height >> 1;
+ nextrow = width << 2;
+ for ( y = 0; y < height2; y++ )
+ {
+ for ( x = 0; x < width; x++ )
+ {
+ out[0] = (byte) ( ( in[0] + in[nextrow ] ) >> 1 );
+ out[1] = (byte) ( ( in[1] + in[nextrow + 1] ) >> 1 );
+ out[2] = (byte) ( ( in[2] + in[nextrow + 2] ) >> 1 );
+ out[3] = (byte) ( ( in[3] + in[nextrow + 3] ) >> 1 );
+ out += 4;
+ in += 4;
+ }
+ in += nextrow; // skip a line
+ }
+ }
+ else
+ {
+ globalOutputStream() << "GL_MipReduce: desired size already achieved\n";
+ }
+ }
}