Merge svn changes up to r28712
[mplayer/glamo.git] / libvo / geometry.c
bloba805c147f9c6e5bd7a2a99d79cff8e893b28a2f0
1 /*
2 * copyright (C) 2002 Mark Zealey <mark@zealos.org>
4 * This file is part of MPlayer.
6 * MPlayer is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * MPlayer is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along
17 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 #include <stdio.h>
22 #include <string.h>
23 #include "geometry.h"
24 #include "mp_msg.h"
26 /* A string of the form [WxH][+X+Y] or xpos[%]:ypos[%] */
27 char *vo_geometry = NULL;
28 // set when either width or height is changed
29 int geometry_wh_changed = 0;
30 int geometry_xy_changed = 0;
32 #define RESET_GEOMETRY width = height = xoff = yoff = xper = yper = -1;
34 // xpos,ypos: position of the left upper corner
35 // widw,widh: width and height of the window
36 // scrw,scrh: width and height of the current screen
37 int geometry(int *xpos, int *ypos, int *widw, int *widh, int scrw, int scrh)
39 int width, height, xoff, yoff, xper, yper;
41 width = height = xoff = yoff = xper = yper = -1;
43 if(vo_geometry != NULL) {
44 if(sscanf(vo_geometry, "%ix%i+%i+%i", &width, &height, &xoff, &yoff) != 4 )
46 RESET_GEOMETRY
47 if(sscanf(vo_geometry, "%ix%i", &width, &height) != 2)
49 RESET_GEOMETRY
50 if(sscanf(vo_geometry, "+%i+%i", &xoff, &yoff) != 2)
52 char percent[2];
53 RESET_GEOMETRY
54 if(sscanf(vo_geometry, "%i%%:%i%1[%]", &xper, &yper, percent) != 3)
56 RESET_GEOMETRY
57 if(sscanf(vo_geometry, "%i:%i%1[%]", &xoff, &yper, percent) != 3)
59 RESET_GEOMETRY
60 if(sscanf(vo_geometry, "%i%%:%i", &xper, &yoff) != 2)
62 RESET_GEOMETRY
63 if(sscanf(vo_geometry, "%i:%i", &xoff, &yoff) != 2)
65 RESET_GEOMETRY
66 if(sscanf(vo_geometry, "%i%1[%]", &xper, percent) != 2)
68 mp_msg(MSGT_VO, MSGL_ERR,
69 "-geometry must be in [WxH][+X+Y] | [X[%%]:[Y[%%]]] format, incorrect (%s)\n", vo_geometry);
70 return 0;
80 mp_msg(MSGT_VO, MSGL_V,"geometry set to width: %i,"
81 "height: %i, xoff: %i, yoff: %i, xper: %i, yper: %i\n",
82 width, height, xoff, yoff, xper, yper);
84 if(xper >= 0 && xper <= 100) xoff = (scrw - *widw) * ((float)xper / 100.0);
85 if(yper >= 0 && yper <= 100) yoff = (scrh - *widh) * ((float)yper / 100.0);
87 mp_msg(MSGT_VO, MSGL_V,"geometry set to width: %i,"
88 "height: %i, xoff: %i, yoff: %i, xper: %i, yper: %i\n",
89 width, height, xoff, yoff, xper, yper);
90 mp_msg(MSGT_VO, MSGL_V,"geometry window parameter: widw: %i,"
91 " widh: %i, scrw: %i, scrh: %i\n",*widw, *widh, scrw, scrh);
93 /* FIXME: better checking of bounds... */
94 if( width != -1 && (width < 0 || width > scrw))
95 width = (scrw < *widw) ? scrw : *widw;
96 if( height != -1 && (height < 0 || height > scrh))
97 height = (scrh < *widh) ? scrh : *widh;
98 if(xoff != -1 && (xoff < 0 || xoff + width > scrw)) xoff = 0;
99 if(yoff != -1 && (yoff < 0 || yoff + height > scrh)) yoff = 0;
101 if(xoff != -1 && xpos) *xpos = xoff;
102 if(yoff != -1 && ypos) *ypos = yoff;
103 if(width != -1 && widw) *widw = width;
104 if(height != -1 && widh) *widh = height;
106 if( width != -1 || height != -1)
107 geometry_wh_changed = 1;
108 if( xoff != -1 || yoff != -1)
109 geometry_xy_changed = 1;
111 return 1;
114 #undef RESET_GEOMETRY