📄 hgraphic2d.h
字号:
{
public:
virtual ~IDXSurface(void) {}
// 获取和释放DC
virtual HRESULT GetDC(HDC * pDC) = 0;
virtual HRESULT ReleaseDC(HDC hDC) = 0;
// 获取DirectDrawSurface7
virtual LPDIRECTDRAWSURFACE7 GetDirectSurface7(void) = 0;
// 用颜色清除指定区域
virtual HRESULT ClearSurface(DWORD dwColor = 0L, RECT * rect= NULL) = 0;
};
typedef IDXSurface * LPI_DXSURFACE;
// ************************************************************************************
// *------------------------------窗口位置处理层---------------------------------------
class IWindow : public ITUnknown
{
public:
virtual ~IWindow(void) {}
// 返回窗口句柄
virtual HWND GetHWnd(void) = 0;
// 返回帧率
virtual long GetFPS(void) = 0;
// 查询是否处于窗口模式
virtual bool IsWindowed(void) = 0;
// 更新窗口裁减区域
virtual void UpdateBounds(void) = 0;
// 将桌面坐标转换为窗口内的坐标
virtual void Desktop2Client(POINT& pt) = 0;
// 是否显示FPS
virtual void SetDisplayFPS(bool value) = 0;
// 当显示FPS时,是否使用透明背景,打开的话比较费资源
virtual void SetFPSTransparent(bool balue) = 0;
};
// ************************************************************************************
// *--------------------DirectDraw硬件设备获取层(主管对象的创建)---------------------
class IDirectDrawEx : public IWindow
{
public:
virtual ~IDirectDrawEx(void) {}
// ----------------------------系统对象获取----------------------------------------
// 获取DirectDraw7
virtual LPDIRECTDRAW7 GetDirectDraw7(void) = 0;
// 获取前台图面,即为显示器的内容,一定处于显存中
virtual LPI_DXSURFACE GetFrontSurface(void) = 0;
// 获取后台缓冲图面,默认为初始化的窗口大小,处于内存
virtual LPI_DXSURFACE GetBackSurface(void) = 0;
// ------------------------------对象创建------------------------------------------
// 创建DirectDraw图面,lType制定存储器定位
virtual LPI_DXSURFACE CreateSurface(int nWidth, int nHeight, long lType= TYPE_MEMORY) = 0;
// 从文件映像中创建图面
// Image制定文件的格式,支持BMP JPG TGA TIF PCX PNG BLP,pPackFile不为空则从压缩包中读取映像
virtual LPI_DXSURFACE CreateSurfaceFromIMG(const char* szFileName, long Image= IMAGE_BMP, long lType= TYPE_MEMORY, LPI_PACKAGE pPackFile= NULL) = 0;
// 创建调色板图像,pPal不为空则将pPal设置为调色板,否则从BMP中创建一个调色板
// pPackFile不为空则从压缩包中读取映像
virtual LPI_INDEXIMAGE CreateIndexImageFromBMP(const char* szFileName, LPI_BASICIMAGE pPal= NULL, LPI_PACKAGE pPackFile= NULL) = 0;
// ---------------------------------GAMMA控制---------------------------------------
// 硬件支持Gamma则返回true
virtual bool IsGammaControl(void) = 0;
// 硬件支持Color调整返回true
virtual bool IsColorControl(void) = 0;
// 设置Gamma偏移,lSGMask为GAMMA_R GAMMA_G GAMMA_B的组合,表示偏移何通道
virtual HRESULT SetGamma(long lOffset/*-65535...65535*/, long lSGMask= GAMMA_RGB) = 0;
// 将Gamma值复位为初始值
virtual HRESULT ResetGamma(long lRGMask= GAMMA_RGB) = 0;;
// ---------------------------------Color控制---------------------------------------
// 设置显示器亮度
virtual HRESULT SetBrightness(unsigned long lBrightness/*0...10000 default750*/) = 0;
// 设置对比度
virtual HRESULT SetContrast(unsigned long lContrast/*0...20000 default10000*/) = 0;
// 设置色调偏移
virtual HRESULT SetHue(long lHue/*-180...180 default0*/) = 0;
// 设置饱和度
virtual HRESULT SetSaturation(unsigned long lSaturation/*0...20000 default10000*/) = 0;
// 将Color调整复位为初始值
virtual HRESULT ResetColor(void) = 0;
// 设置硬件是否使用颜色调整
virtual HRESULT SetColorEnable(bool bEnable/*default true*/) = 0;
};
// ************************************************************************************
// *-------------------------------硬件位图渲染层--------------------------------------
class IHardRender : public IDirectDrawEx
{
public:
virtual ~IHardRender(void) {}
// 直接缩放填充,不裁减,矩形越界则失败,bIsColorKey指定是否使用源关键色
virtual HRESULT FillSurface(LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, RECT * retDest= NULL, RECT * retSrc= NULL, bool bIsColorKey= false) = 0;
// 取出源的矩形绘制到目标(x, y)处,进行裁减,bIsColorKey指定是否使用源关键色
virtual HRESULT DrawSurface(int x, int y, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 将源的内容镜像后绘制到目标的位置,但是不改变源本身
virtual HRESULT DrawSurfaceTurnX(int x, int y, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
virtual HRESULT DrawSurfaceTurnY(int x, int y, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
virtual HRESULT DrawSurfaceTurnXY(int x, int y, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 将源绘制到目标(x, y)处,并使其大小为nWidth * nHeight
virtual HRESULT DrawSurfaceZoom(int x, int y, int nWidth, int nHeight, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, bool bIsColorKey= false) = 0;
// 将源绘制到目标中的矩形
virtual HRESULT DrawSurfaceZoom(RECT * pDest, LPI_DXSURFACE pSurfaceSrc, LPI_DXSURFACE pSurfaceDest, bool bIsColorKey= false) = 0;
};
// ***************************************************************************************
// *---------------------------------软件加速层(图像的双目运算)-------------------------
class ISoftRender : public IHardRender
{
public:
virtual ~ISoftRender(void) {}
// 处理器是否支持MMX
virtual bool IsMMX(void) = 0;
// 处理器是否支持SSE
virtual bool IsSSE(void) = 0;
// 取出源绘制在目标(x, y)处,裁剪,二者像素位深必须相同,bIsColorKey指定是否使用源关键色
virtual bool DrawImage(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源绘制在目标(x, y)处,如果图像为32位色,则保护目标图像的alpha通道
virtual bool DrawImageA(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源绘制在目标(x, y)处,并与目标按通道作加法dest+src=>dest
virtual bool DrawImageAdd(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源绘制在目标(x, y)处,并与目标按通道作减法dest-src=>deat
virtual bool DrawImageMinus(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源绘制在目标(x, y)处,并与目标按作逻辑与dest & src=>dest
virtual bool DrawImageAND(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false)= 0;
// 取出源绘制在目标(x, y)处,并与目标按作逻辑或dest | src=>dest
virtual bool DrawImageOR(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false)= 0;
// 取出源绘制在目标(x, y)处,并与目标按作逻辑异或dest xor src=>dest
virtual bool DrawImageXOR(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false)= 0;
// 取出源作通道衰减后绘制在目标src-dw=>dest
virtual bool DrawImageAttenuation(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, DWORD dwColor= COLORHALF, bool bIsColorKey= false) = 0;
// 取出源作通道加强后绘制在目标src+dw=>dest
virtual bool DrawImageAdditive(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, DWORD dwColor= COLORHALF, bool bIsColorKey= false) = 0;
// 取出源与目标作等分alpha混合后绘制在目标
virtual bool DrawImageAlpha2(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源与目标作32级alpha混合后绘制在目标,指定源的Alpha=0...31
virtual bool DrawImageAlpha(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, int nAlpha= 16, bool bIsColorKey= false) = 0;
// 取出源与目标作256级alpha混合后绘制在目标,指定源的Alpha=0...255,速度比32级混合稍慢
virtual bool DrawImageAlpha256(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, int nAlpha= 128, bool bIsColorKey= false) = 0;
// 取出源作灰度化后绘制到目标gray src=>deat
virtual bool DrawImageGray(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源作伪灰度化后绘制到目标,速度比灰度化快grayex src=>dest
virtual bool DrawImageGrayEx(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源作反色后绘制到目标invert src=>dest
virtual bool DrawImageInvert(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 将源的内容镜像后绘制到目标的位置,但是不改变源本身
virtual bool DrawImageTurnX(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
virtual bool DrawImageTurnY(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
virtual bool DrawImageTurnXY(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 将调色板位图解绘成16或32位图像,目标的像素位深必须与源调色板像素位深相同
virtual bool DrawIndexImage(int x, int y, LPI_INDEXIMAGE pIndexSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 将调色板位图解绘成16或32位图像,并与目标作等分alpha混合,目标的像素位深必须与源调色板像素位深相同
virtual bool DrawIndexImageAlpha2(int x, int y, LPI_INDEXIMAGE pIndexSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL, bool bIsColorKey= false) = 0;
// 取出源绘制在目标(x, y)处,裁剪,二者像素位深必须相同
// 适合绘制有大量关键色的图像,或目标图像处于显存中而又要使用关键色
virtual bool DrawImageASMK(int x, int y, LPI_BASICIMAGE pImageSrc, LPI_BASICIMAGE pImageDest, RECT * rect= NULL) = 0;
};
// ************************************************************************************
// *------------------------------显示层,以2D方式写屏---------------------------------
class IDisplay2D : public ISoftRender
{
public:
virtual ~IDisplay2D(void) {}
// 将pSurface的指定区域填充到目标
virtual HRESULT Present(LPI_DXSURFACE pSurface= NULL, int x= 0, int y= 0, RECT *rect= NULL) = 0;
virtual bool PresentMMX(LPI_BASICIMAGE pImage= NULL, int x= 0, int y= 0, RECT *rect= NULL) = 0;
// 设置是否开启软件Gamma
// 在无法使用硬件Gamma的情况下,如硬件不支持,或处于窗口模式
// 打开软件Gamma然后使用PresentMMX将会以软件方式实现Gamma
virtual void SetSoftGamma(bool bGamma) = 0;
};
typedef IDisplay2D * LPI_DISPLAY2D;
// ************************************************************************************
// *-------------------------------创建一个2D显示--------------------------------------
// * 如果为窗口模式,则nScreenWidth,nScreenHeight指定窗口客户区大小,且忽略参数iDepth
// * 如果为全屏模式,则nScreenWidth,nScreenHeight指定显示分辨率,iDepth指定色彩位数
SAM_API HRESULT CreateDisplay2D(HWND hWnd, int nScreenWidth, int nScreenHeight, LPI_DISPLAY2D* ppDisplay2D, bool bWindowed= true, int iDepth= 16);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -