Mercurial > mplayer.hg
annotate libass/ass_utils.c @ 36941:865e0513b5f4
Remove redundant code.
The only necessary call - uiEvent() - is performed after the switch
statement anyway, so it isn't necessary to do this also in the case
statement.
The btnModify() calls are pointless, because these will be performed
in the windows' draw handler prior to rendering anyway.
author | ib |
---|---|
date | Fri, 21 Mar 2014 15:46:15 +0000 |
parents | c3aaaf17c721 |
children |
rev | line source |
---|---|
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19405
diff
changeset
|
1 /* |
26723 | 2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com> |
3 * | |
26738
588ce97b44f2
Speak of libass instead of MPlayer in the libass license headers.
diego
parents:
26723
diff
changeset
|
4 * This file is part of libass. |
26723 | 5 * |
34011 | 6 * Permission to use, copy, modify, and distribute this software for any |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
26723 | 9 * |
34011 | 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
26723 | 17 */ |
20008
fa122b7c71c6
Add copyright notice and vim/emacs comments to libass and vf_ass.c.
eugeni
parents:
19405
diff
changeset
|
18 |
18937 | 19 #include "config.h" |
20 | |
21 #include <stdlib.h> | |
30200 | 22 #include <stdio.h> |
19405 | 23 #include <inttypes.h> |
26034 | 24 #include <ft2build.h> |
25 #include FT_GLYPH_H | |
31875 | 26 #include <strings.h> |
18937 | 27 |
30200 | 28 #include "ass_library.h" |
29 #include "ass.h" | |
18937 | 30 #include "ass_utils.h" |
31 | |
30200 | 32 int mystrtoi(char **p, int *res) |
18937 | 33 { |
30200 | 34 double temp_res; |
35 char *start = *p; | |
36 temp_res = ass_strtod(*p, p); | |
37 *res = (int) (temp_res + (temp_res > 0 ? 0.5 : -0.5)); | |
38 if (*p != start) | |
39 return 1; | |
40 else | |
41 return 0; | |
28717
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
42 } |
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
43 |
30200 | 44 int mystrtoll(char **p, long long *res) |
28717
7bbe6626f0e0
Support fractional arguments for some override tags.
eugeni
parents:
26738
diff
changeset
|
45 { |
30200 | 46 double temp_res; |
47 char *start = *p; | |
48 temp_res = ass_strtod(*p, p); | |
49 *res = (int) (temp_res + (temp_res > 0 ? 0.5 : -0.5)); | |
50 if (*p != start) | |
51 return 1; | |
52 else | |
53 return 0; | |
18937 | 54 } |
55 | |
30200 | 56 int mystrtou32(char **p, int base, uint32_t *res) |
18937 | 57 { |
30200 | 58 char *start = *p; |
59 *res = strtoll(*p, p, base); | |
60 if (*p != start) | |
61 return 1; | |
62 else | |
63 return 0; | |
18937 | 64 } |
65 | |
30200 | 66 int mystrtod(char **p, double *res) |
18937 | 67 { |
30200 | 68 char *start = *p; |
69 *res = ass_strtod(*p, p); | |
70 if (*p != start) | |
71 return 1; | |
72 else | |
73 return 0; | |
18937 | 74 } |
75 | |
30200 | 76 int strtocolor(ASS_Library *library, char **q, uint32_t *res, int hex) |
18937 | 77 { |
30200 | 78 uint32_t color = 0; |
79 int result; | |
80 char *p = *q; | |
81 int base = hex ? 16 : 10; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
82 |
30200 | 83 if (*p == '&') |
84 ++p; | |
85 else | |
86 ass_msg(library, MSGL_DBG2, "suspicious color format: \"%s\"\n", p); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
87 |
30200 | 88 if (*p == 'H' || *p == 'h') { |
89 ++p; | |
90 result = mystrtou32(&p, 16, &color); | |
91 } else { | |
92 result = mystrtou32(&p, base, &color); | |
93 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28785
diff
changeset
|
94 |
30200 | 95 { |
96 unsigned char *tmp = (unsigned char *) (&color); | |
97 unsigned char b; | |
98 b = tmp[0]; | |
99 tmp[0] = tmp[3]; | |
100 tmp[3] = b; | |
101 b = tmp[1]; | |
102 tmp[1] = tmp[2]; | |
103 tmp[2] = b; | |
104 } | |
105 if (*p == '&') | |
106 ++p; | |
107 *q = p; | |
18937 | 108 |
30200 | 109 *res = color; |
110 return result; | |
18937 | 111 } |
112 | |
28785 | 113 // Return a boolean value for a string |
30200 | 114 char parse_bool(char *str) |
115 { | |
116 while (*str == ' ' || *str == '\t') | |
117 str++; | |
118 if (!strncasecmp(str, "yes", 3)) | |
119 return 1; | |
120 else if (strtol(str, NULL, 10) > 0) | |
121 return 1; | |
122 return 0; | |
123 } | |
124 | |
36363 | 125 int parse_ycbcr_matrix(char *str) |
126 { | |
127 while (*str == ' ' || *str == '\t') | |
128 str++; | |
129 if (*str == '\0') | |
130 return YCBCR_DEFAULT; | |
131 | |
132 char *end = str + strlen(str); | |
133 while (end[-1] == ' ' || end[-1] == '\t') | |
134 end--; | |
135 | |
136 // Trim a local copy of the input that we know is safe to | |
137 // modify. The buffer is larger than any valid string + NUL, | |
138 // so we can simply chop off the rest of the input. | |
139 char buffer[16]; | |
140 size_t n = FFMIN(end - str, sizeof buffer - 1); | |
141 strncpy(buffer, str, n); | |
142 buffer[n] = '\0'; | |
143 | |
144 if (!strcasecmp(buffer, "none")) | |
145 return YCBCR_NONE; | |
146 if (!strcasecmp(buffer, "tv.601")) | |
147 return YCBCR_BT601_TV; | |
148 if (!strcasecmp(buffer, "pc.601")) | |
149 return YCBCR_BT601_PC; | |
150 if (!strcasecmp(buffer, "tv.709")) | |
151 return YCBCR_BT709_TV; | |
152 if (!strcasecmp(buffer, "pc.709")) | |
153 return YCBCR_BT709_PC; | |
154 if (!strcasecmp(buffer, "tv.240m")) | |
155 return YCBCR_SMPTE240M_TV; | |
156 if (!strcasecmp(buffer, "pc.240m")) | |
157 return YCBCR_SMPTE240M_PC; | |
158 if (!strcasecmp(buffer, "tv.fcc")) | |
159 return YCBCR_FCC_TV; | |
160 if (!strcasecmp(buffer, "pc.fcc")) | |
161 return YCBCR_FCC_PC; | |
162 return YCBCR_UNKNOWN; | |
163 } | |
164 | |
30200 | 165 void ass_msg(ASS_Library *priv, int lvl, char *fmt, ...) |
166 { | |
167 va_list va; | |
168 va_start(va, fmt); | |
169 priv->msg_callback(lvl, fmt, va, priv->msg_callback_data); | |
170 va_end(va); | |
28785 | 171 } |
172 | |
30200 | 173 unsigned ass_utf8_get_char(char **str) |
26034 | 174 { |
30200 | 175 uint8_t *strp = (uint8_t *) * str; |
176 unsigned c = *strp++; | |
177 unsigned mask = 0x80; | |
178 int len = -1; | |
179 while (c & mask) { | |
180 mask >>= 1; | |
181 len++; | |
182 } | |
183 if (len <= 0 || len > 4) | |
184 goto no_utf8; | |
185 c &= mask - 1; | |
186 while ((*strp & 0xc0) == 0x80) { | |
187 if (len-- <= 0) | |
188 goto no_utf8; | |
189 c = (c << 6) | (*strp++ & 0x3f); | |
190 } | |
191 if (len) | |
192 goto no_utf8; | |
193 *str = (char *) strp; | |
194 return c; | |
195 | |
196 no_utf8: | |
197 strp = (uint8_t *) * str; | |
198 c = *strp++; | |
199 *str = (char *) strp; | |
200 return c; | |
26034 | 201 } |
202 | |
35262 | 203 /** |
204 * \brief find style by name | |
205 * \param track track | |
206 * \param name style name | |
207 * \return index in track->styles | |
208 * Returnes 0 if no styles found => expects at least 1 style. | |
209 * Parsing code always adds "Default" style in the end. | |
210 */ | |
211 int lookup_style(ASS_Track *track, char *name) | |
212 { | |
213 int i; | |
214 if (*name == '*') | |
215 ++name; // FIXME: what does '*' really mean ? | |
216 for (i = track->n_styles - 1; i >= 0; --i) { | |
217 if (strcmp(track->styles[i].Name, name) == 0) | |
218 return i; | |
219 } | |
220 i = track->default_style; | |
221 ass_msg(track->library, MSGL_WARN, | |
222 "[%p]: Warning: no style named '%s' found, using '%s'", | |
223 track, name, track->styles[i].Name); | |
224 return i; // use the first style | |
225 } | |
226 | |
30200 | 227 #ifdef CONFIG_ENCA |
228 void *ass_guess_buffer_cp(ASS_Library *library, unsigned char *buffer, | |
229 int buflen, char *preferred_language, | |
230 char *fallback) | |
26034 | 231 { |
30200 | 232 const char **languages; |
233 size_t langcnt; | |
234 EncaAnalyser analyser; | |
235 EncaEncoding encoding; | |
236 char *detected_sub_cp = NULL; | |
237 int i; | |
238 | |
239 languages = enca_get_languages(&langcnt); | |
240 ass_msg(library, MSGL_V, "ENCA supported languages"); | |
241 for (i = 0; i < langcnt; i++) { | |
242 ass_msg(library, MSGL_V, "lang %s", languages[i]); | |
243 } | |
244 | |
245 for (i = 0; i < langcnt; i++) { | |
246 const char *tmp; | |
247 | |
248 if (strcasecmp(languages[i], preferred_language) != 0) | |
249 continue; | |
250 analyser = enca_analyser_alloc(languages[i]); | |
251 encoding = enca_analyse_const(analyser, buffer, buflen); | |
252 tmp = enca_charset_name(encoding.charset, ENCA_NAME_STYLE_ICONV); | |
253 if (tmp && encoding.charset != ENCA_CS_UNKNOWN) { | |
254 detected_sub_cp = strdup(tmp); | |
255 ass_msg(library, MSGL_INFO, "ENCA detected charset: %s", tmp); | |
256 } | |
257 enca_analyser_free(analyser); | |
258 } | |
259 | |
260 free(languages); | |
261 | |
262 if (!detected_sub_cp) { | |
263 detected_sub_cp = strdup(fallback); | |
264 ass_msg(library, MSGL_INFO, | |
265 "ENCA detection failed: fallback to %s", fallback); | |
266 } | |
267 | |
268 return detected_sub_cp; | |
26034 | 269 } |
26036
8d8c52a169ad
Comment out dump_glyph(): it is unused and, as it is now, breaks compilation.
eugeni
parents:
26034
diff
changeset
|
270 #endif |