gps/GPSProject/ImageViewer/STScreenBuffer.h

149 lines
4.6 KiB
C++
Executable File

/////////////////////////////////////////////////////////////////////////////
// File name: STScreenBuffer.h
// Author: Vassili Philippov (vasja@spbteam.com)
// Created: June 2001
// Last changed: 07 August 2001
// Version: 2.0
// Description: Class for pixel working with images. One could get access
// to image bits using this library or create custom image.
#if !defined(AFX_STSCREENBUFFER_H__22D62F5D_32E2_4785_B3D9_2341C11F84A3__INCLUDED_)
#define AFX_STSCREENBUFFER_H__22D62F5D_32E2_4785_B3D9_2341C11F84A3__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
/////////////////////////////////////////////////////////////////////////////
// BGRColor structure encapsulates color information about one point. Color
// order is Blue, Green, Red (not RGB).
struct DIBINFO : public BITMAPINFO
{
RGBQUAD arColors[255]; // Color table info - adds an extra 255 entries to palette
operator LPBITMAPINFO() { return (LPBITMAPINFO) this; }
operator LPBITMAPINFOHEADER() { return &bmiHeader; }
RGBQUAD* ColorTable() { return bmiColors; }
};
struct BGRColor
{
BGRColor() {}
BGRColor(byte R, byte G, byte B) : m_R(R), m_G(G), m_B(B) {}
byte m_B;
byte m_G;
byte m_R;
};
/////////////////////////////////////////////////////////////////////////////
// CSTScreenBuffer class provides fast drawing methods and offscreen buffer.
class CSTScreenBuffer
{
public:
// Creates uninitialized buffer. Call Create or CreateRGB to
// initialize the buffer.
CSTScreenBuffer();
virtual ~CSTScreenBuffer();
// Creates buffer with the given size.
void Create(int nWidth, int nHeight);
// Creates buffer with the given size and fills it with
// the given color
void Create(int nWidth, int nHeight, COLORREF clr);
// Creates buffer with the same width andheight as
// the given bitmap and that contains the same picture.
void Create(HBITMAP hBitmap);
// Creates buffer that will contain picture from the given
// area of the given device context.
void Create(CDC *pDC, CRect rect);
// Creates buffer with the given size and uses the given
// array as a source of pixels color information. The given
// array should contain 3 bytes per pixel (RGB). To the array
// size should be 3*nWidth*nHeight
void CreateRGB(void *pData, int nWidth, int nHeight);
// Draws buffer into the given device context starting from
// the given point (top left corner)
BOOL Draw(CDC* pDC, CPoint ptDest);
// Sets color of the given point
inline void SetPoint(int nX, int nY, byte R, byte G, byte B) {
m_pBuffer[m_nCorrectedWidth*(m_nHeight-nY-1)+nX] = BGRColor(R,G,B);
}
// Returns color of the given point
inline BGRColor GetPoint(int nX, int nY) {
return m_pBuffer[m_nCorrectedWidth*(m_nHeight-nY-1)+nX];
}
// Returns array that contains points color information. Each
// point is represented by 3 bytes in Blue, Green, Red order.
// Array contains CorrectedWidth*Height elements (Note! not
// Width*Height).
BGRColor *GetPointsArray() {
return m_pBuffer;
}
// Returns real width of the screen buffer. It could be slightly more then
// requested width. This paramater is important only when you work with
// points array directly (using GetPointsArray function).
int GetCorrectedWidth() {
return m_nCorrectedWidth;
}
// Returns screen buffer width.
int GetWidth() {
return m_nWidth;
}
// Returns screen buffer height.
int GetHeight() {
return m_nHeight;
}
// Returns handle of the encapsulated bitmap.
HBITMAP GetHBitmap() {
return m_hBitmap;
}
// Returns screen buffer device context. After drawing this
// device context should be closed (call ReleaseDC method).
CDC *GetDC();
// Closes bitmap device context previously opened by GetDC function.
void ReleaseDC();
public:
// Creates bitmap with the given sizes and the given array of colors.
static HBITMAP CreateBitmapByRGBArray(void *pData, int nWidth, int nHeight);
// Returns minimum width that is greater then the given width and
// that is acceptable as image width (not all numbers are acceptable)
static int CorrectedWidth(int nWidth);
protected:
// Creates internal bitmap and image buffer. Assignes width and
// height properties
BOOL CreateBitmap(int nWidth, int nHeight);
int m_nWidth;
int m_nHeight;
int m_nCorrectedWidth;
BGRColor *m_pBuffer;
HBITMAP m_hBitmap;
// Members related to device context
CDC *m_pDC;
HBITMAP m_hSaveBitmap;
};
#endif // !defined(AFX_STSCREENBUFFER_H__22D62F5D_32E2_4785_B3D9_2341C11F84A3__INCLUDED_)