annotate libvo/vo_directx.c @ 37058:a6b7e61e4af1

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