diff libvo/geometry.c @ 7866:732a8bfc7681

Added the -geometry option (supports fbdev and tdfxfb drivers)
author mark
date Wed, 23 Oct 2002 16:52:54 +0000
parents
children 9fc45fe0d444
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libvo/geometry.c	Wed Oct 23 16:52:54 2002 +0000
@@ -0,0 +1,80 @@
+/* This file (C) Mark Zealey <mark@zealos.org> 2002, released under GPL */
+
+#include "geometry.h"
+#include "../mp_msg.h"
+#include <string.h>
+
+/* A string of the form xpos[%]:ypos[%] */
+char *vo_geometry = NULL;
+
+int geometry_error()
+{
+	mp_msg(MSGT_VO, MSGL_ERR, "-geometry option format incorrect (%s)\n", vo_geometry);
+	exit_player(NULL);		/* ????? what else could we do ? */
+	return 0;
+}
+
+int get_num(char *s, int *num, char *end)
+{
+	char *e;
+	long int t;
+
+	t = strtol(s, &e, 10);
+
+	if(e != end)
+		return 0;
+
+	*num = t;
+	return 1;
+}
+
+int geometry(int *xpos, int *ypos, int scrw, int scrh, int vidw, int vidh, int fs)
+{
+	int xper = 0, yper = 0;
+	int glen;
+	char *colpos;
+
+	*xpos = 0; *ypos = 0;
+
+	if(vo_geometry == NULL)
+		return 1;
+
+	glen = strlen(vo_geometry);
+	colpos = strchr(vo_geometry, ':');
+	if(colpos == NULL)
+		colpos = (char *)(vo_geometry + glen);
+
+	/* Parse the x bit */
+	if(colpos[-1] == '%') {
+		if(!get_num(vo_geometry, &xper, colpos - 1))
+			return geometry_error();
+	} else {
+		if(!get_num(vo_geometry, xpos, colpos))
+			return geometry_error();
+	}
+
+	if(*colpos != '\0')
+		if(vo_geometry[glen - 1] == '%') {
+			if(!get_num(colpos + 1, &yper, vo_geometry + glen - 1))
+				return geometry_error();
+		} else {
+			if(!get_num(colpos + 1, ypos, vo_geometry + glen))
+				return geometry_error();
+		}
+
+	if(xper)
+		*xpos = (scrw - vidw) * ((float)xper / 100.0);
+	if(yper)
+		*ypos = (scrh - vidh) * ((float)yper / 100.0);
+
+	if(*xpos + vidw > scrw) {
+		mp_msg(MSGT_VO, MSGL_ERR, "X position is too large\n");
+		return geometry_error();
+	}
+	if(*ypos + vidh > scrh) {
+		mp_msg(MSGT_VO, MSGL_ERR, "Y position is too large\n");
+		return geometry_error();
+	}
+
+	return 1;
+}