X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=radiant%2Ftexmanip.cpp;h=03196c3cd30c9da23978ca60cfabab06a8bd31bb;hb=4097617940e50a7980bac412b945acd937b2292c;hp=53c3b788f7d045522e58eae0e8cdc856c6ace5e7;hpb=33efc9089296fc4e5f54d43581a0db81576ba848;p=xonotic%2Fnetradiant.git diff --git a/radiant/texmanip.cpp b/radiant/texmanip.cpp index 53c3b788..03196c3c 100644 --- a/radiant/texmanip.cpp +++ b/radiant/texmanip.cpp @@ -1,380 +1,373 @@ /* -Copyright (c) 2002 Forest "LordHavoc" Hale + Copyright (c) 2002 Forest "LordHavoc" Hale -All rights reserved. + All rights reserved. -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: + Redistribution and use in source and binary forms, with or without modification, + are permitted provided that the following conditions are met: -Redistributions of source code must retain the above copyright notice, this list -of conditions and the following disclaimer. + Redistributions of source code must retain the above copyright notice, this list + of conditions and the following disclaimer. -Redistributions in binary form must reproduce the above copyright notice, this -list of conditions and the following disclaimer in the documentation and/or -other materials provided with the distribution. + Redistributions in binary form must reproduce the above copyright notice, this + list of conditions and the following disclaimer in the documentation and/or + other materials provided with the distribution. -Neither the name of Forest Hale nor the names of other contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. + Neither the name of Forest Hale nor the names of other contributors may be used + to endorse or promote products derived from this software without specific prior + written permission. -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY + DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ -#include "stdafx.h" -#include "str.h" +#include "texmanip.h" + +#include +#include "stream/textstream.h" static byte *row1 = NULL, *row2 = NULL; static int rowsize = 0; -void R_ResampleTextureLerpLine (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 - Sys_Printf("R_ResampleTextureLerpLine: unsupported bytesperpixel %i\n", bytesperpixel); + 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 (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); + ================ + 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 ); + } - 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 - Sys_Printf("R_ResampleTexture: unsupported bytesperpixel %i\n", bytesperpixel); + 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 - Sys_Printf("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"; + } + } }