2 Copyright 2006 Marten Richter
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "surfacewin.h"
25 SurfaceWin::SurfaceWin(int id)
31 event = CreateEvent(NULL,/*FALSE*/TRUE,FALSE,NULL);
34 SurfaceWin::~SurfaceWin()
36 if (d3dsurface) d3dsurface->Release();
37 if (d3dtexture) d3dtexture->Release();
41 int SurfaceWin::create(UINT width, UINT height)
43 LPDIRECT3DDEVICE9 d3ddev=((OsdWin*)(Osd::getInstance()))->getD3dDev();
46 if (d3ddev->CreateTexture(1024,1024,0,0,D3DFMT_A8R8G8B8,
47 // Does every adapter with alpha blending support this?
48 D3DPOOL_DEFAULT,&d3dtexture ,NULL)!=D3D_OK) {
49 MILLISLEEP(50);//wait maybe next time it will work
52 if (d3dtexture->GetSurfaceLevel(0,&d3dsurface)!=D3D_OK) {
53 d3dtexture->Release();
60 if (hres=d3ddev->CreateOffscreenPlainSurface(width,height,D3DFMT_A8R8G8B8,
61 D3DPOOL_SYSTEMMEM,&d3dsurface,NULL)!=D3D_OK) {
62 MILLISLEEP(50);//wait maybe next time it will work
69 /* If someone does high performance Animations on the OSD, we have to change the types
70 of surface in order to address these performance issues, if we have only very few updates
71 per second this would be fast enough !*/
78 void SurfaceWin::display()
82 int SurfaceWin::fillblt(int x, int y, int width, int height, unsigned int c)
84 WaitForSingleObject(event,INFINITE); //since this might be called before surface
85 //allocation we will wait in this case, hopefully without deadlocks
86 OsdWin* osd=((OsdWin*)(Osd::getInstance()));
89 return 0; //why does this happen
92 LPDIRECT3DDEVICE9 d3ddev=osd->getD3dDev();
95 //This should not happen!
100 D3DLOCKED_RECT lockrect;
101 int cx,cy,cwidth,cheight;
102 cx=min(max(x,0),swidth-1);
103 cy=min(max(y,0),sheight-1);
104 cwidth=min(width,swidth-x);
105 cheight=min(height,sheight-y);
106 RECT rect={cx,cy,cwidth,cheight};
108 if (d3dsurface->LockRect(&lockrect,&rect,D3DLOCK_DISCARD)!=D3D_OK) {
113 for (line=0;line<cheight;line++) {
114 unsigned int*row=((unsigned int*)(((char*)lockrect.pBits)+lockrect.Pitch*line));
115 for (column=0;column<cwidth;column++) {
120 if (d3dsurface->UnlockRect()!=D3D_OK) {
130 void SurfaceWin::drawPixel(int x, int y, unsigned int c)
132 //FixMe: locking for every single Pixel will be painfully slow
133 WaitForSingleObject(event,INFINITE); //since this might be called before surface
134 //allocation we will wait in this case, hopefully without deadlocks
136 return; //why does this happen
138 OsdWin* osd=((OsdWin*)(Osd::getInstance()));
139 LPDIRECT3DDEVICE9 d3ddev=osd->getD3dDev();
140 if (x>=swidth || y>=sheight) return; //do not draw outside the surface
142 //This should not happen!
146 osd->BeginPainting();
147 D3DLOCKED_RECT lockrect;
148 RECT rect={x,y,x+1,y+1};
149 if (d3dsurface->LockRect(&lockrect,&rect,D3DLOCK_DISCARD)!=D3D_OK) {
153 unsigned int*row=(unsigned int*)(((char*)lockrect.pBits));
155 if (d3dsurface->UnlockRect()!=D3D_OK) {
164 void SurfaceWin::drawHorzLine(int x1, int x2, int y, unsigned int c)
166 fillblt(x1, y, x2-x1, 1, c);
169 void SurfaceWin::drawVertLine(int x, int y1, int y2, unsigned int c)
171 fillblt(x, y1, 1, y2-y1, c);
174 int SurfaceWin::updateToScreen(int sx, int sy, int w, int h, int dx, int dy) // FIXME new, replace others with this FIXME
176 WaitForSingleObject(event,INFINITE); //since this might be called before surface
177 //allocation we will wait in this case, hopefully without deadlocks
179 return 0; //why does this happen
181 OsdWin* osd=((OsdWin*)(Osd::getInstance()));
182 LPDIRECT3DDEVICE9 d3ddev=osd->getD3dDev();
183 LPDIRECT3DSURFACE9 screensurface=((SurfaceWin*)screen)->getD3dsurface();
184 if (!screensurface) return 0;
185 RECT sourcerect={sx,sy,sx+w,sy+h};
186 POINT destpoint={dx,dy};
187 osd->BeginPainting();
188 if (d3ddev->UpdateSurface(d3dsurface,&sourcerect,screensurface,&destpoint)!=D3D_OK) {
189 Log::getInstance()->log("Surface", Log::DEBUG, "Could not update to Screen!");
197 int SurfaceWin::blt(int fd, unsigned long shandle, int sx, int sy, int width, int height, unsigned long dhandle, int dx, int dy)
199 //I don't see code using this function, so I skip it, since it is a MVP specific interface
203 void SurfaceWin::screenShot(char* fileName)
205 //Isn't this for debugging only, so I won't implement it yet
208 void SurfaceWin::readPixel(int x, int y, unsigned char* r, unsigned char* g, unsigned char* b)
210 //Isn't this for debugging only, so I won't implement it yet
212 void SurfaceWin::ReleaseSurface()
215 LPDIRECT3DSURFACE9 temp_surf=d3dsurface;
216 LPDIRECT3DTEXTURE9 temp_text=d3dtexture;
220 if (temp_surf) temp_surf->Release();
221 if (temp_text) temp_text->Release();
224 void SurfaceWin::drawJpeg(char *fileName,DWORD x, DWORD y,DWORD *width, DWORD *height){
225 WaitForSingleObject(event,INFINITE); //since this might be called before surface
226 //allocation we will wait in this case, hopefully without deadlocks
228 return ; //why does this happen
230 OsdWin* osd=((OsdWin*)(Osd::getInstance()));
233 D3DXIMAGE_INFO image_inf;
234 osd->BeginPainting();
235 // D3DXGetImageInfoFromFile(fileName,&image_inf);
236 D3DXGetImageInfoFromResource(NULL,fileName,&image_inf);
237 RECT dest_rec={x,y,x+image_inf.Width,
239 /* if (D3DXLoadSurfaceFromFile(
247 &image_inf)!=D3D_OK) {
248 Log::getInstance()->log("Surface", Log::DEBUG, "Could not open jpeg!");
251 if (D3DXLoadSurfaceFromResource(
260 &image_inf)!=D3D_OK) {
261 Log::getInstance()->log("Surface", Log::DEBUG, "Could not open jpeg!");
265 *width=image_inf.Width;
266 *height=image_inf.Height;