#include <DxDirectView.h>
Public Member Functions | |
virtual void | InitObject (void) |
virtual void | ExecRender (void) |
virtual BOOL | SetNewSurface (int ovsbpos=0) |
virtual void | OnDraw (CDC *pDC) |
virtual void | OnInitialUpdate () |
virtual void | AssertValid () const |
virtual void | Dump (CDumpContext &dc) const |
Public Attributes | |
RECT | renderRect |
Protected Member Functions | |
CDxDirectView () | |
virtual | ~CDxDirectView () |
Definition at line 20 of file DxDirectView.h.
CDxDirectView | ( | ) | [protected] |
Definition at line 18 of file DxDirectView.cpp.
~CDxDirectView | ( | ) | [protected, virtual] |
Definition at line 24 of file DxDirectView.cpp.
void AssertValid | ( | ) | const [virtual] |
Reimplemented from CExView.
Definition at line 49 of file DxDirectView.cpp.
00050 { 00051 CDxBaseView::AssertValid(); 00052 }
void Dump | ( | CDumpContext & | dc | ) | const [virtual] |
Reimplemented from CExView.
Definition at line 56 of file DxDirectView.cpp.
00057 { 00058 CDxBaseView::Dump(dc); 00059 }
void ExecRender | ( | void | ) | [virtual] |
Reimplemented from CDxBaseView.
Definition at line 278 of file DxDirectView.cpp.
References CDxBaseView::d3dParam, IDS_STR_FAIL_CLR_WND, IDS_STR_FAIL_RESTR_DX9DEV, IDS_STR_FAIL_TRNS_BAKBUF, CDxBaseView::lpBackBuffer, CDxBaseView::lpD3DDevice, CDxBaseView::lpSurface, CExView::pFrame, and jbxwl::ResetDx9Device().
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 }
void InitObject | ( | void | ) | [virtual] |
Reimplemented from CDxBaseView.
Definition at line 314 of file DxDirectView.cpp.
References CDxBaseView::bufferSize, CExView::colorMode, jbxwl::Dx9GetBackBuffer(), CExView::hasViewData, IDS_STR_FAIL_REGET_BAKBUF, IDS_STR_FAIL_REGET_SURFACE, IDS_STR_FAIL_RETRNS_SURFACE, CDxBaseView::lpBackBuffer, CDxBaseView::lpD3DDevice, CDxBaseView::lpSurface, CDxDirectView::SetNewSurface(), and CExView::viewData.
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 { // GRAPH_COLOR_MONO, MONO16, RGB16 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 }
void OnDraw | ( | CDC * | pDC | ) | [virtual] |
Reimplemented from CExView.
Definition at line 37 of file DxDirectView.cpp.
00038 { 00039 CDocument* pDoc = GetDocument(); 00040 00041 // TODO: 描画コードをここに追加してください. 00042 }
void OnInitialUpdate | ( | void | ) | [virtual] |
Reimplemented from CDxBaseView.
Definition at line 68 of file DxDirectView.cpp.
References CDxBaseView::bufferSize, CExView::colorMode, CExFrame::doneErrorMessage, jbxwl::Dx9GetBackBuffer(), CExView::hasViewData, IDS_STR_FAIL_CRT_BAKBUF, IDS_STR_FAIL_CRT_SURFACE, IDS_STR_FAIL_GET_DX9DEV, IDS_STR_FAIL_TRNS_SURFACE, CDxBaseView::InitDevice(), CDxBaseView::lpBackBuffer, CDxBaseView::lpD3DDevice, CDxBaseView::lpSurface, CExView::origXSize, CExView::origYSize, CExView::pFrame, CDxDirectView::renderRect, CDxDirectView::SetNewSurface(), CExView::SetWindowSize(), CExView::sizeXYRate, CExView::viewData, CExView::xsize, and CExView::ysize.
00069 { 00070 // xsize, ysize の4バイト境界の問題は呼び出し側の責任 00071 if (xsize<=0 || ysize<=0) return; 00072 00073 // 00074 D3DFORMAT format; 00075 00076 // RGB 8bit/plane 00077 if (colorMode==GRAPH_COLOR_RGB || colorMode==GRAPH_COLOR_BGR) { 00078 viewData.set(xsize, ysize, 1, 24); 00079 format = D3DFMT_X8R8G8B8; 00080 } 00081 // ARGB/RGBA 8bit/plane 00082 else if (colorMode==GRAPH_COLOR_ARGB || colorMode==GRAPH_COLOR_RGBA) { 00083 viewData.set(xsize, ysize, 1, 32); 00084 format = D3DFMT_A8R8G8B8; 00085 } 00086 // XRGB 8bit/plane 00087 else if (colorMode==GRAPH_COLOR_XRGB) { 00088 viewData.set(xsize, ysize, 1, 32); 00089 format = D3DFMT_X8R8G8B8; 00090 } 00091 // ABGR/BGRA 8bit/plane 00092 else if (colorMode==GRAPH_COLOR_ABGR || colorMode==GRAPH_COLOR_BGRA) { 00093 viewData.set(xsize, ysize, 1, 32); 00094 format = D3DFMT_A8R8G8B8; 00095 } 00096 // XBGR 8bit/plane 00097 else if (colorMode==GRAPH_COLOR_XBGR) { 00098 viewData.set(xsize, ysize, 1, 32); 00099 format = D3DFMT_X8R8G8B8; 00100 } 00101 // ARGB16/RGBA16 16bit/plane 00102 else if (colorMode==GRAPH_COLOR_ARGB16 || colorMode==GRAPH_COLOR_RGBA16) { 00103 viewData.set(xsize, ysize, 1, 16); 00104 format = D3DFMT_A4R4G4B4; 00105 } 00106 // RGB16 16bit/plane 00107 else if (colorMode==GRAPH_COLOR_RGB16) { 00108 viewData.set(xsize, ysize, 1, 16); 00109 format = D3DFMT_R5G6B5; 00110 } 00111 // GRAPH_COLOR_MONO, MONO16 8,16bit/plane (MONO16は MONOに変換されて表示される) 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 // DX9 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 }
BOOL SetNewSurface | ( | int | ovsbpos = 0 |
) | [virtual] |
Reimplemented from CExView.
Definition at line 170 of file DxDirectView.cpp.
References CExView::colorMode, IDS_STR_DLTD_DATA, IDS_STR_ERROR, CDxBaseView::lpSurface, CDxDirectView::renderRect, and CExView::viewData.
Referenced by CDxDirectView::InitObject(), and CDxDirectView::OnInitialUpdate().
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 // RGB 8bit/plane 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 // BGR 8bit/plane 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 // XRGB/ARGB 8bit/plane 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 // RBGA 8bit/plane 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 // XBGR/ABGR 8bit/plane 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 // BGRA 8bit/plane 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 // RGB16 16bit/plane 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 // ARGB16 16bit/plane 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 // RGBA16 16bit/plane 00249 else if (colorMode==GRAPH_COLOR_RGBA16) { 00250 int srcpitch = viewData.xsize*2; 00251 ntoh_data(viewData.grptr, viewData.lsize, 2); 00252 // R4G4B4A4 -> A4R4G4B4 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 // Monochrome 8,16bit/plane 00265 else if (colorMode==GRAPH_COLOR_MONO || colorMode==GRAPH_COLOR_MONO16) { 00266 // GRAPH_COLOR_MONO16 は 8bitに変換されている 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 }
RECT renderRect |
Definition at line 29 of file DxDirectView.h.
Referenced by CDxDirectView::OnInitialUpdate(), and CDxDirectView::SetNewSurface().