-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathDirectDraw.h
381 lines (305 loc) · 21.4 KB
/
DirectDraw.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
//
// DirectDraw class
//
#ifndef __DIRECTDRAW_INCLUDED__
#define __DIRECTDRAW_INCLUDED__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <objbase.h>
#include <mmsystem.h>
#include <vector>
using namespace std;
#define DIRECTDRAW_VERSION 0x0700
#include <ddraw.h>
#include <stdio.h>
#include <stdlib.h>
#include "typedef.h"
#include "macro.h"
class CDirectDraw
{
public:
// パブリックメンバ変数
typedef struct tagDISPLAYMODE {
DWORD dwWidth;
DWORD dwHeight;
DWORD dwDepth;
DWORD dwRate;
} DISPLAYMODE, *LPDISPLAYMODE;
typedef struct tagPALBUF {
BYTE r;
BYTE g;
BYTE b;
} PALBUF, *LPPALBUF;
// 利用可能なディスプレイモード
enum { DD_DISPLAYMODEMAX = 512 };
INT m_DisplayModeNum; // ディスプレイモード数
DISPLAYMODE m_DisplayModeBuf[DD_DISPLAYMODEMAX];
// Screen size
enum { SCREEN_WIDTH = 256, SCREEN_HEIGHT = 240 };
// Render screen size
enum { RENDER_WIDTH = SCREEN_WIDTH+16, RENDER_HEIGHT = SCREEN_HEIGHT };
// Delta screen size
enum { DELTA_WIDTH = SCREEN_WIDTH, DELTA_HEIGHT = SCREEN_HEIGHT+6 };
// Filter
enum { BLTFILTER_NONE = 0,
BLTFILTER_2XSAI,
BLTFILTER_SUPER2XSAI,
BLTFILTER_SUPEREAGLE,
BLTFILTER_SCALE2X,
BLTFILTER_HQ2X,
BLTFILTER_LQ2X,
};
// パブリックメンバ関数
CDirectDraw();
virtual ~CDirectDraw();
BOOL InitialDDraw( HWND hWnd );
void ReleaseDDraw();
BOOL InitialSurface( BOOL bScreenMode );
BOOL ReleaseSurface();
BOOL RestoreSurface();
BOOL BeginDisplayChange();
BOOL EndDisplayChange();
BOOL OnChangeDisplayMode();
// Displayモード
INT GetDisplayModeNum() { return m_DisplayModes.size(); }
void SetDisplayMode( DWORD dwWidth, DWORD dwHeight, DWORD dwDepth, DWORD dwRate );
void GetDisplayMode( DWORD& dwWidth, DWORD& dwHeight, DWORD& dwDepth, DWORD& dwRate );
BOOL GetDisplayMode( INT no, DWORD& dwWidth, DWORD& dwHeight, DWORD& dwDepth, DWORD& dwRate );
INT GetMatchDisplayMode( DWORD dwWidth, DWORD dwHeight, DWORD dwDepth, DWORD dwRate );
BOOL IsNowDisplayMode( DWORD dwWidth, DWORD dwHeight, DWORD dwDepth, DWORD dwRate );
BOOL CalcPaletteTable();
void SetPaletteTable( LPBYTE pal );
void SetPaletteTable( RGBQUAD* pal );
void GetPaletteTable( RGBQUAD* pal );
void SetPaletteFile( LPCTSTR fname );
BOOL SetFullScreenGDI( BOOL bMode );
void SetUseHEL( BOOL bUseHEL ) {
m_bUseHEL = bUseHEL;
m_bDeltaUpdate = TRUE;
}
void SetSystemMemory( BOOL bSystemMemory ) {
m_bSystemMemory = bSystemMemory;
m_bDeltaUpdate = TRUE;
}
void SetScreenMode( BOOL bScreenMode ) {
m_bScreenMode = bScreenMode;
m_bDeltaUpdate = TRUE;
}
void SetFlipMode( BOOL bFlip ) {
m_bFlip = bFlip;
}
void SetAspectMode( BOOL bAspect ) {
m_bAspect = bAspect;
}
void SetAllLineMode( BOOL bAllLine ) {
m_bAllLine = bAllLine;
}
void SetMaxZoom( BOOL bZoom ) {
m_bMaxZoom = bZoom;
}
void SetDoubleSize( BOOL bDoubleSize ) {
m_bDoubleSize = bDoubleSize;
m_bDeltaUpdate = TRUE;
}
void SetTVFrameMode( BOOL bTVFrame ) {
m_bTVFrameMode = bTVFrame;
}
void SetScanlineMode( BOOL bScanline ) {
m_bScanlineMode = bScanline;
m_bDeltaUpdate = TRUE;
}
void SetScanlineColor( INT nScanlineColor ) {
m_nScanlineColor = nScanlineColor;
}
void SetZapperMode( BOOL bZapper ) {
m_bZapper = bZapper;
}
void SetZapperDrawMode( BOOL bDraw ) {
m_bZapperDraw = bDraw;
}
void SetWindowVSyncMode( BOOL bVSync ) {
m_bWindowVSync = bVSync;
}
void SetGraphicsFilter( INT nFilter ) {
m_nBltFilter = nFilter;
m_bDeltaUpdate = TRUE;
}
BOOL GetUseHEL() { return m_bUseHEL; }
BOOL GetSystemMemory() { return m_bSystemMemory; }
BOOL GetScreenMode() { return m_bScreenMode; }
BOOL GetFlipMode() { return m_bFlip; }
BOOL GetAspectMode() { return m_bAspect; }
BOOL GetAllLineMode() { return m_bAllLine; }
BOOL GetMaxZoom() { return m_bMaxZoom; }
BOOL GetDoubleSize() { return m_bDoubleSize; }
BOOL GetTVFrameMode() { return m_bTVFrameMode; }
BOOL GetScanlineMode() { return m_bScanlineMode; }
INT GetScanlineColor() { return m_nScanlineColor; }
BOOL GetZapperMode() { return m_bZapper; }
BOOL GetZapperDrawMode() { return m_bZapperDraw; }
BOOL GetWindowVSyncMode() { return m_bWindowVSync; }
INT GetGraphicsFilter() { return m_nBltFilter; }
LPBYTE GetRenderScreen() { return m_lpRender; }
LPBYTE GetLineColormode() { return m_LineColormode; }
// For Zapper
BYTE GetZapperHit();
void GetZapperPos( LONG& x, LONG& y );
void SetZapperPos( LONG x, LONG y );
void SetInfoString( LPCSTR str );
void SetMessageString( LPCSTR str );
void RealizePalette();
void OnScreenDraw();
void SetPaletteMode( INT nMode, BOOL bMono );
void GetPaletteData( RGBQUAD* rgb );
void GetPaletteData2( RGBQUAD* rgb );
void SetDiskAccessLamp( BOOL bAccess ) {
m_bDiskAccessLamp = bAccess;
}
void Blt();
void Flip();
// MMX
BOOL IsMMX() { return m_bMMX; }
BYTE GetPixel( INT x, INT y );
protected:
// プロテクトメンバ変数
// General
HWND m_hWnd; // Window handle
BOOL m_bChangeMode; // Screen Mode changing flag
BOOL m_bDraw; // Drawing flag
BOOL m_bNoRestore;
BOOL m_bMessage; // Message display?
DWORD m_dwMessageTime; // Message display times
BOOL m_bMMX; // Existence of MMX technology.
// Options
BOOL m_bUseHEL; // HALを使わずHELを使用
BOOL m_bSystemMemory; // サーフェスにシステムメモリを使用
BOOL m_bScreenMode; // FALSE:Window TRUE:Fullscreen
BOOL m_bFlip; // フリップ使用
BOOL m_bGDI; // GDI
BOOL m_bAspect; // TVアスペクト補正
BOOL m_bAllLine; // 全ライン表示
BOOL m_bMaxZoom; // 画面全体まで拡大
BOOL m_bDoubleSize; // 2倍サイズレンダリング
BOOL m_bTVFrameMode; // TV枠表示
BOOL m_bScanlineMode; // スキャンラインモード
INT m_nScanlineColor; // スキャンラインカラー
BOOL m_bZapper; // Zapper
BOOL m_bZapperDraw; // Zapper Sight drawing
BOOL m_bWindowVSync; // Wait for VSync(Window mode)
BOOL m_bForceWrite; // 常に上書き描画
INT m_nBltFilter; // Blit Filter
// 利用可能なディスプレイモード
std::vector<DISPLAYMODE> m_DisplayModes;
// フルスクリーンディスプレイモード
DWORD m_dwDisplayWidth;
DWORD m_dwDisplayHeight;
DWORD m_dwDisplayDepth;
DWORD m_dwDisplayRate;
// DLL dynamic load
HINSTANCE m_hDDraw; // DLL Instance handle
// DirectDraw object
LPDIRECTDRAW7 m_lpDD; // DirectDraw Object
LPDIRECTDRAWSURFACE7 m_lpDDPrimary; // PrimarySurface
LPDIRECTDRAWSURFACE7 m_lpDDBack; // BackSurface
LPDIRECTDRAWSURFACE7 m_lpDDRender; // RenderSurface
LPDIRECTDRAWSURFACE7 m_lpDDRender2; // RenderSurface2
LPDIRECTDRAWSURFACE7 m_lpDDAscii; // AsciiSurface
LPDIRECTDRAWSURFACE7 m_lpDDZapper; // ZapperSurface
LPDIRECTDRAWSURFACE7 m_lpDDTV; // TV枠(^^;
LPDIRECTDRAWCLIPPER m_lpDDClipper; // Clipper
LPDIRECTDRAWCLIPPER m_lpDDClipper2; // Render window Clipper
LPDIRECTDRAWPALETTE m_lpDDPalette; // DirectDraw Palette
LPBYTE m_lpRender;
LPBYTE m_lpRenderDelta;
BYTE m_LineColormode[RENDER_HEIGHT];
BOOL m_bDeltaUpdate;
// パレット
INT m_nPaletteMode;
BOOL m_bMonoMode;
BOOL m_bPaletteUpdate; // Palette Update?
static PALBUF m_PalDefault[64]; // デフォルトパレット
PALBUF m_PaletteBuf[64]; // パレットバッファ
typedef struct tagLOGPAL {
WORD palVersion;
WORD palNumEntries;
PALETTEENTRY pe[256];
} LOGPAL, *LPLOGPAL;
HPALETTE m_hPalette; // Windows GDI Palette handle
LOGPAL m_logPalette; // Windows GDI Palette
// 256色モード用
RGBQUAD m_cpPalette[8][64*2]; // Color
RGBQUAD m_mpPalette[8][64*2]; // Monochrome
// ピクセルフォーマットに変換したパレット
DWORD m_cnPalette[8][256]; // Color
DWORD m_csPalette[8][256]; // Color/Scanline
DWORD m_mnPalette[8][256]; // Monochrome
DWORD m_msPalette[8][256]; // Monochrome/Scanline
// 2xSaI mmx用のRGB555パレット
DWORD m_cfPalette[8][256]; // Color
DWORD m_mfPalette[8][256]; // Monochrome
// For Zapper
LONG m_ZapperPosX, m_ZapperPosY;
// For Infomation&Message
enum { INFOSTR_SIZE = 64 };
CHAR m_szInfo[INFOSTR_SIZE+1];
CHAR m_szMess[INFOSTR_SIZE+1];
// For DiskAccessLamp
BOOL m_bDiskAccessLamp;
// プロテクトメンバ関数
static HRESULT WINAPI EnumModesCallback( LPDDSURFACEDESC2 lpDDSurfaceDesc, LPVOID lpContext );
void RenderString( INT x, INT y, LPCSTR str );
BOOL RestoreSurfaceSub( LPDIRECTDRAWSURFACE7 lpSurface );
void GetBitMask( DWORD val, int& shift, int& bits );
void SetLZSSChar( LPBYTE lpLZ, LPDIRECTDRAWSURFACE7 lpDDSurface );
// Blitters
typedef void (CDirectDraw::*BLTFUNC)(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
static BLTFUNC NormalBltTable[];
static BLTFUNC ScanlineBltTable[];
static BLTFUNC DoubleBltTable[];
static BLTFUNC DoubleScanlineBltTable[];
static BLTFUNC nx2xSaIBltTable[];
static BLTFUNC nxSuper2xSaIBltTable[];
static BLTFUNC nxSuperEagleBltTable[];
static BLTFUNC nxScale2xBltTable[];
static BLTFUNC nxHq2xBltTable[];
static BLTFUNC nxLq2xBltTable[];
// 大量…
void Render8bpp_Normal(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render16bpp_Normal(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render24bpp_Normal(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render32bpp_Normal(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render8bpp_Scanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render16bpp_Scanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render24bpp_Scanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render32bpp_Scanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render8bpp_Double(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render16bpp_Double(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render24bpp_Double(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render32bpp_Double(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render8bpp_DoubleScanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render16bpp_DoubleScanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render24bpp_DoubleScanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void Render32bpp_DoubleScanline(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
// プリレンダ用
void Render16bpp( LPBYTE lpSrc, LPBYTE lpDst );
void Render16bppPrefilter( LPBYTE lpSrc, LPBYTE lpDst );
void Render32bpp( LPBYTE lpSrc, LPBYTE lpDst );
// Effects
void nx_2xSaI_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_2xSaI_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_Super2xSaI_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_Super2xSaI_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_SuperEagle_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_SuperEagle_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_Scale2x_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_Scale2x_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_hq2x_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_hq2x_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_lq2x_16bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
void nx_lq2x_32bpp(LPBYTE,LPBYTE,DDSURFACEDESC2&,BOOL);
private:
// プライベートメンバ変数
// プライベートメンバ関数
};
extern CDirectDraw DirectDraw;
#endif // !__DIRECTDRAW_INCLUDED__