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_shaper(ASS_Renderer
*priv
, ASS_ShapingLevel level
)
63 #ifdef CONFIG_HARFBUZZ
64 // select the complex shaper for illegal values
65 if (level
== ASS_SHAPING_SIMPLE
|| level
== ASS_SHAPING_COMPLEX
)
66 priv
->settings
.shaper
= level
;
68 priv
->settings
.shaper
= ASS_SHAPING_COMPLEX
;
72 void ass_set_margins(ASS_Renderer
*priv
, int t
, int b
, int l
, int r
)
74 if (priv
->settings
.left_margin
!= l
|| priv
->settings
.right_margin
!= r
||
75 priv
->settings
.top_margin
!= t
|| priv
->settings
.bottom_margin
!= b
) {
76 priv
->settings
.left_margin
= l
;
77 priv
->settings
.right_margin
= r
;
78 priv
->settings
.top_margin
= t
;
79 priv
->settings
.bottom_margin
= b
;
80 ass_reconfigure(priv
);
84 void ass_set_use_margins(ASS_Renderer
*priv
, int use
)
86 priv
->settings
.use_margins
= use
;
89 void ass_set_aspect_ratio(ASS_Renderer
*priv
, double dar
, double sar
)
91 if (priv
->settings
.aspect
!= dar
|| priv
->settings
.storage_aspect
!= sar
) {
92 priv
->settings
.aspect
= dar
;
93 priv
->settings
.storage_aspect
= sar
;
94 ass_reconfigure(priv
);
98 void ass_set_font_scale(ASS_Renderer
*priv
, double font_scale
)
100 if (priv
->settings
.font_size_coeff
!= font_scale
) {
101 priv
->settings
.font_size_coeff
= font_scale
;
102 ass_reconfigure(priv
);
106 void ass_set_hinting(ASS_Renderer
*priv
, ASS_Hinting ht
)
108 if (priv
->settings
.hinting
!= ht
) {
109 priv
->settings
.hinting
= ht
;
110 ass_reconfigure(priv
);
114 void ass_set_line_spacing(ASS_Renderer
*priv
, double line_spacing
)
116 priv
->settings
.line_spacing
= line_spacing
;
119 void ass_set_fonts(ASS_Renderer
*priv
, const char *default_font
,
120 const char *default_family
, int fc
, const char *config
,
123 free(priv
->settings
.default_font
);
124 free(priv
->settings
.default_family
);
125 priv
->settings
.default_font
= default_font
? strdup(default_font
) : 0;
126 priv
->settings
.default_family
=
127 default_family
? strdup(default_family
) : 0;
129 if (priv
->fontconfig_priv
)
130 fontconfig_done(priv
->fontconfig_priv
);
131 priv
->fontconfig_priv
=
132 fontconfig_init(priv
->library
, priv
->ftlibrary
, default_family
,
133 default_font
, fc
, config
, update
);
136 int ass_fonts_update(ASS_Renderer
*render_priv
)
138 return fontconfig_update(render_priv
->fontconfig_priv
);
141 void ass_set_cache_limits(ASS_Renderer
*render_priv
, int glyph_max
,
144 render_priv
->cache
.glyph_max
= glyph_max
? glyph_max
: GLYPH_CACHE_MAX
;
145 render_priv
->cache
.bitmap_max_size
= bitmap_max
? 1048576 * bitmap_max
:
146 BITMAP_CACHE_MAX_SIZE
;