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 * libass 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.
12 * libass 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.
17 * You should have received a copy of the GNU General Public License along
18 * with libass; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #ifndef LIBASS_RENDER_H
23 #define LIBASS_RENDER_H
27 #include FT_FREETYPE_H
30 #include FT_SYNTHESIS_H
34 #include "ass_bitmap.h"
35 #include "ass_cache.h"
36 #include "ass_utils.h"
37 #include "ass_fontconfig.h"
38 #include "ass_library.h"
39 #include "ass_drawing.h"
53 typedef struct free_list
{
55 struct free_list
*next
;
61 double font_size_coeff
; // font size multiplier
62 double line_spacing
; // additional line spacing (in frame pixels)
63 int top_margin
; // height of top margin. Everything except toptitles is shifted down by top_margin.
64 int bottom_margin
; // height of bottom margin. (frame_height - top_margin - bottom_margin) is original video height.
67 int use_margins
; // 0 - place all subtitles inside original frame
68 // 1 - use margins for placing toptitles and subtitles
69 double aspect
; // frame aspect ratio, d_width / d_height.
70 double storage_aspect
; // pixel ratio of the source image
80 int top
, height
, left
, width
;
81 int detect_collisions
;
94 // GlyphInfo and TextInfo are used for text centering and word-wrapping operations
97 unsigned skip
; // skip glyph when layouting text
99 FT_Glyph outline_glyph
;
100 Bitmap
*bm
; // glyph bitmap
101 Bitmap
*bm_o
; // outline bitmap
102 Bitmap
*bm_s
; // shadow bitmap
105 char linebreak
; // the first (leading) glyph of some line ?
106 uint32_t c
[4]; // colors
107 FT_Vector advance
; // 26.6
109 int effect_timing
; // time duration of current karaoke word
110 // after process_karaoke_effects: distance in pixels from the glyph origin.
111 // part of the glyph to the left of it is displayed in a different color.
112 int effect_skip_timing
; // delay after the end of last karaoke word
113 int asc
, desc
; // font max ascender and descender
114 int be
; // blur edges
115 double blur
; // gaussian blur
118 double frx
, fry
, frz
; // rotation
119 double fax
, fay
; // text shearing
121 BitmapHashKey hash_key
;
139 // Values like current font face, color, screen position, clipping and so on are stored here.
147 int flags
; // decoration flags (underline/strike-through)
150 int alignment
; // alignment overrides go here; if zero, style value will be used
151 double frx
, fry
, frz
;
152 double fax
, fay
; // text shearing
154 EVENT_NORMAL
, // "normal" top-, sub- or mid- title
155 EVENT_POSITIONED
, // happens after pos(,), margins are ignored
156 EVENT_HSCROLL
, // "Banner" transition effect, text_width is unlimited
157 EVENT_VSCROLL
// "Scroll up", "Scroll down" transition effects
159 double pos_x
, pos_y
; // position
160 double org_x
, org_y
; // origin
161 char have_origin
; // origin is explicitly defined; if 0, get_base_point() is used
162 double scale_x
, scale_y
;
163 double hspacing
; // distance between letters, in pixels
164 double border_x
; // outline width
166 uint32_t c
[4]; // colors(Primary, Secondary, so on) in RGBA
167 int clip_x0
, clip_y0
, clip_x1
, clip_y1
;
168 char clip_mode
; // 1 = iclip
169 char detect_collisions
;
170 uint32_t fade
; // alpha from \fad
171 char be
; // blur edges
172 double blur
; // gaussian blur
175 int drawing_mode
; // not implemented; when != 0 text is discarded, except for style override tags
176 ASS_Drawing
*drawing
; // current drawing
177 ASS_Drawing
*clip_drawing
; // clip vector
178 int clip_drawing_mode
; // 0 = regular clip, 1 = inverse clip
182 int effect_skip_timing
;
185 SCROLL_LR
, // left-to-right
187 SCROLL_TB
, // top-to-bottom
189 } scroll_direction
; // for EVENT_HSCROLL, EVENT_VSCROLL
196 int treat_family_as_pattern
;
202 Hashmap
*glyph_cache
;
203 Hashmap
*bitmap_cache
;
204 Hashmap
*composite_cache
;
206 size_t bitmap_max_size
;
209 struct ass_renderer
{
210 ASS_Library
*library
;
211 FT_Library ftlibrary
;
212 FCInstance
*fontconfig_priv
;
213 ASS_Settings settings
;
215 ASS_SynthPriv
*synth_priv
;
217 ASS_Image
*images_root
; // rendering result is stored here
218 ASS_Image
*prev_images_root
;
220 EventImages
*eimg
; // temporary buffer for sorting rendered events
221 int eimg_size
; // allocated buffer size
224 int width
, height
; // screen dimensions
225 int orig_height
; // frame height ( = screen height - margins )
226 int orig_width
; // frame width ( = screen width - margins )
227 int orig_height_nocrop
; // frame height ( = screen height - margins + cropheight)
228 int orig_width_nocrop
; // frame width ( = screen width - margins + cropwidth)
230 long long time
; // frame's timestamp, ms
232 double font_scale_x
; // x scale applied to all glyphs to preserve text aspect ratio
243 typedef struct render_priv
{
244 int top
, height
, left
, width
;
256 int a
, b
; // top and height
257 int ha
, hb
; // left and width
260 #endif /* LIBASS_RENDER_H */