SOL9 2.0 Class: BitmapFile

 SOL9 C++ Class Library  SOL9 Samples  SOL9 Tutorial  SOL9 FAQ  SOL9 ClassTree 

Source code

/*
 * BitmapFile.h 
 * Copyright (c) 2011 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED. 
 */


// SOL++2000
#pragma once

#include <sol\BinaryFile.h>
#include <sol\GlobalMemory.h>


namespace SOL {
#define MAX 32000

class BitmapFile :public BinaryFile {
    char*    bmi;


protected:
    int getColorCount(BITMAPINFOHEADER* bi)
    {
        if (bi->biClrUsed != 0) {
            return (int)bi->biClrUsed;
        }
        int bits = bi->biBitCount;

        switch (bits){
        case 1:
            return 2;
        case 4:
            return 16;
        case 8:
            return 256;
        default:
            break;
        }
        return 0;
    }


public:
    BitmapFile() {    bmi  = NULL; }

    ~BitmapFile() {    
        if(bmi) 
            delete [] bmi; 
    }


public:
    HBITMAP extract(HDC hdc)
    {
        char* buffer = new char[MAX];    
        BinaryFile::read(0L, buffer, MAX);
        if(strncmp(buffer, "BM", 2) != 0) return NULL;

        BITMAPFILEHEADER* fileHeader = (BITMAPFILEHEADER*)buffer;
        DWORD offset = fileHeader -> bfOffBits;
        DWORD size   = fileLength() - offset;

        int  n = sizeof(BITMAPFILEHEADER);
        BITMAPINFOHEADER* bi = (BITMAPINFOHEADER*)&buffer[n];

        int colorCount = getColorCount(bi);
        int infoSize   = sizeof(BITMAPINFOHEADER) +
             sizeof(RGBQUAD) * colorCount;

        bmi = new char[infoSize];
        for(int i = 0; i < infoSize; i++) {
            bmi[i] = buffer[n++];
        }
        BITMAPINFO* bitmapInfo = (BITMAPINFO*)bmi;

        HBITMAP hbitmap = NULL;

        GlobalMemory gmemory(size);

        char* bits = (char*) gmemory.getBuffer();
        char* ptr  = bits;

        while(size > MAX) {
            read(offset, ptr, MAX);
            ptr    += MAX;
            offset += MAX;
            size   -= MAX;
        }
        BinaryFile::read(offset, ptr, (WORD)size);
        hbitmap = ::CreateDIBitmap(hdc, 
             &(bitmapInfo->bmiHeader),
             CBM_INIT,  bits,
             bitmapInfo, DIB_RGB_COLORS);
  
        delete [] buffer;

        return hbitmap;
    }

};

}



Last modified: 1 Feb 2012

Copyright (c) 2009-2012 Antillia.com ALL RIGHTS RESERVED.