-/*
- Copyright 2004-2005 Chris Tallon
-
- This file is part of VOMP.
-
- VOMP is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- VOMP is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#include "osdwin.h"
-#include "mtd.h"
-#include "video.h"
-#include "surfacewin.h"
-
-//This is stuff for rendering the OSD
-
-
-OsdWin::OsdWin()
-{
- d3d=NULL;
- d3ddevice=NULL;
- d3dvb=NULL;
- external_driving=false;
- event = CreateEvent(NULL,/*FALSE*/TRUE,FALSE,NULL);
- d3dmutex = CreateMutex(NULL,FALSE,NULL);
-
-}
-
-OsdWin::~OsdWin()
-{
- if (initted) shutdown();
- CloseHandle(event);
- CloseHandle(d3dmutex);
-}
-
-int OsdWin::getFD()
-{
- if (!initted) return 0;
- return fdOsd;
-}
-
-int OsdWin::init(void* device)
-{
- if (initted) return 0;
- Video* video = Video::getInstance();
- //First Create Direct 3D Object
- d3d=Direct3DCreate9(D3D_SDK_VERSION);
- if (!d3d)
- {
- Log::getInstance()->log("OSD", Log::DEBUG, "Could not create Direct3D9 object!");
- return 0;
- }
- // then create the Device
- D3DPRESENT_PARAMETERS d3dparas;
- ZeroMemory(&d3dparas,sizeof(d3dparas));
- d3dparas.BackBufferWidth=video->getScreenWidth();
- d3dparas.BackBufferHeight=video->getScreenHeight();
- d3dparas.Windowed=TRUE;
- d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;
- if (d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,*((HWND*) device),
- D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dparas,&d3ddevice)!=D3D_OK) {
- Log::getInstance()->log("OSD", Log::DEBUG, "Could not create Direct3D9 device!");
- return 0;
- }
- //TODO a render function and a device lost detection
-
- if (!InitVertexBuffer()) {
- Log::getInstance()->log("OSD", Log::DEBUG, "Could not create Direct3D9 vertex buf!");
- return 0;
- }
-
- //Now we will create the Screen
- screen = new SurfaceWin(Surface::SCREEN);
- SetEvent(event);//Now all devices are ready
- screen->create(video->getScreenWidth(), video->getScreenHeight());
- screen->display();
- initted = 1; // must set this here or create surface won't work
-
- return 1;
-}
-
-
-int OsdWin::InitVertexBuffer() {
- Video* video = Video::getInstance();
- FLOAT texx=((float)video->getScreenWidth())/1024.f;
- FLOAT texy=((float)video->getScreenHeight())/1024.f;
- D3DCOLOR osdcolor=D3DCOLOR_RGBA(255,255,255,255);
- osdvertices[0].c=osdcolor;
- osdvertices[0].x=0.f-0.5f;
- osdvertices[0].y=0.f-0.5f;
- osdvertices[0].z=0.5f;
- osdvertices[0].rhw=1.f;
- osdvertices[0].u=0.f;
- osdvertices[0].v=0.f;
- osdvertices[1].c=osdcolor;
- osdvertices[1].x=((float)video->getScreenWidth())-0.5f;-0.5f;
- osdvertices[1].y=0.f-0.5f;
- osdvertices[1].z=0.5f;
- osdvertices[1].u=texx;
- osdvertices[1].v=0.f;
- osdvertices[1].rhw=1.f;
- osdvertices[2].c=osdcolor;
- osdvertices[2].x=((float)video->getScreenWidth())-0.5f;
- osdvertices[2].y=((float)video->getScreenHeight())-0.5f;
- osdvertices[2].z=0.5f;
- osdvertices[2].rhw=1.f;
- osdvertices[2].u=texx;
- osdvertices[2].v=texy;
- osdvertices[3].c=osdcolor;
- osdvertices[3].x=0.f-0.5f;
- osdvertices[3].y=((float)video->getScreenHeight())-0.5f;
- osdvertices[3].z=0;
- osdvertices[3].rhw=1.f;
- osdvertices[3].u=0.f;
- osdvertices[3].v=texy;
- if (d3dvb) {
- d3dvb->Release();
- d3dvb=NULL;
- }
- if (d3ddevice->CreateVertexBuffer(4*sizeof(OSDVERTEX),0,D3DFVF_OSDVERTEX,D3DPOOL_MANAGED,
- &d3dvb,NULL)!=D3D_OK) {
- return 0;
- }
- void *pvertex=NULL;
- if (d3dvb->Lock(0,sizeof(osdvertices),&pvertex,0)!=D3D_OK) {
- return 0;
- }
- memcpy(pvertex,osdvertices,sizeof(osdvertices));
- d3dvb->Unlock();
- return 1;
-}
-
-int OsdWin::shutdown()
-{
- if (!initted) return 0;
- initted = 0;
- d3ddevice->Release();
- d3d->Release();
-
- return 1;
-}
-
-void OsdWin::screenShot(char* fileName)
-{
- screen->screenShot(fileName);
-}
-
-// This function is called from the WinMain function in order to get Screen updates
-void OsdWin::Render()
-{
- if (!initted) return ;
- if (external_driving) {
- Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads
- } else {
- InternalRendering();
- }
-}
-
-
-void OsdWin::InternalRendering(){
- WaitForSingleObject(event,INFINITE);
- BeginPainting();
- if (external_driving) {
- //Copy video to Backbuffer
- } else {
- //Clear Background
- d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);
- }
- //Drawing the OSD
- if (d3ddevice->BeginScene()==D3D_OK) {
- d3ddevice->SetStreamSource(0,d3dvb,0,sizeof(OSDVERTEX));
- d3ddevice->SetFVF(D3DFVF_OSDVERTEX);
- d3ddevice->SetTexture(0,((SurfaceWin*)screen)->getD3dtexture());
- //d3ddevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
- d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP,D3DTOP_MODULATE);
- d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
- d3ddevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
- d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- d3ddevice->SetRenderState(D3DRS_LIGHTING,FALSE);
-
-
- d3ddevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);
- d3ddevice->EndScene();
- //Show it to the user!
- if (d3ddevice->Present(NULL,NULL,NULL,NULL)==D3DERR_DEVICELOST){
- EndPainting();
- DoLost();
- }
- EndPainting();
- }
- if (!external_driving) {
- Sleep(4);//The User can wait for 4 milliseconds to see his changes
- }
-}
-
-void OsdWin::DoLost(){
- Log::getInstance()->log("OSD", Log::DEBUG, "Direct3D Device Lost! Reobtaining...");
- ResetEvent(event);
- //First we free up all resources
- Video* video = Video::getInstance();
- ((SurfaceWin*)screen)->ReleaseSurface();
- d3dvb->Release();
- d3dvb=NULL;
- D3DPRESENT_PARAMETERS d3dparas;
- ZeroMemory(&d3dparas,sizeof(d3dparas));
- d3dparas.BackBufferWidth=video->getScreenWidth();
- d3dparas.BackBufferHeight=video->getScreenHeight();
- d3dparas.Windowed=TRUE;
- d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;
- if (d3ddevice->Reset(&d3dparas)!=D3D_OK){
- return;
- }
- screen->create(video->getScreenWidth(), video->getScreenHeight());
- screen->display();
- InitVertexBuffer();
- //Redraw Views, Chris could you add a member function to viewman, so that
- // I can cause it to completely redraw the Views?
- // Otherwise the OSD would be distorted after Device Lost
- SetEvent(event);
-
-}
-LPDIRECT3DDEVICE9 OsdWin::getD3dDev() {
- WaitForSingleObject(event,INFINITE);//We will only return if we are initted
- return d3ddevice;
-}
-
-void OsdWin::BeginPainting() {//We synchronize calls to d3d between different threads
- WaitForSingleObject(d3dmutex,INFINITE);
-}
-
-void OsdWin::EndPainting() {
- ReleaseMutex(d3dmutex);
-}
+/*\r
+ Copyright 2004-2005 Chris Tallon\r
+\r
+ This file is part of VOMP.\r
+\r
+ VOMP is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ VOMP is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with VOMP; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+\r
+\r
+#include "osdwin.h"\r
+#include "mtd.h"\r
+#include "video.h"\r
+#include "surfacewin.h"\r
+\r
+#include "dsallocator.h"\r
+\r
+\r
+//This is stuff for rendering the OSD\r
+\r
+\r
+OsdWin::OsdWin()\r
+{\r
+ d3d=NULL;\r
+ d3ddevice=NULL;\r
+ d3dvb=NULL;\r
+ d3drtsurf=NULL;\r
+ external_driving=false;\r
+ dsallocator=NULL;\r
+ event = CreateEvent(NULL,/*FALSE*/TRUE,FALSE,NULL);\r
+ d3dmutex = CreateMutex(NULL,FALSE,NULL);\r
+ \r
+}\r
+\r
+OsdWin::~OsdWin()\r
+{\r
+ if (initted) shutdown();\r
+ CloseHandle(event);\r
+ CloseHandle(d3dmutex);\r
+}\r
+\r
+int OsdWin::getFD()\r
+{\r
+ if (!initted) return 0;\r
+ return fdOsd;\r
+}\r
+\r
+int OsdWin::init(void* device)\r
+{\r
+ if (initted) return 0;\r
+ Video* video = Video::getInstance();\r
+ //First Create Direct 3D Object\r
+ d3d=Direct3DCreate9(D3D_SDK_VERSION);\r
+ if (!d3d) \r
+ {\r
+ Log::getInstance()->log("OSD", Log::WARN, "Could not create Direct3D9 object!");\r
+ return 0;\r
+ }\r
+ // then create the Device\r
+ D3DPRESENT_PARAMETERS d3dparas;\r
+ ZeroMemory(&d3dparas,sizeof(d3dparas));\r
+ d3dparas.BackBufferWidth=video->getScreenWidth();\r
+ d3dparas.BackBufferHeight=video->getScreenHeight();\r
+ d3dparas.Windowed=TRUE;\r
+ d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
+ if (d3d->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,*((HWND*) device),\r
+ D3DCREATE_SOFTWARE_VERTEXPROCESSING,&d3dparas,&d3ddevice)!=D3D_OK) {\r
+ Log::getInstance()->log("OSD", Log::WARN, "Could not create Direct3D9 device!");\r
+ return 0;\r
+ }\r
+ d3ddevice->GetRenderTarget(0,&d3drtsurf);\r
+\r
+ if (!InitVertexBuffer()) {\r
+ Log::getInstance()->log("OSD", Log::WARN, "Could not create Direct3D9 vertex buf!");\r
+ return 0;\r
+ }\r
+\r
+ //Now we will create the Screen\r
+ screen = new SurfaceWin(Surface::SCREEN);\r
+ SetEvent(event);//Now all devices are ready\r
+ screen->create(video->getScreenWidth(), video->getScreenHeight());\r
+ screen->display();\r
+ initted = 1; // must set this here or create surface won't work\r
+ \r
+ return 1;\r
+}\r
+\r
+\r
+int OsdWin::InitVertexBuffer() {\r
+ Video* video = Video::getInstance();\r
+ FLOAT texx=((float)video->getScreenWidth())/1024.f;\r
+ FLOAT texy=((float)video->getScreenHeight())/1024.f;\r
+ D3DCOLOR osdcolor=D3DCOLOR_RGBA(255,255,255,255);\r
+ osdvertices[0].c=osdcolor;\r
+ osdvertices[0].x=0.f-0.5f;\r
+ osdvertices[0].y=0.f-0.5f;\r
+ osdvertices[0].z=0.5f;\r
+ osdvertices[0].rhw=1.f;\r
+ osdvertices[0].u=0.f;\r
+ osdvertices[0].v=0.f;\r
+ osdvertices[1].c=osdcolor;\r
+ osdvertices[1].x=((float)video->getScreenWidth())-0.5f;-0.5f;\r
+ osdvertices[1].y=0.f-0.5f;\r
+ osdvertices[1].z=0.5f;\r
+ osdvertices[1].u=texx;\r
+ osdvertices[1].v=0.f;\r
+ osdvertices[1].rhw=1.f;\r
+ osdvertices[2].c=osdcolor;\r
+ osdvertices[2].x=((float)video->getScreenWidth())-0.5f;\r
+ osdvertices[2].y=((float)video->getScreenHeight())-0.5f;\r
+ osdvertices[2].z=0.5f;\r
+ osdvertices[2].rhw=1.f;\r
+ osdvertices[2].u=texx;\r
+ osdvertices[2].v=texy;\r
+ osdvertices[3].c=osdcolor;\r
+ osdvertices[3].x=0.f-0.5f;\r
+ osdvertices[3].y=((float)video->getScreenHeight())-0.5f;\r
+ osdvertices[3].z=0;\r
+ osdvertices[3].rhw=1.f;\r
+ osdvertices[3].u=0.f;\r
+ osdvertices[3].v=texy;\r
+ if (d3dvb) {\r
+ d3dvb->Release();\r
+ d3dvb=NULL;\r
+ }\r
+ if (d3ddevice->CreateVertexBuffer(4*sizeof(OSDVERTEX),0,D3DFVF_OSDVERTEX,D3DPOOL_MANAGED,\r
+ &d3dvb,NULL)!=D3D_OK) {\r
+ return 0;\r
+ }\r
+ void *pvertex=NULL;\r
+ if (d3dvb->Lock(0,sizeof(osdvertices),&pvertex,0)!=D3D_OK) {\r
+ return 0;\r
+ }\r
+ memcpy(pvertex,osdvertices,sizeof(osdvertices));\r
+ d3dvb->Unlock();\r
+ return 1;\r
+}\r
+\r
+int OsdWin::shutdown()\r
+{\r
+ if (!initted) return 0;\r
+ initted = 0;\r
+ d3drtsurf->Release();\r
+ d3ddevice->Release();\r
+ d3d->Release();\r
+\r
+ return 1;\r
+}\r
+\r
+void OsdWin::screenShot(char* fileName)\r
+{\r
+ screen->screenShot(fileName);\r
+}\r
+\r
+// This function is called from the WinMain function in order to get Screen updates\r
+void OsdWin::Render()\r
+{\r
+ if (!initted) return ;\r
+ if (external_driving) {\r
+ Sleep(5); //Sleep for 5 ms, in order to avoid blocking the other threads\r
+ } else {\r
+ InternalRendering(NULL);\r
+ }\r
+}\r
+\r
+void OsdWin::RenderDS(LPDIRECT3DSURFACE9 present){\r
+ if (!initted) return;\r
+ if (external_driving) {\r
+ InternalRendering(present);\r
+ }\r
+}\r
+\r
+\r
+void OsdWin::InternalRendering(LPDIRECT3DSURFACE9 present){\r
+ WaitForSingleObject(event,INFINITE);\r
+ BeginPainting();\r
+ if (external_driving) {\r
+ //Copy video to Backbuffer\r
+ if (present!=NULL) {\r
+ d3ddevice->StretchRect(present,NULL,d3drtsurf ,NULL,D3DTEXF_LINEAR);\r
+\r
+ }\r
+ } else {\r
+ //Clear Background\r
+ d3ddevice->Clear(0,NULL,D3DCLEAR_TARGET,D3DCOLOR_XRGB(0,0,255),1.0f,0);\r
+ }\r
+ //Drawing the OSD\r
+ if (d3ddevice->BeginScene()==D3D_OK) {\r
+ d3ddevice->SetStreamSource(0,d3dvb,0,sizeof(OSDVERTEX));\r
+ d3ddevice->SetFVF(D3DFVF_OSDVERTEX);\r
+ d3ddevice->SetTexture(0,((SurfaceWin*)screen)->getD3dtexture());\r
+ //d3ddevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);\r
+ d3ddevice->SetTextureStageState(0, D3DTSS_ALPHAOP,D3DTOP_MODULATE);\r
+ d3ddevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);\r
+ d3ddevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);\r
+ d3ddevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);\r
+ d3ddevice->SetRenderState(D3DRS_LIGHTING,FALSE);\r
+\r
+\r
+ d3ddevice->DrawPrimitive(D3DPT_TRIANGLEFAN,0,2);\r
+ d3ddevice->EndScene();\r
+ //Show it to the user!\r
+ if (d3ddevice->Present(NULL,NULL,NULL,NULL)==D3DERR_DEVICELOST){\r
+ EndPainting();\r
+ DoLost();\r
+ }\r
+ EndPainting();\r
+ }\r
+ if (!external_driving) {\r
+ Sleep(4);//The User can wait for 4 milliseconds to see his changes\r
+ }\r
+}\r
+\r
+void OsdWin::DoLost(){\r
+ Log::getInstance()->log("OSD", Log::WARN, "Direct3D Device Lost! Reobtaining...");\r
+ ResetEvent(event);\r
+ if (external_driving && dsallocator!=NULL) {\r
+ dsallocator->LostDevice(); //Propagate the information through DS\r
+ }\r
+ //First we free up all resources\r
+ Video* video = Video::getInstance();\r
+ ((SurfaceWin*)screen)->ReleaseSurface();\r
+ d3drtsurf->Release();\r
+ d3dvb->Release();\r
+ d3dvb=NULL;\r
+ D3DPRESENT_PARAMETERS d3dparas;\r
+ ZeroMemory(&d3dparas,sizeof(d3dparas));\r
+ d3dparas.BackBufferWidth=video->getScreenWidth();\r
+ d3dparas.BackBufferHeight=video->getScreenHeight();\r
+ d3dparas.Windowed=TRUE;\r
+ d3dparas.SwapEffect=D3DSWAPEFFECT_COPY;\r
+ if (d3ddevice->Reset(&d3dparas)!=D3D_OK){\r
+ return;\r
+ }\r
+ screen->create(video->getScreenWidth(), video->getScreenHeight());\r
+ screen->display();\r
+ d3ddevice->GetRenderTarget(0,&d3drtsurf);\r
+ InitVertexBuffer();\r
+ //Redraw Views, Chris could you add a member function to viewman, so that\r
+ // I can cause it to completely redraw the Views?\r
+ // Otherwise the OSD would be distorted after Device Lost\r
+ \r
+ SetEvent(event);\r
+\r
+}\r
+LPDIRECT3DDEVICE9 OsdWin::getD3dDev() {\r
+ WaitForSingleObject(event,INFINITE);//We will only return if we are initted\r
+ return d3ddevice;\r
+}\r
+\r
+LPDIRECT3D9 OsdWin::getD3d() {\r
+ WaitForSingleObject(event,INFINITE);//We will only return if we are initted\r
+ return d3d;\r
+}\r
+\r
+void OsdWin::BeginPainting() {//We synchronize calls to d3d between different threads\r
+ WaitForSingleObject(d3dmutex,INFINITE);\r
+}\r
+\r
+void OsdWin::EndPainting() {\r
+ ReleaseMutex(d3dmutex);\r
+}\r
+\r
+void OsdWin::setExternalDriving(DsAllocator* dsall) {\r
+ if (dsall==NULL) {\r
+ external_driving=false;\r
+ dsallocator=NULL;\r
+ return;\r
+ }\r
+ WaitForSingleObject(event,INFINITE);//We will only return if we are initted\r
+ dsallocator=dsall;\r
+ external_driving=true;\r
+}\r
-/*
- Copyright 2004-2005 Chris Tallon
-
- This file is part of VOMP.
-
- VOMP is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- VOMP is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with VOMP; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-#ifndef OSDWIN_H
-#define OSDWIN_H
-
-#include <stdio.h>
-
-#include "osd.h"
-#include "defines.h"
-#include "log.h"
-#include <winsock2.h>
-#include <d3d9.h>
-
-struct OSDVERTEX
-{
- FLOAT x,y,z,rhw;
- DWORD c;
- FLOAT u,v;
-};
-
-#define D3DFVF_OSDVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE| D3DFVF_TEX1)
-
-
-class OsdWin : public Osd
-{
- public:
- OsdWin();
- ~OsdWin();
-
- int init(void* device);
- int shutdown();
-
- int getFD();
-
- void screenShot(char* fileName);
-
- LPDIRECT3DDEVICE9 getD3dDev() ;
- // This function is called from the WinMain function in order to get Screen updates
- void Render();
- void BeginPainting();
- void EndPainting();
-private:
- LPDIRECT3D9 d3d;
- LPDIRECT3DDEVICE9 d3ddevice;
- LPDIRECT3DVERTEXBUFFER9 d3dvb;
- // This indicates, that currently a video is played, thus the osd updates are driven by the Directshow Filtersystem
- bool external_driving;
- HANDLE d3dmutex;
- void InternalRendering();
- void DoLost();
- int InitVertexBuffer();
- OSDVERTEX osdvertices[4];
- HANDLE event;
-};
-
-#endif
+/*\r
+ Copyright 2004-2005 Chris Tallon\r
+\r
+ This file is part of VOMP.\r
+\r
+ VOMP is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ VOMP is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with VOMP; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+*/\r
+\r
+#ifndef OSDWIN_H\r
+#define OSDWIN_H\r
+\r
+#include <stdio.h>\r
+\r
+#include "osd.h"\r
+#include "defines.h"\r
+#include "log.h"\r
+#include <winsock2.h>\r
+#include <d3d9.h>\r
+\r
+struct OSDVERTEX\r
+{\r
+ FLOAT x,y,z,rhw;\r
+ DWORD c;\r
+ FLOAT u,v;\r
+};\r
+\r
+#define D3DFVF_OSDVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE| D3DFVF_TEX1)\r
+\r
+class DsAllocator;\r
+\r
+class OsdWin : public Osd\r
+{\r
+ public:\r
+ OsdWin();\r
+ ~OsdWin();\r
+\r
+ int init(void* device);\r
+ int shutdown();\r
+\r
+ int getFD();\r
+\r
+ void screenShot(char* fileName);\r
+\r
+ LPDIRECT3DDEVICE9 getD3dDev() ;\r
+ LPDIRECT3D9 getD3d() ;\r
+ // This function is called from the WinMain function in order to get Screen updates\r
+ void Render();\r
+ void RenderDS(LPDIRECT3DSURFACE9 present);\r
+ void BeginPainting();\r
+ void EndPainting();\r
+ void setExternalDriving(DsAllocator* dsall);\r
+private:\r
+ LPDIRECT3D9 d3d;\r
+ LPDIRECT3DDEVICE9 d3ddevice;\r
+ LPDIRECT3DVERTEXBUFFER9 d3dvb;\r
+ LPDIRECT3DSURFACE9 d3drtsurf;\r
+ DsAllocator* dsallocator;\r
+ // This indicates, that currently a video is played, thus the osd updates are driven by the Directshow Filtersystem\r
+ bool external_driving;\r
+ HANDLE d3dmutex;\r
+ void InternalRendering(LPDIRECT3DSURFACE9 present);\r
+ void DoLost();\r
+ int InitVertexBuffer();\r
+ OSDVERTEX osdvertices[4];\r
+ HANDLE event;\r
+};\r
+\r
+#endif\r
+\r