VLC  4.0.0-dev
vlc_text_style.h
Go to the documentation of this file.
1 /*****************************************************************************
2  * vlc_text_style.h: text_style_t definition and helpers.
3  *****************************************************************************
4  * Copyright (C) 1999-2010 VLC authors and VideoLAN
5  *
6  * Authors: Derk-Jan Hartman <hartman _AT_ videolan _DOT_ org>
7  * basOS G <noxelia 4t gmail , com>
8  *
9  * This program is free software; you can redistribute it and/or modify it
10  * under the terms of the GNU Lesser General Public License as published by
11  * the Free Software Foundation; either version 2.1 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23 
24 #ifndef VLC_TEXT_STYLE_H
25 #define VLC_TEXT_STYLE_H 1
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 /**
32  * Text style
33  *
34  * A text style is used to specify the formatting of text.
35  * A font renderer can use the supplied information to render the
36  * text specified.
37  */
38 typedef struct
39 {
40  /* Family font names */
41  char * psz_fontname; /**< The name of the font */
42  char * psz_monofontname; /**< The name of the mono font */
43 
44  uint16_t i_features; /**< Feature flags (means non default) */
45  uint16_t i_style_flags; /**< Formatting style flags */
46 
47  /* Font style */
48  float f_font_relsize; /**< The font size in video height % */
49  int i_font_size; /**< The font size in pixels */
50  int i_font_color; /**< The color of the text 0xRRGGBB
51  (native endianness) */
52  uint8_t i_font_alpha; /**< The transparency of the text.*/
53  int i_spacing; /**< The spaceing between glyphs in pixels */
54 
55  /* Outline */
56  int i_outline_color; /**< The color of the outline 0xRRGGBB */
57  uint8_t i_outline_alpha; /**< The transparency of the outline */
58  int i_outline_width; /**< The width of the outline in pixels */
59 
60  /* Shadow */
61  int i_shadow_color; /**< The color of the shadow 0xRRGGBB */
62  uint8_t i_shadow_alpha; /**< The transparency of the shadow. */
63  int i_shadow_width; /**< The width of the shadow in pixels */
64 
65  /* Background */
66  int i_background_color;/**< The color of the background 0xRRGGBB */
67  uint8_t i_background_alpha;/**< The transparency of the background */
68 
69  /* Line breaking */
70  enum
71  {
72  STYLE_WRAP_DEFAULT = 0, /**< Breaks on whitespace or fallback on char */
73  STYLE_WRAP_CHAR, /**< Breaks at character level only */
74  STYLE_WRAP_NONE, /**< No line breaks (except explicit ones) */
75  } e_wrapinfo;
76 } text_style_t;
77 
78 #define STYLE_ALPHA_OPAQUE 0xFF
79 #define STYLE_ALPHA_TRANSPARENT 0x00
80 
81 /* Features flags for \ref i_features */
82 #define STYLE_NO_DEFAULTS 0x0
83 #define STYLE_FULLY_SET 0xFFFF
84 #define STYLE_HAS_FONT_COLOR (1 << 0)
85 #define STYLE_HAS_FONT_ALPHA (1 << 1)
86 #define STYLE_HAS_FLAGS (1 << 2)
87 #define STYLE_HAS_OUTLINE_COLOR (1 << 3)
88 #define STYLE_HAS_OUTLINE_ALPHA (1 << 4)
89 #define STYLE_HAS_SHADOW_COLOR (1 << 5)
90 #define STYLE_HAS_SHADOW_ALPHA (1 << 6)
91 #define STYLE_HAS_BACKGROUND_COLOR (1 << 7)
92 #define STYLE_HAS_BACKGROUND_ALPHA (1 << 8)
93 #define STYLE_HAS_WRAP_INFO (1 << 9)
94 
95 /* Style flags for \ref text_style_t */
96 #define STYLE_BOLD (1 << 0)
97 #define STYLE_ITALIC (1 << 1)
98 #define STYLE_OUTLINE (1 << 2)
99 #define STYLE_SHADOW (1 << 3)
100 #define STYLE_BACKGROUND (1 << 4)
101 #define STYLE_UNDERLINE (1 << 5)
102 #define STYLE_STRIKEOUT (1 << 6)
103 #define STYLE_HALFWIDTH (1 << 7)
104 #define STYLE_MONOSPACED (1 << 8)
105 #define STYLE_DOUBLEWIDTH (1 << 9)
106 #define STYLE_BLINK_FOREGROUND (1 << 10)
107 #define STYLE_BLINK_BACKGROUND (1 << 11)
109 #define STYLE_DEFAULT_FONT_SIZE 20
110 #define STYLE_DEFAULT_REL_FONT_SIZE 6.25
112 
113 typedef struct text_segment_t text_segment_t;
116 /**
117  * Text segment ruby for subtitles
118  * Each ruby has an anchor to the segment char.
119  */
120 struct text_segment_ruby_t
121 {
122  char *psz_base;
123  char *psz_rt;
125 };
126 
127 /**
128  * Text segment for subtitles
129  *
130  * This structure is used to store a formatted text, with mixed styles
131  * Every segment is comprised of one text and a unique style
132  *
133  * On style change, a new segment is created with the next part of text
134  * and the new style, and chained to the list
135  *
136  * Create with text_segment_New and clean the chain with
137  * text_segment_ChainDelete
138  */
139 struct text_segment_t {
140  char *psz_text; /**< text string of the segment */
141  text_style_t *style; /**< style applied to this segment */
142  text_segment_t *p_next; /**< next segment */
143  text_segment_ruby_t *p_ruby; /**< ruby descriptions */
144 };
145 
146 /**
147  * Create a default text style
148  */
150 
151 /**
152  * Create a text style
153  *
154  * Give STYLE_NO_DEFAULTS as the argument if you want only the zero-filled
155  * object. Give STYLE_FULLY_SET (or anything other than STYLE_NO_DEFAULTS)
156  * if you want an object with sensible defaults. (The value is not stored,
157  * the only effect is to determine whether to return a zero-filled or
158  * sensible-defaults-filled object).
159  */
161 
162 /**
163  * Copy a text style into another
164  */
166 
167 /**
168  * Duplicate a text style
169  */
171 
172 /**
173  * Merge two styles using non default values
174  *
175  * Set b_override to true if you also want to overwrite non-defaults
176  */
177 VLC_API void text_style_Merge( text_style_t *, const text_style_t *, bool b_override );
178 
179 /**
180  * Delete a text style created by text_style_New or text_style_Duplicate
181  */
183 
184 /**
185  * This function will create a new text segment.
186  *
187  * You should use text_segment_ChainDelete to destroy it, to clean all
188  * the linked segments, or text_segment_Delete to free a specic one
189  *
190  * This duplicates the string passed as argument
191  */
192 VLC_API text_segment_t *text_segment_New( const char * );
193 
194 /**
195  * This function will create a new text segment and duplicates the style passed as argument
196  *
197  * You should use text_segment_ChainDelete to destroy it, to clean all
198  * the linked segments, or text_segment_Delete to free a specic one
199  *
200  * This doesn't initialize the text.
201  */
203 
204 /**
205  * Delete a text segment and its content.
206  *
207  * This assumes the segment is not part of a chain
208  */
210 
211 /**
212  * This function will destroy a list of text segments allocated
213  * by text_segment_New.
214  *
215  * You may pass it NULL.
216  */
218 
219 /**
220  * This function will copy a text_segment and its chain into a new one
221  *
222  * You may give it NULL, but it will return NULL.
223  */
225 
226 /**
227  * This function will create a ruby section for a text_segment
228  *
229  */
231  const char *psz_rt );
232 
233 /**
234  * Deletes a ruby sections chain
235  */
237 
238 /**
239  * This function creates a text segment from a ruby section,
240  * and creates fallback string.
241  */
243 
244 /**
245  * Returns an integer representation of an HTML color.
246  *
247  * @param psz_value An HTML color, which can be either:
248  * - A standard HTML color (red, cyan, ...) as defined in p_html_colors
249  * - An hexadecimal color, of the form [#][AA]RRGGBB
250  * @param ok If non-null, true will be stored in this pointer to signal
251  * a successful conversion
252  */
253 VLC_API unsigned int vlc_html_color( const char *psz_value, bool* ok );
254 
255 #ifdef __cplusplus
256 }
257 #endif
258 
259 #endif /* VLC_TEXT_STYLE_H */
text_segment_ruby_t * text_segment_ruby_New(const char *psz_base, const char *psz_rt)
This function will create a ruby section for a text_segment.
Definition: text_style.c:341
text_segment_t * text_segment_NewInheritStyle(const text_style_t *p_style)
This function will create a new text segment and duplicates the style passed as argument.
Definition: text_style.c:384
text_segment_t * text_segment_Copy(text_segment_t *)
This function will copy a text_segment and its chain into a new one.
Definition: text_style.c:444
char * psz_rt
Definition: vlc_text_style.h:124
text_segment_t * text_segment_New(const char *)
This function will create a new text segment.
Definition: text_style.c:372
text_style_t * text_style_New(void)
Create a default text style.
Definition: text_style.c:208
void text_segment_Delete(text_segment_t *)
Delete a text segment and its content.
Definition: text_style.c:421
void text_style_Delete(text_style_t *)
Delete a text style created by text_style_New or text_style_Duplicate.
Definition: text_style.c:320
Text style.
Definition: vlc_text_style.h:39
char psz_value[8]
Definition: vout_intf.c:99
text_style_t * text_style_Create(int)
Create a text style.
Definition: text_style.c:213
Text segment for subtitles.
Definition: vlc_text_style.h:140
#define VLC_API
Definition: fourcc_gen.c:31
unsigned int vlc_html_color(const char *psz_value, bool *ok)
Returns an integer representation of an HTML color.
Definition: text_style.c:473
text_style_t * text_style_Copy(text_style_t *, const text_style_t *)
Copy a text style into another.
Definition: text_style.c:245
void text_segment_ruby_ChainDelete(text_segment_ruby_t *p_ruby)
Deletes a ruby sections chain.
Definition: text_style.c:329
char * psz_base
Definition: vlc_text_style.h:123
text_segment_ruby_t * p_next
Definition: vlc_text_style.h:125
text_style_t * text_style_Duplicate(const text_style_t *)
Duplicate a text style.
Definition: text_style.c:309
void text_segment_ChainDelete(text_segment_t *)
This function will destroy a list of text segments allocated by text_segment_New. ...
Definition: text_style.c:432
void text_style_Merge(text_style_t *, const text_style_t *, bool b_override)
Merge two styles using non default values.
Definition: text_style.c:270
Text segment ruby for subtitles Each ruby has an anchor to the segment char.
Definition: vlc_text_style.h:121
text_segment_t * text_segment_FromRuby(text_segment_ruby_t *p_ruby)
This function creates a text segment from a ruby section, and creates fallback string.
Definition: text_style.c:400