use offscreen blitting when SDL_DOUBLEBUF is not set
[sdl_omap.git] / src / video / omapdss / config.c
1 /*
2  * (C) GraÅžvydas "notaz" Ignotas, 2010
3  *
4  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
5  * See the COPYING file in the top-level directory.
6  */
7
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <strings.h>
12 #include <ctype.h>
13
14 #include "osdl.h"
15
16 static char *sskip(char *p)
17 {
18         while (*p && isspace(*p))
19                 p++;
20         return p;
21 }
22
23 static char *nsskip(char *p)
24 {
25         while (*p && !isspace(*p))
26                 p++;
27         return p;
28 }
29
30 static int check_token(char **p_, const char *token)
31 {
32         char *p = *p_;
33         int tlen = strlen(token);
34         int ret = strncasecmp(p, token, tlen) == 0 && isspace(p[tlen]);
35         if (ret)
36                 *p_ = sskip(p + tlen + 1);
37
38         return ret;
39 }
40
41 static int check_token_eq(char **p_, const char *token)
42 {
43         char *p = *p_;
44         int ret = check_token(&p, token);
45         ret = ret && *p == '=';
46         if (ret)
47                 *p_ = sskip(p + 1);
48
49         return ret;
50 }
51
52 void omapsdl_config(struct SDL_PrivateVideoData *pdata)
53 {
54         char buff[256];
55         FILE *f;
56
57         f = fopen("omapsdl.cfg", "r");
58         if (f == NULL)
59                 return;
60
61         while (!feof(f)) {
62                 char *p, *line = fgets(buff, sizeof(buff), f);
63                 if (line == NULL)
64                         break;
65                 p = line = sskip(line);
66                 if (*p == 0 || *p == '#')
67                         continue;
68
69                 if (check_token(&p, "bind")) {
70                         char *key, *key_end, *sdlkey, *sdlkey_end;
71                         key = p;
72                         key_end = nsskip(key);
73                         p = sskip(key_end);
74                         if (*p != '=')
75                                 goto bad;
76                         sdlkey = sskip(p + 1);
77                         sdlkey_end = nsskip(sdlkey);
78                         p = sskip(sdlkey_end);
79                         if (*key == 0 || *sdlkey == 0 || *p != 0)
80                                 goto bad;
81                         *key_end = *sdlkey_end = 0;
82
83                         omapsdl_input_bind(key, sdlkey);
84                         continue;
85                 }
86                 else if (check_token_eq(&p, "force_vsync")) {
87                         pdata->cfg_force_vsync = !!strtol(p, NULL, 0);
88                         continue;
89                 }
90                 else if (check_token_eq(&p, "force_doublebuf")) {
91                         pdata->cfg_force_doublebuf = !!strtol(p, NULL, 0);
92                         continue;
93                 }
94                 else if (check_token_eq(&p, "force_directbuf")) {
95                         pdata->cfg_force_directbuf = !!strtol(p, NULL, 0);
96                         continue;
97                 }
98                 else if (check_token_eq(&p, "no_ts_translate")) {
99                         pdata->cfg_no_ts_translate = !!strtol(p, NULL, 0);
100                         continue;
101                 }
102                 else if (check_token_eq(&p, "ts_force_tslib")) {
103                         pdata->cfg_ts_force_tslib = !!strtol(p, NULL, 0);
104                         continue;
105                 }
106
107 bad:
108                 err("config: failed to parse: %s", line);
109         }
110         fclose(f);
111 }
112
113 void omapsdl_config_from_env(struct SDL_PrivateVideoData *pdata)
114 {
115         const char *tmp;
116
117         tmp = getenv("SDL_OMAP_VSYNC");
118         if (tmp != NULL)
119                 pdata->cfg_force_vsync = !!strtol(tmp, NULL, 0);
120         tmp = getenv("SDL_OMAP_FORCE_DOUBLEBUF");
121         if (tmp != NULL)
122                 pdata->cfg_force_doublebuf = !!strtol(tmp, NULL, 0);
123         tmp = getenv("SDL_OMAP_FORCE_DIRECTBUF");
124         if (tmp != NULL)
125                 pdata->cfg_force_directbuf = !!strtol(tmp, NULL, 0);
126         tmp = getenv("SDL_OMAP_NO_TS_TRANSLATE");
127         if (tmp != NULL)
128                 pdata->cfg_no_ts_translate = !!strtol(tmp, NULL, 0);
129         tmp = getenv("SDL_OMAP_TS_FORCE_TSLIB");
130         if (tmp != NULL)
131                 pdata->cfg_ts_force_tslib = !!strtol(tmp, NULL, 0);
132         tmp = getenv("SDL_OMAP_BORDER_CUT");
133         if (tmp != NULL) {
134                 int l, r, t, b;
135                 if (sscanf(tmp, "%d,%d,%d,%d", &l, &r, &t, &b) == 4
136                     && l >= 0 && r >= 0 && t >= 0 && b >= 0) {
137                         pdata->border_l = l, pdata->border_r = r;
138                         pdata->border_t = t, pdata->border_b = b;
139                 }
140                 else
141                         err("border incorrectly specified, ignored");
142         }
143 }
144