2 * Copyright (C) 2006 Evgeniy Stepanov <eugeni.stepanov@gmail.com>
3 * Copyright (C) 2010 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.
21 #include "ass_render.h"
23 static void ass_reconfigure(ASS_Renderer
*priv
)
25 ASS_Settings
*settings
= &priv
->settings
;
28 ass_cache_empty(priv
->cache
.outline_cache
, 0);
29 ass_cache_empty(priv
->cache
.bitmap_cache
, 0);
30 ass_cache_empty(priv
->cache
.composite_cache
, 0);
31 ass_free_images(priv
->prev_images_root
);
32 priv
->prev_images_root
= 0;
34 priv
->width
= settings
->frame_width
;
35 priv
->height
= settings
->frame_height
;
36 priv
->orig_width
= settings
->frame_width
- settings
->left_margin
-
37 settings
->right_margin
;
38 priv
->orig_height
= settings
->frame_height
- settings
->top_margin
-
39 settings
->bottom_margin
;
40 priv
->orig_width_nocrop
=
41 settings
->frame_width
- FFMAX(settings
->left_margin
, 0) -
42 FFMAX(settings
->right_margin
, 0);
43 priv
->orig_height_nocrop
=
44 settings
->frame_height
- FFMAX(settings
->top_margin
, 0) -
45 FFMAX(settings
->bottom_margin
, 0);
48 void ass_set_frame_size(ASS_Renderer
*priv
, int w
, int h
)
50 if (priv
->settings
.frame_width
!= w
|| priv
->settings
.frame_height
!= h
) {
51 priv
->settings
.frame_width
= w
;
52 priv
->settings
.frame_height
= h
;
53 if (priv
->settings
.aspect
== 0.) {
54 priv
->settings
.aspect
= ((double) w
) / h
;
55 priv
->settings
.storage_aspect
= ((double) w
) / h
;
57 ass_reconfigure(priv
);
61 void ass_set_margins(ASS_Renderer
*priv
, int t
, int b
, int l
, int r
)
63 if (priv
->settings
.left_margin
!= l
|| priv
->settings
.right_margin
!= r
||
64 priv
->settings
.top_margin
!= t
|| priv
->settings
.bottom_margin
!= b
) {
65 priv
->settings
.left_margin
= l
;
66 priv
->settings
.right_margin
= r
;
67 priv
->settings
.top_margin
= t
;
68 priv
->settings
.bottom_margin
= b
;
69 ass_reconfigure(priv
);
73 void ass_set_use_margins(ASS_Renderer
*priv
, int use
)
75 priv
->settings
.use_margins
= use
;
78 void ass_set_aspect_ratio(ASS_Renderer
*priv
, double dar
, double sar
)
80 if (priv
->settings
.aspect
!= dar
|| priv
->settings
.storage_aspect
!= sar
) {
81 priv
->settings
.aspect
= dar
;
82 priv
->settings
.storage_aspect
= sar
;
83 ass_reconfigure(priv
);
87 void ass_set_font_scale(ASS_Renderer
*priv
, double font_scale
)
89 if (priv
->settings
.font_size_coeff
!= font_scale
) {
90 priv
->settings
.font_size_coeff
= font_scale
;
91 ass_reconfigure(priv
);
95 void ass_set_hinting(ASS_Renderer
*priv
, ASS_Hinting ht
)
97 if (priv
->settings
.hinting
!= ht
) {
98 priv
->settings
.hinting
= ht
;
99 ass_reconfigure(priv
);
103 void ass_set_line_spacing(ASS_Renderer
*priv
, double line_spacing
)
105 priv
->settings
.line_spacing
= line_spacing
;
108 void ass_set_fonts(ASS_Renderer
*priv
, const char *default_font
,
109 const char *default_family
, int fc
, const char *config
,
112 free(priv
->settings
.default_font
);
113 free(priv
->settings
.default_family
);
114 priv
->settings
.default_font
= default_font
? strdup(default_font
) : 0;
115 priv
->settings
.default_family
=
116 default_family
? strdup(default_family
) : 0;
118 if (priv
->fontconfig_priv
)
119 fontconfig_done(priv
->fontconfig_priv
);
120 priv
->fontconfig_priv
=
121 fontconfig_init(priv
->library
, priv
->ftlibrary
, default_family
,
122 default_font
, fc
, config
, update
);
125 int ass_fonts_update(ASS_Renderer
*render_priv
)
127 return fontconfig_update(render_priv
->fontconfig_priv
);
130 void ass_set_cache_limits(ASS_Renderer
*render_priv
, int glyph_max
,
133 render_priv
->cache
.glyph_max
= glyph_max
? glyph_max
: GLYPH_CACHE_MAX
;
134 render_priv
->cache
.bitmap_max_size
= bitmap_max
? 1048576 * bitmap_max
:
135 BITMAP_CACHE_MAX_SIZE
;