diff options
Diffstat (limited to 'hw/xgl/xglparse.c')
-rw-r--r-- | hw/xgl/xglparse.c | 138 |
1 files changed, 115 insertions, 23 deletions
diff --git a/hw/xgl/xglparse.c b/hw/xgl/xglparse.c index c1f7e6527..5292692a4 100644 --- a/hw/xgl/xglparse.c +++ b/hw/xgl/xglparse.c @@ -1,6 +1,6 @@ /* * Copyright © 2004 David Reveman - * + * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without * fee, provided that the above copyright notice appear in all copies @@ -12,11 +12,11 @@ * software for any purpose. It is provided "as is" without express or * implied warranty. * - * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * DAVID REVEMAN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN * NO EVENT SHALL DAVID REVEMAN BE LIABLE FOR ANY SPECIAL, INDIRECT OR * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS - * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * @@ -33,13 +33,13 @@ xglParseFindNext (char *cur, { while (*cur && !strchr (delim, *cur)) *save++ = *cur++; - + *save = 0; *last = *cur; - + if (*cur) cur++; - + return cur; } @@ -57,28 +57,28 @@ xglParseScreen (char *arg) if (!arg) return; - + if (strlen (arg) >= sizeof (save)) return; - + for (i = 0; i < 2; i++) { - arg = xglParseFindNext (arg, "x/@XY", save, &delim); + arg = xglParseFindNext (arg, "x/", save, &delim); if (!save[0]) return; - + pixels = atoi (save); mm = 0; - + if (delim == '/') { - arg = xglParseFindNext (arg, "x@XY", save, &delim); + arg = xglParseFindNext (arg, "x", save, &delim); if (!save[0]) return; - + mm = atoi (save); } - + if (i == 0) { xglScreenInfo.width = pixels; @@ -89,12 +89,98 @@ xglParseScreen (char *arg) xglScreenInfo.height = pixels; xglScreenInfo.heightMm = mm; } - + if (delim != 'x') return; } } +static void +xglParseAccel (char *arg) +{ + xglAccelInfoPtr pAccel; + char delim; + char save[1024]; + + if (!arg) + return; + + if (strlen (arg) >= sizeof (save)) + return; + + arg = xglParseFindNext (arg, "@:", save, &delim); + if (!save[0]) + return; + + if (strcasecmp (save, "pixmap") == 0) + pAccel = &xglScreenInfo.accel.pixmap; + else if (strcasecmp (save, "window") == 0) + pAccel = &xglScreenInfo.accel.window; + else if (strcasecmp (save, "glx") == 0) + pAccel = &xglScreenInfo.accel.glx; + else if (strcasecmp (save, "xv") == 0) + pAccel = &xglScreenInfo.accel.xv; + else + return; + + if (delim == '@') + { + arg = xglParseFindNext (arg, "/x:", save, &delim); + if (!save[0]) + return; + + pAccel->size.aboveWidth = pAccel->size.minWidth = atoi (save); + + if (delim == '/') + { + arg = xglParseFindNext (arg, "x:", save, &delim); + if (!save[0]) + return; + + pAccel->size.aboveWidth = atoi (save); + } + + if (delim == 'x') + { + arg = xglParseFindNext (arg, "/:", save, &delim); + if (!save[0]) + return; + + pAccel->size.aboveHeight = pAccel->size.minHeight = atoi (save); + + if (delim == '/') + { + arg = xglParseFindNext (arg, ":", save, &delim); + if (!save[0]) + return; + + pAccel->size.aboveHeight = atoi (save); + } + } + } + + pAccel->enabled = TRUE; + pAccel->pbuffer = FALSE; + + if (delim == ':') + { + if (strcasecmp (arg, "fbo") == 0) + ; + else if (strcasecmp (arg, "off") == 0 || + strncasecmp (arg, "0", 1) == 0 || + strncasecmp (arg, "f", 1) == 0 || + strncasecmp (arg, "n", 1) == 0) + { + pAccel->enabled = FALSE; + pAccel->pbuffer = FALSE; + } + else if (strcasecmp (arg, "pbuffer") == 0) + { + pAccel->pbuffer = TRUE; + } + } +} + void xglUseMsg (void) { @@ -106,8 +192,8 @@ xglUseMsg (void) "use vertex buffer objects for streaming of vertex data\n"); ErrorF ("-pbomask [1|4|8|16|32] " "set bpp's to use with pixel buffer objects\n"); - ErrorF ("-fbo " - "use frame buffer objects for accelerate offscreen drawing\n"); + ErrorF ("-accel TYPE[@WIDTH[/MIN]xHEIGHT[/MIN]][:METHOD] " + "offscreen acceleration\n"); } int @@ -126,7 +212,7 @@ xglProcessArgument (int argc, } else return 1; - + return 2; } else if (!strcmp (argv[i], "-yinverted")) @@ -152,14 +238,20 @@ xglProcessArgument (int argc, } else return 1; - + return 2; } - else if (!strcmp (argv[i], "-fbo")) + else if (!strcmp (argv[i], "-accel")) { - xglScreenInfo.fbo = TRUE; - return 1; + if ((i + 1) < argc) + { + xglParseAccel (argv[i + 1]); + } + else + return 1; + + return 2; } - + return 0; } |