Mercurial > mplayer.hg
annotate libass/ass_library.c @ 35833:dbfedb331095
Keep GUI history untouched upon file select "Cancel".
Currently, when "Cancel" is selected in the file select menu, the
GUI history can be modified nevertheless. Presuming that "Cancel"
shall discard changes, the history should be kept unchanged, too.
Patch by Hans-Dieter Kosch, hdkosch kabelbw de.
author | ib |
---|---|
date | Thu, 28 Feb 2013 11:19:59 +0000 |
parents | 6e7f60f6f9d4 |
children |
rev | line source |
---|---|
20477 | 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:
26724
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 */ |
20477 | 18 |
31875 | 19 #include "config.h" |
20 | |
20477 | 21 #include <inttypes.h> |
22 #include <stdio.h> | |
23 #include <stdlib.h> | |
24 #include <string.h> | |
30200 | 25 #include <stdarg.h> |
20477 | 26 |
27 #include "ass.h" | |
28 #include "ass_library.h" | |
30200 | 29 #include "ass_utils.h" |
20477 | 30 |
30200 | 31 static void ass_msg_handler(int level, const char *fmt, va_list va, void *data) |
20477 | 32 { |
30200 | 33 if (level > MSGL_INFO) |
34 return; | |
35 fprintf(stderr, "[ass] "); | |
36 vfprintf(stderr, fmt, va); | |
37 fprintf(stderr, "\n"); | |
20477 | 38 } |
39 | |
30200 | 40 ASS_Library *ass_library_init(void) |
20477 | 41 { |
30200 | 42 ASS_Library* lib = calloc(1, sizeof(*lib)); |
43 lib->msg_callback = ass_msg_handler; | |
44 | |
45 return lib; | |
20477 | 46 } |
47 | |
30200 | 48 void ass_library_done(ASS_Library *priv) |
20477 | 49 { |
30200 | 50 if (priv) { |
51 ass_set_fonts_dir(priv, NULL); | |
52 ass_set_style_overrides(priv, NULL); | |
53 ass_clear_fonts(priv); | |
54 free(priv); | |
55 } | |
20477 | 56 } |
57 | |
30200 | 58 void ass_set_fonts_dir(ASS_Library *priv, const char *fonts_dir) |
20477 | 59 { |
31875 | 60 free(priv->fonts_dir); |
30200 | 61 |
62 priv->fonts_dir = fonts_dir ? strdup(fonts_dir) : 0; | |
63 } | |
64 | |
65 void ass_set_extract_fonts(ASS_Library *priv, int extract) | |
66 { | |
67 priv->extract_fonts = !!extract; | |
20477 | 68 } |
69 | |
30200 | 70 void ass_set_style_overrides(ASS_Library *priv, char **list) |
20477 | 71 { |
30200 | 72 char **p; |
73 char **q; | |
74 int cnt; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26738
diff
changeset
|
75 |
30200 | 76 if (priv->style_overrides) { |
77 for (p = priv->style_overrides; *p; ++p) | |
78 free(*p); | |
79 } | |
31875 | 80 free(priv->style_overrides); |
34295 | 81 priv->style_overrides = NULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
26738
diff
changeset
|
82 |
30200 | 83 if (!list) |
84 return; | |
20477 | 85 |
30200 | 86 for (p = list, cnt = 0; *p; ++p, ++cnt) { |
87 } | |
88 | |
89 priv->style_overrides = malloc((cnt + 1) * sizeof(char *)); | |
90 for (p = list, q = priv->style_overrides; *p; ++p, ++q) | |
91 *q = strdup(*p); | |
92 priv->style_overrides[cnt] = NULL; | |
20477 | 93 } |
21458
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
94 |
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
95 static void grow_array(void **array, int nelem, size_t elsize) |
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
96 { |
30200 | 97 if (!(nelem & 31)) |
98 *array = realloc(*array, (nelem + 32) * elsize); | |
99 } | |
100 | |
101 void ass_add_font(ASS_Library *priv, char *name, char *data, int size) | |
102 { | |
103 int idx = priv->num_fontdata; | |
104 if (!name || !data || !size) | |
105 return; | |
106 grow_array((void **) &priv->fontdata, priv->num_fontdata, | |
107 sizeof(*priv->fontdata)); | |
108 | |
109 priv->fontdata[idx].name = strdup(name); | |
110 | |
111 priv->fontdata[idx].data = malloc(size); | |
112 memcpy(priv->fontdata[idx].data, data, size); | |
113 | |
114 priv->fontdata[idx].size = size; | |
115 | |
116 priv->num_fontdata++; | |
21458
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
117 } |
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
118 |
30200 | 119 void ass_clear_fonts(ASS_Library *priv) |
21458
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
120 { |
30200 | 121 int i; |
122 for (i = 0; i < priv->num_fontdata; ++i) { | |
123 free(priv->fontdata[i].name); | |
124 free(priv->fontdata[i].data); | |
125 } | |
126 free(priv->fontdata); | |
127 priv->fontdata = NULL; | |
128 priv->num_fontdata = 0; | |
21458
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
129 } |
7af6c25a0cfc
Keep embedded fonts in ass_library_t and perform actual disk write
eugeni
parents:
20722
diff
changeset
|
130 |
30200 | 131 /* |
132 * Register a message callback function with libass. Without setting one, | |
133 * a default handler is used which prints everything with MSGL_INFO or | |
134 * higher to the standard output. | |
135 * | |
136 * \param msg_cb the callback function | |
137 * \param data additional data that will be passed to the callback | |
138 */ | |
139 void ass_set_message_cb(ASS_Library *priv, | |
140 void (*msg_cb)(int, const char *, va_list, void *), | |
141 void *data) | |
25613
f00333e3facf
Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents:
21497
diff
changeset
|
142 { |
30200 | 143 if (msg_cb) { |
144 priv->msg_callback = msg_cb; | |
145 priv->msg_callback_data = data; | |
146 } | |
25613
f00333e3facf
Copy font data to ass_library instead of referencing demuxer-owned memory.
eugeni
parents:
21497
diff
changeset
|
147 } |