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
e2da2cb0
Commit
e2da2cb0
authored
Aug 24, 2007
by
Bernie Purcell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
RGB and alpha --> ARGB - similar to freetype.c
Remove an imbrication in XML parsing, again similar to freetype.c
parent
69b82164
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
101 additions
and
89 deletions
+101
-89
modules/misc/quartztext.c
modules/misc/quartztext.c
+101
-89
No files found.
modules/misc/quartztext.c
View file @
e2da2cb0
...
@@ -63,7 +63,7 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
...
@@ -63,7 +63,7 @@ static int RenderYUVA( filter_t *p_filter, subpicture_region_t *p_region,
uint32_t
i_runs
,
uint32_t
*
pi_run_lengths
,
uint32_t
i_runs
,
uint32_t
*
pi_run_lengths
,
ATSUStyle
*
pp_styles
);
ATSUStyle
*
pp_styles
);
static
ATSUStyle
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
static
ATSUStyle
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
int
i_font_color
,
int
i_font_alpha
,
uint32_t
i_font_color
,
vlc_bool_t
b_bold
,
vlc_bool_t
b_italic
,
vlc_bool_t
b_bold
,
vlc_bool_t
b_italic
,
vlc_bool_t
b_uline
);
vlc_bool_t
b_uline
);
//////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
...
@@ -91,8 +91,7 @@ struct font_stack_t
...
@@ -91,8 +91,7 @@ struct font_stack_t
{
{
char
*
psz_name
;
char
*
psz_name
;
int
i_size
;
int
i_size
;
int
i_color
;
uint32_t
i_color
;
int
i_alpha
;
font_stack_t
*
p_next
;
font_stack_t
*
p_next
;
};
};
...
@@ -382,7 +381,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
...
@@ -382,7 +381,8 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
if
(
psz_utf16_str
!=
NULL
)
if
(
psz_utf16_str
!=
NULL
)
{
{
ATSUStyle
p_style
=
CreateStyle
(
p_sys
->
psz_font_name
,
i_font_size
,
ATSUStyle
p_style
=
CreateStyle
(
p_sys
->
psz_font_name
,
i_font_size
,
i_font_color
,
i_font_alpha
,
(
i_font_color
&
0xfffffff
)
|
((
i_font_alpha
&
0xff
)
<<
24
),
VLC_FALSE
,
VLC_FALSE
,
VLC_FALSE
);
VLC_FALSE
,
VLC_FALSE
,
VLC_FALSE
);
if
(
p_style
)
if
(
p_style
)
{
{
...
@@ -398,7 +398,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
...
@@ -398,7 +398,7 @@ static int RenderText( filter_t *p_filter, subpicture_region_t *p_region_out,
}
}
static
ATSUStyle
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
int
i_font_color
,
int
i_font_alpha
,
static
ATSUStyle
CreateStyle
(
char
*
psz_fontname
,
int
i_font_size
,
uint32_t
i_font_color
,
vlc_bool_t
b_bold
,
vlc_bool_t
b_italic
,
vlc_bool_t
b_uline
)
vlc_bool_t
b_bold
,
vlc_bool_t
b_italic
,
vlc_bool_t
b_uline
)
{
{
ATSUStyle
p_style
;
ATSUStyle
p_style
;
...
@@ -408,7 +408,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
...
@@ -408,7 +408,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
float
f_red
=
(
float
)((
i_font_color
&
0x00FF0000
)
>>
16
)
/
255
.
0
;
float
f_red
=
(
float
)((
i_font_color
&
0x00FF0000
)
>>
16
)
/
255
.
0
;
float
f_green
=
(
float
)((
i_font_color
&
0x0000FF00
)
>>
8
)
/
255
.
0
;
float
f_green
=
(
float
)((
i_font_color
&
0x0000FF00
)
>>
8
)
/
255
.
0
;
float
f_blue
=
(
float
)(
i_font_color
&
0x000000FF
)
/
255
.
0
;
float
f_blue
=
(
float
)(
i_font_color
&
0x000000FF
)
/
255
.
0
;
float
f_alpha
=
(
255
.
0
-
(
float
)
i_font_alpha
)
/
255
.
0
;
float
f_alpha
=
(
255
.
0
-
(
float
)
((
i_font_color
&
0xFF000000
)
>>
24
)
)
/
255
.
0
;
ATSUFontID
font
;
ATSUFontID
font
;
Fixed
font_size
=
IntToFixed
(
i_font_size
);
Fixed
font_size
=
IntToFixed
(
i_font_size
);
...
@@ -451,7 +451,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
...
@@ -451,7 +451,7 @@ static ATSUStyle CreateStyle( char *psz_fontname, int i_font_size, int i_font_co
}
}
static
int
PushFont
(
font_stack_t
**
p_font
,
const
char
*
psz_name
,
int
i_size
,
static
int
PushFont
(
font_stack_t
**
p_font
,
const
char
*
psz_name
,
int
i_size
,
int
i_color
,
int
i_alpha
)
uint32_t
i_color
)
{
{
font_stack_t
*
p_new
;
font_stack_t
*
p_new
;
...
@@ -471,7 +471,6 @@ static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size,
...
@@ -471,7 +471,6 @@ static int PushFont( font_stack_t **p_font, const char *psz_name, int i_size,
p_new
->
i_size
=
i_size
;
p_new
->
i_size
=
i_size
;
p_new
->
i_color
=
i_color
;
p_new
->
i_color
=
i_color
;
p_new
->
i_alpha
=
i_alpha
;
if
(
!*
p_font
)
if
(
!*
p_font
)
{
{
...
@@ -518,7 +517,7 @@ static int PopFont( font_stack_t **p_font )
...
@@ -518,7 +517,7 @@ static int PopFont( font_stack_t **p_font )
}
}
static
int
PeekFont
(
font_stack_t
**
p_font
,
char
**
psz_name
,
int
*
i_size
,
static
int
PeekFont
(
font_stack_t
**
p_font
,
char
**
psz_name
,
int
*
i_size
,
int
*
i_color
,
int
*
i_alpha
)
uint32_t
*
i_color
)
{
{
font_stack_t
*
p_last
;
font_stack_t
*
p_last
;
...
@@ -533,7 +532,6 @@ static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size,
...
@@ -533,7 +532,6 @@ static int PeekFont( font_stack_t **p_font, char **psz_name, int *i_size,
*
psz_name
=
p_last
->
psz_name
;
*
psz_name
=
p_last
->
psz_name
;
*
i_size
=
p_last
->
i_size
;
*
i_size
=
p_last
->
i_size
;
*
i_color
=
p_last
->
i_color
;
*
i_color
=
p_last
->
i_color
;
*
i_alpha
=
p_last
->
i_alpha
;
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
...
@@ -543,23 +541,102 @@ static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys, font_stack_t **p_fo
...
@@ -543,23 +541,102 @@ static ATSUStyle GetStyleFromFontStack( filter_sys_t *p_sys, font_stack_t **p_fo
{
{
ATSUStyle
p_style
=
NULL
;
ATSUStyle
p_style
=
NULL
;
char
*
psz_fontname
=
NULL
;
char
*
psz_fontname
=
NULL
;
int
i_font_color
=
p_sys
->
i_font_color
;
uint32_t
i_font_color
=
p_sys
->
i_font_color
;
int
i_font_alpha
=
0
;
int
i_font_size
=
p_sys
->
i_font_size
;
int
i_font_size
=
p_sys
->
i_font_size
;
if
(
VLC_SUCCESS
==
PeekFont
(
p_fonts
,
&
psz_fontname
,
&
i_font_size
,
&
i_font_color
,
&
i_font_alpha
)
)
if
(
VLC_SUCCESS
==
PeekFont
(
p_fonts
,
&
psz_fontname
,
&
i_font_size
,
&
i_font_color
)
)
{
{
p_style
=
CreateStyle
(
psz_fontname
,
i_font_size
,
i_font_color
,
i_font_alpha
,
p_style
=
CreateStyle
(
psz_fontname
,
i_font_size
,
i_font_color
,
b_bold
,
b_italic
,
b_uline
);
b_bold
,
b_italic
,
b_uline
);
}
}
return
p_style
;
return
p_style
;
}
}
static
int
ProcessNodes
(
filter_t
*
p_filter
,
xml_reader_t
*
p_xml_reader
,
static
int
HandleFontAttributes
(
xml_reader_t
*
p_xml_reader
,
text_style_t
*
p_font_style
,
UniChar
*
psz_text
,
int
*
pi_len
,
font_stack_t
**
p_fonts
)
uint32_t
*
pi_runs
,
uint32_t
**
ppi_run_lengths
,
{
ATSUStyle
**
ppp_styles
)
int
rv
;
char
*
psz_fontname
=
NULL
;
uint32_t
i_font_color
=
0xffffff
;
int
i_font_alpha
=
0
;
int
i_font_size
=
24
;
// Default all attributes to the top font in the stack -- in case not
// all attributes are specified in the sub-font
if
(
VLC_SUCCESS
==
PeekFont
(
p_fonts
,
&
psz_fontname
,
&
i_font_size
,
&
i_font_color
))
{
psz_fontname
=
strdup
(
psz_fontname
);
}
i_font_alpha
=
(
i_font_color
>>
24
)
&
0xff
;
i_font_color
&=
0x00ffffff
;
while
(
xml_ReaderNextAttr
(
p_xml_reader
)
==
VLC_SUCCESS
)
{
char
*
psz_name
=
xml_ReaderName
(
p_xml_reader
);
char
*
psz_value
=
xml_ReaderValue
(
p_xml_reader
);
if
(
psz_name
&&
psz_value
)
{
if
(
!
strcasecmp
(
"face"
,
psz_name
)
)
{
if
(
psz_fontname
)
free
(
psz_fontname
);
psz_fontname
=
strdup
(
psz_value
);
}
else
if
(
!
strcasecmp
(
"size"
,
psz_name
)
)
{
if
(
(
*
psz_value
==
'+'
)
||
(
*
psz_value
==
'-'
)
)
{
int
i_value
=
atoi
(
psz_value
);
if
(
(
i_value
>=
-
5
)
&&
(
i_value
<=
5
)
)
i_font_size
+=
(
i_value
*
i_font_size
)
/
10
;
else
if
(
i_value
<
-
5
)
i_font_size
=
-
i_value
;
else
if
(
i_value
>
5
)
i_font_size
=
i_value
;
}
else
i_font_size
=
atoi
(
psz_value
);
}
else
if
(
!
strcasecmp
(
"color"
,
psz_name
)
&&
(
psz_value
[
0
]
==
'#'
)
)
{
i_font_color
=
strtol
(
psz_value
+
1
,
NULL
,
16
);
i_font_color
&=
0x00ffffff
;
}
else
if
(
!
strcasecmp
(
"alpha"
,
psz_name
)
&&
(
psz_value
[
0
]
==
'#'
)
)
{
i_font_alpha
=
strtol
(
psz_value
+
1
,
NULL
,
16
);
i_font_alpha
&=
0xff
;
}
free
(
psz_name
);
free
(
psz_value
);
}
}
rv
=
PushFont
(
p_fonts
,
psz_fontname
,
i_font_size
,
(
i_font_color
&
0xffffff
)
|
((
i_font_alpha
&
0xff
)
<<
24
));
free
(
psz_fontname
);
return
rv
;
}
static
int
ProcessNodes
(
filter_t
*
p_filter
,
xml_reader_t
*
p_xml_reader
,
text_style_t
*
p_font_style
,
UniChar
*
psz_text
,
int
*
pi_len
,
uint32_t
*
pi_runs
,
uint32_t
**
ppi_run_lengths
,
ATSUStyle
**
ppp_styles
)
{
{
filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
filter_sys_t
*
p_sys
=
p_filter
->
p_sys
;
UniChar
*
psz_text_orig
=
psz_text
;
UniChar
*
psz_text_orig
=
psz_text
;
...
@@ -577,8 +654,8 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
...
@@ -577,8 +654,8 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
rv
=
PushFont
(
&
p_fonts
,
rv
=
PushFont
(
&
p_fonts
,
p_font_style
->
psz_fontname
,
p_font_style
->
psz_fontname
,
p_font_style
->
i_font_size
,
p_font_style
->
i_font_size
,
p_font_style
->
i_font_color
,
(
p_font_style
->
i_font_color
&
0xffffff
)
|
p_font_style
->
i_font_alpha
);
((
p_font_style
->
i_font_alpha
&
0xff
)
<<
24
)
);
if
(
p_font_style
->
i_style_flags
&
STYLE_BOLD
)
if
(
p_font_style
->
i_style_flags
&
STYLE_BOLD
)
b_bold
=
VLC_TRUE
;
b_bold
=
VLC_TRUE
;
...
@@ -592,7 +669,7 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
...
@@ -592,7 +669,7 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
rv
=
PushFont
(
&
p_fonts
,
rv
=
PushFont
(
&
p_fonts
,
p_sys
->
psz_font_name
,
p_sys
->
psz_font_name
,
p_sys
->
i_font_size
,
p_sys
->
i_font_size
,
p_sys
->
i_font_color
,
0
);
p_sys
->
i_font_color
);
}
}
if
(
rv
!=
VLC_SUCCESS
)
if
(
rv
!=
VLC_SUCCESS
)
return
rv
;
return
rv
;
...
@@ -625,78 +702,13 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
...
@@ -625,78 +702,13 @@ static int ProcessNodes( filter_t *p_filter, xml_reader_t *p_xml_reader,
if
(
psz_node
)
if
(
psz_node
)
{
{
if
(
!
strcasecmp
(
"font"
,
psz_node
)
)
if
(
!
strcasecmp
(
"font"
,
psz_node
)
)
{
rv
=
HandleFontAttributes
(
p_xml_reader
,
&
p_fonts
);
char
*
psz_fontname
=
NULL
;
int
i_font_color
=
0xffffff
;
int
i_font_alpha
=
0
;
int
i_font_size
=
24
;
// Default all attributes to the top font in the stack -- in case not
// all attributes are specified in the sub-font
if
(
VLC_SUCCESS
==
PeekFont
(
&
p_fonts
,
&
psz_fontname
,
&
i_font_size
,
&
i_font_color
,
&
i_font_alpha
))
{
psz_fontname
=
strdup
(
psz_fontname
);
}
while
(
xml_ReaderNextAttr
(
p_xml_reader
)
==
VLC_SUCCESS
)
{
char
*
psz_name
=
xml_ReaderName
(
p_xml_reader
);
char
*
psz_value
=
xml_ReaderValue
(
p_xml_reader
);
if
(
psz_name
&&
psz_value
)
{
if
(
!
strcasecmp
(
"face"
,
psz_name
)
)
{
if
(
psz_fontname
)
free
(
psz_fontname
);
psz_fontname
=
strdup
(
psz_value
);
}
else
if
(
!
strcasecmp
(
"size"
,
psz_name
)
)
{
if
(
(
*
psz_value
==
'+'
)
||
(
*
psz_value
==
'-'
)
)
{
int
i_value
=
atoi
(
psz_value
);
if
(
(
i_value
>=
-
5
)
&&
(
i_value
<=
5
)
)
i_font_size
+=
(
i_value
*
i_font_size
)
/
10
;
else
if
(
i_value
<
-
5
)
i_font_size
=
-
i_value
;
else
if
(
i_value
>
5
)
i_font_size
=
i_value
;
}
else
i_font_size
=
atoi
(
psz_value
);
}
else
if
(
!
strcasecmp
(
"color"
,
psz_name
)
&&
(
psz_value
[
0
]
==
'#'
)
)
{
i_font_color
=
strtol
(
psz_value
+
1
,
NULL
,
16
);
i_font_color
&=
0x00ffffff
;
}
else
if
(
!
strcasecmp
(
"alpha"
,
psz_name
)
&&
(
psz_value
[
0
]
==
'#'
)
)
{
i_font_alpha
=
strtol
(
psz_value
+
1
,
NULL
,
16
);
i_font_alpha
&=
0xff
;
}
free
(
psz_name
);
free
(
psz_value
);
}
}
PushFont
(
&
p_fonts
,
psz_fontname
,
i_font_size
,
i_font_color
,
i_font_alpha
);
free
(
psz_fontname
);
}
else
if
(
!
strcasecmp
(
"b"
,
psz_node
)
)
else
if
(
!
strcasecmp
(
"b"
,
psz_node
)
)
{
b_bold
=
VLC_TRUE
;
b_bold
=
VLC_TRUE
;
}
else
if
(
!
strcasecmp
(
"i"
,
psz_node
)
)
else
if
(
!
strcasecmp
(
"i"
,
psz_node
)
)
{
b_italic
=
VLC_TRUE
;
b_italic
=
VLC_TRUE
;
}
else
if
(
!
strcasecmp
(
"u"
,
psz_node
)
)
else
if
(
!
strcasecmp
(
"u"
,
psz_node
)
)
{
b_uline
=
VLC_TRUE
;
b_uline
=
VLC_TRUE
;
}
else
if
(
!
strcasecmp
(
"br"
,
psz_node
)
)
else
if
(
!
strcasecmp
(
"br"
,
psz_node
)
)
{
{
uint32_t
i_string_length
;
uint32_t
i_string_length
;
...
...
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