Don't extend face runs as much as possible
[libass.git] / libass / ass_render.h
blob05c4974133b7aaeefa870e7e38f9b4ad21277156
1 /*
2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
3 * Copyright (C) 2009 Grigori Goronzy <greg@geekmind.org>
5 * This file is part of libass.
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #ifndef LIBASS_RENDER_H
21 #define LIBASS_RENDER_H
23 #include <inttypes.h>
24 #include <ft2build.h>
25 #include FT_FREETYPE_H
26 #include FT_STROKER_H
27 #include FT_GLYPH_H
28 #include FT_SYNTHESIS_H
30 // XXX: fix the inclusion mess so we can avoid doing this here
31 typedef struct ass_shaper ASS_Shaper;
33 #include "ass.h"
34 #include "ass_font.h"
35 #include "ass_bitmap.h"
36 #include "ass_cache.h"
37 #include "ass_utils.h"
38 #include "ass_fontconfig.h"
39 #include "ass_library.h"
40 #include "ass_drawing.h"
42 #define GLYPH_CACHE_MAX 1000
43 #define BITMAP_CACHE_MAX_SIZE 30 * 1048576
45 #define PARSED_FADE (1<<0)
46 #define PARSED_A (1<<1)
48 typedef struct {
49 double xMin;
50 double xMax;
51 double yMin;
52 double yMax;
53 } DBBox;
55 typedef struct {
56 double x;
57 double y;
58 } DVector;
60 typedef struct free_list {
61 void *object;
62 struct free_list *next;
63 } FreeList;
65 typedef struct {
66 int frame_width;
67 int frame_height;
68 double font_size_coeff; // font size multiplier
69 double line_spacing; // additional line spacing (in frame pixels)
70 int top_margin; // height of top margin. Everything except toptitles is shifted down by top_margin.
71 int bottom_margin; // height of bottom margin. (frame_height - top_margin - bottom_margin) is original video height.
72 int left_margin;
73 int right_margin;
74 int use_margins; // 0 - place all subtitles inside original frame
75 // 1 - use margins for placing toptitles and subtitles
76 double aspect; // frame aspect ratio, d_width / d_height.
77 double storage_aspect; // pixel ratio of the source image
78 ASS_Hinting hinting;
80 char *default_font;
81 char *default_family;
82 } ASS_Settings;
84 // a rendered event
85 typedef struct {
86 ASS_Image *imgs;
87 int top, height, left, width;
88 int detect_collisions;
89 int shift_direction;
90 ASS_Event *event;
91 } EventImages;
93 typedef enum {
94 EF_NONE = 0,
95 EF_KARAOKE,
96 EF_KARAOKE_KF,
97 EF_KARAOKE_KO
98 } Effect;
100 // describes a glyph
101 // GlyphInfo and TextInfo are used for text centering and word-wrapping operations
102 typedef struct glyph_info {
103 unsigned symbol;
104 unsigned skip; // skip glyph when layouting text
105 ASS_Font *font;
106 int face_index;
107 int glyph_index;
108 double font_size;
109 ASS_Drawing *drawing;
110 FT_Outline *outline;
111 FT_Outline *border;
112 Bitmap *bm; // glyph bitmap
113 Bitmap *bm_o; // outline bitmap
114 Bitmap *bm_s; // shadow bitmap
115 FT_BBox bbox;
116 FT_Vector pos;
117 FT_Vector offset;
118 char linebreak; // the first (leading) glyph of some line ?
119 uint32_t c[4]; // colors
120 FT_Vector advance; // 26.6
121 FT_Vector cluster_advance;
122 Effect effect_type;
123 int effect_timing; // time duration of current karaoke word
124 // after process_karaoke_effects: distance in pixels from the glyph origin.
125 // part of the glyph to the left of it is displayed in a different color.
126 int effect_skip_timing; // delay after the end of last karaoke word
127 int asc, desc; // font max ascender and descender
128 int be; // blur edges
129 double blur; // gaussian blur
130 double shadow_x;
131 double shadow_y;
132 double frx, fry, frz; // rotation
133 double fax, fay; // text shearing
134 double scale_x, scale_y;
135 double border_x, border_y;
136 unsigned italic;
137 unsigned bold;
138 int flags;
140 int bm_run_id;
141 int shape_run_id;
143 BitmapHashKey hash_key;
145 // next glyph in this cluster
146 struct glyph_info *next;
147 } GlyphInfo;
149 typedef struct {
150 double asc, desc;
151 int offset, len;
152 } LineInfo;
154 typedef struct {
155 GlyphInfo *glyphs;
156 int length;
157 LineInfo *lines;
158 int n_lines;
159 double height;
160 int max_glyphs;
161 int max_lines;
162 } TextInfo;
164 // Renderer state.
165 // Values like current font face, color, screen position, clipping and so on are stored here.
166 typedef struct {
167 ASS_Event *event;
168 ASS_Style *style;
169 int parsed_tags;
171 ASS_Font *font;
172 double font_size;
173 int flags; // decoration flags (underline/strike-through)
175 FT_Stroker stroker;
176 int alignment; // alignment overrides go here; if zero, style value will be used
177 double frx, fry, frz;
178 double fax, fay; // text shearing
179 enum {
180 EVENT_NORMAL, // "normal" top-, sub- or mid- title
181 EVENT_POSITIONED, // happens after pos(,), margins are ignored
182 EVENT_HSCROLL, // "Banner" transition effect, text_width is unlimited
183 EVENT_VSCROLL // "Scroll up", "Scroll down" transition effects
184 } evt_type;
185 double pos_x, pos_y; // position
186 double org_x, org_y; // origin
187 char have_origin; // origin is explicitly defined; if 0, get_base_point() is used
188 double scale_x, scale_y;
189 double hspacing; // distance between letters, in pixels
190 double border_x; // outline width
191 double border_y;
192 uint32_t c[4]; // colors(Primary, Secondary, so on) in RGBA
193 int clip_x0, clip_y0, clip_x1, clip_y1;
194 char clip_mode; // 1 = iclip
195 char detect_collisions;
196 uint32_t fade; // alpha from \fad
197 char be; // blur edges
198 double blur; // gaussian blur
199 double shadow_x;
200 double shadow_y;
201 int drawing_mode; // not implemented; when != 0 text is discarded, except for style override tags
202 ASS_Drawing *drawing; // current drawing
203 ASS_Drawing *clip_drawing; // clip vector
204 int clip_drawing_mode; // 0 = regular clip, 1 = inverse clip
206 Effect effect_type;
207 int effect_timing;
208 int effect_skip_timing;
210 // bitmap run id (used for final bitmap rendering)
211 int bm_run_id;
213 enum {
214 SCROLL_LR, // left-to-right
215 SCROLL_RL,
216 SCROLL_TB, // top-to-bottom
217 SCROLL_BT
218 } scroll_direction; // for EVENT_HSCROLL, EVENT_VSCROLL
219 int scroll_shift;
221 // face properties
222 char *family;
223 unsigned bold;
224 unsigned italic;
225 int treat_family_as_pattern;
226 int wrap_style;
227 int font_encoding;
228 } RenderContext;
230 typedef struct {
231 Cache *font_cache;
232 Cache *outline_cache;
233 Cache *bitmap_cache;
234 Cache *composite_cache;
235 size_t glyph_max;
236 size_t bitmap_max_size;
237 } CacheStore;
239 struct ass_renderer {
240 ASS_Library *library;
241 FT_Library ftlibrary;
242 FCInstance *fontconfig_priv;
243 ASS_Settings settings;
244 int render_id;
245 ASS_SynthPriv *synth_priv;
246 ASS_Shaper *shaper;
248 ASS_Image *images_root; // rendering result is stored here
249 ASS_Image *prev_images_root;
251 EventImages *eimg; // temporary buffer for sorting rendered events
252 int eimg_size; // allocated buffer size
254 // frame-global data
255 int width, height; // screen dimensions
256 int orig_height; // frame height ( = screen height - margins )
257 int orig_width; // frame width ( = screen width - margins )
258 int orig_height_nocrop; // frame height ( = screen height - margins + cropheight)
259 int orig_width_nocrop; // frame width ( = screen width - margins + cropwidth)
260 ASS_Track *track;
261 long long time; // frame's timestamp, ms
262 double font_scale;
263 double font_scale_x; // x scale applied to all glyphs to preserve text aspect ratio
264 double border_scale;
266 RenderContext state;
267 TextInfo text_info;
268 CacheStore cache;
270 FreeList *free_head;
271 FreeList *free_tail;
274 typedef struct render_priv {
275 int top, height, left, width;
276 int render_id;
277 } RenderPriv;
279 typedef struct {
280 int x0;
281 int y0;
282 int x1;
283 int y1;
284 } Rect;
286 typedef struct {
287 int a, b; // top and height
288 int ha, hb; // left and width
289 } Segment;
291 void reset_render_context(ASS_Renderer *render_priv);
292 void ass_free_images(ASS_Image *img);
294 // XXX: this is actually in ass.c, includes should be fixed later on
295 void ass_lazy_track_init(ASS_Library *lib, ASS_Track *track);
297 #endif /* LIBASS_RENDER_H */