]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/gtkgensurf/bitmap.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / gtkgensurf / bitmap.cpp
index 68eea5c2c43ee611a0bec432075a855bf2dc8cf6..5156634556ae1487a63345d153f81701a1035553 100644 (file)
 #include <math.h>
 #include "gensurf.h"
 
-void GenerateBitmapMapping(){
-       double value;
-       double C0, C1;
-       double x, y;
-       int i, j;
-       int O00,O01,O10,O11;
-       int r0, r1, c0, c1;
-       int color;
-       unsigned char       *colors;
-
-       if ( !gbmp.colors ) {
-               return;
-       }
-
-       colors = gbmp.colors;
-
-       for ( j = 0; j <= NV; j++ )
-       {
-               y  = (double)( j * ( gbmp.height - 1 ) ) / (double)NV;
-               r0 = (int)floor( y );
-               r1 = (int)ceil( y );
-               for ( i = 0; i <= NH; i++ )
-               {
-                       x = (double)( i * ( gbmp.width - 1 ) ) / (double)NH;
-                       c0 = (int)floor( x );
-                       c1 = (int)ceil( x );
-                       O00 = r0 * gbmp.width + c0;
-                       O01 = r0 * gbmp.width + c1;
-                       O10 = r1 * gbmp.width + c0;
-                       O11 = r1 * gbmp.width + c1;
-                       C0 = (double)colors[O00] + (double)( colors[O01] - colors[O00] ) * ( x - (double)c0 );
-                       C1 = (double)colors[O10] + (double)( colors[O11] - colors[O10] ) * ( x - (double)c0 );
-                       color = (int)( C0 + ( C1 - C0 ) * ( y - r0 ) );
-
-                       value = CalculateSnapValue( gbmp.black_value + color * ( ( gbmp.white_value - gbmp.black_value ) / 255. ) );
-
-                       switch ( Plane )
-                       {
-                       case PLANE_XZ0:
-                       case PLANE_XZ1:
-                               xyz[i][j].p[1] = value;
-                               break;
-                       case PLANE_YZ0:
-                       case PLANE_YZ1:
-                               xyz[i][j].p[0] = value;
-                               break;
-                       default:
-                               xyz[i][j].p[2] = value;
-                       }
-               }
-       }
+void GenerateBitmapMapping()
+{
+    double value;
+    double C0, C1;
+    double x, y;
+    int i, j;
+    int O00, O01, O10, O11;
+    int r0, r1, c0, c1;
+    int color;
+    unsigned char *colors;
+
+    if (!gbmp.colors) {
+        return;
+    }
+
+    colors = gbmp.colors;
+
+    for (j = 0; j <= NV; j++) {
+        y = (double) (j * (gbmp.height - 1)) / (double) NV;
+        r0 = (int) floor(y);
+        r1 = (int) ceil(y);
+        for (i = 0; i <= NH; i++) {
+            x = (double) (i * (gbmp.width - 1)) / (double) NH;
+            c0 = (int) floor(x);
+            c1 = (int) ceil(x);
+            O00 = r0 * gbmp.width + c0;
+            O01 = r0 * gbmp.width + c1;
+            O10 = r1 * gbmp.width + c0;
+            O11 = r1 * gbmp.width + c1;
+            C0 = (double) colors[O00] + (double) (colors[O01] - colors[O00]) * (x - (double) c0);
+            C1 = (double) colors[O10] + (double) (colors[O11] - colors[O10]) * (x - (double) c0);
+            color = (int) (C0 + (C1 - C0) * (y - r0));
+
+            value = CalculateSnapValue(gbmp.black_value + color * ((gbmp.white_value - gbmp.black_value) / 255.));
+
+            switch (Plane) {
+                case PLANE_XZ0:
+                case PLANE_XZ1:
+                    xyz[i][j].p[1] = value;
+                    break;
+                case PLANE_YZ0:
+                case PLANE_YZ1:
+                    xyz[i][j].p[0] = value;
+                    break;
+                default:
+                    xyz[i][j].p[2] = value;
+            }
+        }
+    }
 }
 
-static unsigned char* OpenBitmapFile(){
-#define INVALID_FORMAT do {    \
-               fprintf( stderr,"%s:%d: Error file '%s' is malformed.\n",__FILE__,__LINE__,gbmp.name ); \
-               fclose( fp ); \
-               return NULL; \
+static unsigned char *OpenBitmapFile()
+{
+#define INVALID_FORMAT do {    \
+        fprintf( stderr,"%s:%d: Error file '%s' is malformed.\n",__FILE__,__LINE__,gbmp.name );    \
+        fclose( fp ); \
+        return NULL; \
 } while ( 0 );
 
-       int32_t bmWidth;
-       int32_t bmHeight;
-       uint16_t bmPlanes;
-       uint16_t bmBitsPixel;
-       uint8_t m1,m2;
-       uint32_t sizeimage;
-       int16_t res1,res2;
-       int32_t filesize, pixoff;
-       int32_t bmisize, compression;
-       int32_t xscale, yscale;
-       int32_t colors, impcol;
-       uint32_t m_bytesRead = 0;
-       unsigned char *image;
-       FILE *fp;
-
-       fp = fopen( gbmp.name, "rb" );
-       if ( fp == NULL ) {
-               fprintf( stderr,"Error: Invalid filename '%s'\n",gbmp.name );
-               return NULL;
-       }
-
-       long rc;
-       rc = fread( &m1, 1, 1, fp );
-       m_bytesRead++;
-       if ( rc == -1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( &m2, 1, 1, fp );
-       m_bytesRead++;
-       if ( ( m1 != 'B' ) || ( m2 != 'M' ) ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( filesize ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint16_t*)&( res1 ),2,1,fp ); m_bytesRead += 2;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint16_t*)&( res2 ),2,1,fp ); m_bytesRead += 2;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( pixoff ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( bmisize ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t  *)&( bmWidth ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( bmHeight ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint16_t*)&( bmPlanes ),2,1,fp ); m_bytesRead += 2;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint16_t*)&( bmBitsPixel ),2,1,fp ); m_bytesRead += 2;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( compression ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( sizeimage ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( xscale ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( yscale ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( colors ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       rc = fread( (uint32_t*)&( impcol ),4,1,fp ); m_bytesRead += 4;
-       if ( rc != 1 ) {
-               INVALID_FORMAT;
-       }
-
-       if ( bmBitsPixel != 8 ) {
-               g_FuncTable.m_pfnMessageBox( g_pWnd, "This is not an 8-bit image. GenSurf can't use it.",
-                                                                        "Bitmap", eMB_OK, eMB_ICONWARNING );
-               fclose( fp );
-               return NULL;
-       }
-
-       if ( colors == 0 ) {
-               colors = 1 << bmBitsPixel;
-       }
-
-       if ( bmBitsPixel != 24 ) {
-               int i;
-               for ( i = 0; i < colors; i++ )
-               {
-                       unsigned char r,g, b, dummy;
-
-                       rc = fread( &b, 1, 1, fp );
-                       m_bytesRead++;
-                       if ( rc != 1 ) {
-                               INVALID_FORMAT;
-                       }
-
-                       rc = fread( &g, 1, 1, fp );
-                       m_bytesRead++;
-                       if ( rc != 1 ) {
-                               INVALID_FORMAT;
-                       }
-
-                       rc = fread( &r, 1, 1, fp );
-                       m_bytesRead++;
-                       if ( rc != 1 ) {
-                               INVALID_FORMAT;
-                       }
-
-                       rc = fread( &dummy, 1, 1, fp );
-                       m_bytesRead++;
-                       if ( rc != 1 ) {
-                               INVALID_FORMAT;
-                       }
-               }
-       }
-
-       if ( (long)m_bytesRead > pixoff ) {
-               INVALID_FORMAT;
-       }
-
-       while ( (long)m_bytesRead < pixoff )
-       {
-               char dummy;
-               fread( &dummy,1,1,fp );
-               m_bytesRead++;
-       }
-
-       int w = bmWidth;
-       int h = bmHeight;
-
-       // set the output params
-       image = (unsigned char*)malloc( w * h );
-
-       if ( image != NULL ) {
-               unsigned char* outbuf = image;
-               long row = 0;
-               long rowOffset = 0;
-
-               if ( compression == 0 ) { // BI_RGB
-                       for ( row = 0; row < bmHeight; row++ )
-                       {
-                               // which row are we working on?
-                               rowOffset = (long unsigned)row * w;
-
-                               {
-                                       // pixels are packed as 1 , 4 or 8 bit vals. need to unpack them
-                                       int bit_count = 0;
-                                       unsigned long mask = ( 1 << bmBitsPixel ) - 1;
-                                       unsigned char inbyte = 0;
-
-                                       for ( int col = 0; col < w; col++ )
-                                       {
-                                               int pix = 0;
-
-                                               // if we need another byte
-                                               if ( bit_count <= 0 ) {
-                                                       bit_count = 8;
-                                                       if ( fread( &inbyte,1,1,fp ) != 1 ) {
-                                                               free( image );
-                                                               INVALID_FORMAT;
-                                                       }
-                                                       m_bytesRead++;
-                                               }
-
-                                               // keep track of where we are in the bytes
-                                               bit_count -= bmBitsPixel;
-                                               pix = ( inbyte >> bit_count ) & mask;
-
-                                               // lookup the color from the colormap - stuff it in our buffer
-                                               // swap red and blue
-                                               *( outbuf + rowOffset + col ) = pix;
-                                       }
-
-                                       // read DWORD padding
-                                       while ( ( m_bytesRead - pixoff ) & 3 )
-                                       {
-                                               char dummy;
-                                               if ( fread( &dummy,1,1,fp ) != 1 ) {
-                                                       free( image );
-                                                       INVALID_FORMAT;
-                                               }
-                                               m_bytesRead++;
-                                       }
-                               }
-                       }
-               }
-               else // compression != 0
-               {
-                       int i, x = 0;
-                       unsigned char c, c1 = 0, *pp;
-                       row = 0;
-                       pp = outbuf;
-
-                       if ( bmBitsPixel == 8 ) {
-                               while ( row < bmHeight )
-                               {
-                                       c = getc( fp );
-
-                                       if ( c ) {
-                                               // encoded mode
-                                               c1 = getc( fp );
-                                               for ( i = 0; i < c; x++, i++ )
-                                               {
-                                                       *pp = c1; pp++;
-                                               }
-                                       }
-                                       else
-                                       {
-                                               // c==0x00,  escape codes
-                                               c = getc( fp );
-
-                                               if ( c == 0x00 ) { // end of line
-                                                       row++;
-                                                       x = 0;
-                                                       pp = outbuf + row * bmWidth;
-                                               }
-                                               else if ( c == 0x01 ) {
-                                                       break; // end of pic
-                                               }
-                                               else if ( c == 0x02 ) { // delta
-                                                       c = getc( fp );
-                                                       x += c;
-                                                       c = getc( fp );
-                                                       row += c;
-                                                       pp = outbuf + x + row * bmWidth;
-                                               }
-                                               else // absolute mode
-                                               {
-                                                       for ( i = 0; i < c; x++, i++ )
-                                                       {
-                                                               c1 = getc( fp );
-                                                               *pp = c1; pp++;
-                                                       }
-
-                                                       if ( c & 1 ) {
-                                                               getc( fp ); // odd length run: read an extra pad byte
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-                       else if ( bmBitsPixel == 4 ) {
-                               while ( row < bmHeight )
-                               {
-                                       c = getc( fp );
-
-                                       if ( c ) {
-                                               // encoded mode
-                                               c1 = getc( fp );
-                                               for ( i = 0; i < c; x++, i++ )
-                                               {
-                                                       *pp = ( i & 1 ) ? ( c1 & 0x0f ) : ( ( c1 >> 4 ) & 0x0f ); pp++;
-                                               }
-                                       }
-                                       else
-                                       {
-                                               // c==0x00,  escape codes
-                                               c = getc( fp );
-
-                                               if ( c == 0x00 ) { // end of line
-                                                       row++;
-                                                       x = 0;
-                                                       pp = outbuf + bmHeight * bmWidth;
-                                               }
-                                               else if ( c == 0x01 ) {
-                                                       break; // end of pic
-                                               }
-                                               else if ( c == 0x02 ) { // delta
-                                                       c = getc( fp );
-                                                       x += c;
-                                                       c = getc( fp );
-                                                       row += c;
-                                                       pp = outbuf + x + row * bmWidth;
-                                               }
-                                               else // absolute mode
-                                               {
-                                                       for ( i = 0; i < c; x++, i++ )
-                                                       {
-                                                               if ( ( i & 1 ) == 0 ) {
-                                                                       c1 = getc( fp );
-                                                               }
-                                                               *pp = ( i & 1 ) ? ( c1 & 0x0f ) : ( ( c1 >> 4 ) & 0x0f ); pp++;
-                                                       }
-
-                                                       if ( ( ( c & 3 ) == 1 ) || ( ( c & 3 ) == 2 ) ) {
-                                                               getc( fp ); // odd length run: read an extra pad byte
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-       fclose( fp );
-
-       gbmp.width = w;
-       gbmp.height = h;
-       if ( gbmp.colors ) {
-               free( gbmp.colors );
-       }
-       gbmp.colors = image;
-       return image;
+    int32_t bmWidth;
+    int32_t bmHeight;
+    uint16_t bmPlanes;
+    uint16_t bmBitsPixel;
+    uint8_t m1, m2;
+    uint32_t sizeimage;
+    int16_t res1, res2;
+    int32_t filesize, pixoff;
+    int32_t bmisize, compression;
+    int32_t xscale, yscale;
+    int32_t colors, impcol;
+    uint32_t m_bytesRead = 0;
+    unsigned char *image;
+    FILE *fp;
+
+    fp = fopen(gbmp.name, "rb");
+    if (fp == NULL) {
+        fprintf(stderr, "Error: Invalid filename '%s'\n", gbmp.name);
+        return NULL;
+    }
+
+    long rc;
+    rc = fread(&m1, 1, 1, fp);
+    m_bytesRead++;
+    if (rc == -1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread(&m2, 1, 1, fp);
+    m_bytesRead++;
+    if ((m1 != 'B') || (m2 != 'M')) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (filesize), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint16_t * ) & (res1), 2, 1, fp);
+    m_bytesRead += 2;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint16_t * ) & (res2), 2, 1, fp);
+    m_bytesRead += 2;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (pixoff), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (bmisize), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (bmWidth), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (bmHeight), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint16_t * ) & (bmPlanes), 2, 1, fp);
+    m_bytesRead += 2;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint16_t * ) & (bmBitsPixel), 2, 1, fp);
+    m_bytesRead += 2;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (compression), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (sizeimage), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (xscale), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (yscale), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (colors), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    rc = fread((uint32_t * ) & (impcol), 4, 1, fp);
+    m_bytesRead += 4;
+    if (rc != 1) {
+        INVALID_FORMAT;
+    }
+
+    if (bmBitsPixel != 8) {
+        g_FuncTable.m_pfnMessageBox(g_pWnd, "This is not an 8-bit image. GenSurf can't use it.",
+                                    "Bitmap", eMB_OK, eMB_ICONWARNING);
+        fclose(fp);
+        return NULL;
+    }
+
+    if (colors == 0) {
+        colors = 1 << bmBitsPixel;
+    }
+
+    if (bmBitsPixel != 24) {
+        int i;
+        for (i = 0; i < colors; i++) {
+            unsigned char r, g, b, dummy;
+
+            rc = fread(&b, 1, 1, fp);
+            m_bytesRead++;
+            if (rc != 1) {
+                INVALID_FORMAT;
+            }
+
+            rc = fread(&g, 1, 1, fp);
+            m_bytesRead++;
+            if (rc != 1) {
+                INVALID_FORMAT;
+            }
+
+            rc = fread(&r, 1, 1, fp);
+            m_bytesRead++;
+            if (rc != 1) {
+                INVALID_FORMAT;
+            }
+
+            rc = fread(&dummy, 1, 1, fp);
+            m_bytesRead++;
+            if (rc != 1) {
+                INVALID_FORMAT;
+            }
+        }
+    }
+
+    if ((long) m_bytesRead > pixoff) {
+        INVALID_FORMAT;
+    }
+
+    while ((long) m_bytesRead < pixoff) {
+        char dummy;
+        fread(&dummy, 1, 1, fp);
+        m_bytesRead++;
+    }
+
+    int w = bmWidth;
+    int h = bmHeight;
+
+    // set the output params
+    image = (unsigned char *) malloc(w * h);
+
+    if (image != NULL) {
+        unsigned char *outbuf = image;
+        long row = 0;
+        long rowOffset = 0;
+
+        if (compression == 0) { // BI_RGB
+            for (row = 0; row < bmHeight; row++) {
+                // which row are we working on?
+                rowOffset = (long unsigned) row * w;
+
+                {
+                    // pixels are packed as 1 , 4 or 8 bit vals. need to unpack them
+                    int bit_count = 0;
+                    unsigned long mask = (1 << bmBitsPixel) - 1;
+                    unsigned char inbyte = 0;
+
+                    for (int col = 0; col < w; col++) {
+                        int pix = 0;
+
+                        // if we need another byte
+                        if (bit_count <= 0) {
+                            bit_count = 8;
+                            if (fread(&inbyte, 1, 1, fp) != 1) {
+                                free(image);
+                                INVALID_FORMAT;
+                            }
+                            m_bytesRead++;
+                        }
+
+                        // keep track of where we are in the bytes
+                        bit_count -= bmBitsPixel;
+                        pix = (inbyte >> bit_count) & mask;
+
+                        // lookup the color from the colormap - stuff it in our buffer
+                        // swap red and blue
+                        *(outbuf + rowOffset + col) = pix;
+                    }
+
+                    // read DWORD padding
+                    while ((m_bytesRead - pixoff) & 3) {
+                        char dummy;
+                        if (fread(&dummy, 1, 1, fp) != 1) {
+                            free(image);
+                            INVALID_FORMAT;
+                        }
+                        m_bytesRead++;
+                    }
+                }
+            }
+        } else // compression != 0
+        {
+            int i, x = 0;
+            unsigned char c, c1 = 0, *pp;
+            row = 0;
+            pp = outbuf;
+
+            if (bmBitsPixel == 8) {
+                while (row < bmHeight) {
+                    c = getc(fp);
+
+                    if (c) {
+                        // encoded mode
+                        c1 = getc(fp);
+                        for (i = 0; i < c; x++, i++) {
+                            *pp = c1;
+                            pp++;
+                        }
+                    } else {
+                        // c==0x00,  escape codes
+                        c = getc(fp);
+
+                        if (c == 0x00) { // end of line
+                            row++;
+                            x = 0;
+                            pp = outbuf + row * bmWidth;
+                        } else if (c == 0x01) {
+                            break; // end of pic
+                        } else if (c == 0x02) { // delta
+                            c = getc(fp);
+                            x += c;
+                            c = getc(fp);
+                            row += c;
+                            pp = outbuf + x + row * bmWidth;
+                        } else // absolute mode
+                        {
+                            for (i = 0; i < c; x++, i++) {
+                                c1 = getc(fp);
+                                *pp = c1;
+                                pp++;
+                            }
+
+                            if (c & 1) {
+                                getc(fp); // odd length run: read an extra pad byte
+                            }
+                        }
+                    }
+                }
+            } else if (bmBitsPixel == 4) {
+                while (row < bmHeight) {
+                    c = getc(fp);
+
+                    if (c) {
+                        // encoded mode
+                        c1 = getc(fp);
+                        for (i = 0; i < c; x++, i++) {
+                            *pp = (i & 1) ? (c1 & 0x0f) : ((c1 >> 4) & 0x0f);
+                            pp++;
+                        }
+                    } else {
+                        // c==0x00,  escape codes
+                        c = getc(fp);
+
+                        if (c == 0x00) { // end of line
+                            row++;
+                            x = 0;
+                            pp = outbuf + bmHeight * bmWidth;
+                        } else if (c == 0x01) {
+                            break; // end of pic
+                        } else if (c == 0x02) { // delta
+                            c = getc(fp);
+                            x += c;
+                            c = getc(fp);
+                            row += c;
+                            pp = outbuf + x + row * bmWidth;
+                        } else // absolute mode
+                        {
+                            for (i = 0; i < c; x++, i++) {
+                                if ((i & 1) == 0) {
+                                    c1 = getc(fp);
+                                }
+                                *pp = (i & 1) ? (c1 & 0x0f) : ((c1 >> 4) & 0x0f);
+                                pp++;
+                            }
+
+                            if (((c & 3) == 1) || ((c & 3) == 2)) {
+                                getc(fp); // odd length run: read an extra pad byte
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+    fclose(fp);
+
+    gbmp.width = w;
+    gbmp.height = h;
+    if (gbmp.colors) {
+        free(gbmp.colors);
+    }
+    gbmp.colors = image;
+    return image;
 
 
 }
 
-bool OpenBitmap(){
+bool OpenBitmap()
+{
 
-       OpenBitmapFile();
+    OpenBitmapFile();
 
-       if ( !gbmp.colors ) {
-               char Text[256];
+    if (!gbmp.colors) {
+        char Text[256];
 
-               sprintf( Text, "Error opening %s", gbmp.name );
-               g_FuncTable.m_pfnMessageBox( g_pWnd, Text, "Bitmap", eMB_OK, eMB_ICONWARNING );
-               strcpy( gbmp.name, "" );
-       }
+        sprintf(Text, "Error opening %s", gbmp.name);
+        g_FuncTable.m_pfnMessageBox(g_pWnd, Text, "Bitmap", eMB_OK, eMB_ICONWARNING);
+        strcpy(gbmp.name, "");
+    }
 
-       if ( g_pWnd ) {
-               gtk_entry_set_text( GTK_ENTRY( g_object_get_data( G_OBJECT( g_pWnd ), "bmp_file" ) ), gbmp.name );
-               gtk_widget_set_sensitive( g_object_get_data( G_OBJECT( g_pWnd , "bmp_reload" ) ),
-                                                                 strlen( gbmp.name ) ? TRUE : FALSE );
+    if (g_pWnd) {
+        gtk_entry_set_text(GTK_ENTRY(g_object_get_data(G_OBJECT(g_pWnd), "bmp_file")), gbmp.name);
+        gtk_widget_set_sensitive(g_object_get_data(G_OBJECT(g_pWnd, "bmp_reload")),
+                                 strlen(gbmp.name) ? TRUE : FALSE);
 
-               UpdatePreview( true );
-       }
+        UpdatePreview(true);
+    }
 
-       return ( gbmp.colors != NULL );
+    return (gbmp.colors != NULL);
 }