]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/texmanip.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / radiant / texmanip.cpp
index 03196c3cd30c9da23978ca60cfabab06a8bd31bb..5f66bb2d659e933c1b1c5f4bc47fe477390e9717 100644 (file)
 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";
+        }
+    }
 }