00001
00002
00003
00004
00005 #include "MFCBase.h"
00006 #include "DxDirectView.h"
00007
00008
00009 using namespace jbxl;
00010 using namespace jbxwl;
00011
00012
00013
00014
00015 IMPLEMENT_DYNCREATE(CDxDirectView, CExView)
00016
00017
00018 CDxDirectView::CDxDirectView()
00019 {
00020 }
00021
00022
00023
00024 CDxDirectView::~CDxDirectView()
00025 {
00026 }
00027
00028
00029
00030 BEGIN_MESSAGE_MAP(CDxDirectView, CDxBaseView)
00031 END_MESSAGE_MAP()
00032
00033
00034
00035
00036
00037 void CDxDirectView::OnDraw(CDC* pDC)
00038 {
00039 CDocument* pDoc = GetDocument();
00040
00041
00042 }
00043
00044
00045
00046
00047
00048 #ifdef _DEBUG
00049 void CDxDirectView::AssertValid() const
00050 {
00051 CDxBaseView::AssertValid();
00052 }
00053
00054
00055 #ifndef _WIN32_WCE
00056 void CDxDirectView::Dump(CDumpContext& dc) const
00057 {
00058 CDxBaseView::Dump(dc);
00059 }
00060 #endif
00061 #endif //_DEBUG
00062
00063
00064
00066
00067
00068 void CDxDirectView::OnInitialUpdate()
00069 {
00070
00071 if (xsize<=0 || ysize<=0) return;
00072
00073
00074 D3DFORMAT format;
00075
00076
00077 if (colorMode==GRAPH_COLOR_RGB || colorMode==GRAPH_COLOR_BGR) {
00078 viewData.set(xsize, ysize, 1, 24);
00079 format = D3DFMT_X8R8G8B8;
00080 }
00081
00082 else if (colorMode==GRAPH_COLOR_ARGB || colorMode==GRAPH_COLOR_RGBA) {
00083 viewData.set(xsize, ysize, 1, 32);
00084 format = D3DFMT_A8R8G8B8;
00085 }
00086
00087 else if (colorMode==GRAPH_COLOR_XRGB) {
00088 viewData.set(xsize, ysize, 1, 32);
00089 format = D3DFMT_X8R8G8B8;
00090 }
00091
00092 else if (colorMode==GRAPH_COLOR_ABGR || colorMode==GRAPH_COLOR_BGRA) {
00093 viewData.set(xsize, ysize, 1, 32);
00094 format = D3DFMT_A8R8G8B8;
00095 }
00096
00097 else if (colorMode==GRAPH_COLOR_XBGR) {
00098 viewData.set(xsize, ysize, 1, 32);
00099 format = D3DFMT_X8R8G8B8;
00100 }
00101
00102 else if (colorMode==GRAPH_COLOR_ARGB16 || colorMode==GRAPH_COLOR_RGBA16) {
00103 viewData.set(xsize, ysize, 1, 16);
00104 format = D3DFMT_A4R4G4B4;
00105 }
00106
00107 else if (colorMode==GRAPH_COLOR_RGB16) {
00108 viewData.set(xsize, ysize, 1, 16);
00109 format = D3DFMT_R5G6B5;
00110 }
00111
00112 else {
00113 viewData.set(xsize, ysize);
00114 format = D3DFMT_R5G6B5;
00115 }
00116
00117 origXSize = xsize;
00118 origYSize = ysize;
00119 sizeXYRate = (double)ysize/(double)xsize;
00120
00121 renderRect.top = 0;
00122 renderRect.left = 0;
00123 renderRect.right = xsize;
00124 renderRect.bottom = ysize;
00125
00126
00127
00128
00129 BOOL rslt = InitDevice(xsize, ysize);
00130 if (!rslt) {
00131 CString mesg;
00132 mesg.LoadString(IDS_STR_FAIL_GET_DX9DEV);
00133 MessageBox(_T("CDxDirectView::OnInitialUpdate():\n\n") + mesg);
00134 pFrame->doneErrorMessage = TRUE;
00135 return;
00136 }
00137
00138 bufferSize = Dx9GetBackBuffer(lpD3DDevice, &lpBackBuffer);
00139 if (bufferSize.x<0) {
00140 CString mesg;
00141 mesg.LoadString(IDS_STR_FAIL_CRT_BAKBUF);
00142 MessageBox(_T("CDxDirectView::OnInitialUpdate():\n\n") + mesg);
00143 return;
00144 }
00145
00146 HRESULT hr = lpD3DDevice->CreateOffscreenPlainSurface(xsize, ysize, format, D3DPOOL_DEFAULT, &lpSurface, NULL);
00147 if (FAILED(hr)) {
00148 CString mesg;
00149 mesg.LoadString(IDS_STR_FAIL_CRT_SURFACE);
00150 MessageBox(_T("CDxDirectView::OnInitialUpdate():\n\n") + mesg);
00151 pFrame->doneErrorMessage = TRUE;
00152 return;
00153 }
00154
00155 hasViewData = SetNewSurface(0);
00156 if (!hasViewData) {
00157 CString mesg;
00158 mesg.LoadString(IDS_STR_FAIL_TRNS_SURFACE);
00159 MessageBox(_T("CDxDirectView::OnInitialUpdate():\n\n") + mesg);
00160 pFrame->doneErrorMessage = TRUE;
00161 return;
00162 }
00163
00164 SetWindowSize(viewData.xsize, viewData.ysize);
00165 return;
00166 }
00167
00168
00169
00170 BOOL CDxDirectView::SetNewSurface(int dummy)
00171 {
00172 if (isNull(viewData.grptr)) {
00173 CString mesg, noti;
00174 mesg.LoadString(IDS_STR_DLTD_DATA);
00175 noti.LoadString(IDS_STR_ERROR);
00176 MessageBox(_T("CDxDirectView::SetNewSurface():\n\n") + mesg, noti, MB_OK);
00177 return FALSE;
00178 }
00179
00180 HRESULT hr;
00181
00182
00183 if (colorMode==GRAPH_COLOR_RGB) {
00184 int srcpitch = viewData.xsize*3;
00185 ntoh_data(viewData.grptr, viewData.lsize, 3);
00186 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_R8G8B8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00187 }
00188
00189
00190 else if (colorMode==GRAPH_COLOR_BGR) {
00191 int srcpitch = viewData.xsize*3;
00192 if (isBigEndian) swap_byte((void*)viewData.grptr, viewData.lsize, 3);
00193 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_R8G8B8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00194 }
00195
00196
00197 else if (colorMode==GRAPH_COLOR_XRGB || colorMode==GRAPH_COLOR_ARGB) {
00198 int srcpitch = viewData.xsize*4;
00199 ntoh_data(viewData.grptr, viewData.lsize, 4);
00200 if (colorMode==GRAPH_COLOR_XRGB) {
00201 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_X8R8G8B8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00202 }
00203 else {
00204 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A8R8G8B8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00205 }
00206 }
00207
00208
00209 else if (colorMode==GRAPH_COLOR_RGBA) {
00210 int srcpitch = viewData.xsize*4;
00211 if (isBigEndian) swap_byte((void*)viewData.grptr, viewData.lsize, 4);
00212 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A8B8G8R8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00213 }
00214
00215
00216 else if (colorMode==GRAPH_COLOR_XBGR || colorMode==GRAPH_COLOR_ABGR) {
00217 int srcpitch = viewData.xsize*4;
00218 ntoh_data(viewData.grptr, viewData.lsize, 4);
00219 if (colorMode==GRAPH_COLOR_XBGR) {
00220 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_X8B8G8R8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00221 }
00222 else {
00223 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A8B8G8R8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00224 }
00225 }
00226
00227
00228 else if (colorMode==GRAPH_COLOR_BGRA) {
00229 int srcpitch = viewData.xsize*4;
00230 if (isBigEndian) swap_byte((void*)viewData.grptr, viewData.lsize, 4);
00231 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A8R8G8B8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00232 }
00233
00234
00235 else if (colorMode==GRAPH_COLOR_RGB16) {
00236 int srcpitch = viewData.xsize*2;
00237 ntoh_data(viewData.grptr, viewData.lsize, 2);
00238 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_R5G6B5, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00239 }
00240
00241
00242 else if (colorMode==GRAPH_COLOR_ARGB16) {
00243 int srcpitch = viewData.xsize*2;
00244 ntoh_data(viewData.grptr, viewData.lsize, 2);
00245 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A4R4G4B4, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00246 }
00247
00248
00249 else if (colorMode==GRAPH_COLOR_RGBA16) {
00250 int srcpitch = viewData.xsize*2;
00251 ntoh_data(viewData.grptr, viewData.lsize, 2);
00252
00253 for (int i=0; i<viewData.xsize*viewData.ysize*2; i+=2) {
00254 int r = (viewData.grptr[i] &0xf0)>>4;
00255 int g = (viewData.grptr[i] &0x0f)<<4;
00256 int b = (viewData.grptr[i+1]&0xf0)>>4;
00257 int a = (viewData.grptr[i+1]&0x0f)<<4;
00258 viewData.grptr[i] = (uByte)(a + r);
00259 viewData.grptr[i+1] = (uByte)(g + b);
00260 }
00261 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_A4R4G4B4, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00262 }
00263
00264
00265 else if (colorMode==GRAPH_COLOR_MONO || colorMode==GRAPH_COLOR_MONO16) {
00266
00267 int srcpitch = viewData.xsize;
00268 hr = D3DXLoadSurfaceFromMemory(lpSurface, NULL, NULL, viewData.grptr, D3DFMT_L8, srcpitch, NULL, &renderRect, D3DX_FILTER_NONE, 0);
00269 }
00270
00271 if (FAILED(hr)) return FALSE;
00272
00273 return TRUE;
00274 }
00275
00276
00277
00278 void CDxDirectView::ExecRender()
00279 {
00280 if (isNull(lpD3DDevice)) return;
00281
00282 HRESULT hr = lpD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,255), 1.0f, 0);
00283 if (FAILED(hr)) {
00284 CString mesg;
00285 mesg.LoadString(IDS_STR_FAIL_CLR_WND);
00286 MessageBox(_T("CDxDirectView::ExecRender():\n\n") + mesg);
00287 return;
00288 }
00289
00290 hr = lpD3DDevice->StretchRect(lpSurface, NULL, lpBackBuffer, NULL, D3DTEXF_NONE);
00291 if (FAILED(hr)) {
00292 CString mesg;
00293 mesg.LoadString(IDS_STR_FAIL_TRNS_BAKBUF);
00294 MessageBox(_T("CDxDirectView::ExecRender():\n\n") + mesg);
00295 return;
00296 }
00297
00298 hr = lpD3DDevice->Present(NULL, NULL, NULL, NULL);
00299 if (FAILED(hr)) {
00300 hr = ResetDx9Device(lpD3DDevice, &d3dParam, this);
00301 if (FAILED(hr)) {
00302 DEBUG_INFO("CDxDirectView::ExecRender(): %s (%s)\n", DXGetErrorString(hr), DXGetErrorDescription(hr));
00303 CString mesg;
00304 mesg.LoadString(IDS_STR_FAIL_RESTR_DX9DEV);
00305 MessageBox(_T("CDxDirectView::ExecRender():\n\n") + mesg + _T("\n") + DXGetErrorString(hr));
00306 pFrame->SendMessage(WM_CLOSE);
00307 }
00308 else ExecRender();
00309 }
00310 }
00311
00312
00313
00314 void CDxDirectView::InitObject()
00315 {
00316 bufferSize = Dx9GetBackBuffer(lpD3DDevice, &lpBackBuffer);
00317 if (bufferSize.x<0) {
00318 CString mesg;
00319 mesg.LoadString(IDS_STR_FAIL_REGET_BAKBUF);
00320 MessageBox(_T("CDxDirectView::InitObject():\n\n") + mesg);
00321 return;
00322 }
00323
00324 HRESULT hr;
00325 if (colorMode==GRAPH_COLOR_RGB || colorMode==GRAPH_COLOR_BGR) {
00326 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, NULL);
00327 }
00328 else if (colorMode==GRAPH_COLOR_ARGB || colorMode==GRAPH_COLOR_RGBA) {
00329 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, NULL);
00330 }
00331 else if (colorMode==GRAPH_COLOR_XRGB) {
00332 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, NULL);
00333 }
00334 else if (colorMode==GRAPH_COLOR_ABGR || colorMode==GRAPH_COLOR_BGRA) {
00335 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, NULL);
00336 }
00337 else if (colorMode==GRAPH_COLOR_XBGR) {
00338 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_X8R8G8B8, D3DPOOL_DEFAULT, &lpSurface, NULL);
00339 }
00340 else if (colorMode==GRAPH_COLOR_ARGB16 || colorMode==GRAPH_COLOR_RGBA16) {
00341 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_A4R4G4B4, D3DPOOL_DEFAULT, &lpSurface, NULL);
00342 }
00343 else {
00344 hr = lpD3DDevice->CreateOffscreenPlainSurface(viewData.xsize, viewData.ysize, D3DFMT_R5G6B5, D3DPOOL_DEFAULT, &lpSurface, NULL);
00345 }
00346
00347 if (FAILED(hr)) {
00348 CString mesg;
00349 mesg.LoadString(IDS_STR_FAIL_REGET_SURFACE);
00350 MessageBox(_T("CDxDirectView::InitObject():\n\n") + mesg);
00351 return;
00352 }
00353
00354 hasViewData = SetNewSurface(0);
00355 if (!hasViewData) {
00356 CString mesg;
00357 mesg.LoadString(IDS_STR_FAIL_RETRNS_SURFACE);
00358 MessageBox(_T("CDxDirectView::InitObject():\n\n") + mesg);
00359 return;
00360 }
00361 return;
00362 }
00363