SOL9 2.0 Class: DIBitmapFile

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

Source code

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


// SOL++2000
#pragma once

#include <sol\BitmapFile.h>

#include <sol\DIBitmap.h>


typedef HANDLE HDIB;

namespace SOL {

#define MAX 32000

class DIBitmapFile :public BitmapFile {
public:
    
    DIBitmapFile() { }

public:
    ~DIBitmapFile() { }

public:

    DIBitmap* extract()
    {
        char* buffer = new char[MAX]; 
        read(0L, buffer, MAX);
        if(strncmp(buffer, "BM", 2) != 0) return NULL;

        DWORD size  = fileLength() - sizeof(BITMAPFILEHEADER);

        int  n = sizeof(BITMAPFILEHEADER);

        BITMAPINFOHEADER* bi = (BITMAPINFOHEADER*)&buffer[n];
        int colorCount = getColorCount(bi);
    
        if (bi->biSize == sizeof(BITMAPCOREHEADER)){
            ::MessageBox(NULL, _T("This version does not support this type of format."), 
                _T("class DIBitmapFile"), MB_OK);
            delete [] buffer;
            return NULL;
        }

        HDIB hdib = (HDIB)::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, size);
        if (hdib == 0) {
            delete [] buffer;
            return NULL;
        }

        char* bits = (char*)::GlobalLock(hdib);
        char* ptr  = bits;
        unsigned long offset = sizeof(BITMAPFILEHEADER);

        while(size > MAX) {
            read(offset, ptr, MAX);
            ptr    += MAX;
            offset += MAX;
            size   -= MAX;
        }
        read(offset, ptr, (WORD)size);

        ::GlobalUnlock(hdib);

        delete [] buffer;
        DIBitmap* dibitmap = new DIBitmap(_T(""), hdib, 
            bi->biWidth, bi->biHeight, colorCount);
        return dibitmap;
    }


};

}



Last modified: 1 Feb 2012

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