Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
54348a25
Commit
54348a25
authored
Jun 10, 2011
by
Laurent Aimar
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Replaced ft_style_t by text_style_t in freetype.
parent
f8486788
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
71 additions
and
94 deletions
+71
-94
modules/misc/text_renderer/freetype.c
modules/misc/text_renderer/freetype.c
+71
-94
No files found.
modules/misc/text_renderer/freetype.c
View file @
54348a25
...
...
@@ -226,18 +226,6 @@ struct line_desc_t
static
line_desc_t
*
NewLine
(
int
);
static
void
FreeLines
(
line_desc_t
*
);
typedef
struct
{
int
i_font_size
;
uint32_t
i_font_color
;
/* ARGB */
uint32_t
i_karaoke_bg_color
;
/* ARGB */
bool
b_italic
;
bool
b_bold
;
bool
b_underline
;
bool
b_through
;
char
*
psz_fontname
;
}
ft_style_t
;
typedef
struct
font_stack_t
font_stack_t
;
struct
font_stack_t
{
...
...
@@ -1045,54 +1033,44 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
return
VLC_SUCCESS
;
}
static
f
t_style_t
*
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
uint32_t
i_font_color
,
uint32_t
i_karaoke_bg_color
,
bool
b_bold
,
bool
b_italic
,
bool
b_uline
,
bool
b_through
)
static
tex
t_style_t
*
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
uint32_t
i_font_color
,
uint32_t
i_karaoke_bg_color
,
bool
b_bold
,
bool
b_italic
,
bool
b_uline
,
bool
b_through
)
{
ft_style_t
*
p_style
=
malloc
(
sizeof
(
*
p_style
)
);
text_style_t
*
p_style
=
text_style_New
(
);
if
(
!
p_style
)
return
NULL
;
p_style
->
i_font_size
=
i_font_size
;
p_style
->
i_font_color
=
i_font_color
;
p_style
->
i_karaoke_bg_color
=
i_karaoke_bg_color
;
p_style
->
b_italic
=
b_italic
;
p_style
->
b_bold
=
b_bold
;
p_style
->
b_underline
=
b_uline
;
p_style
->
b_through
=
b_through
;
p_style
->
psz_fontname
=
strdup
(
psz_fontname
);
p_style
->
i_font_size
=
i_font_size
;
p_style
->
i_font_color
=
(
i_font_color
&
0x00ffffff
)
>>
0
;
p_style
->
i_font_alpha
=
(
i_font_color
&
0xff000000
)
>>
24
;
p_style
->
i_karaoke_background_color
=
(
i_karaoke_bg_color
&
0x00ffffff
)
>>
0
;
p_style
->
i_karaoke_background_alpha
=
(
i_karaoke_bg_color
&
0xff000000
)
>>
24
;
if
(
b_bold
)
p_style
->
i_style_flags
|=
STYLE_BOLD
;
if
(
b_italic
)
p_style
->
i_style_flags
|=
STYLE_ITALIC
;
if
(
b_uline
)
p_style
->
i_style_flags
|=
STYLE_UNDERLINE
;
if
(
b_through
)
p_style
->
i_style_flags
|=
STYLE_STRIKEOUT
;
return
p_style
;
}
static
void
DeleteStyle
(
ft_style_t
*
p_style
)
{
if
(
!
p_style
)
return
;
free
(
p_style
->
psz_fontname
);
free
(
p_style
);
}
static
bool
StyleEquals
(
ft_style_t
*
s1
,
ft_style_t
*
s2
)
static
bool
StyleEquals
(
text_style_t
*
s1
,
text_style_t
*
s2
)
{
if
(
!
s1
||
!
s2
)
return
false
;
if
(
s1
==
s2
)
return
true
;
if
((
s1
->
i_font_size
==
s2
->
i_font_size
)
&&
(
s1
->
i_font_color
==
s2
->
i_font_color
)
&&
(
s1
->
b_italic
==
s2
->
b_italic
)
&&
(
s1
->
b_through
==
s2
->
b_through
)
&&
(
s1
->
b_bold
==
s2
->
b_bold
)
&&
(
s1
->
b_underline
==
s2
->
b_underline
)
&&
(
!
strcmp
(
s1
->
psz_fontname
,
s2
->
psz_fontname
)))
{
return
true
;
}
return
false
;
return
s1
->
i_font_size
==
s2
->
i_font_size
&&
s1
->
i_font_color
==
s2
->
i_font_color
&&
s1
->
i_font_alpha
==
s2
->
i_font_alpha
&&
s1
->
i_style_flags
==
s2
->
i_style_flags
&&
!
strcmp
(
s1
->
psz_fontname
,
s2
->
psz_fontname
);
}
static
void
IconvText
(
filter_t
*
p_filter
,
const
char
*
psz_string
,
...
...
@@ -1558,7 +1536,7 @@ static void HandleWhiteSpace( char *psz_node )
}
static
f
t_style_t
*
GetStyleFromFontStack
(
filter_sys_t
*
p_sys
,
static
tex
t_style_t
*
GetStyleFromFontStack
(
filter_sys_t
*
p_sys
,
font_stack_t
**
p_fonts
,
bool
b_bold
,
bool
b_italic
,
bool
b_uline
,
bool
b_through
)
...
...
@@ -1576,9 +1554,10 @@ static ft_style_t *GetStyleFromFontStack( filter_sys_t *p_sys,
i_karaoke_bg_color
,
b_bold
,
b_italic
,
b_uline
,
b_through
);
}
static
int
RenderTag
(
filter_t
*
p_filter
,
FT_Face
p_face
,
int
i_font_color
,
bool
b_uline
,
bool
b_through
,
bool
b_bold
,
bool
b_italic
,
int
i_karaoke_bgcolor
,
static
int
RenderTag
(
filter_t
*
p_filter
,
FT_Face
p_face
,
int
i_font_color
,
int
i_style_flags
,
int
i_karaoke_bgcolor
,
line_desc_t
*
p_line
,
uint32_t
*
psz_unicode
,
int
*
pi_pen_x
,
int
i_pen_y
,
int
*
pi_start
,
FT_Vector
*
p_result
)
...
...
@@ -1649,9 +1628,9 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
* ie. if the font we have loaded is NOT already in the
* style that the tags want, then switch it on; if they
* are then don't. */
if
(
b_bold
&&
!
(
p_face
->
style_flags
&
FT_STYLE_FLAG_BOLD
))
if
(
(
i_style_flags
&
STYLE_BOLD
)
&&
!
(
p_face
->
style_flags
&
FT_STYLE_FLAG_BOLD
))
FT_GlyphSlot_Embolden
(
p_face
->
glyph
);
if
(
b_italic
&&
!
(
p_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
))
if
(
(
i_style_flags
&
STYLE_ITALIC
)
&&
!
(
p_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
))
FT_GlyphSlot_Oblique
(
p_face
->
glyph
);
i_error
=
FT_Get_Glyph
(
p_face
->
glyph
,
&
tmp_glyph
);
...
...
@@ -1669,7 +1648,7 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
FT_Done_Glyph
(
tmp_glyph
);
continue
;
}
if
(
b_uline
||
b_through
)
if
(
i_style_flags
&
(
STYLE_UNDERLINE
|
STYLE_STRIKEOUT
)
)
{
float
aOffset
=
FT_FLOOR
(
FT_MulFix
(
p_face
->
underline_position
,
p_face
->
size
->
metrics
.
y_scale
));
...
...
@@ -1680,7 +1659,7 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
(
aOffset
<
0
)
?
-
aOffset
:
aOffset
;
p_line
->
pi_underline_thickness
[
i
]
=
(
aSize
<
0
)
?
-
aSize
:
aSize
;
if
(
b_through
)
if
(
i_style_flags
&
STYLE_STRIKEOUT
)
{
/* Move the baseline to make it strikethrough instead of
* underline. That means that strikethrough takes precedence
...
...
@@ -1694,8 +1673,8 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
}
p_line
->
pp_glyphs
[
i
]
=
(
FT_BitmapGlyph
)
tmp_glyph
;
p_line
->
p_fg_rgb
[
i
]
=
i_font_color
&
0x00ffffff
;
p_line
->
p_bg_rgb
[
i
]
=
i_karaoke_bgcolor
&
0x00ffffff
;
p_line
->
p_fg_rgb
[
i
]
=
i_font_color
;
p_line
->
p_bg_rgb
[
i
]
=
i_karaoke_bgcolor
;
p_line
->
p_fg_bg_ratio
[
i
]
=
0x00
;
line
.
xMax
=
p_line
->
p_glyph_pos
[
i
].
x
+
glyph_size
.
xMax
-
...
...
@@ -1780,8 +1759,8 @@ static int RenderTag( filter_t *p_filter, FT_Face p_face, int i_font_color,
static
void
SetupLine
(
filter_t
*
p_filter
,
const
char
*
psz_text_in
,
uint32_t
**
ppsz_text_out
,
uint32_t
*
pi_runs
,
uint32_t
**
ppi_run_lengths
,
f
t_style_t
***
ppp_styles
,
f
t_style_t
*
p_style
)
uint32_t
**
ppi_run_lengths
,
tex
t_style_t
***
ppp_styles
,
tex
t_style_t
*
p_style
)
{
size_t
i_string_length
;
...
...
@@ -1797,11 +1776,11 @@ static void SetupLine( filter_t *p_filter, const char *psz_text_in,
if
(
*
ppp_styles
)
{
*
ppp_styles
=
realloc_or_free
(
*
ppp_styles
,
*
pi_runs
*
sizeof
(
f
t_style_t
*
)
);
*
pi_runs
*
sizeof
(
tex
t_style_t
*
)
);
}
else
if
(
*
pi_runs
==
1
)
{
*
ppp_styles
=
malloc
(
*
pi_runs
*
sizeof
(
f
t_style_t
*
)
);
*
ppp_styles
=
malloc
(
*
pi_runs
*
sizeof
(
tex
t_style_t
*
)
);
}
/* We have just malloc'ed this memory successfully -
...
...
@@ -1834,10 +1813,10 @@ static void SetupLine( filter_t *p_filter, const char *psz_text_in,
/* If we couldn't use the p_style argument due to memory allocation
* problems above, release it here.
*/
DeleteStyl
e
(
p_style
);
text_style_Delet
e
(
p_style
);
}
static
int
CheckForEmbeddedFont
(
filter_sys_t
*
p_sys
,
FT_Face
*
pp_face
,
f
t_style_t
*
p_style
)
static
int
CheckForEmbeddedFont
(
filter_sys_t
*
p_sys
,
FT_Face
*
pp_face
,
tex
t_style_t
*
p_style
)
{
for
(
int
k
=
0
;
k
<
p_sys
->
i_font_attachments
;
k
++
)
{
...
...
@@ -1857,14 +1836,14 @@ static int CheckForEmbeddedFont( filter_sys_t *p_sys, FT_Face *pp_face, ft_style
p_style
->
psz_fontname
);
if
(
p_face
->
style_flags
&
FT_STYLE_FLAG_BOLD
)
match
=
match
&&
p_style
->
b_bold
;
match
&=
(
p_style
->
i_style_flags
&
STYLE_BOLD
)
!=
0
;
else
match
=
match
&&
!
p_style
->
b_bold
;
match
&=
(
p_style
->
i_style_flags
&
STYLE_BOLD
)
==
0
;
if
(
p_face
->
style_flags
&
FT_STYLE_FLAG_ITALIC
)
match
=
match
&&
p_style
->
b_italic
;
match
&=
(
p_style
->
i_style_flags
&
STYLE_ITALIC
)
!=
0
;
else
match
=
match
&&
!
p_style
->
b_italic
;
match
&=
(
p_style
->
i_style_flags
&
STYLE_ITALIC
)
==
0
;
if
(
match
)
{
...
...
@@ -1888,7 +1867,7 @@ static int ProcessNodes( filter_t *p_filter,
uint32_t
*
pi_runs
,
uint32_t
**
ppi_run_lengths
,
f
t_style_t
*
**
ppp_styles
,
tex
t_style_t
*
**
ppp_styles
,
bool
b_karaoke
,
uint32_t
*
pi_k_runs
,
...
...
@@ -2047,7 +2026,7 @@ static int ProcessLines( filter_t *p_filter,
uint32_t
i_runs
,
uint32_t
*
pi_run_lengths
,
f
t_style_t
**
pp_styles
,
tex
t_style_t
**
pp_styles
,
line_desc_t
**
pp_lines
,
FT_Vector
*
p_result
,
...
...
@@ -2058,7 +2037,7 @@ static int ProcessLines( filter_t *p_filter,
uint32_t
*
pi_k_durations
)
{
filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
ft_style_t
**
pp_char_styles
;
text_style_t
**
pp_char_styles
;
int
*
p_new_positions
=
NULL
;
int8_t
*
p_levels
=
NULL
;
uint8_t
*
pi_karaoke_bar
=
NULL
;
...
...
@@ -2069,7 +2048,7 @@ static int ProcessLines( filter_t *p_filter,
* after the characters have been shuffled around by Fribidi, we can re-apply
* the styles, and to simplify the calculation of runs within a line.
*/
pp_char_styles
=
(
ft_style_t
**
)
malloc
(
i_len
*
sizeof
(
f
t_style_t
*
));
pp_char_styles
=
(
text_style_t
**
)
malloc
(
i_len
*
sizeof
(
tex
t_style_t
*
));
if
(
!
pp_char_styles
)
return
VLC_ENOMEM
;
...
...
@@ -2089,13 +2068,12 @@ static int ProcessLines( filter_t *p_filter,
#if defined(HAVE_FRIBIDI)
{
ft_style_t
**
pp_char_styles_new
;
text_style_t
**
pp_char_styles_new
;
int
*
p_old_positions
;
uint32_t
*
p_fribidi_string
;
int
start_pos
,
pos
=
0
;
pp_char_styles_new
=
(
ft_style_t
**
)
malloc
(
i_len
*
sizeof
(
ft_style_t
*
));
pp_char_styles_new
=
(
text_style_t
**
)
malloc
(
i_len
*
sizeof
(
text_style_t
*
));
p_fribidi_string
=
(
uint32_t
*
)
malloc
(
(
i_len
+
1
)
*
sizeof
(
uint32_t
)
);
...
...
@@ -2251,7 +2229,7 @@ static int ProcessLines( filter_t *p_filter,
(
(
k
>
0
)
&&
!
StyleEquals
(
pp_char_styles
[
k
],
pp_char_styles
[
k
-
1
]
)
)
)
{
f
t_style_t
*
p_style
=
pp_char_styles
[
k
-
1
];
tex
t_style_t
*
p_style
=
pp_char_styles
[
k
-
1
];
/* End of the current style run */
FT_Face
p_face
=
NULL
;
...
...
@@ -2267,8 +2245,8 @@ static int ProcessLines( filter_t *p_filter,
#ifdef HAVE_FONTCONFIG
psz_fontfile
=
FontConfig_Select
(
NULL
,
p_style
->
psz_fontname
,
p_style
->
b_bold
,
p_style
->
b_italic
,
(
p_style
->
i_style_flags
&
STYLE_BOLD
)
!=
0
,
(
p_style
->
i_style_flags
&
STYLE_ITALIC
)
!=
0
,
-
1
,
&
i_idx
);
#elif defined( WIN32 )
...
...
@@ -2283,11 +2261,12 @@ static int ProcessLines( filter_t *p_filter,
#endif
if
(
psz_fontfile
&&
!
*
psz_fontfile
)
{
msg_Warn
(
p_filter
,
"We were not able to find a matching font:
\"
%s
\"
%s,"
" so using default font"
,
p_style
->
psz_fontname
,
((
p_style
->
b_bold
&&
p_style
->
b_italic
)
?
"(Bold,Italic)"
:
(
p_style
->
b_bold
?
"(Bold)"
:
(
p_style
->
b_italic
?
"(Italic)"
:
""
)))
);
msg_Warn
(
p_filter
,
"We were not able to find a matching font:
\"
%s
\"
(%s %s),"
" so using default font"
,
p_style
->
psz_fontname
,
(
p_style
->
i_style_flags
&
STYLE_BOLD
)
?
"Bold"
:
""
,
(
p_style
->
i_style_flags
&
STYLE_ITALIC
)
?
"Italic"
:
""
);
free
(
psz_fontfile
);
psz_fontfile
=
NULL
;
}
...
...
@@ -2371,10 +2350,10 @@ static int ProcessLines( filter_t *p_filter,
* need to populate the legacy colour fields also.
*/
p_line
->
b_new_color_mode
=
true
;
p_line
->
i_alpha
=
(
p_style
->
i_font_
color
&
0xff000000
)
>>
24
;
p_line
->
i_alpha
=
(
p_style
->
i_font_
alpha
&
0x000000ff
)
>>
0
;
p_line
->
i_red
=
(
p_style
->
i_font_color
&
0x00ff0000
)
>>
16
;
p_line
->
i_green
=
(
p_style
->
i_font_color
&
0x0000ff00
)
>>
8
;
p_line
->
i_blue
=
(
p_style
->
i_font_color
&
0x000000ff
);
p_line
->
i_blue
=
(
p_style
->
i_font_color
&
0x000000ff
)
>>
0
;
p_line
->
p_next
=
NULL
;
i_pen_x
=
0
;
i_pen_y
+=
tmp_result
.
y
;
...
...
@@ -2386,11 +2365,9 @@ static int ProcessLines( filter_t *p_filter,
}
if
(
RenderTag
(
p_filter
,
p_face
?
p_face
:
p_sys
->
p_face
,
p_style
->
i_font_color
,
p_style
->
b_underline
,
p_style
->
b_through
,
p_style
->
b_bold
,
p_style
->
b_italic
,
p_style
->
i_karaoke_bg_color
,
p_style
->
i_font_color
,
p_style
->
i_style_flags
,
p_style
->
i_karaoke_background_color
,
p_line
,
psz_unicode
,
&
i_pen_x
,
i_pen_y
,
&
i_posn
,
&
tmp_result
)
!=
VLC_SUCCESS
)
{
...
...
@@ -2576,7 +2553,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
uint32_t
*
pi_run_lengths
=
NULL
;
uint32_t
*
pi_k_run_lengths
=
NULL
;
uint32_t
*
pi_k_durations
=
NULL
;
ft_style_t
**
pp_styles
=
NULL
;
text_style_t
**
pp_styles
=
NULL
;
rv
=
ProcessNodes
(
p_filter
,
p_xml_reader
,
p_region_in
->
p_style
,
psz_text
,
&
i_text_length
,
...
...
@@ -2593,7 +2570,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
}
for
(
uint32_t
k
=
0
;
k
<
i_runs
;
k
++
)
DeleteStyl
e
(
pp_styles
[
k
]
);
text_style_Delet
e
(
pp_styles
[
k
]
);
free
(
pp_styles
);
free
(
pi_run_lengths
);
...
...
@@ -2617,7 +2594,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
if
(
VLC_SUCCESS
==
var_Get
(
p_filter
,
"scale"
,
&
val
)
)
i_scale
=
val
.
i_int
;
f
t_style_t
*
p_style
;
tex
t_style_t
*
p_style
;
if
(
p_region_in
->
p_style
)
p_style
=
CreateStyle
(
p_region_in
->
p_style
->
psz_fontname
,
p_region_in
->
p_style
->
i_font_size
*
i_scale
/
1000
,
...
...
@@ -2641,7 +2618,7 @@ static int RenderCommon( filter_t *p_filter, subpicture_region_t *p_region_out,
1
,
&
i_run_length
,
&
p_style
,
&
p_lines
,
&
result
,
false
,
0
,
NULL
,
NULL
);
DeleteStyl
e
(
p_style
);
text_style_Delet
e
(
p_style
);
}
free
(
psz_text
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment