/*++

Copyright (c) 1996  Microsoft Corporation

Module Name:

    bmp2tiff.c

Abstract:

    This file contains support for converting a
    Windows BMP file to a TIFF file.

Environment:

    WIN32 User Mode

Author:

    Wesley Witt (wesw) 17-Feb-1996

--*/

#include "test.h"
#pragma hdrstop




DWORD
ConvertBmpToTiff(
    LPTSTR BmpFile,
    LPTSTR TiffFile,
    DWORD CompressionType
    )

/*++

Routine Description:

    Converts a BMP file to a TIFF file.

Arguments:

    BmpFile             - BMP file name
    TiffFile            - TIFF file name
    CompressionType     - Compression method, see tifflib.h

Return Value:

    None.

--*/

{
    HANDLE hFileIn;
    HANDLE hMapIn;
    LPVOID FilePtrIn;
    HANDLE hTiff;
    PBMPINFO BmpInfo;
    DWORD LineWidth;
    DWORD FileSize;
    LPBYTE Bits;
    DWORD i,j;
    LPBYTE SrcPtr;
    DWORD RealWidth;
    BYTE BitBuffer[(1728/8)*2];


    hFileIn = CreateFile(
        BmpFile,
        GENERIC_READ,
        FILE_SHARE_READ,
        NULL,
        OPEN_EXISTING,
        0,
        NULL
        );
    if (hFileIn != INVALID_HANDLE_VALUE) {
        return GetLastError();
    }

    hMapIn = CreateFileMapping(
        hFileIn,
        NULL,
        PAGE_READONLY | SEC_COMMIT,
        0,
        0,
        NULL
        );
    if (!hMapIn) {
        return GetLastError();
    }

    FilePtrIn = MapViewOfFile(
        hMapIn,
        FILE_MAP_READ,
        0,
        0,
        0
        );
    if (!FilePtrIn) {
        return GetLastError();
    }

    FileSize = GetFileSize( hFileIn, NULL );

    BmpInfo = (PBMPINFO) FilePtrIn;

    LineWidth = BmpInfo->SizeImage / BmpInfo->Height;
    Bits = (LPBYTE) ( (LPBYTE)FilePtrIn + BmpInfo->Offset );
    SrcPtr = ((LPBYTE)FilePtrIn + BmpInfo->Offset) + (LineWidth * (BmpInfo->Height - 1));
    RealWidth = Align( 8, BmpInfo->Width ) / 8;

    hTiff = TiffCreate( TiffFile, CompressionType, LineWidth*8, 1, 1 );
    if (!hTiff) {
        return GetLastError();
    }

    TiffStartPage( hTiff );

    for (i=0; i<BmpInfo->Height; i++) {
        FillMemory( BitBuffer, sizeof(BitBuffer), 0xff );
        CopyMemory( BitBuffer, SrcPtr, RealWidth );
        if (BmpInfo->Width % 8) {
            BitBuffer[BmpInfo->Width/8] |= 0xf;
        }
        for (j=0; j<sizeof(BitBuffer); j++) {
            BitBuffer[j] ^= 0xff;
        }
        SrcPtr -= LineWidth;
        TiffWrite( hTiff, BitBuffer );
    }

    TiffEndPage( hTiff );

    UnmapViewOfFile( FilePtrIn );
    CloseHandle( hMapIn );
    CloseHandle( hFileIn );

    TiffClose( hTiff );

    return 0;
}
