diff options
Diffstat (limited to 'app/help/fixbmp.c')
-rw-r--r-- | app/help/fixbmp.c | 227 |
1 files changed, 0 insertions, 227 deletions
diff --git a/app/help/fixbmp.c b/app/help/fixbmp.c deleted file mode 100644 index 44555dc..0000000 --- a/app/help/fixbmp.c +++ /dev/null @@ -1,227 +0,0 @@ - -/* XTrkCad - Model Railroad CAD - * Copyright (C) 2005 Dave Bullis - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include <stdio.h> - -#define TRUE (1) -#define FALSE (0) - -struct BITMAPFILEHEADER { - char bfType[2]; - long bfSize; - short bfRsvd1; - short bfRsvd2; - long bfOffBits; - }; - -struct BITMAPINFOHEADER { - long biSize; - long biWidth; - long biHeight; - short biPlanes; - short biBitCount; - long biCompression; - long biSizeImage; - long biXPelsPerMeter; - long biYPelsPerMeter; - long biClrUsed; - long biClrImportant; - }; - -int namenames; -int dumpInfo; -int dumpColorMap; -int dumpBits; -int dumpHisto; -int updateColorCount; -int zeroColorCount; -int setColorCount; -int fixColorMap; - -int fixbmp( char * filename ) -{ - FILE * file; - struct BITMAPFILEHEADER bmfh; - struct BITMAPINFOHEADER bmih; - int rc; - long colors[256]; - int i, j, size; - unsigned char * bmp, bit; - int colorCnt; - long maxcolor; - long histo[256];; - - if ( namenames ) - printf( "%s\n", filename ); - file = fopen( filename, "r+" ); - if ( file == NULL ) { - fprintf( stderr, "%s: Cant open:%s\n", filename, filename ); - return FALSE; - } - rc = fread( &bmfh.bfType, 1, sizeof bmfh.bfType, file ); - rc += fread( &bmfh.bfSize, 1, sizeof bmfh.bfSize, file ); - rc += fread( &bmfh.bfRsvd1, 1, sizeof bmfh.bfRsvd1, file ); - rc += fread( &bmfh.bfRsvd2, 1, sizeof bmfh.bfRsvd2, file ); - rc += fread( &bmfh.bfOffBits, 1, sizeof bmfh.bfOffBits, file ); - if ( rc != 14 ) { - fprintf( stderr, "%s: Bad read of bmfh: %d\n", filename, rc ); - return FALSE; - } - rc = fread( &bmih, 1, sizeof bmih, file ); - if ( rc != sizeof bmih ) { - fprintf( stderr, "%s: Bad read of bmih: %d\n", filename, rc ); - return FALSE; - } - if ( dumpInfo ) { - printf( "fh:sz=%d, off=%ld\n", bmfh.bfSize, bmfh.bfOffBits ); - printf( "ih:sz=%ld, w=%ld, h=%ld, (%ld), pl=%d, bc=%d, co=%ld, si=%ld, cu=%ld, ci=%ld\n", - bmih.biSize, bmih.biWidth, bmih.biHeight, bmih.biWidth*bmih.biHeight, - bmih.biPlanes, bmih.biBitCount, bmih.biCompression, - bmih.biSizeImage, bmih.biClrUsed, bmih.biClrImportant ); - } - if ( bmih.biPlanes != 1 || bmih.biBitCount != 8 ) { - fprintf( stderr, "%s: bad Planes(%d) or BitCount(%d)\n", filename, bmih.biPlanes, bmih.biBitCount ); - return FALSE; - } - if ( bmih.biClrUsed > 256 ) { - fprintf( stderr, "%s: Too many colors (%ld)\n", filename, bmih.biClrUsed ); - return FALSE; - } - colorCnt = bmih.biClrUsed; - if ( colorCnt == 0 ) - colorCnt = 256; - rc = fread( colors, sizeof colors[0], colorCnt, file ); - if ( rc != colorCnt ) { - fprintf( stderr, "%s: Bad read of colors: %d\n", filename, rc ); - return FALSE; - } - if ( dumpColorMap ) { - printf( "colorcnt=%d", rc ); - for ( i=0; i<colorCnt; i++ ) { - if ( i%8 == 0 ) - printf( "\n%2.2x: ", i ); - printf( "%8.8lx ", colors[i] ); - } - printf( "\n" ); - } - if ( fixColorMap ) { - long c; - for ( i=0; i<colorCnt; i++ ) { - c = colors[i]&0xFFFFFF; - if ( (c & 0xFF0000) != 0xFF0000 ) - c &= 0xF0FFFF; - if ( (c & 0x00FF00) != 0x00FF00 ) - c &= 0xFFF0FF; - if ( (c & 0x0000FF) != 0x0000FF ) - c &= 0xFFFFF0; - colors[i] = c; - } - fseek( file, 14+40, SEEK_SET ); - rc = fwrite( colors, sizeof colors[0], colorCnt, file ); - if ( rc != colorCnt ) { - fprintf( stderr, "%s: Bad write of colors: %d\n", filename, rc ); - return FALSE; - } - } - size = (int)(bmih.biWidth*bmih.biHeight); - size = (int)bmih.biWidth; - size = (size+3)/4*4; - fseek( file, bmfh.bfOffBits, SEEK_SET ); - bmp = (unsigned char*)malloc( size ); - if ( bmp == NULL ) { - fprintf( stderr, "%s: Cant malloc(%d) for bitmap\n", filename, size ); - return FALSE; - } - maxcolor = 0; - memset( histo, 0, sizeof histo ); - for ( j=0; j<bmih.biHeight; j++ ) { - rc = fread( bmp, 1, size, file ); - if ( rc != size ) { - fprintf( stderr, "%s: Cant read bits for line %d: %d\n", filename, j, rc ); - return FALSE; - } - if ( dumpBits ) - printf( "%2.2d: ", j ); - for ( i=0; i<bmih.biWidth; i++ ) { - bit = bmp[i]; - histo[bit]++; - if ( dumpBits ) - printf( "%2.2x", bit ); - if ( bit > maxcolor ) - maxcolor = bit; - } - if ( dumpBits ) - printf( "\n" ); - } - free( bmp ); - if ( dumpHisto ) { - printf( "maxcolor=%ld\n", maxcolor ); - for ( i=0; i<256; i++ ) - if ( histo[i] ) - printf( "[%2.2x]%8.8x = %ld\n", i, colors[i], histo[i] ); - - } - if ( updateColorCount || zeroColorCount || setColorCount ) { - fseek( file, 14, SEEK_SET ); - if ( updateColorCount ) { - bmih.biClrImportant = maxcolor; - } else if ( zeroColorCount ) { - bmih.biClrImportant = 0; - bmih.biClrUsed = 0; - } else { - bmih.biClrImportant = 256; - bmih.biClrUsed = 256; - } - rc = fwrite( &bmih, 1, sizeof bmih, file ); - if ( rc != sizeof bmih ) { - fprintf( stderr, "%s: Update failed; %d\n", filename, rc ); - } - } - fclose( file ); - return TRUE; -} - - -int main( int argc, char * argv[] ) -{ - while ( argc > 2 && argv[1][0] == '-' ) { - switch ( argv[1][1] ) { - case 'a': dumpInfo++; dumpColorMap++; dumpBits++; dumpHisto++; break; - case 'i': dumpInfo++; break; - case 'c': dumpColorMap++; break; - case 'b': dumpBits++; break; - case 'h': dumpHisto++; break; - case 'u': updateColorCount++; break; - case 'z': zeroColorCount++; break; - case 's': setColorCount++; break; - case 'f': fixColorMap++; break; - default: - fprintf( stderr, "bad option %s\n", argv[1] ); - } - argc--; - argv++; - } - if ( argc > 2 && dumpInfo+dumpColorMap+dumpBits+dumpHisto > 0 ) - namenames++; - while ( argc > 1 ) { - fixbmp( argv[1] ); - argc--; - argv++; - } -} |