Mercurial > mplayer.hg
annotate libvo/vo_directx.c @ 33671:a460339acfdf
Fix volume and balance bug.
Changing the volume changed the balance as well,
because the calculation for the balance was wrong.
Additionally, use macro FFMAX() and replace
identical code by a call to existing code.
author | ib |
---|---|
date | Tue, 28 Jun 2011 17:52:30 +0000 |
parents | 835841f89315 |
children | 8c31fd7b9a08 |
rev | line source |
---|---|
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
1 /* |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
2 * Directx v2 or later DirectDraw interface |
7537 | 3 * |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
4 * Copyright (c) 2002 - 2005 Sascha Sommer <saschasommer@freenet.de> |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
5 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
6 * This file is part of MPlayer. |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
7 * |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
7537 | 9 * it under the terms of the GNU General Public License as published by |
10 * the Free Software Foundation; either version 2 of the License, or | |
11 * (at your option) any later version. | |
12 * | |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
7537 | 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 * GNU General Public License for more details. | |
17 * | |
26739
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
2a34d9fa52ab
Use standard license headers with standard formatting.
diego
parents:
25962
diff
changeset
|
21 */ |
7537 | 22 |
23 #include <windows.h> | |
24 #include <windowsx.h> | |
25 #include <ddraw.h> | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
26 #include <stdio.h> |
7537 | 27 #include <stdlib.h> |
28 #include <errno.h> | |
29 #include "config.h" | |
30 #include "video_out.h" | |
31 #include "video_out_internal.h" | |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
32 #include "libmpcodecs/vf.h" |
7537 | 33 #include "fastmemcpy.h" |
30653
3d23e24c5c60
Declare externally used variables from vd.c as extern in vd.h.
diego
parents:
30301
diff
changeset
|
34 #include "libmpcodecs/vd.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13775
diff
changeset
|
35 #include "mp_msg.h" |
8519 | 36 #include "aspect.h" |
32467 | 37 #include "sub/sub.h" |
33569 | 38 #include "w32_common.h" |
7537 | 39 |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
40 static LPDIRECTDRAWCOLORCONTROL g_cc = NULL; //color control interface |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
41 static LPDIRECTDRAW7 g_lpdd = NULL; //DirectDraw Object |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
42 static LPDIRECTDRAWSURFACE7 g_lpddsPrimary = NULL; //Primary Surface: viewport through the Desktop |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
43 static LPDIRECTDRAWSURFACE7 g_lpddsOverlay = NULL; //Overlay Surface |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
44 static LPDIRECTDRAWSURFACE7 g_lpddsBack = NULL; //Back surface |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
45 static LPDIRECTDRAWCLIPPER g_lpddclipper; //clipper object, can only be used without overlay |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
46 static DDSURFACEDESC2 ddsdsf; //surface descripiton needed for locking |
7778
f804db78f704
10l - noticed by Soeren Mueller <soeren.mueller at webwasher.com>
faust3
parents:
7713
diff
changeset
|
47 static HINSTANCE hddraw_dll; //handle to ddraw.dll |
7537 | 48 static RECT rd; //rect of our stretched image |
49 static RECT rs; //rect of our source image | |
15428
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
50 static HBRUSH colorbrush = NULL; // Handle to colorkey brush |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
51 static HBRUSH blackbrush = NULL; // Handle to black brush |
7537 | 52 static uint32_t image_width, image_height; //image width and height |
53 static uint8_t *image=NULL; //image data | |
24833 | 54 static void* tmp_image = NULL; |
10640
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
55 static uint32_t image_format=0; //image format |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
56 static uint32_t primary_image_format; |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
57 static uint32_t vm_height=0; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
58 static uint32_t vm_width=0; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
59 static uint32_t vm_bpp=0; |
7537 | 60 static uint32_t dstride; //surface stride |
7682 | 61 static uint32_t nooverlay = 0; //NonOverlay mode |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
62 static DWORD destcolorkey; //colorkey for our surface |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
63 static COLORREF windowcolor = RGB(0,0,16); //windowcolor == colorkey |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
64 static int adapter_count=0; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
65 static GUID selected_guid; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
66 static GUID *selected_guid_ptr = NULL; |
7537 | 67 |
68 /***************************************************************************** | |
69 * DirectDraw GUIDs. | |
70 * Defining them here allows us to get rid of the dxguid library during | |
71 * the linking stage. | |
72 *****************************************************************************/ | |
30301
a33cf9c69731
Change GUID declarations in vo_directx to be static.
reimar
parents:
29263
diff
changeset
|
73 #define IID_IDirectDraw7 MP_IID_IDirectDraw7 |
a33cf9c69731
Change GUID declarations in vo_directx to be static.
reimar
parents:
29263
diff
changeset
|
74 static const GUID MP_IID_IDirectDraw7 = |
8667 | 75 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
76 0x15e65ec0,0x3b9c,0x11d2,{0xb9,0x2f,0x00,0x60,0x97,0x97,0xea,0x5b} |
8667 | 77 }; |
7537 | 78 |
30301
a33cf9c69731
Change GUID declarations in vo_directx to be static.
reimar
parents:
29263
diff
changeset
|
79 #define IID_IDirectDrawColorControl MP_IID_IDirectDrawColorControl |
a33cf9c69731
Change GUID declarations in vo_directx to be static.
reimar
parents:
29263
diff
changeset
|
80 static const GUID MP_IID_IDirectDrawColorControl = |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
81 { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
82 0x4b9f0ee0,0x0d7e,0x11d0,{0x9b,0x06,0x00,0xa0,0xc9,0x03,0xa3,0xb8} |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
83 }; |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
84 |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
85 |
7537 | 86 typedef struct directx_fourcc_caps |
87 { | |
88 char* img_format_name; //human readable name | |
89 uint32_t img_format; //as MPlayer image format | |
90 uint32_t drv_caps; //what hw supports with this format | |
91 DDPIXELFORMAT g_ddpfOverlay; //as Directx Sourface description | |
92 } directx_fourcc_caps; | |
93 | |
94 | |
95 static directx_fourcc_caps g_ddpf[] = | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
96 { |
7537 | 97 {"YV12 ",IMGFMT_YV12 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','1','2'),0,0,0,0,0}}, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
98 {"I420 ",IMGFMT_I420 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','4','2','0'),0,0,0,0,0}}, //yv12 with swapped uv |
7537 | 99 {"IYUV ",IMGFMT_IYUV ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('I','Y','U','V'),0,0,0,0,0}}, //same as i420 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
100 {"YVU9 ",IMGFMT_YVU9 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','V','U','9'),0,0,0,0,0}}, |
7537 | 101 {"YUY2 ",IMGFMT_YUY2 ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('Y','U','Y','2'),0,0,0,0,0}}, |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
102 {"UYVY ",IMGFMT_UYVY ,0,{sizeof(DDPIXELFORMAT), DDPF_FOURCC,MAKEFOURCC('U','Y','V','Y'),0,0,0,0,0}}, |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
103 {"BGR8 ",IMGFMT_BGR8 ,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 8, 0x00000000, 0x00000000, 0x00000000, 0}}, |
7537 | 104 {"RGB15",IMGFMT_RGB15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000003E0, 0x00007C00, 0}}, //RGB 5:5:5 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
105 {"BGR15",IMGFMT_BGR15,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x00007C00, 0x000003E0, 0x0000001F, 0}}, |
10647 | 106 {"RGB16",IMGFMT_RGB16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000001F, 0x000007E0, 0x0000F800, 0}}, //RGB 5:6:5 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
107 {"BGR16",IMGFMT_BGR16,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 16, 0x0000F800, 0x000007E0, 0x0000001F, 0}}, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
108 {"RGB24",IMGFMT_RGB24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}}, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
109 {"BGR24",IMGFMT_BGR24,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 24, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}}, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
110 {"RGB32",IMGFMT_RGB32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0}}, |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
111 {"BGR32",IMGFMT_BGR32,0,{sizeof(DDPIXELFORMAT), DDPF_RGB, 0, 32, 0x00FF0000, 0x0000FF00, 0x000000FF, 0}} |
7537 | 112 }; |
113 #define NUM_FORMATS (sizeof(g_ddpf) / sizeof(g_ddpf[0])) | |
114 | |
25216 | 115 static const vo_info_t info = |
7537 | 116 { |
117 "Directx DDraw YUV/RGB/BGR renderer", | |
118 "directx", | |
119 "Sascha Sommer <saschasommer@freenet.de>", | |
120 "" | |
121 }; | |
122 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
123 const LIBVO_EXTERN(directx) |
7537 | 124 |
125 static void draw_alpha(int x0, int y0, int w, int h, unsigned char *src, | |
126 unsigned char *srca, int stride) | |
127 { | |
128 switch(image_format) { | |
129 case IMGFMT_YV12 : | |
130 case IMGFMT_I420 : | |
131 case IMGFMT_IYUV : | |
132 case IMGFMT_YVU9 : | |
8495 | 133 vo_draw_alpha_yv12(w,h,src,srca,stride,((uint8_t *) image) + dstride*y0 + x0,dstride); |
7537 | 134 break; |
135 case IMGFMT_YUY2 : | |
8495 | 136 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image)+ dstride*y0 + 2*x0 ,dstride); |
7537 | 137 break; |
138 case IMGFMT_UYVY : | |
8495 | 139 vo_draw_alpha_yuy2(w,h,src,srca,stride,((uint8_t *) image) + dstride*y0 + 2*x0 + 1,dstride); |
7537 | 140 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
141 case IMGFMT_RGB15: |
7537 | 142 case IMGFMT_BGR15: |
143 vo_draw_alpha_rgb15(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+2*x0,dstride); | |
144 break; | |
145 case IMGFMT_RGB16: | |
146 case IMGFMT_BGR16: | |
147 vo_draw_alpha_rgb16(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+2*x0,dstride); | |
148 break; | |
149 case IMGFMT_RGB24: | |
150 case IMGFMT_BGR24: | |
151 vo_draw_alpha_rgb24(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+4*x0,dstride); | |
152 break; | |
153 case IMGFMT_RGB32: | |
154 case IMGFMT_BGR32: | |
155 vo_draw_alpha_rgb32(w,h,src,srca,stride,((uint8_t *) image)+dstride*y0+4*x0,dstride); | |
156 break; | |
157 } | |
158 } | |
159 | |
160 static void draw_osd(void) | |
161 { | |
162 vo_draw_text(image_width,image_height,draw_alpha); | |
163 } | |
164 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15690
diff
changeset
|
165 static int |
7537 | 166 query_format(uint32_t format) |
167 { | |
168 uint32_t i=0; | |
169 while ( i < NUM_FORMATS ) | |
170 { | |
171 if (g_ddpf[i].img_format == format) | |
172 return g_ddpf[i].drv_caps; | |
173 i++; | |
174 } | |
175 return 0; | |
176 } | |
177 | |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
178 static uint32_t Directx_CreatePrimarySurface(void) |
7537 | 179 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
180 DDSURFACEDESC2 ddsd; |
7537 | 181 //cleanup |
182 if(g_lpddsPrimary)g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary); | |
183 g_lpddsPrimary=NULL; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
184 |
12021
cd33d1e3b709
move refreshrate and adapter_num variables to video_out because they might be usefull for other drivers, too
faust3
parents:
12020
diff
changeset
|
185 if(vidmode)g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width,vm_height,vm_bpp,vo_refresh_rate,0); |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
186 ZeroMemory(&ddsd, sizeof(ddsd)); |
7537 | 187 ddsd.dwSize = sizeof(ddsd); |
188 //set flags and create a primary surface. | |
189 ddsd.dwFlags = DDSD_CAPS; | |
190 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; | |
191 if(g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsd, &g_lpddsPrimary, NULL )== DD_OK) | |
192 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>primary surface created\n"); | |
193 else | |
194 { | |
195 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>could not create primary surface\n"); | |
196 return 1; | |
197 } | |
198 return 0; | |
199 } | |
200 | |
201 static uint32_t Directx_CreateOverlay(uint32_t imgfmt) | |
202 { | |
203 HRESULT ddrval; | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
204 DDSURFACEDESC2 ddsdOverlay; |
7537 | 205 uint32_t i=0; |
32481 | 206 while ( i < NUM_FORMATS && imgfmt != g_ddpf[i].img_format) |
7537 | 207 { |
208 i++; | |
209 } | |
32481 | 210 if (!g_lpdd || !g_lpddsPrimary || i == NUM_FORMATS) |
7537 | 211 return 1; |
212 //cleanup | |
213 if (g_lpddsOverlay)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay); | |
214 if (g_lpddsBack)g_lpddsBack->lpVtbl->Release(g_lpddsBack); | |
215 g_lpddsOverlay= NULL; | |
216 g_lpddsBack = NULL; | |
217 //create our overlay | |
218 ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay)); | |
219 ddsdOverlay.dwSize = sizeof(ddsdOverlay); | |
220 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_FLIP | DDSCAPS_COMPLEX | DDSCAPS_VIDEOMEMORY; | |
221 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_BACKBUFFERCOUNT| DDSD_PIXELFORMAT; | |
222 ddsdOverlay.dwWidth=image_width; | |
223 ddsdOverlay.dwHeight=image_height; | |
224 ddsdOverlay.dwBackBufferCount=2; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
225 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay; |
7537 | 226 if(vo_doublebuffering) //tribblebuffering |
227 { | |
228 if (g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL)== DD_OK) | |
229 { | |
230 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>overlay with format %s created\n",g_ddpf[i].img_format_name); | |
231 //get the surface directly attached to the primary (the back buffer) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
232 ddsdOverlay.ddsCaps.dwCaps = DDSCAPS_BACKBUFFER; |
7537 | 233 if(g_lpddsOverlay->lpVtbl->GetAttachedSurface(g_lpddsOverlay,&ddsdOverlay.ddsCaps, &g_lpddsBack) != DD_OK) |
234 { | |
235 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't get attached surface\n"); | |
236 return 1; | |
237 } | |
238 return 0; | |
239 } | |
240 vo_doublebuffering=0; //disable tribblebuffering | |
241 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><WARN>cannot create tribblebuffer overlay with format %s\n",g_ddpf[i].img_format_name); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
242 } |
7537 | 243 //single buffer |
244 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>using singlebuffer overlay\n"); | |
245 ddsdOverlay.dwBackBufferCount=0; | |
246 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; | |
247 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT; | |
248 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay; | |
249 // try to create the overlay surface | |
250 ddrval = g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL); | |
251 if(ddrval != DD_OK) | |
252 { | |
10640
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
253 if(ddrval == DDERR_INVALIDPIXELFORMAT)mp_msg(MSGT_VO,MSGL_V,"<vo_directx><ERROR> invalid pixelformat: %s\n",g_ddpf[i].img_format_name); |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
254 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>"); |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
255 switch(ddrval) |
7537 | 256 { |
257 case DDERR_INCOMPATIBLEPRIMARY: | |
258 {mp_msg(MSGT_VO, MSGL_ERR,"incompatible primary surface\n");break;} | |
259 case DDERR_INVALIDCAPS: | |
260 {mp_msg(MSGT_VO, MSGL_ERR,"invalid caps\n");break;} | |
261 case DDERR_INVALIDOBJECT: | |
262 {mp_msg(MSGT_VO, MSGL_ERR,"invalid object\n");break;} | |
263 case DDERR_INVALIDPARAMS: | |
264 {mp_msg(MSGT_VO, MSGL_ERR,"invalid parameters\n");break;} | |
265 case DDERR_NODIRECTDRAWHW: | |
266 {mp_msg(MSGT_VO, MSGL_ERR,"no directdraw hardware\n");break;} | |
267 case DDERR_NOEMULATION: | |
11000 | 268 {mp_msg(MSGT_VO, MSGL_ERR,"can't emulate\n");break;} |
7537 | 269 case DDERR_NOFLIPHW: |
270 {mp_msg(MSGT_VO, MSGL_ERR,"hardware can't do flip\n");break;} | |
271 case DDERR_NOOVERLAYHW: | |
272 {mp_msg(MSGT_VO, MSGL_ERR,"hardware can't do overlay\n");break;} | |
273 case DDERR_OUTOFMEMORY: | |
274 {mp_msg(MSGT_VO, MSGL_ERR,"not enough system memory\n");break;} | |
275 case DDERR_UNSUPPORTEDMODE: | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
276 {mp_msg(MSGT_VO, MSGL_ERR,"unsupported mode\n");break;} |
7537 | 277 case DDERR_OUTOFVIDEOMEMORY: |
278 {mp_msg(MSGT_VO, MSGL_ERR,"not enough video memory\n");break;} | |
12156
ff9f315741a7
print at least the error number when there is no text for it
faust3
parents:
12021
diff
changeset
|
279 default: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
280 mp_msg(MSGT_VO, MSGL_ERR,"create surface failed with 0x%x\n",ddrval); |
7537 | 281 } |
282 return 1; | |
283 } | |
284 g_lpddsBack = g_lpddsOverlay; | |
285 return 0; | |
286 } | |
287 | |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
288 static uint32_t Directx_CreateBackpuffer(void) |
7537 | 289 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
290 DDSURFACEDESC2 ddsd; |
7537 | 291 //cleanup |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
292 if (g_lpddsBack)g_lpddsBack->lpVtbl->Release(g_lpddsBack); |
7537 | 293 g_lpddsBack=NULL; |
294 ZeroMemory(&ddsd, sizeof(ddsd)); | |
295 ddsd.dwSize = sizeof(ddsd); | |
296 ddsd.ddsCaps.dwCaps= DDSCAPS_OFFSCREENPLAIN | DDSCAPS_SYSTEMMEMORY; | |
297 ddsd.dwFlags= DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT; | |
298 ddsd.dwWidth=image_width; | |
299 ddsd.dwHeight=image_height; | |
300 if(g_lpdd->lpVtbl->CreateSurface( g_lpdd, &ddsd, &g_lpddsBack, 0 ) != DD_OK ) | |
301 { | |
302 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't create backpuffer\n"); | |
303 return 1; | |
304 } | |
305 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>backbuffer created\n"); | |
306 return 0; | |
307 } | |
308 | |
309 static void uninit(void) | |
310 { | |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
311 if (g_cc != NULL) |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
312 { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
313 g_cc->lpVtbl->Release(g_cc); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
314 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
315 g_cc=NULL; |
7537 | 316 if (g_lpddclipper != NULL) g_lpddclipper->lpVtbl->Release(g_lpddclipper); |
9619 | 317 g_lpddclipper = NULL; |
7537 | 318 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>clipper released\n"); |
319 if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack); | |
320 g_lpddsBack = NULL; | |
321 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>back surface released\n"); | |
10640
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
322 if(vo_doublebuffering && !nooverlay) |
7537 | 323 { |
324 if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay); | |
325 g_lpddsOverlay = NULL; | |
326 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>overlay surface released\n"); | |
327 } | |
328 if (g_lpddsPrimary != NULL) g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary); | |
7682 | 329 g_lpddsPrimary = NULL; |
330 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>primary released\n"); | |
15428
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
331 if (colorbrush) DeleteObject(colorbrush); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
332 colorbrush = NULL; |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
333 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>GDI resources deleted\n"); |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
334 if (g_lpdd != NULL){ |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
335 if(vidmode)g_lpdd->lpVtbl->RestoreDisplayMode(g_lpdd); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
336 g_lpdd->lpVtbl->Release(g_lpdd); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
337 } |
7537 | 338 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>directdrawobject released\n"); |
7778
f804db78f704
10l - noticed by Soeren Mueller <soeren.mueller at webwasher.com>
faust3
parents:
7713
diff
changeset
|
339 FreeLibrary( hddraw_dll); |
f804db78f704
10l - noticed by Soeren Mueller <soeren.mueller at webwasher.com>
faust3
parents:
7713
diff
changeset
|
340 hddraw_dll= NULL; |
f804db78f704
10l - noticed by Soeren Mueller <soeren.mueller at webwasher.com>
faust3
parents:
7713
diff
changeset
|
341 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>ddraw.dll freed\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
342 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>uninitialized\n"); |
33569 | 343 vo_w32_uninit(); |
7537 | 344 } |
345 | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
346 static BOOL WINAPI EnumCallbackEx(GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext, HMONITOR hm) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
347 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
348 if (!lpGUID) |
33584 | 349 lpDriverDescription = "Primary Display Adapter"; |
350 mp_msg(MSGT_VO, MSGL_INFO ,"<vo_directx> adapter %d: %s", adapter_count, lpDriverDescription); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
351 |
12021
cd33d1e3b709
move refreshrate and adapter_num variables to video_out because they might be usefull for other drivers, too
faust3
parents:
12020
diff
changeset
|
352 if(adapter_count == vo_adapter_num){ |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
353 if (!lpGUID) |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
354 selected_guid_ptr = NULL; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
355 else |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
356 { |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
357 selected_guid = *lpGUID; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
358 selected_guid_ptr = &selected_guid; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
359 } |
14302
9929eafe6be5
win95 fix fix by Rune Petersen <rune.mail-list at mail.tele.dk>
faust3
parents:
14253
diff
changeset
|
360 |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
361 mp_msg(MSGT_VO, MSGL_INFO ,"\t\t<--"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
362 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
363 mp_msg(MSGT_VO, MSGL_INFO ,"\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
364 |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
365 adapter_count++; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
366 |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
367 return 1; // list all adapters |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
368 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
369 |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
370 static uint32_t Directx_InitDirectDraw(void) |
7537 | 371 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
372 HRESULT (WINAPI *OurDirectDrawCreateEx)(GUID *,LPVOID *, REFIID,IUnknown FAR *); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
373 DDSURFACEDESC2 ddsd; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
374 LPDIRECTDRAWENUMERATEEX OurDirectDrawEnumerateEx; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
375 |
17534
13cdba48ff98
reinitialize adapter_count to 0, EnumCallbackEx will not work otherwise
reimar
parents:
16975
diff
changeset
|
376 adapter_count = 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
377 |
7537 | 378 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>Initing DirectDraw\n" ); |
379 | |
380 //load direct draw DLL: based on videolans code | |
381 hddraw_dll = LoadLibrary("DDRAW.DLL"); | |
382 if( hddraw_dll == NULL ) | |
383 { | |
384 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>failed loading ddraw.dll\n" ); | |
385 return 1; | |
386 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
387 |
12021
cd33d1e3b709
move refreshrate and adapter_num variables to video_out because they might be usefull for other drivers, too
faust3
parents:
12020
diff
changeset
|
388 if(vo_adapter_num){ //display other than default |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
389 OurDirectDrawEnumerateEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(hddraw_dll,"DirectDrawEnumerateExA"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
390 if (!OurDirectDrawEnumerateEx){ |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
391 FreeLibrary( hddraw_dll ); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
392 hddraw_dll = NULL; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
393 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>failed geting proc address: DirectDrawEnumerateEx\n"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
394 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>no directx 7 or higher installed\n"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
395 return 1; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
396 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
397 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
398 // enumerate all display devices attached to the desktop |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
399 OurDirectDrawEnumerateEx(EnumCallbackEx, NULL, DDENUM_ATTACHEDSECONDARYDEVICES ); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
400 |
12021
cd33d1e3b709
move refreshrate and adapter_num variables to video_out because they might be usefull for other drivers, too
faust3
parents:
12020
diff
changeset
|
401 if(vo_adapter_num >= adapter_count) |
cd33d1e3b709
move refreshrate and adapter_num variables to video_out because they might be usefull for other drivers, too
faust3
parents:
12020
diff
changeset
|
402 mp_msg(MSGT_VO, MSGL_ERR,"Selected adapter (%d) doesn't exist: Default Display Adapter selected\n",vo_adapter_num); |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
403 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
404 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
405 OurDirectDrawCreateEx = (void *)GetProcAddress(hddraw_dll, "DirectDrawCreateEx"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
406 if ( OurDirectDrawCreateEx == NULL ) |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
407 { |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
408 FreeLibrary( hddraw_dll ); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
409 hddraw_dll = NULL; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
410 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>failed geting proc address: DirectDrawCreateEx\n"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
411 return 1; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
412 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
413 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
414 // initialize DirectDraw and create directx v7 object |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
415 if (OurDirectDrawCreateEx(selected_guid_ptr, (VOID**)&g_lpdd, &IID_IDirectDraw7, NULL ) != DD_OK ) |
7537 | 416 { |
417 FreeLibrary( hddraw_dll ); | |
418 hddraw_dll = NULL; | |
419 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't initialize ddraw\n"); | |
420 return 1; | |
421 } | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
422 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
423 //get current screen siz for selected monitor ... |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
424 ddsd.dwSize=sizeof(ddsd); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
425 ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_PIXELFORMAT; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
426 g_lpdd->lpVtbl->GetDisplayMode(g_lpdd, &ddsd); |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
427 if(vo_screenwidth && vo_screenheight) |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
428 { |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
429 vm_height=vo_screenheight; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
430 vm_width=vo_screenwidth; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
431 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
432 else |
7537 | 433 { |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
434 vm_height=ddsd.dwHeight; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
435 vm_width=ddsd.dwWidth; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
436 } |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
437 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
438 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
439 if(vo_dbpp)vm_bpp=vo_dbpp; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
440 else vm_bpp=ddsd.ddpfPixelFormat.dwRGBBitCount; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
441 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
442 if(vidmode){ |
33569 | 443 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, vo_w32_window, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN) != DD_OK) |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
444 { |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
445 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set cooperativelevel for exclusive mode\n"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
446 return 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
447 } |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
448 /*SetDisplayMode(ddobject,width,height,bpp,refreshrate,aditionalflags)*/ |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
449 if(g_lpdd->lpVtbl->SetDisplayMode(g_lpdd,vm_width, vm_height, vm_bpp,0,0) != DD_OK) |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
450 { |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
451 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't set displaymode\n"); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
452 return 1; |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
453 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
454 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>Initialized adapter %i for %i x %i @ %i \n",vo_adapter_num,vm_width,vm_height,vm_bpp); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
455 return 0; |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
456 } |
33569 | 457 if (g_lpdd->lpVtbl->SetCooperativeLevel(g_lpdd, vo_w32_window, DDSCL_NORMAL) != DD_OK) // or DDSCL_SETFOCUSWINDOW |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
458 { |
7537 | 459 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>could not set cooperativelevel for hardwarecheck\n"); |
460 return 1; | |
461 } | |
25962 | 462 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>DirectDraw Initialized\n"); |
7537 | 463 return 0; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
464 } |
7537 | 465 |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
466 static uint32_t Directx_ManageDisplay(void) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
467 { |
7537 | 468 HRESULT ddrval; |
469 DDCAPS capsDrv; | |
470 DDOVERLAYFX ovfx; | |
8667 | 471 DWORD dwUpdateFlags=0; |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
472 int width,height; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
473 |
33569 | 474 rd.left = vo_dx - xinerama_x; |
475 rd.top = vo_dy - xinerama_y; | |
476 width = vo_dwidth; | |
477 height = vo_dheight; | |
17853
33ec9a9f4eef
fix for MPlayer taking 100% CPU with -wid on some systems, patch by Martin Fiedler <martin.fiedler at gmx.net>
faust3
parents:
17534
diff
changeset
|
478 |
33569 | 479 aspect(&width, &height, A_WINZOOM); |
480 panscan_calc_windowed(); | |
481 width += vo_panscan_x; | |
482 height += vo_panscan_y; | |
483 width = FFMIN(width, vo_screenwidth); | |
484 height = FFMIN(height, vo_screenheight); | |
485 rd.left += (vo_dwidth - width ) / 2; | |
486 rd.top += (vo_dheight - height) / 2; | |
487 | |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
488 rd.right=rd.left+width; |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
489 rd.bottom=rd.top+height; |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
490 |
8667 | 491 /*ok, let's workaround some overlay limitations*/ |
492 if(!nooverlay) | |
493 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
494 uint32_t uStretchFactor1000; //minimum stretch |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
495 uint32_t xstretch1000,ystretch1000; |
8667 | 496 /*get driver capabilities*/ |
497 ZeroMemory(&capsDrv, sizeof(capsDrv)); | |
498 capsDrv.dwSize = sizeof(capsDrv); | |
499 if(g_lpdd->lpVtbl->GetCaps(g_lpdd,&capsDrv, NULL) != DD_OK)return 1; | |
12485
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
500 /*get minimum stretch, depends on display adaptor and mode (refresh rate!) */ |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
501 uStretchFactor1000 = capsDrv.dwMinOverlayStretch>1000 ? capsDrv.dwMinOverlayStretch : 1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
502 rd.right = ((width+rd.left)*uStretchFactor1000+999)/1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
503 rd.bottom = (height+rd.top)*uStretchFactor1000/1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
504 /*calculate xstretch1000 and ystretch1000*/ |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
505 xstretch1000 = ((rd.right - rd.left)* 1000)/image_width ; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
506 ystretch1000 = ((rd.bottom - rd.top)* 1000)/image_height; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
507 rs.left=0; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
508 rs.right=image_width; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
509 rs.top=0; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
510 rs.bottom=image_height; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
511 if(rd.left < 0)rs.left=(-rd.left*1000)/xstretch1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
512 if(rd.top < 0)rs.top=(-rd.top*1000)/ystretch1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
513 if(rd.right > vo_screenwidth)rs.right=((vo_screenwidth-rd.left)*1000)/xstretch1000; |
d6885dbe1017
more sane order for overlay workarounds, fixed a bug where the mouse would stay hidden on win98
faust3
parents:
12387
diff
changeset
|
514 if(rd.bottom > vo_screenheight)rs.bottom=((vo_screenheight-rd.top)*1000)/ystretch1000; |
8667 | 515 /*do not allow to zoom or shrink if hardware isn't able to do so*/ |
516 if((width < image_width)&& !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKX)) | |
517 { | |
518 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKXN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only shrinkN\n"); | |
519 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't shrink x\n"); | |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
520 rd.right=rd.left+image_width; |
8667 | 521 } |
522 else if((width > image_width)&& !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHX)) | |
523 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
524 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHXN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n"); |
8667 | 525 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch x\n"); |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
526 rd.right = rd.left+image_width; |
8667 | 527 } |
528 if((height < image_height) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKY)) | |
529 { | |
530 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSHRINKYN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only shrinkN\n"); | |
531 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't shrink y\n"); | |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
532 rd.bottom = rd.top + image_height; |
8667 | 533 } |
534 else if((height > image_height ) && !(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHY)) | |
535 { | |
536 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYSTRETCHYN)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can only stretchN\n"); | |
537 else mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't stretch y\n"); | |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
538 rd.bottom = rd.top + image_height; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
539 } |
8667 | 540 /*the last thing to check are alignment restrictions |
541 these expressions (x & -y) just do alignment by dropping low order bits... | |
542 so to round up, we add first, then truncate*/ | |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
543 if((capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYSRC) && capsDrv.dwAlignBoundarySrc) |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
544 rs.left = (rs.left + capsDrv.dwAlignBoundarySrc / 2) & -(signed)(capsDrv.dwAlignBoundarySrc); |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
545 if((capsDrv.dwCaps & DDCAPS_ALIGNSIZESRC) && capsDrv.dwAlignSizeSrc) |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
546 rs.right = rs.left + ((rs.right - rs.left + capsDrv.dwAlignSizeSrc / 2) & -(signed) (capsDrv.dwAlignSizeSrc)); |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
547 if((capsDrv.dwCaps & DDCAPS_ALIGNBOUNDARYDEST) && capsDrv.dwAlignBoundaryDest) |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
548 rd.left = (rd.left + capsDrv.dwAlignBoundaryDest / 2) & -(signed)(capsDrv.dwAlignBoundaryDest); |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
549 if((capsDrv.dwCaps & DDCAPS_ALIGNSIZEDEST) && capsDrv.dwAlignSizeDest) |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
550 rd.right = rd.left + ((rd.right - rd.left) & -(signed) (capsDrv.dwAlignSizeDest)); |
8667 | 551 /*create an overlay FX structure to specify a destination color key*/ |
552 ZeroMemory(&ovfx, sizeof(ovfx)); | |
553 ovfx.dwSize = sizeof(ovfx); | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
554 if(vo_fs||vidmode) |
8667 | 555 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
556 ovfx.dckDestColorkey.dwColorSpaceLowValue = 0; |
8667 | 557 ovfx.dckDestColorkey.dwColorSpaceHighValue = 0; |
558 } | |
559 else | |
560 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
561 ovfx.dckDestColorkey.dwColorSpaceLowValue = destcolorkey; |
8667 | 562 ovfx.dckDestColorkey.dwColorSpaceHighValue = destcolorkey; |
563 } | |
22289
780caed72ac7
cosmetics: typo fixes, usefuLL --> useful and aswell --> as well
diego
parents:
20394
diff
changeset
|
564 // set the flags we'll send to UpdateOverlay //DDOVER_AUTOFLIP|DDOVERFX_MIRRORLEFTRIGHT|DDOVERFX_MIRRORUPDOWN could be useful?; |
8667 | 565 dwUpdateFlags = DDOVER_SHOW | DDOVER_DDFX; |
566 /*if hardware can't do colorkeying set the window on top*/ | |
567 if(capsDrv.dwCKeyCaps & DDCKEYCAPS_DESTOVERLAY) dwUpdateFlags |= DDOVER_KEYDESTOVERRIDE; | |
24833 | 568 else if (!tmp_image) vo_ontop = 1; |
7537 | 569 } |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
570 else |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
571 { |
33569 | 572 g_lpddclipper->lpVtbl->SetHWnd(g_lpddclipper, 0, vo_w32_window); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
573 } |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
574 |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
575 /*make sure the overlay is inside the screen*/ |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
576 if(rd.left<0)rd.left=0; |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
577 if(rd.right>vo_screenwidth)rd.right=vo_screenwidth; |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
578 if(rd.top<0)rd.top=0; |
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
579 if(rd.bottom>vo_screenheight)rd.bottom=vo_screenheight; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
580 |
14207 | 581 /*for nonoverlay mode we are finished, for overlay mode we have to display the overlay first*/ |
582 if(nooverlay)return 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
583 |
12387
5c2e728f5a00
keepaspect support, tryed to clean up DirectxManageDisplay a bit, enabled UYVY support and fixed bugs where switching to fullscreen would keep the console window on top and where the initial window position is wrongly calculated
faust3
parents:
12192
diff
changeset
|
584 // printf("overlay: %i %i %ix%i\n",rd.left,rd.top,rd.right - rd.left,rd.bottom - rd.top); |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
585 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx); |
7537 | 586 if(FAILED(ddrval)) |
587 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
588 // one cause might be the driver lied about minimum stretch |
7537 | 589 // we should try upping the destination size a bit, or |
590 // perhaps shrinking the source size | |
591 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>UpdateOverlay failed\n" ); | |
592 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Overlay:x1:%i,y1:%i,x2:%i,y2:%i,w:%i,h:%i\n",rd.left,rd.top,rd.right,rd.bottom,rd.right - rd.left,rd.bottom - rd.top ); | |
593 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>"); | |
594 switch (ddrval) | |
595 { | |
596 case DDERR_NOSTRETCHHW: | |
597 {mp_msg(MSGT_VO, MSGL_ERR ,"hardware can't stretch: try to size the window back\n");break;} | |
598 case DDERR_INVALIDRECT: | |
599 {mp_msg(MSGT_VO, MSGL_ERR ,"invalid rectangle\n");break;} | |
600 case DDERR_INVALIDPARAMS: | |
601 {mp_msg(MSGT_VO, MSGL_ERR ,"invalid parameters\n");break;} | |
602 case DDERR_HEIGHTALIGN: | |
603 {mp_msg(MSGT_VO, MSGL_ERR ,"height align\n");break;} | |
604 case DDERR_XALIGN: | |
605 {mp_msg(MSGT_VO, MSGL_ERR ,"x align\n");break;} | |
606 case DDERR_UNSUPPORTED: | |
607 {mp_msg(MSGT_VO, MSGL_ERR ,"unsupported\n");break;} | |
608 case DDERR_INVALIDSURFACETYPE: | |
609 {mp_msg(MSGT_VO, MSGL_ERR ,"invalid surfacetype\n");break;} | |
610 case DDERR_INVALIDOBJECT: | |
611 {mp_msg(MSGT_VO, MSGL_ERR ,"invalid object\n");break;} | |
612 case DDERR_SURFACELOST: | |
613 { | |
614 mp_msg(MSGT_VO, MSGL_ERR ,"surfaces lost\n"); | |
615 g_lpddsOverlay->lpVtbl->Restore( g_lpddsOverlay ); //restore and try again | |
616 g_lpddsPrimary->lpVtbl->Restore( g_lpddsPrimary ); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
617 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,&rs, g_lpddsPrimary, &rd, dwUpdateFlags, &ovfx); |
7537 | 618 if(ddrval !=DD_OK)mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>UpdateOverlay failed again\n" ); |
619 break; | |
620 } | |
12156
ff9f315741a7
print at least the error number when there is no text for it
faust3
parents:
12021
diff
changeset
|
621 default: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
622 mp_msg(MSGT_VO, MSGL_ERR ," 0x%x\n",ddrval); |
7537 | 623 } |
8667 | 624 /*ok we can't do anything about it -> hide overlay*/ |
7537 | 625 if(ddrval != DD_OK) |
626 { | |
627 ddrval = g_lpddsOverlay->lpVtbl->UpdateOverlay(g_lpddsOverlay,NULL, g_lpddsPrimary, NULL, DDOVER_HIDE, NULL); | |
628 return 1; | |
629 } | |
630 } | |
631 return 0; | |
632 } | |
633 | |
33590
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
634 static void check_events(void) |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
635 { |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
636 int evt = vo_w32_check_events(); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
637 if (evt & (VO_EVENT_RESIZE | VO_EVENT_MOVE)) |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
638 Directx_ManageDisplay(); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
639 if (evt & (VO_EVENT_RESIZE | VO_EVENT_MOVE | VO_EVENT_EXPOSE)) { |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
640 HDC dc = vo_w32_get_dc(vo_w32_window); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
641 RECT r; |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
642 GetClientRect(vo_w32_window, &r); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
643 FillRect(dc, &r, vo_fs || vidmode ? blackbrush : colorbrush); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
644 vo_w32_release_dc(vo_w32_window, dc); |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
645 } |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
646 } |
b213f28fc17a
Move check_events function to avoid forward declaration.
reimar
parents:
33589
diff
changeset
|
647 |
7537 | 648 //find out supported overlay pixelformats |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
649 static uint32_t Directx_CheckOverlayPixelformats(void) |
7537 | 650 { |
651 DDCAPS capsDrv; | |
652 HRESULT ddrval; | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
653 DDSURFACEDESC2 ddsdOverlay; |
7537 | 654 uint32_t i; |
655 uint32_t formatcount = 0; | |
656 //get driver caps to determine overlay support | |
657 ZeroMemory(&capsDrv, sizeof(capsDrv)); | |
658 capsDrv.dwSize = sizeof(capsDrv); | |
659 ddrval = g_lpdd->lpVtbl->GetCaps(g_lpdd,&capsDrv, NULL); | |
660 if (FAILED(ddrval)) | |
661 { | |
662 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>failed getting ddrawcaps\n"); | |
663 return 1; | |
664 } | |
665 if (!(capsDrv.dwCaps & DDCAPS_OVERLAY)) | |
666 { | |
667 mp_msg(MSGT_VO, MSGL_ERR ,"<vo_directx><ERROR>Your card doesn't support overlay\n"); | |
668 return 1; | |
669 } | |
670 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>testing supported overlay pixelformats\n"); | |
671 //it is not possible to query for pixel formats supported by the | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
672 //overlay hardware: try out various formats till one works |
7537 | 673 ZeroMemory(&ddsdOverlay, sizeof(ddsdOverlay)); |
674 ddsdOverlay.dwSize = sizeof(ddsdOverlay); | |
675 ddsdOverlay.ddsCaps.dwCaps=DDSCAPS_OVERLAY | DDSCAPS_VIDEOMEMORY; | |
676 ddsdOverlay.dwFlags= DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH| DDSD_PIXELFORMAT; | |
677 ddsdOverlay.dwWidth=300; | |
678 ddsdOverlay.dwHeight=280; | |
679 ddsdOverlay.dwBackBufferCount=0; | |
680 //try to create an overlay surface using one of the pixel formats in our global list | |
681 i=0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
682 do |
7537 | 683 { |
684 ddsdOverlay.ddpfPixelFormat=g_ddpf[i].g_ddpfOverlay; | |
685 ddrval = g_lpdd->lpVtbl->CreateSurface(g_lpdd,&ddsdOverlay, &g_lpddsOverlay, NULL); | |
686 if (ddrval == DD_OK) | |
687 { | |
688 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT OVERLAY>%i %s supported\n",i,g_ddpf[i].img_format_name); | |
689 g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD |VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_HWSCALE_UP; | |
690 formatcount++;} | |
691 else mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT OVERLAY>%i %s not supported\n",i,g_ddpf[i].img_format_name); | |
692 if (g_lpddsOverlay != NULL) {g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay);g_lpddsOverlay = NULL;} | |
693 } while( ++i < NUM_FORMATS ); | |
694 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>Your card supports %i of %i overlayformats\n",formatcount, NUM_FORMATS); | |
695 if (formatcount == 0) | |
696 { | |
697 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><WARN>Your card supports overlay, but we couldn't create one\n"); | |
698 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>This can have the following reasons:\n"); | |
699 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- you are already using an overlay with another app\n"); | |
700 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- you don't have enough videomemory\n"); | |
701 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>- vo_directx doesn't support the cards overlay pixelformat\n"); | |
702 return 1; | |
703 } | |
704 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORLEFTRIGHT)mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror left right\n"); //I don't have hardware which | |
705 if(capsDrv.dwFXCaps & DDFXCAPS_OVERLAYMIRRORUPDOWN )mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>can mirror up down\n"); //supports those send me one and I'll implement ;) | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
706 return 0; |
7537 | 707 } |
708 | |
709 //find out the Pixelformat of the Primary Surface | |
29212
eda346733b8c
Add missing 'void' to parameterless function declarations.
diego
parents:
28121
diff
changeset
|
710 static uint32_t Directx_CheckPrimaryPixelformat(void) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
711 { |
7537 | 712 uint32_t i=0; |
713 uint32_t formatcount = 0; | |
714 DDPIXELFORMAT ddpf; | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
715 DDSURFACEDESC2 ddsd; |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
716 HDC hdc; |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
717 HRESULT hres; |
8667 | 718 COLORREF rgbT=RGB(0,0,0); |
7537 | 719 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>checking primary surface\n"); |
720 memset( &ddpf, 0, sizeof( DDPIXELFORMAT )); | |
721 ddpf.dwSize = sizeof( DDPIXELFORMAT ); | |
722 //we have to create a primary surface first | |
723 if(Directx_CreatePrimarySurface()!=0)return 1; | |
724 if(g_lpddsPrimary->lpVtbl->GetPixelFormat( g_lpddsPrimary, &ddpf ) != DD_OK ) | |
725 { | |
726 mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>can't get pixelformat\n"); | |
727 return 1; | |
728 } | |
729 while ( i < NUM_FORMATS ) | |
730 { | |
731 if (g_ddpf[i].g_ddpfOverlay.dwRGBBitCount == ddpf.dwRGBBitCount) | |
732 { | |
733 if (g_ddpf[i].g_ddpfOverlay.dwRBitMask == ddpf.dwRBitMask) | |
734 { | |
735 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><FORMAT PRIMARY>%i %s supported\n",i,g_ddpf[i].img_format_name); | |
7713 | 736 g_ddpf[i].drv_caps = VFCAP_CSP_SUPPORTED |VFCAP_OSD; |
7537 | 737 formatcount++; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
738 primary_image_format=g_ddpf[i].img_format; |
7537 | 739 } |
740 } | |
741 i++; | |
742 } | |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
743 //get the colorkey for overlay mode |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
744 destcolorkey = CLR_INVALID; |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
745 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK) |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
746 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
747 rgbT = GetPixel(hdc, 0, 0); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
748 SetPixel(hdc, 0, 0, windowcolor); |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
749 g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc); |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
750 } |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
751 // read back the converted color |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
752 ddsd.dwSize = sizeof(ddsd); |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
753 while ((hres = g_lpddsPrimary->lpVtbl->Lock(g_lpddsPrimary,NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING) |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
754 ; |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
755 if (hres == DD_OK) |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
756 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
757 destcolorkey = *(DWORD *) ddsd.lpSurface; |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
758 if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
759 destcolorkey &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; |
7624
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
760 g_lpddsPrimary->lpVtbl->Unlock(g_lpddsPrimary,NULL); |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
761 } |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
762 if (windowcolor != CLR_INVALID && g_lpddsPrimary->lpVtbl->GetDC(g_lpddsPrimary,&hdc) == DD_OK) |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
763 { |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
764 SetPixel(hdc, 0, 0, rgbT); |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
765 g_lpddsPrimary->lpVtbl->ReleaseDC(g_lpddsPrimary,hdc); |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
766 } |
b1a3b979c630
This patch hopefully fixes colorkeying and a segfault in exclusive mode
arpi
parents:
7537
diff
changeset
|
767 //release primary |
7537 | 768 g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary); |
769 g_lpddsPrimary = NULL; | |
770 if(formatcount==0) | |
771 { | |
772 mp_msg(MSGT_VO, MSGL_FATAL ,"<vo_directx><FATAL ERROR>Unknown Pixelformat\n"); | |
773 return 1; | |
774 } | |
775 return 0; | |
776 } | |
777 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15690
diff
changeset
|
778 static int preinit(const char *arg) |
7537 | 779 { |
7682 | 780 if(arg) |
781 { | |
9488
abe81caa8cc1
fix fullscreenswitching patch by Joey Parrish <joey at nicewarrior.org>
faust3
parents:
9380
diff
changeset
|
782 if(strstr(arg,"noaccel")) |
7682 | 783 { |
784 mp_msg(MSGT_VO,MSGL_V,"<vo_directx><INFO>disabled overlay\n"); | |
785 nooverlay = 1; | |
786 } | |
787 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
788 |
14205 | 789 windowcolor = vo_colorkey; |
15428
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
790 colorbrush = CreateSolidBrush(windowcolor); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
791 blackbrush = (HBRUSH)GetStockObject(BLACK_BRUSH); |
33569 | 792 if (!vo_w32_init()) |
793 return 1; | |
794 if (!vo_w32_config(100, 100, VOFLAG_HIDDEN)) | |
795 return 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
796 |
7537 | 797 if (Directx_InitDirectDraw()!= 0)return 1; //init DirectDraw |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
798 |
7537 | 799 if (Directx_CheckPrimaryPixelformat()!=0)return 1; |
7682 | 800 if (!nooverlay && Directx_CheckOverlayPixelformats() == 0) //check for supported hardware |
7537 | 801 { |
802 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>hardware supports overlay\n"); | |
803 nooverlay = 0; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
804 } |
7537 | 805 else //if we can't have overlay we create a backpuffer with the same imageformat as the primary surface |
806 { | |
807 mp_msg(MSGT_VO, MSGL_V ,"<vo_directx><INFO>using backpuffer\n"); | |
808 nooverlay = 1; | |
809 } | |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
810 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>preinit succesfully finished\n"); |
7537 | 811 return 0; |
812 } | |
813 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15690
diff
changeset
|
814 static int draw_slice(uint8_t *src[], int stride[], int w,int h,int x,int y ) |
7537 | 815 { |
816 uint8_t *s; | |
817 uint8_t *d; | |
24840 | 818 uint32_t uvstride=dstride/2; |
7537 | 819 // copy Y |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
820 d=image+dstride*y+x; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
821 s=src[0]; |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
822 mem2agpcpy_pic(d,s,w,h,dstride,stride[0]); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
823 |
7537 | 824 w/=2;h/=2;x/=2;y/=2; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
825 |
7537 | 826 // copy U |
8490
ac40496c7d9e
1000l! I have no idea how this code worked at all before. I guess no
rfelker
parents:
8148
diff
changeset
|
827 d=image+dstride*image_height + uvstride*y+x; |
8667 | 828 if(image_format == IMGFMT_YV12)s=src[2]; |
7537 | 829 else s=src[1]; |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
830 mem2agpcpy_pic(d,s,w,h,uvstride,stride[1]); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
831 |
7537 | 832 // copy V |
8490
ac40496c7d9e
1000l! I have no idea how this code worked at all before. I guess no
rfelker
parents:
8148
diff
changeset
|
833 d=image+dstride*image_height +uvstride*(image_height/2) + uvstride*y+x; |
8667 | 834 if(image_format == IMGFMT_YV12)s=src[1]; |
7537 | 835 else s=src[2]; |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
836 mem2agpcpy_pic(d,s,w,h,uvstride,stride[2]); |
7537 | 837 return 0; |
838 } | |
839 | |
840 static void flip_page(void) | |
841 { | |
842 HRESULT dxresult; | |
8519 | 843 g_lpddsBack->lpVtbl->Unlock (g_lpddsBack,NULL); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
844 if (vo_doublebuffering) |
7537 | 845 { |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
846 // flip to the next image in the sequence |
7537 | 847 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT); |
848 if(dxresult == DDERR_SURFACELOST) | |
849 { | |
850 mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR><vo_directx><INFO>Restoring Surface\n"); | |
851 g_lpddsBack->lpVtbl->Restore( g_lpddsBack ); | |
24833 | 852 // restore overlay and primary before calling |
853 // Directx_ManageDisplay() to avoid error messages | |
854 g_lpddsOverlay->lpVtbl->Restore( g_lpddsOverlay ); | |
855 g_lpddsPrimary->lpVtbl->Restore( g_lpddsPrimary ); | |
856 // update overlay in case we return from screensaver | |
857 Directx_ManageDisplay(); | |
7537 | 858 dxresult = g_lpddsOverlay->lpVtbl->Flip( g_lpddsOverlay,NULL, DDFLIP_WAIT); |
859 } | |
860 if(dxresult != DD_OK)mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>can't flip page\n"); | |
861 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
862 if(nooverlay) |
7537 | 863 { |
864 DDBLTFX ddbltfx; | |
865 // ask for the "NOTEARING" option | |
866 memset( &ddbltfx, 0, sizeof(DDBLTFX) ); | |
867 ddbltfx.dwSize = sizeof(DDBLTFX); | |
868 ddbltfx.dwDDFX = DDBLTFX_NOTEARING; | |
869 g_lpddsPrimary->lpVtbl->Blt(g_lpddsPrimary, &rd, g_lpddsBack, NULL, DDBLT_WAIT, &ddbltfx); | |
24833 | 870 } |
871 if (g_lpddsBack->lpVtbl->Lock(g_lpddsBack,NULL,&ddsdsf, DDLOCK_NOSYSLOCK | DDLOCK_WAIT , NULL) == DD_OK) { | |
24835 | 872 if(vo_directrendering && (dstride != ddsdsf.lPitch)){ |
873 mp_msg(MSGT_VO,MSGL_WARN,"<vo_directx><WARN>stride changed !!!! disabling direct rendering\n"); | |
874 vo_directrendering=0; | |
875 } | |
32537
8fa2f43cb760
Remove most of the NULL pointer check before free all over the code
cboesch
parents:
32481
diff
changeset
|
876 free(tmp_image); |
24835 | 877 tmp_image = NULL; |
878 dstride = ddsdsf.lPitch; | |
879 image = ddsdsf.lpSurface; | |
24833 | 880 } else if (!tmp_image) { |
881 mp_msg(MSGT_VO, MSGL_WARN, "<vo_directx><WARN>Locking the surface failed, rendering to a hidden surface!\n"); | |
882 tmp_image = image = calloc(1, image_height * dstride * 2); | |
883 } | |
7537 | 884 } |
885 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15690
diff
changeset
|
886 static int draw_frame(uint8_t *src[]) |
7537 | 887 { |
23457
a124f3abc1ec
Replace implicit use of fast_memcpy via macro by explicit use to allow
reimar
parents:
23077
diff
changeset
|
888 fast_memcpy( image, *src, dstride * image_height ); |
7537 | 889 return 0; |
890 } | |
891 | |
892 static uint32_t get_image(mp_image_t *mpi) | |
893 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
894 if(mpi->flags&MP_IMGFLAG_READABLE) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>slow video ram\n");return VO_FALSE;} |
7537 | 895 if(mpi->type==MP_IMGTYPE_STATIC) {mp_msg(MSGT_VO, MSGL_V,"<vo_directx><ERROR>not static\n");return VO_FALSE;} |
896 if((mpi->width==dstride) || (mpi->flags&(MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_ACCEPT_WIDTH))) | |
897 { | |
8667 | 898 if(mpi->flags&MP_IMGFLAG_PLANAR) |
7537 | 899 { |
8667 | 900 if(image_format == IMGFMT_YV12) |
7537 | 901 { |
902 mpi->planes[2]= image + dstride*image_height; | |
903 mpi->planes[1]= image + dstride*image_height+ dstride*image_height/4; | |
8667 | 904 mpi->stride[1]=mpi->stride[2]=dstride/2; |
7537 | 905 } |
8667 | 906 else if(image_format == IMGFMT_IYUV || image_format == IMGFMT_I420) |
7537 | 907 { |
908 mpi->planes[1]= image + dstride*image_height; | |
909 mpi->planes[2]= image + dstride*image_height+ dstride*image_height/4; | |
8667 | 910 mpi->stride[1]=mpi->stride[2]=dstride/2; |
7537 | 911 } |
8667 | 912 else if(image_format == IMGFMT_YVU9) |
913 { | |
914 mpi->planes[2] = image + dstride*image_height; | |
915 mpi->planes[1] = image + dstride*image_height+ dstride*image_height/16; | |
916 mpi->stride[1]=mpi->stride[2]=dstride/4; | |
917 } | |
7537 | 918 } |
8667 | 919 mpi->planes[0]=image; |
920 mpi->stride[0]=dstride; | |
921 mpi->width=image_width; | |
922 mpi->height=image_height; | |
7537 | 923 mpi->flags|=MP_IMGFLAG_DIRECT; |
924 mp_msg(MSGT_VO, MSGL_DBG3, "<vo_directx><INFO>Direct Rendering ENABLED\n"); | |
925 return VO_TRUE; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
926 } |
7537 | 927 return VO_FALSE; |
928 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
929 |
7537 | 930 static uint32_t put_image(mp_image_t *mpi){ |
931 | |
932 uint8_t *d; | |
933 uint8_t *s; | |
934 uint32_t x = mpi->x; | |
935 uint32_t y = mpi->y; | |
936 uint32_t w = mpi->w; | |
937 uint32_t h = mpi->h; | |
14207 | 938 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
939 if((mpi->flags&MP_IMGFLAG_DIRECT)||(mpi->flags&MP_IMGFLAG_DRAW_CALLBACK)) |
7537 | 940 { |
941 mp_msg(MSGT_VO, MSGL_DBG3 ,"<vo_directx><INFO>put_image: nothing to do: drawslices\n"); | |
942 return VO_TRUE; | |
943 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
944 |
7537 | 945 if (mpi->flags&MP_IMGFLAG_PLANAR) |
946 { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
947 |
8667 | 948 if(image_format!=IMGFMT_YVU9)draw_slice(mpi->planes,mpi->stride,mpi->w,mpi->h,0,0); |
949 else | |
7537 | 950 { |
951 // copy Y | |
952 d=image+dstride*y+x; | |
953 s=mpi->planes[0]; | |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
954 mem2agpcpy_pic(d,s,w,h,dstride,mpi->stride[0]); |
8519 | 955 w/=4;h/=4;x/=4;y/=4; |
7537 | 956 // copy V |
8519 | 957 d=image+dstride*image_height + dstride*y/4+x; |
8667 | 958 s=mpi->planes[2]; |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
959 mem2agpcpy_pic(d,s,w,h,dstride/4,mpi->stride[1]); |
7537 | 960 // copy U |
8519 | 961 d=image+dstride*image_height + dstride*image_height/16 + dstride/4*y+x; |
8667 | 962 s=mpi->planes[1]; |
19242
8298ac25902e
optimize and simplify memcpy usage, use mem2agpcpy_pic
reimar
parents:
18952
diff
changeset
|
963 mem2agpcpy_pic(d,s,w,h,dstride/4,mpi->stride[2]); |
7537 | 964 } |
965 } | |
966 else //packed | |
967 { | |
27738
c89a913b5d5e
Honour differences between src and dst stride for packed yuv
faust3
parents:
27343
diff
changeset
|
968 mem2agpcpy_pic(image, mpi->planes[0], w * (mpi->bpp / 8), h, dstride, mpi->stride[0]); |
7537 | 969 } |
970 return VO_TRUE; | |
971 } | |
972 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15690
diff
changeset
|
973 static int |
7537 | 974 config(uint32_t width, uint32_t height, uint32_t d_width, uint32_t d_height, uint32_t options, char *title, uint32_t format) |
975 { | |
976 image_format = format; | |
977 image_width = width; | |
978 image_height = height; | |
13438 | 979 if(format != primary_image_format)nooverlay = 0; |
15428
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
980 |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
981 /*release all directx objects*/ |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
982 if (g_cc != NULL)g_cc->lpVtbl->Release(g_cc); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
983 g_cc=NULL; |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
984 if(g_lpddclipper)g_lpddclipper->lpVtbl->Release(g_lpddclipper); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
985 g_lpddclipper=NULL; |
15428
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
986 if (g_lpddsBack != NULL) g_lpddsBack->lpVtbl->Release(g_lpddsBack); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
987 g_lpddsBack = NULL; |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
988 if(vo_doublebuffering) |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
989 if (g_lpddsOverlay != NULL)g_lpddsOverlay->lpVtbl->Release(g_lpddsOverlay); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
990 g_lpddsOverlay = NULL; |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
991 if (g_lpddsPrimary != NULL) g_lpddsPrimary->lpVtbl->Release(g_lpddsPrimary); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
992 g_lpddsPrimary = NULL; |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
993 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>overlay surfaces released\n"); |
3d26652b8d29
multifile leak fixes by Timothy Lee <timothy.lee at siriushk.com> +some more -fixed-vo fixes
faust3
parents:
14692
diff
changeset
|
994 |
33569 | 995 if (!vo_w32_config(d_width, d_height, options)) |
996 return 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
997 |
14207 | 998 if (WinID == -1) |
33569 | 999 SetWindowText(vo_w32_window,title); |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
1000 |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
1001 |
8667 | 1002 /*create the surfaces*/ |
1003 if(Directx_CreatePrimarySurface())return 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1004 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1005 //create palette for 256 color mode |
14400
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1006 if(image_format==IMGFMT_BGR8){ |
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1007 LPDIRECTDRAWPALETTE ddpalette=NULL; |
33593
835841f89315
Use the proper type for the palette, fixes compiler warning.
reimar
parents:
33592
diff
changeset
|
1008 LPPALETTEENTRY palette=calloc(256, sizeof(*palette)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1009 int i; |
14400
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1010 for(i=0; i<256; i++){ |
33593
835841f89315
Use the proper type for the palette, fixes compiler warning.
reimar
parents:
33592
diff
changeset
|
1011 palette[i].peRed = ((i >> 5) & 0x07) * 255 / 7; |
835841f89315
Use the proper type for the palette, fixes compiler warning.
reimar
parents:
33592
diff
changeset
|
1012 palette[i].peGreen = ((i >> 2) & 0x07) * 255 / 7; |
835841f89315
Use the proper type for the palette, fixes compiler warning.
reimar
parents:
33592
diff
changeset
|
1013 palette[i].peBlue = ((i >> 0) & 0x03) * 255 / 3; |
835841f89315
Use the proper type for the palette, fixes compiler warning.
reimar
parents:
33592
diff
changeset
|
1014 palette[i].peFlags = PC_NOCOLLAPSE; |
14400
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1015 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1016 g_lpdd->lpVtbl->CreatePalette(g_lpdd,DDPCAPS_8BIT|DDPCAPS_INITIALIZE,palette,&ddpalette,NULL); |
14400
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1017 g_lpddsPrimary->lpVtbl->SetPalette(g_lpddsPrimary,ddpalette); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1018 free(palette); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1019 ddpalette->lpVtbl->Release(ddpalette); |
14400
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1020 } |
50d99489dfe5
256 color mode support, use -vm to get better output when overlay is not supported
faust3
parents:
14302
diff
changeset
|
1021 |
8667 | 1022 if (!nooverlay && Directx_CreateOverlay(image_format)) |
7537 | 1023 { |
10640
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
1024 if(format == primary_image_format)nooverlay=1; /*overlay creation failed*/ |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
1025 else { |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
1026 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't use overlay mode: please use -vo directx:noaccel\n"); |
01e0d93182f8
fix playback of rgb files when overlay is not disabled
faust3
parents:
9943
diff
changeset
|
1027 return 1; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1028 } |
7537 | 1029 } |
8667 | 1030 if(nooverlay) |
1031 { | |
1032 if(Directx_CreateBackpuffer()) | |
1033 { | |
1034 mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't get the driver to work on your system :(\n"); | |
1035 return 1; | |
1036 } | |
1037 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><INFO>back surface created\n"); | |
1038 vo_doublebuffering = 0; | |
1039 /*create clipper for nonoverlay mode*/ | |
1040 if(g_lpdd->lpVtbl->CreateClipper(g_lpdd, 0, &g_lpddclipper,NULL)!= DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't create clipper\n");return 1;} | |
33569 | 1041 if(g_lpddclipper->lpVtbl->SetHWnd (g_lpddclipper, 0, vo_w32_window)!= DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't associate clipper with window\n");return 1;} |
8667 | 1042 if(g_lpddsPrimary->lpVtbl->SetClipper (g_lpddsPrimary,g_lpddclipper)!=DD_OK){mp_msg(MSGT_VO, MSGL_FATAL,"<vo_directx><FATAL ERROR>can't associate primary surface with clipper\n");return 1;} |
1043 mp_msg(MSGT_VO, MSGL_DBG3,"<vo_directx><INFO>clipper succesfully created\n"); | |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1044 }else{ |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1045 if(DD_OK != g_lpddsOverlay->lpVtbl->QueryInterface(g_lpddsOverlay,&IID_IDirectDrawColorControl,(void**)&g_cc)) |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1046 mp_msg(MSGT_VO, MSGL_V,"<vo_directx><WARN>unable to get DirectDraw ColorControl interface\n"); |
8667 | 1047 } |
12005
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
1048 Directx_ManageDisplay(); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
1049 memset(&ddsdsf, 0,sizeof(DDSURFACEDESC2)); |
a8adfcf47f4e
adapter selection patch by Rune <runner at mail.tele.dk> +first attempt to implement 2 window fullscreenswitching by me
faust3
parents:
11542
diff
changeset
|
1050 ddsdsf.dwSize = sizeof (DDSURFACEDESC2); |
24833 | 1051 if (g_lpddsBack->lpVtbl->Lock(g_lpddsBack,NULL,&ddsdsf, DDLOCK_NOSYSLOCK | DDLOCK_WAIT, NULL) == DD_OK) { |
24835 | 1052 dstride = ddsdsf.lPitch; |
1053 image = ddsdsf.lpSurface; | |
1054 return 0; | |
24833 | 1055 } |
1056 mp_msg(MSGT_VO, MSGL_V, "<vo_directx><ERROR>Initial Lock on the Surface failed.\n"); | |
1057 return 1; | |
7537 | 1058 } |
1059 | |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1060 //function to set color controls |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1061 // brightness [0, 10000] |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1062 // contrast [0, 20000] |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1063 // hue [-180, 180] |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1064 // saturation [0, 20000] |
33592 | 1065 static uint32_t color_ctrl_set(const char *what, int value) |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1066 { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1067 uint32_t r = VO_NOTIMPL; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1068 DDCOLORCONTROL dcc; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1069 //printf("\n*** %s = %d\n", what, value); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1070 if (!g_cc) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1071 //printf("\n *** could not get color control interface!!!\n"); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1072 return VO_NOTIMPL; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1073 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1074 ZeroMemory(&dcc, sizeof(dcc)); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1075 dcc.dwSize = sizeof(dcc); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1076 |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1077 if (!strcmp(what, "brightness")) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1078 dcc.dwFlags = DDCOLOR_BRIGHTNESS; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1079 dcc.lBrightness = (value + 100) * 10000 / 200; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1080 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1081 } else if (!strcmp(what, "contrast")) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1082 dcc.dwFlags = DDCOLOR_CONTRAST; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1083 dcc.lContrast = (value + 100) * 20000 / 200; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1084 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1085 } else if (!strcmp(what, "hue")) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1086 dcc.dwFlags = DDCOLOR_HUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1087 dcc.lHue = value * 180 / 100; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1088 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1089 } else if (!strcmp(what, "saturation")) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1090 dcc.dwFlags = DDCOLOR_SATURATION; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1091 dcc.lSaturation = (value + 100) * 20000 / 200; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1092 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1093 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1094 |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1095 if (r == VO_TRUE) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1096 g_cc->lpVtbl->SetColorControls(g_cc, &dcc); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1097 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1098 return r; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1099 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1100 |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1101 //analoguous to color_ctrl_set |
33592 | 1102 static uint32_t color_ctrl_get(const char *what, int *value) |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1103 { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1104 uint32_t r = VO_NOTIMPL; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1105 DDCOLORCONTROL dcc; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1106 if (!g_cc) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1107 //printf("\n *** could not get color control interface!!!\n"); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1108 return VO_NOTIMPL; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1109 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1110 ZeroMemory(&dcc, sizeof(dcc)); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1111 dcc.dwSize = sizeof(dcc); |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1112 |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1113 if (g_cc->lpVtbl->GetColorControls(g_cc, &dcc) != DD_OK) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1114 return r; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1115 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1116 |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1117 if (!strcmp(what, "brightness") && (dcc.dwFlags & DDCOLOR_BRIGHTNESS)) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1118 *value = dcc.lBrightness * 200 / 10000 - 100; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1119 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1120 } else if (!strcmp(what, "contrast") && (dcc.dwFlags & DDCOLOR_CONTRAST)) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1121 *value = dcc.lContrast * 200 / 20000 - 100; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1122 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1123 } else if (!strcmp(what, "hue") && (dcc.dwFlags & DDCOLOR_HUE)) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1124 *value = dcc.lHue * 100 / 180; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1125 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1126 } else if (!strcmp(what, "saturation") && (dcc.dwFlags & DDCOLOR_SATURATION)) { |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1127 *value = dcc.lSaturation * 200 / 20000 - 100; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1128 r = VO_TRUE; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1129 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1130 // printf("\n*** %s = %d\n", what, *value); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1131 |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1132 return r; |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1133 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1134 |
33305
ddb45e9443ec
Remove the variable arguments from the libvo control() functions.
iive
parents:
33301
diff
changeset
|
1135 static int control(uint32_t request, void *data) |
7537 | 1136 { |
1137 switch (request) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29212
diff
changeset
|
1138 |
7537 | 1139 case VOCTRL_GET_IMAGE: |
1140 return get_image(data); | |
1141 case VOCTRL_QUERY_FORMAT: | |
1142 return query_format(*((uint32_t*)data)); | |
1143 case VOCTRL_DRAW_IMAGE: | |
1144 return put_image(data); | |
16968
e9d849bf8050
add a switch, slave command, and vo control to toggle borderless window.
joey
parents:
16966
diff
changeset
|
1145 case VOCTRL_BORDER: |
33569 | 1146 vo_w32_border(); |
1147 Directx_ManageDisplay(); | |
16968
e9d849bf8050
add a switch, slave command, and vo control to toggle borderless window.
joey
parents:
16966
diff
changeset
|
1148 return VO_TRUE; |
11542 | 1149 case VOCTRL_ONTOP: |
33569 | 1150 vo_w32_ontop(); |
11542 | 1151 return VO_TRUE; |
13091 | 1152 case VOCTRL_ROOTWIN: |
14207 | 1153 if(WinID != -1) return VO_TRUE; |
13091 | 1154 if(vidmode) |
1155 { | |
1156 mp_msg(MSGT_VO, MSGL_ERR,"<vo_directx><ERROR>rootwin has no meaning in exclusive mode\n"); | |
1157 } | |
1158 else | |
1159 { | |
1160 if(vo_rootwin) vo_rootwin = 0; | |
1161 else vo_rootwin = 1; | |
1162 Directx_ManageDisplay(); | |
1163 } | |
1164 return VO_TRUE; | |
7537 | 1165 case VOCTRL_FULLSCREEN: |
1166 { | |
33569 | 1167 vo_w32_fullscreen(); |
1168 Directx_ManageDisplay(); | |
7537 | 1169 return VO_TRUE; |
1170 } | |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1171 case VOCTRL_SET_EQUALIZER: { |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
1172 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
1173 return color_ctrl_set(eq->item, eq->value); |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1174 } |
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1175 case VOCTRL_GET_EQUALIZER: { |
33301
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
1176 vf_equalizer_t *eq=data; |
899d817e56fc
Implement control() VOCTRL_SET/GET_EQUALIZER using a vf_equalize struct,
iive
parents:
32537
diff
changeset
|
1177 return color_ctrl_get(eq->item, &eq->value); |
13736
e4281b5463a4
overlay color control support based on patch by Vitos Laszlo <laca <at> evol.ro>
faust3
parents:
13438
diff
changeset
|
1178 } |
22459
d870e862d272
Simplify config by using code available in video_out.c
reimar
parents:
22289
diff
changeset
|
1179 case VOCTRL_UPDATE_SCREENINFO: |
33569 | 1180 w32_update_xinerama_info(); |
22459
d870e862d272
Simplify config by using code available in video_out.c
reimar
parents:
22289
diff
changeset
|
1181 return VO_TRUE; |
7537 | 1182 }; |
1183 return VO_NOTIMPL; | |
1184 } |