Click here to Skip to main content
Click here to Skip to main content
Articles » Multimedia » OpenGL » General » Downloads
 
Add your own
alternative version

A Win32 class support OpenGL printing

, 22 Nov 1999
opengl_printing_demo.zip
exercise
OpenGL
codgu
GLBook
glprint
Release
glprint.exe
res
glprintDoc.ico
glprint.ico
Toolbar.bmp
glprint.clw
glprint.dsp
glprint.dsw
opengl_printing_src.zip
// GLMemDC.cpp: implementation of the CGLMemDC class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GLMemDC.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CGLMemoryDC::CGLMemoryDC()
{
    m_hBitmap = NULL;      
	memset(&m_DIBInfo, 0, sizeof(BITMAPINFO));  
    m_hImage = NULL; 
	m_dwDataSize = 0;    
}

CGLMemoryDC::~CGLMemoryDC()
{
	ClearMemory();
}


/********************************************************************/
/* Get the color entries number of the image             		    */
/********************************************************************/
int CGLMemoryDC::GetColorNumber(int nBitCount)
{
	int ColorTableEntries;

    switch(nBitCount)
	{
	    case 1:            //Black and White 
	        ColorTableEntries = 2;
	    case 4:            //16 colors 
	        ColorTableEntries = 16;
	    case 8:            //256 colors 
	        ColorTableEntries = 256;
	    case 16:             
	    case 24:            
	    case 32:            
			ColorTableEntries = 0;
		break;
	}
	
	return ColorTableEntries;
}


/********************************************************************/
/* Clear all memory   											    */
/********************************************************************/
void CGLMemoryDC::ClearMemory(void)
{
    if(m_hBitmap)
		DeleteObject(m_hBitmap);
	m_hBitmap = NULL;      
	memset(&m_DIBInfo, 0, sizeof(BITMAPINFO));  
    m_hImage = NULL; 
	m_dwDataSize = 0;    
}


/********************************************************************/
/* Set the memory device size   								    */
/********************************************************************/
BOOL CGLMemoryDC::SetMemorySize(int width, int height)
{
	//clear every thing
	ClearMemory();

	//set DIB image header information
	//just support true color bitmap
	m_DIBInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	m_DIBInfo.bmiHeader.biCompression = BI_RGB;
    m_DIBInfo.bmiHeader.biPlanes = 1;
    m_DIBInfo.bmiHeader.biBitCount = 32;
    m_DIBInfo.bmiHeader.biWidth = width;
    m_DIBInfo.bmiHeader.biHeight = height;
    m_DIBInfo.bmiHeader.biSizeImage = width*height*4;

	//craete the BITMAP color data memory
    m_hBitmap = CreateDIBSection(
		        NULL,
				&m_DIBInfo,
				DIB_RGB_COLORS,
				(void **)&m_hImage,
                NULL,
				NULL);
    
	//if sucess
	if(m_hBitmap)
		return TRUE;
	else
        return FALSE;   
}


/********************************************************************/
/* Get the memory device size   								    */
/********************************************************************/
void CGLMemoryDC::GetMemorySize(int* width, int* height)
{
    *width = m_DIBInfo.bmiHeader.biWidth;
    *height = m_DIBInfo.bmiHeader.biHeight;
}


/********************************************************************/
/* Scan the image from the device context   					    */
/********************************************************************/
void CGLMemoryDC::CopyDataFromDC(CDC* pDC, CRect& rect)
{
	CDC      dcBuffer;       //the compatible DC 
	CBitmap  bmBitmap;		 //bitmap in memory for retreive data from DC
	CBitmap* pbmBitmapOld;

	//if the orignal bitmap did not set up
	if(!m_hBitmap)
        return;

	//create compatible DC to copy image
	dcBuffer.CreateCompatibleDC(pDC);

	//create memory bitmap 
    bmBitmap.CreateCompatibleBitmap(pDC,
                  m_DIBInfo.bmiHeader.biWidth,
                  m_DIBInfo.bmiHeader.biHeight);
    
	//set memory bitmap to memory DC
	pbmBitmapOld = dcBuffer.SelectObject(&bmBitmap);
    
	//copy source DC image to memory bitmap
	dcBuffer.StretchBlt(0, 0,  
             m_DIBInfo.bmiHeader.biWidth,
	         m_DIBInfo.bmiHeader.biHeight,
			 pDC, 
             rect.left,
			 rect.top,
			 rect.Width(),
			 rect.Height(),
			 SRCCOPY);

	//restore the orginal object in memory DC
    dcBuffer.SelectObject(pbmBitmapOld);

	//copy image data from memory bitmap
	GetDIBits(pDC->m_hDC,
		(HBITMAP)bmBitmap, 
		0, 
        m_DIBInfo.bmiHeader.biHeight,
        m_hImage,
		&m_DIBInfo,
		DIB_RGB_COLORS);
}


/********************************************************************/
/* Copy image data to target DC             					    */
/*                                                                  */ 
/* This function just support the color printer setting in Text     */
/* mode																*/
/********************************************************************/
void CGLMemoryDC::CopyDataToDC(CDC* pDC, CRect& rect)
{
    ::StretchDIBits(pDC->m_hDC, 
		            rect.left, 
					rect.top, 
		            rect.Width(), 
					rect.Height(),
                    0, 0, 
					m_DIBInfo.bmiHeader.biWidth, 
					m_DIBInfo.bmiHeader.biHeight,
                    m_hImage,  
					&m_DIBInfo, 
					DIB_RGB_COLORS, 
					SRCCOPY);
}


/********************************************************************/
/* Write image data directly to target DC             				*/
/*                                                                  */ 
/* This function just support the color printer setting in Photo    */
/* quality mode														*/
/********************************************************************/
void CGLMemoryDC::WriteDataToDC(CDC* pDC, int startx, int starty)
{
    ::SetDIBitsToDevice(pDC->m_hDC, 
		                startx, 
						starty,
                        m_DIBInfo.bmiHeader.biWidth,
	                    m_DIBInfo.bmiHeader.biHeight,
                        0, 0, 0,
	                    m_DIBInfo.bmiHeader.biHeight,
                        m_hImage, 
						&m_DIBInfo, 
						DIB_RGB_COLORS);
           			 
}


/********************************************************************/
/* Write image data to a DIB file (disk file)  					    */
/********************************************************************/
void CGLMemoryDC::WriteDataToDIBfile(CFile* DIBFile)
{
    BITMAPFILEHEADER  bmFileHeader;
    BITMAPINFOHEADER  bmInfoHeader;
    int     nByte = sizeof(RGBQUAD)*GetColorNumber(m_DIBInfo.bmiHeader.biBitCount);
	void*   PaletteEntry;
	
	//prepare image header data
	bmFileHeader.bfType = 0x4d42;   
    bmFileHeader.bfSize = 0;
	bmFileHeader.bfReserved1 = 0;
	bmFileHeader.bfReserved2 = 0;
	bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER)
                    		 + sizeof(BITMAPINFOHEADER)
		                     + nByte;
	
	//write image header data to DIB file
	DIBFile->Write((LPVOID)&bmFileHeader,sizeof(BITMAPFILEHEADER)); 
	
	//prepare image header information data
	bmInfoHeader.biSize = m_DIBInfo.bmiHeader.biSize;
	bmInfoHeader.biCompression = m_DIBInfo.bmiHeader.biCompression;
    bmInfoHeader.biPlanes = m_DIBInfo.bmiHeader.biPlanes;
    bmInfoHeader.biBitCount = m_DIBInfo.bmiHeader.biBitCount;
    bmInfoHeader.biWidth = m_DIBInfo.bmiHeader.biWidth;
    bmInfoHeader.biHeight = m_DIBInfo.bmiHeader.biHeight;
    bmInfoHeader.biSizeImage = m_DIBInfo.bmiHeader.biSizeImage;
    bmInfoHeader.biClrUsed = m_DIBInfo.bmiHeader.biClrUsed;
	
	//write image header information data to DIB file
	DIBFile->Write((LPVOID)&bmInfoHeader,sizeof(BITMAPINFOHEADER)); 
    
    nByte = sizeof(RGBQUAD)*GetColorNumber(m_DIBInfo.bmiHeader.biBitCount);
    
	//wrtie the palette and color data to DIB file
	DIBFile->Write(PaletteEntry, nByte); 
	DIBFile->Write(m_hImage, m_DIBInfo.bmiHeader.biSizeImage);
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Zhaohui Xing

United States United States
No Biography provided

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.141223.1 | Last Updated 23 Nov 1999
Article Copyright 1999 by Zhaohui Xing
Everything else Copyright © CodeProject, 1999-2014
Layout: fixed | fluid