X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Ftexmanip.cpp;h=5f66bb2d659e933c1b1c5f4bc47fe477390e9717;hb=9dfae1c9b270ee369c6362903a9205b30751b95f;hp=03196c3cd30c9da23978ca60cfabab06a8bd31bb;hpb=62d99f889c0e98be65f779d3983109c84ce58cec;p=xonotic%2Fnetradiant.git diff --git a/radiant/texmanip.cpp b/radiant/texmanip.cpp index 03196c3c..5f66bb2d 100644 --- a/radiant/texmanip.cpp +++ b/radiant/texmanip.cpp @@ -37,64 +37,58 @@ 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"; + } } /* @@ -102,272 +96,248 @@ void R_ResampleTextureLerpLine( const byte *in, byte *out, int inwidth, int outw 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"; + } + } }