149 lines
4.6 KiB
C++
Executable File
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_)
|