Mercurial > mplayer.hg
annotate libvo/vo_xmga.c @ 25317:7f3cb5408f28
Fixed VIDIX color bug that was introduced when Radeon VIDIX driver
was synchronized with vidix.sf.net.
The red color was saturating.
Corrected value fixes the issue and restore the color to the level
it used to have before synchronization.
Meaning of the value remains unknow but was retrieved from
register's value of a Radeon 9000 card, so it may need further testing.
Patch by Guillaume Lecerf (foxcore at gmail dot com)
author | ben |
---|---|
date | Mon, 10 Dec 2007 19:27:46 +0000 |
parents | c9e9ac2008c2 |
children | afa125da85cf |
rev | line source |
---|---|
100 | 1 |
2 //#define SHOW_TIME | |
1 | 3 |
4 /* | |
7680 | 5 * vo_xmga.c |
1 | 6 * |
7 * Copyright (C) Zoltan Ponekker - Jan 2001 | |
8 * | |
9 */ | |
10 | |
11 #include <stdio.h> | |
12 #include <stdlib.h> | |
13 #include <string.h> | |
14 | |
15 #include "config.h" | |
6296 | 16 |
1 | 17 #include "video_out.h" |
18 #include "video_out_internal.h" | |
19 | |
20 | |
21 #include <sys/ioctl.h> | |
22 #include <unistd.h> | |
23 #include <fcntl.h> | |
24 #include <sys/mman.h> | |
25 | |
26 #include "drivers/mga_vid.h" | |
27 | |
28 #include <X11/Xlib.h> | |
29 #include <X11/Xutil.h> | |
30 #include <errno.h> | |
31 | |
4017 | 32 #ifdef HAVE_XINERAMA |
33 #include <X11/extensions/Xinerama.h> | |
34 #endif | |
35 | |
31 | 36 #include "x11_common.h" |
616 | 37 #include "sub.h" |
2057 | 38 #include "aspect.h" |
31 | 39 |
182 | 40 #ifdef SHOW_TIME |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
41 #include "osdep/timer.h" |
12582 | 42 static unsigned int timer = 0; |
43 static unsigned int timerd = 0; | |
100 | 44 #endif |
45 | |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
46 #ifdef HAVE_NEW_GUI |
23077 | 47 #include "gui/interface.h" |
5955
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
48 #endif |
caac20b1ca79
fix xmga fs, resize to movie size and mouse auto hide + dga
pontscho
parents:
5945
diff
changeset
|
49 |
25216 | 50 static const vo_info_t info = { |
12582 | 51 "Matrox G200/G4x0/G550 overlay in X11 window (using /dev/mga_vid)", |
52 "xmga", | |
53 "Zoltan Ponekker <pontscho@makacs.poliod.hu>", | |
54 "" | |
1 | 55 }; |
56 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
57 const LIBVO_EXTERN(xmga) |
12582 | 58 static XGCValues wGCV; |
8148
5b39e79af5fe
removed get_info, using the same sheme as in libmpcodecs instead
alex
parents:
8017
diff
changeset
|
59 |
12582 | 60 static uint32_t mDepth; |
61 static XWindowAttributes attribs; | |
10988 | 62 static int colorkey; |
1 | 63 |
12582 | 64 static uint32_t mvHeight; |
65 static uint32_t mvWidth; | |
1 | 66 |
12582 | 67 static Window mRoot; |
1 | 68 |
12582 | 69 static XSetWindowAttributes xWAttribs; |
1 | 70 |
12582 | 71 static int inited = 0; |
6311
da2dda48b7ec
add mute support ( step 1 ) and fixed panscan bugs (1000l for me)
pontscho
parents:
6307
diff
changeset
|
72 |
4981 | 73 #define VO_XMGA |
1 | 74 #include "mga_common.c" |
4981 | 75 #undef VO_XMGA |
1 | 76 |
12582 | 77 static void mDrawColorKey(void) |
1 | 78 { |
12582 | 79 XSetBackground(mDisplay, vo_gc, 0); |
80 XClearWindow(mDisplay, vo_window); | |
81 XSetForeground(mDisplay, vo_gc, colorkey); | |
82 XFillRectangle(mDisplay, vo_window, vo_gc, drwX, drwY, drwWidth, | |
83 (vo_fs ? drwHeight - 1 : drwHeight)); | |
84 XFlush(mDisplay); | |
1 | 85 } |
86 | |
31 | 87 static void check_events(void) |
1 | 88 { |
12582 | 89 int e = vo_x11_check_events(mDisplay); |
90 | |
91 if (!(e & VO_EVENT_RESIZE) && !(e & VO_EVENT_EXPOSE)) | |
92 return; | |
93 set_window(); | |
94 mDrawColorKey(); | |
95 if (ioctl(f, MGA_VID_CONFIG, &mga_vid_config)) | |
96 mp_msg(MSGT_VO, MSGL_WARN, | |
97 "Error in mga_vid_config ioctl (wrong mga_vid.o version?)"); | |
1 | 98 } |
99 | |
12582 | 100 static void flip_page(void) |
101 { | |
182 | 102 #ifdef SHOW_TIME |
100 | 103 unsigned int t; |
12582 | 104 |
105 t = GetTimer(); | |
106 mp_msg(MSGT_VO, MSGL_STATUS, | |
107 " [timer: %08X diff: %6d dd: %6d ] \n", t, t - timer, | |
108 (t - timer) - timerd); | |
109 timerd = t - timer; | |
110 timer = t; | |
182 | 111 #endif |
100 | 112 |
12582 | 113 vo_mga_flip_page(); |
31 | 114 } |
1 | 115 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
116 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 117 uint32_t d_height, uint32_t flags, char *title, |
118 uint32_t format) | |
1 | 119 { |
12582 | 120 XVisualInfo vinfo; |
121 unsigned long xswamask; | |
122 int r, g, b; | |
123 | |
124 if (mga_init(width, height, format)) | |
125 return -1; // ioctl errors? | |
1 | 126 |
12582 | 127 aspect_save_orig(width, height); |
128 aspect_save_prescale(d_width, d_height); | |
18116 | 129 update_xinerama_info(); |
12582 | 130 |
131 mvWidth = width; | |
132 mvHeight = height; | |
1 | 133 |
12582 | 134 vo_panscan_x = vo_panscan_y = vo_panscan_amount = 0; |
2249
48f0ac1e9d13
Update to new (cleaner, more bugfree, better) aspect api. vo_gl vo_gl2 and vo_xmga are untested!
atmos4
parents:
2057
diff
changeset
|
135 |
18509
94965d83e2b6
do aspect correction of video size before calculating vo_dx and vo_dy.
reimar
parents:
18116
diff
changeset
|
136 aspect(&d_width, &d_height, A_NOZOOM); |
12582 | 137 vo_dx = (vo_screenwidth - d_width) / 2; |
138 vo_dy = (vo_screenheight - d_height) / 2; | |
139 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, | |
140 vo_screenheight); | |
18116 | 141 vo_dx += xinerama_x; |
142 vo_dy += xinerama_y; | |
12582 | 143 vo_dwidth = d_width; |
144 vo_dheight = d_height; | |
145 vo_mouse_autohide = 1; | |
6307 | 146 |
12582 | 147 r = (vo_colorkey & 0x00ff0000) >> 16; |
148 g = (vo_colorkey & 0x0000ff00) >> 8; | |
149 b = vo_colorkey & 0x000000ff; | |
150 switch (vo_depthonscreen) | |
151 { | |
152 case 32: | |
153 colorkey = vo_colorkey; | |
154 break; | |
155 case 24: | |
156 colorkey = vo_colorkey & 0x00ffffff; | |
157 break; | |
158 case 16: | |
159 colorkey = ((r >> 3) << 11) | ((g >> 2) << 5) | (b >> 3); | |
160 break; | |
161 case 15: | |
162 colorkey = ((r >> 3) << 10) | ((g >> 3) << 5) | (b >> 3); | |
163 break; | |
164 default: | |
165 mp_msg(MSGT_VO, MSGL_ERR, | |
166 "Sorry, this (%d) color depth not supported.\n", | |
167 vo_depthonscreen); | |
168 return -1; | |
169 } | |
13946 | 170 mp_msg(MSGT_VO, MSGL_V, "Using colorkey: %x\n", colorkey); |
1 | 171 |
12582 | 172 inited = 1; |
1 | 173 |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1637
diff
changeset
|
174 #ifdef HAVE_NEW_GUI |
12582 | 175 if (use_gui) |
176 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
177 else | |
5985 | 178 #endif |
12582 | 179 { |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13946
diff
changeset
|
180 if (flags & VOFLAG_FULLSCREEN) |
12582 | 181 aspect(&dwidth, &dheight, A_ZOOM); |
723 | 182 |
12582 | 183 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
184 mDepth = attribs.depth; | |
185 if (mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32) | |
186 mDepth = 24; | |
187 XMatchVisualInfo(mDisplay, mScreen, mDepth, TrueColor, &vinfo); | |
188 xWAttribs.colormap = | |
189 XCreateColormap(mDisplay, mRootWin, vinfo.visual, AllocNone); | |
190 xWAttribs.background_pixel = 0; | |
191 xWAttribs.border_pixel = 0; | |
192 xWAttribs.event_mask = | |
193 StructureNotifyMask | ExposureMask | KeyPressMask | | |
194 ((WinID == | |
195 0) ? 0 : (ButtonPressMask | ButtonReleaseMask | | |
196 PointerMotionMask | PropertyChangeMask)); | |
197 xswamask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; | |
198 | |
199 if (WinID >= 0) | |
200 { | |
1 | 201 |
12582 | 202 vo_window = WinID ? ((Window) WinID) : mRootWin; |
203 if (WinID) | |
204 { | |
205 XUnmapWindow(mDisplay, vo_window); | |
206 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
207 &xWAttribs); | |
208 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
209 StructureNotifyMask | | |
210 KeyPressMask | | |
211 PropertyChangeMask | | |
212 PointerMotionMask | | |
213 ButtonPressMask | | |
214 ButtonReleaseMask | | |
215 ExposureMask); | |
15540 | 216 XMapWindow(mDisplay, vo_window); |
12582 | 217 } else |
218 XSelectInput(mDisplay, vo_window, ExposureMask); | |
219 | |
220 } else | |
221 { | |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23077
diff
changeset
|
222 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, |
23822 | 223 flags, xWAttribs.colormap, "xmga", title); |
24348
f96e42d494f9
Fix borders for xmga broken by r23675. Tested by Diego.
reimar
parents:
23822
diff
changeset
|
224 XChangeWindowAttributes(mDisplay, vo_window, xswamask, &xWAttribs); |
12582 | 225 } |
7679 | 226 |
12582 | 227 if (vo_gc != None) |
228 XFreeGC(mDisplay, vo_gc); | |
229 vo_gc = XCreateGC(mDisplay, vo_window, GCForeground, &wGCV); | |
7679 | 230 |
12582 | 231 } // !GUI |
7679 | 232 |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13946
diff
changeset
|
233 if ((flags & VOFLAG_FULLSCREEN) && (!WinID)) |
12582 | 234 { |
235 vo_dx = 0; | |
236 vo_dy = 0; | |
237 vo_dwidth = vo_screenwidth; | |
238 vo_dheight = vo_screenheight; | |
239 vo_fs = 1; | |
240 } | |
7679 | 241 |
12582 | 242 panscan_calc(); |
6755 | 243 |
12582 | 244 mga_vid_config.colkey_on = 1; |
245 mga_vid_config.colkey_red = r; | |
246 mga_vid_config.colkey_green = g; | |
247 mga_vid_config.colkey_blue = b; | |
248 | |
249 set_window(); // set up mga_vid_config.dest_width etc | |
250 | |
251 if (vo_ontop) | |
252 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
6755 | 253 |
12582 | 254 XSync(mDisplay, False); |
255 | |
256 ioctl(f, MGA_VID_ON, 0); | |
257 | |
258 return 0; | |
1 | 259 } |
260 | |
12582 | 261 static void uninit(void) |
262 { | |
263 mp_msg(MSGT_VO, MSGL_V, "vo: uninit!\n"); | |
264 mga_uninit(); | |
265 if (!inited) | |
266 return; // no window? | |
267 inited = 0; | |
268 vo_x11_uninit(); // destroy the window | |
1 | 269 } |