-/*\r
-Copyright (c) 2002 Forest "LordHavoc" Hale\r
-\r
-All rights reserved.\r
-\r
-Redistribution and use in source and binary forms, with or without modification,\r
-are permitted provided that the following conditions are met:\r
-\r
-Redistributions of source code must retain the above copyright notice, this list\r
-of conditions and the following disclaimer.\r
-\r
-Redistributions in binary form must reproduce the above copyright notice, this\r
-list of conditions and the following disclaimer in the documentation and/or\r
-other materials provided with the distribution.\r
-\r
-Neither the name of Forest Hale nor the names of other contributors may be used\r
-to endorse or promote products derived from this software without specific prior\r
-written permission. \r
-\r
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''\r
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\r
-DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY \r
-DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES \r
-(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r
-LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\r
-ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
-SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \r
-*/\r
-\r
-#include "stdafx.h"\r
-#include "str.h"\r
-\r
-static byte *row1 = NULL, *row2 = NULL;\r
-static int rowsize = 0;\r
-\r
-void R_ResampleTextureLerpLine (byte *in, byte *out, int inwidth, int outwidth, int bytesperpixel)\r
-{\r
- int j, xi, oldx = 0, f, fstep, endx, lerp;\r
-#define LERPBYTE(i) out[i] = (byte) ((((row2[i] - row1[i]) * lerp) >> 16) + row1[i])\r
-\r
- fstep = (int) (inwidth * 65536.0f / outwidth);\r
- endx = (inwidth - 1);\r
- if (bytesperpixel == 4)\r
- {\r
- for (j = 0,f = 0;j < outwidth;j++, f += fstep)\r
- {\r
- xi = f >> 16;\r
- if (xi != oldx)\r
- {\r
- in += (xi - oldx) * 4;\r
- oldx = xi;\r
- }\r
-\r
- if (xi < endx)\r
- {\r
- lerp = f & 0xFFFF;\r
- *out++ = (byte) ((((in[4] - in[0]) * lerp) >> 16) + in[0]);\r
- *out++ = (byte) ((((in[5] - in[1]) * lerp) >> 16) + in[1]);\r
- *out++ = (byte) ((((in[6] - in[2]) * lerp) >> 16) + in[2]);\r
- *out++ = (byte) ((((in[7] - in[3]) * lerp) >> 16) + in[3]);\r
- }\r
- else // last pixel of the line has no pixel to lerp to\r
- {\r
- *out++ = in[0];\r
- *out++ = in[1];\r
- *out++ = in[2];\r
- *out++ = in[3];\r
- }\r
- }\r
- }\r
- else if (bytesperpixel == 3)\r
- {\r
- for (j = 0, f = 0; j < outwidth; j++, f += fstep)\r
- {\r
- xi = f >> 16;\r
- if (xi != oldx)\r
- {\r
- in += (xi - oldx) * 3;\r
- oldx = xi;\r
- }\r
-\r
- if (xi < endx)\r
- {\r
- lerp = f & 0xFFFF;\r
- *out++ = (byte) ((((in[3] - in[0]) * lerp) >> 16) + in[0]);\r
- *out++ = (byte) ((((in[4] - in[1]) * lerp) >> 16) + in[1]);\r
- *out++ = (byte) ((((in[5] - in[2]) * lerp) >> 16) + in[2]);\r
- }\r
- else // last pixel of the line has no pixel to lerp to\r
- {\r
- *out++ = in[0];\r
- *out++ = in[1];\r
- *out++ = in[2];\r
- }\r
- }\r
- }\r
- else\r
- Sys_Printf("R_ResampleTextureLerpLine: unsupported bytesperpixel %i\n", bytesperpixel);\r
-}\r
-\r
-/*\r
-================\r
-R_ResampleTexture\r
-================\r
-*/\r
-void R_ResampleTexture (void *indata, int inwidth, int inheight, void *outdata, int outwidth, int outheight, int bytesperpixel)\r
-{\r
- if (rowsize < outwidth * bytesperpixel)\r
- {\r
- if (row1)\r
- free(row1);\r
- if (row2)\r
- free(row2);\r
-\r
- rowsize = outwidth * bytesperpixel;\r
- row1 = (byte *)malloc(rowsize);\r
- row2 = (byte *)malloc(rowsize);\r
- }\r
-\r
- if (bytesperpixel == 4)\r
- {\r
- int i, j, yi, oldy, f, fstep, lerp, endy = (inheight-1), inwidth4 = inwidth*4, outwidth4 = outwidth*4;\r
- byte *inrow, *out;\r
- out = (byte *)outdata;\r
- fstep = (int) (inheight * 65536.0f / outheight);\r
-#define LERPBYTE(i) out[i] = (byte) ((((row2[i] - row1[i]) * lerp) >> 16) + row1[i])\r
-\r
- inrow = (byte *)indata;\r
- oldy = 0;\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
- R_ResampleTextureLerpLine (inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel);\r
-\r
- for (i = 0, f = 0;i < outheight;i++,f += fstep)\r
- {\r
- yi = f >> 16;\r
- if (yi < endy)\r
- {\r
- lerp = f & 0xFFFF;\r
- if (yi != oldy)\r
- {\r
- inrow = (byte *)indata + inwidth4 * yi;\r
- if (yi == oldy+1)\r
- memcpy(row1, row2, outwidth4);\r
- else\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
-\r
- R_ResampleTextureLerpLine (inrow + inwidth4, row2, inwidth, outwidth, bytesperpixel);\r
- oldy = yi;\r
- }\r
- j = outwidth - 4;\r
- while(j >= 0)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- LERPBYTE( 3);\r
- LERPBYTE( 4);\r
- LERPBYTE( 5);\r
- LERPBYTE( 6);\r
- LERPBYTE( 7);\r
- LERPBYTE( 8);\r
- LERPBYTE( 9);\r
- LERPBYTE(10);\r
- LERPBYTE(11);\r
- LERPBYTE(12);\r
- LERPBYTE(13);\r
- LERPBYTE(14);\r
- LERPBYTE(15);\r
- out += 16;\r
- row1 += 16;\r
- row2 += 16;\r
- j -= 4;\r
- }\r
- if (j & 2)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- LERPBYTE( 3);\r
- LERPBYTE( 4);\r
- LERPBYTE( 5);\r
- LERPBYTE( 6);\r
- LERPBYTE( 7);\r
- out += 8;\r
- row1 += 8;\r
- row2 += 8;\r
- }\r
- if (j & 1)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- LERPBYTE( 3);\r
- out += 4;\r
- row1 += 4;\r
- row2 += 4;\r
- }\r
- row1 -= outwidth4;\r
- row2 -= outwidth4;\r
- }\r
- else\r
- {\r
- if (yi != oldy)\r
- {\r
- inrow = (byte *)indata + inwidth4*yi;\r
- if (yi == oldy+1)\r
- memcpy(row1, row2, outwidth4);\r
- else\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
-\r
- oldy = yi;\r
- }\r
- memcpy(out, row1, outwidth4);\r
- }\r
- }\r
- }\r
- else if (bytesperpixel == 3)\r
- {\r
- int i, j, yi, oldy, f, fstep, lerp, endy = (inheight-1), inwidth3 = inwidth * 3, outwidth3 = outwidth * 3;\r
- byte *inrow, *out;\r
- out = (byte *)outdata;\r
- fstep = (int) (inheight*65536.0f/outheight);\r
-#define LERPBYTE(i) out[i] = (byte) ((((row2[i] - row1[i]) * lerp) >> 16) + row1[i])\r
-\r
- inrow = (byte *)indata;\r
- oldy = 0;\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
- R_ResampleTextureLerpLine (inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel);\r
- for (i = 0, f = 0;i < outheight;i++,f += fstep)\r
- {\r
- yi = f >> 16;\r
- if (yi < endy)\r
- {\r
- lerp = f & 0xFFFF;\r
- if (yi != oldy)\r
- {\r
- inrow = (byte *)indata + inwidth3*yi;\r
- if (yi == oldy+1)\r
- memcpy(row1, row2, outwidth3);\r
- else\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
-\r
- R_ResampleTextureLerpLine (inrow + inwidth3, row2, inwidth, outwidth, bytesperpixel);\r
- oldy = yi;\r
- }\r
- j = outwidth - 4;\r
- while(j >= 0)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- LERPBYTE( 3);\r
- LERPBYTE( 4);\r
- LERPBYTE( 5);\r
- LERPBYTE( 6);\r
- LERPBYTE( 7);\r
- LERPBYTE( 8);\r
- LERPBYTE( 9);\r
- LERPBYTE(10);\r
- LERPBYTE(11);\r
- out += 12;\r
- row1 += 12;\r
- row2 += 12;\r
- j -= 4;\r
- }\r
- if (j & 2)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- LERPBYTE( 3);\r
- LERPBYTE( 4);\r
- LERPBYTE( 5);\r
- out += 6;\r
- row1 += 6;\r
- row2 += 6;\r
- }\r
- if (j & 1)\r
- {\r
- LERPBYTE( 0);\r
- LERPBYTE( 1);\r
- LERPBYTE( 2);\r
- out += 3;\r
- row1 += 3;\r
- row2 += 3;\r
- }\r
- row1 -= outwidth3;\r
- row2 -= outwidth3;\r
- }\r
- else\r
- {\r
- if (yi != oldy)\r
- {\r
- inrow = (byte *)indata + inwidth3*yi;\r
- if (yi == oldy+1)\r
- memcpy(row1, row2, outwidth3);\r
- else\r
- R_ResampleTextureLerpLine (inrow, row1, inwidth, outwidth, bytesperpixel);\r
-\r
- oldy = yi;\r
- }\r
- memcpy(out, row1, outwidth3);\r
- }\r
- }\r
- }\r
- else\r
- Sys_Printf("R_ResampleTexture: unsupported bytesperpixel %i\n", bytesperpixel);\r
-}\r
-\r
-// in can be the same as out\r
-void GL_MipReduce(byte *in, byte *out, int width, int height, int destwidth, int destheight)\r
-{\r
- int x, y, width2, height2, nextrow;\r
- if (width > destwidth)\r
- {\r
- if (height > destheight)\r
- {\r
- // reduce both\r
- width2 = width >> 1;\r
- height2 = height >> 1;\r
- nextrow = width << 2;\r
- for (y = 0;y < height2;y++)\r
- {\r
- for (x = 0;x < width2;x++)\r
- {\r
- out[0] = (byte) ((in[0] + in[4] + in[nextrow ] + in[nextrow+4]) >> 2);\r
- out[1] = (byte) ((in[1] + in[5] + in[nextrow+1] + in[nextrow+5]) >> 2);\r
- out[2] = (byte) ((in[2] + in[6] + in[nextrow+2] + in[nextrow+6]) >> 2);\r
- out[3] = (byte) ((in[3] + in[7] + in[nextrow+3] + in[nextrow+7]) >> 2);\r
- out += 4;\r
- in += 8;\r
- }\r
- in += nextrow; // skip a line\r
- }\r
- }\r
- else\r
- {\r
- // reduce width\r
- width2 = width >> 1;\r
- for (y = 0;y < height;y++)\r
- {\r
- for (x = 0;x < width2;x++)\r
- {\r
- out[0] = (byte) ((in[0] + in[4]) >> 1);\r
- out[1] = (byte) ((in[1] + in[5]) >> 1);\r
- out[2] = (byte) ((in[2] + in[6]) >> 1);\r
- out[3] = (byte) ((in[3] + in[7]) >> 1);\r
- out += 4;\r
- in += 8;\r
- }\r
- }\r
- }\r
- }\r
- else\r
- {\r
- if (height > destheight)\r
- {\r
- // reduce height\r
- height2 = height >> 1;\r
- nextrow = width << 2;\r
- for (y = 0;y < height2;y++)\r
- {\r
- for (x = 0;x < width;x++)\r
- {\r
- out[0] = (byte) ((in[0] + in[nextrow ]) >> 1);\r
- out[1] = (byte) ((in[1] + in[nextrow+1]) >> 1);\r
- out[2] = (byte) ((in[2] + in[nextrow+2]) >> 1);\r
- out[3] = (byte) ((in[3] + in[nextrow+3]) >> 1);\r
- out += 4;\r
- in += 4;\r
- }\r
- in += nextrow; // skip a line\r
- }\r
- }\r
- else\r
- Sys_Printf("GL_MipReduce: desired size already achieved\n");\r
- }\r
-}\r
+/*
+ Copyright (c) 2002 Forest "LordHavoc" Hale
+
+ All rights reserved.
+
+ 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 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.
+
+ 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 "texmanip.h"
+
+#include <stdlib.h>
+#include "stream/textstream.h"
+
+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] )
+
+ 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[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 );
+ }
+
+ 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] )
+
+ 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 );
+ }
+
+ 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] )
+
+ 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 );
+ }
+
+ 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";
+ }
+ }
+}