X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=radiant%2Ftexmanip.cpp;h=5f66bb2d659e933c1b1c5f4bc47fe477390e9717;hb=9dfae1c9b270ee369c6362903a9205b30751b95f;hp=53c3b788f7d045522e58eae0e8cdc856c6ace5e7;hpb=33efc9089296fc4e5f54d43581a0db81576ba848;p=xonotic%2Fnetradiant.git diff --git a/radiant/texmanip.cpp b/radiant/texmanip.cpp index 53c3b788..5f66bb2d 100644 --- a/radiant/texmanip.cpp +++ b/radiant/texmanip.cpp @@ -1,380 +1,343 @@ /* -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) +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]) + 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]; - } + 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"; } - } - else - Sys_Printf("R_ResampleTextureLerpLine: unsupported bytesperpixel %i\n", bytesperpixel); } /* -================ -R_ResampleTexture -================ -*/ -void R_ResampleTexture (void *indata, int inwidth, int inheight, void *outdata, int outwidth, int outheight, int bytesperpixel) + ================ + 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); + 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; + oldy = yi; + } + memcpy(out, row1, outwidth4); + } } - 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]) + } 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; + oldy = yi; + } + memcpy(out, row1, outwidth3); + } } - memcpy(out, row1, outwidth3); - } + } else { + globalOutputStream() << "R_ResampleTexture: unsupported bytesperpixel " << bytesperpixel << "\n"; } - } - else - Sys_Printf("R_ResampleTexture: unsupported bytesperpixel %i\n", bytesperpixel); } // 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; + 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; + } 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"; } - in += nextrow; // skip a line - } } - else - Sys_Printf("GL_MipReduce: desired size already achieved\n"); - } }