Mercurial > mplayer.hg
annotate libvo/geometry.c @ 31597:1eb8dc8f96fa
Make subdelay handling work the same way for all subtitle types and also allow
changing subtitle delay to work better with vobsubs.
This probably breaks vobsub behaviour with timestamp wrapping though.
author | reimar |
---|---|
date | Sat, 10 Jul 2010 12:53:05 +0000 |
parents | eff096c1ea0a |
children | 8528f4b70dff |
rev | line source |
---|---|
27509
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
1 /* |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
2 * copyright (C) 2002 Mark Zealey <mark@zealos.org> |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
3 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
4 * This file is part of MPlayer. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
5 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
6 * MPlayer is free software; you can redistribute it and/or modify |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
7 * it under the terms of the GNU General Public License as published by |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
8 * the Free Software Foundation; either version 2 of the License, or |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
9 * (at your option) any later version. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
10 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
11 * MPlayer is distributed in the hope that it will be useful, |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
14 * GNU General Public License for more details. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
15 * |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
16 * You should have received a copy of the GNU General Public License along |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
17 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
d97a607821f1
Replace casual GPL notices by proper license headers.
diego
parents:
15058
diff
changeset
|
19 */ |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
20 |
9217
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8768
diff
changeset
|
21 #include <stdio.h> |
420e2b2f8e5a
compiler warning fixes patch by Dominik Mierzejewski <dominik@rangers.eu.org>
arpi
parents:
8768
diff
changeset
|
22 #include <string.h> |
29073
a5f19a8ecc86
Get rid of nonsensical limits on -geometry x, y,w and h values, they only
reimar
parents:
27509
diff
changeset
|
23 #include <limits.h> |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
24 #include "geometry.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
11996
diff
changeset
|
25 #include "mp_msg.h" |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
26 |
8745
93f78fb709e6
Added support for X style -geometry options (adapted from Henk's patch)
mark
parents:
8254
diff
changeset
|
27 /* A string of the form [WxH][+X+Y] or xpos[%]:ypos[%] */ |
30450
201c9a709547
Remove pointless initializers and also set geometry_*_changed to 0 when
reimar
parents:
29350
diff
changeset
|
28 char *vo_geometry; |
11125 | 29 // set when either width or height is changed |
30450
201c9a709547
Remove pointless initializers and also set geometry_*_changed to 0 when
reimar
parents:
29350
diff
changeset
|
30 int geometry_wh_changed; |
201c9a709547
Remove pointless initializers and also set geometry_*_changed to 0 when
reimar
parents:
29350
diff
changeset
|
31 int geometry_xy_changed; |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
32 |
9517 | 33 // xpos,ypos: position of the left upper corner |
34 // widw,widh: width and height of the window | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29073
diff
changeset
|
35 // scrw,scrh: width and height of the current screen |
9517 | 36 int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh) |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
37 { |
8745
93f78fb709e6
Added support for X style -geometry options (adapted from Henk's patch)
mark
parents:
8254
diff
changeset
|
38 if(vo_geometry != NULL) { |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
39 char xsign[2], ysign[2], dummy[2]; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
40 int width, height, xoff, yoff, xper, yper; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
41 int i; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
42 int ok = 0; |
31252
eff096c1ea0a
Add support for -geometry x syntax since the documentation claims
reimar
parents:
31236
diff
changeset
|
43 for (i = 0; !ok && i < 9; i++) { |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
44 width = height = xoff = yoff = xper = yper = INT_MIN; |
30780
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
45 strcpy(xsign, "+"); |
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
46 strcpy(ysign, "+"); |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
47 switch (i) { |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
48 case 0: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
49 ok = sscanf(vo_geometry, "%ix%i%1[+-]%i%1[+-]%i%c", |
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
50 &width, &height, xsign, &xoff, ysign, |
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
51 &yoff, dummy) == 6; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
52 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
53 case 1: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
54 ok = sscanf(vo_geometry, "%ix%i%c", &width, &height, dummy) == 2; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
55 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
56 case 2: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
57 ok = sscanf(vo_geometry, "%1[+-]%i%1[+-]%i%c", |
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
58 xsign, &xoff, ysign, &yoff, dummy) == 4; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
59 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
60 case 3: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
61 ok = sscanf(vo_geometry, "%i%%:%i%1[%]%c", &xper, &yper, dummy, dummy) == 3; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
62 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
63 case 4: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
64 ok = sscanf(vo_geometry, "%i:%i%1[%]%c", &xoff, &yper, dummy, dummy) == 3; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
65 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
66 case 5: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
67 ok = sscanf(vo_geometry, "%i%%:%i%c", &xper, &yoff, dummy) == 2; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
68 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
69 case 6: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
70 ok = sscanf(vo_geometry, "%i:%i%c", &xoff, &yoff, dummy) == 2; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
71 break; |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
72 case 7: |
31236
08ce2830d10c
Extend geometry parsing to reject all invalid strings.
reimar
parents:
30781
diff
changeset
|
73 ok = sscanf(vo_geometry, "%i%1[%]%c", &xper, dummy, dummy) == 2; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
74 break; |
31252
eff096c1ea0a
Add support for -geometry x syntax since the documentation claims
reimar
parents:
31236
diff
changeset
|
75 case 8: |
eff096c1ea0a
Add support for -geometry x syntax since the documentation claims
reimar
parents:
31236
diff
changeset
|
76 ok = sscanf(vo_geometry, "%i%c", &xoff, dummy) == 1; |
eff096c1ea0a
Add support for -geometry x syntax since the documentation claims
reimar
parents:
31236
diff
changeset
|
77 break; |
30778
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
78 } |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
79 } |
dc08ce042315
Avoid very deep indentation level and RESET_GEOMETRY macro in -geometry
reimar
parents:
30450
diff
changeset
|
80 if (!ok) { |
10734 | 81 mp_msg(MSGT_VO, MSGL_ERR, |
30780
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
82 "-geometry must be in [WxH][[+-]X[+-]Y] | [X[%%]:[Y[%%]]] format, incorrect (%s)\n", vo_geometry); |
10734 | 83 return 0; |
84 } | |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
85 |
30781
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
86 mp_msg(MSGT_VO, MSGL_V,"geometry window parameter: widw: %i," |
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
87 " widh: %i, scrw: %i, scrh: %i\n",*widw, *widh, scrw, scrh); |
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
88 |
9517 | 89 mp_msg(MSGT_VO, MSGL_V,"geometry set to width: %i," |
30780
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
90 "height: %i, xoff: %s%i, yoff: %s%i, xper: %i, yper: %i\n", |
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
91 width, height, xsign, xoff, ysign, yoff, xper, yper); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29073
diff
changeset
|
92 |
30781
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
93 if (width > 0 && widw) *widw = width; |
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
94 if (height > 0 && widh) *widh = height; |
1b4d24af52a7
Save the new width and height earlier so that e.g. -geometry 30x30-50-50
reimar
parents:
30780
diff
changeset
|
95 |
30780
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
96 if(xoff != INT_MIN && xsign[0] == '-') xoff = scrw - *widw - xoff; |
0ab92d0c1901
Add support for specifying window position relative to right and bottom
reimar
parents:
30779
diff
changeset
|
97 if(yoff != INT_MIN && ysign[0] == '-') yoff = scrh - *widh - yoff; |
9517 | 98 if(xper >= 0 && xper <= 100) xoff = (scrw - *widw) * ((float)xper / 100.0); |
99 if(yper >= 0 && yper <= 100) yoff = (scrh - *widh) * ((float)yper / 100.0); | |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
100 |
9947 | 101 mp_msg(MSGT_VO, MSGL_V,"geometry set to width: %i," |
102 "height: %i, xoff: %i, yoff: %i, xper: %i, yper: %i\n", | |
103 width, height, xoff, yoff, xper, yper); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
29073
diff
changeset
|
104 |
29073
a5f19a8ecc86
Get rid of nonsensical limits on -geometry x, y,w and h values, they only
reimar
parents:
27509
diff
changeset
|
105 if (xoff != INT_MIN && xpos) *xpos = xoff; |
a5f19a8ecc86
Get rid of nonsensical limits on -geometry x, y,w and h values, they only
reimar
parents:
27509
diff
changeset
|
106 if (yoff != INT_MIN && ypos) *ypos = yoff; |
8745
93f78fb709e6
Added support for X style -geometry options (adapted from Henk's patch)
mark
parents:
8254
diff
changeset
|
107 |
30450
201c9a709547
Remove pointless initializers and also set geometry_*_changed to 0 when
reimar
parents:
29350
diff
changeset
|
108 geometry_wh_changed = width > 0 || height > 0; |
201c9a709547
Remove pointless initializers and also set geometry_*_changed to 0 when
reimar
parents:
29350
diff
changeset
|
109 geometry_xy_changed = xoff != INT_MIN || yoff != INT_MIN; |
8767 | 110 } |
7866
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
111 return 1; |
732a8bfc7681
Added the -geometry option (supports fbdev and tdfxfb drivers)
mark
parents:
diff
changeset
|
112 } |