Mercurial > mplayer.hg
annotate sub/eosd.c @ 36607:6b17e4932555
Improve the dialog for font encodings.
In case iconv is available, add only available encodings from the
full list to avoid possible confusion.
In any case (and especially if iconv isn't available) add UNICODE,
since this is internally provided by MPlayer.
author | ib |
---|---|
date | Thu, 23 Jan 2014 12:09:37 +0000 |
parents | 7dbe7168cf49 |
children |
rev | line source |
---|---|
32460 | 1 /* |
2 * Extended On Screen Display | |
3 * Copyright (C) 2010 Nicolas George | |
4 * | |
5 * This file is part of MPlayer. | |
6 * | |
7 * MPlayer is free software; you can redistribute it and/or modify | |
8 * it under the terms of the GNU General Public License as published by | |
9 * the Free Software Foundation; either version 2 of the License, or | |
10 * (at your option) any later version. | |
11 * | |
12 * MPlayer is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 * GNU General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU General Public License along | |
18 * with MPlayer; if not, write to the Free Software Foundation, Inc., | |
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | |
20 */ | |
21 | |
22 #include "mpcommon.h" | |
23 #include "libmpcodecs/vf.h" | |
24 #include "libvo/video_out.h" | |
32467 | 25 #include "sub.h" |
32464
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32461
diff
changeset
|
26 #include "ass_mp.h" |
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32461
diff
changeset
|
27 #include "eosd.h" |
32460 | 28 |
29 static struct mp_eosd_source *sources; | |
30 static struct mp_eosd_settings settings; | |
31 static struct mp_eosd_image *image_pool; | |
32 | |
33 void eosd_init(vf_instance_t *vf) | |
34 { | |
35 vf->control(vf, VFCTRL_INIT_EOSD, NULL); | |
36 } | |
37 | |
38 void eosd_register(struct mp_eosd_source *src) | |
39 { | |
40 struct mp_eosd_source *p, **prev = &sources; | |
41 for (p = sources; p && p->z_index < src->z_index; p = p->priv_next) | |
42 prev = &p->priv_next; | |
43 src->priv_next = p; | |
44 *prev = src; | |
45 src->initialized = 0; | |
46 } | |
47 | |
48 int eosd_registered(struct mp_eosd_source *source) | |
49 { | |
50 struct mp_eosd_source *p; | |
51 for (p = sources; p; p = p->priv_next) | |
52 if (p == source) | |
53 return 1; | |
54 return 0; | |
55 } | |
56 | |
57 void eosd_configure(struct mp_eosd_settings *res) | |
58 { | |
59 if (res->w != settings.w || | |
60 res->h != settings.h || | |
61 res->srcw != settings.srcw || | |
62 res->srch != settings.srch || | |
63 res->mt != settings.mt || | |
35121
7dbe7168cf49
Fix typos which cause the ASS renderer to be reconfigured on every single
reimar
parents:
32467
diff
changeset
|
64 res->mb != settings.mb || |
7dbe7168cf49
Fix typos which cause the ASS renderer to be reconfigured on every single
reimar
parents:
32467
diff
changeset
|
65 res->ml != settings.ml || |
7dbe7168cf49
Fix typos which cause the ASS renderer to be reconfigured on every single
reimar
parents:
32467
diff
changeset
|
66 res->mr != settings.mr || |
32460 | 67 res->unscaled != settings.unscaled) { |
68 settings = *res; | |
69 settings.changed = 1; | |
70 } | |
71 } | |
72 | |
73 void eosd_render_frame(double ts, struct mp_eosd_image_list *images) | |
74 { | |
75 struct mp_eosd_source *src; | |
76 int changed = 0; | |
77 for (src = sources; src; src = src->priv_next) { | |
78 if (src->update) | |
79 src->update(src, &settings, ts); | |
80 changed |= src->changed; | |
81 src->changed = 0; | |
82 } | |
83 settings.changed = 0; | |
84 images->first_source = sources; | |
85 images->changed = changed; | |
86 } | |
87 | |
88 void eosd_uninit(void) | |
89 { | |
90 struct mp_eosd_source *src; | |
91 for (src = sources; src; src = src->priv_next) { | |
92 // TODO: maybe only call if src->initialized is set. | |
93 if (src->uninit) | |
94 src->uninit(src); | |
95 src->initialized = 0; | |
96 } | |
97 } | |
98 | |
99 struct mp_eosd_image *eosd_image_alloc(void) | |
100 { | |
101 struct mp_eosd_image *r; | |
102 if (!image_pool) { | |
103 const unsigned n_alloc = 127; /* arbitrary */ | |
104 unsigned i; | |
105 image_pool = calloc(n_alloc, sizeof(*image_pool)); | |
106 for (i = 0; i < n_alloc - 1; i++) | |
107 image_pool[i].next = image_pool + i + 1; | |
108 image_pool[i].next = NULL; | |
109 } | |
110 r = image_pool; | |
111 image_pool = image_pool->next; | |
112 return r; | |
113 } | |
114 | |
115 void eosd_image_free(struct mp_eosd_image *image) | |
116 { | |
117 image->next = image_pool; | |
118 image_pool = image; | |
119 } | |
120 | |
121 void eosd_image_append(struct mp_eosd_source *source, | |
122 struct mp_eosd_image *image) | |
123 { | |
124 image->next = NULL; | |
125 *source->images_tail = image; | |
126 source->images_tail = &image->next; | |
127 } | |
128 | |
129 void eosd_image_remove(struct mp_eosd_source *source, | |
130 struct mp_eosd_image *image, | |
131 struct mp_eosd_image **prev) | |
132 { | |
133 *prev = image->next; | |
134 if (!*prev) | |
135 source->images_tail = prev; | |
136 eosd_image_free(image); | |
137 } | |
138 | |
139 void eosd_image_remove_all(struct mp_eosd_source *source) | |
140 { | |
141 struct mp_eosd_image *image; | |
142 | |
143 while (source->images) { | |
144 image = source->images; | |
145 source->images = source->images->next; | |
146 eosd_image_free(image); | |
147 } | |
148 source->images_tail = &source->images; | |
149 } | |
150 | |
151 static void next_image_in_sources(struct mp_eosd_image_list *images, | |
152 struct mp_eosd_source *src) | |
153 { | |
154 images->source = src; | |
155 while (images->source && !images->source->images) | |
156 images->source = images->source->priv_next; | |
157 images->image = images->source ? images->source->images : NULL; | |
158 } | |
159 | |
160 struct mp_eosd_image *eosd_image_first(struct mp_eosd_image_list *images) | |
161 { | |
162 next_image_in_sources(images, images->first_source); | |
163 return images->image; | |
164 } | |
165 | |
166 struct mp_eosd_image *eosd_image_next(struct mp_eosd_image_list *images) | |
167 { | |
168 images->image = images->image->next; | |
169 if (!images->image) | |
170 next_image_in_sources(images, images->source->priv_next); | |
171 return images->image; | |
172 } |