2 * Copyright 2012 Nikolay Sivov for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
22 #include "wine/debug.h"
23 #include "wine/heap.h"
24 #include "wine/list.h"
25 #include "wine/unicode.h"
27 #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
29 static const DWRITE_MATRIX identity
=
36 static inline LPWSTR
heap_strdupW(const WCHAR
*str
)
43 size
= (strlenW(str
)+1)*sizeof(WCHAR
);
44 ret
= heap_alloc(size
);
46 memcpy(ret
, str
, size
);
52 static inline LPWSTR
heap_strdupnW(const WCHAR
*str
, UINT32 len
)
58 ret
= heap_alloc((len
+1)*sizeof(WCHAR
));
61 memcpy(ret
, str
, len
*sizeof(WCHAR
));
69 static inline const char *debugstr_range(const DWRITE_TEXT_RANGE
*range
)
71 return wine_dbg_sprintf("%u:%u", range
->startPosition
, range
->length
);
74 static inline const char *debugstr_matrix(const DWRITE_MATRIX
*m
)
76 if (!m
) return "(null)";
77 return wine_dbg_sprintf("{%.2f,%.2f,%.2f,%.2f,%.2f,%.2f}", m
->m11
, m
->m12
, m
->m21
, m
->m22
,
81 const char *debugstr_sa_script(UINT16
) DECLSPEC_HIDDEN
;
83 static inline unsigned short get_table_entry(const unsigned short *table
, WCHAR ch
)
85 return table
[table
[table
[ch
>> 8] + ((ch
>> 4) & 0x0f)] + (ch
& 0xf)];
88 static inline FLOAT
get_scaled_advance_width(INT32 advance
, FLOAT emSize
, const DWRITE_FONT_METRICS
*metrics
)
90 return (FLOAT
)advance
* emSize
/ (FLOAT
)metrics
->designUnitsPerEm
;
93 static inline BOOL
is_simulation_valid(DWRITE_FONT_SIMULATIONS simulations
)
95 return (simulations
& ~(DWRITE_FONT_SIMULATIONS_NONE
| DWRITE_FONT_SIMULATIONS_BOLD
|
96 DWRITE_FONT_SIMULATIONS_OBLIQUE
)) == 0;
99 struct textlayout_desc
101 IDWriteFactory5
*factory
;
104 IDWriteTextFormat
*format
;
107 BOOL is_gdi_compatible
;
108 /* fields below are only meaningful for gdi-compatible layout */
110 const DWRITE_MATRIX
*transform
;
111 BOOL use_gdi_natural
;
114 struct glyphrunanalysis_desc
116 const DWRITE_GLYPH_RUN
*run
;
117 const DWRITE_MATRIX
*transform
;
118 DWRITE_RENDERING_MODE1 rendering_mode
;
119 DWRITE_MEASURING_MODE measuring_mode
;
120 DWRITE_GRID_FIT_MODE gridfit_mode
;
121 DWRITE_TEXT_ANTIALIAS_MODE aa_mode
;
129 IDWriteFactory5
*factory
;
130 DWRITE_FONT_FACE_TYPE face_type
;
131 IDWriteFontFile
* const *files
;
132 IDWriteFontFileStream
*stream
;
135 DWRITE_FONT_SIMULATIONS simulations
;
136 struct dwrite_font_data
*font_data
; /* could be NULL when face is created directly with IDWriteFactory::CreateFontFace() */
139 struct fontfacecached
142 IDWriteFontFace4
*fontface
;
145 extern HRESULT
create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD
,const WCHAR
*locale
,BOOL
,IDWriteNumberSubstitution
**) DECLSPEC_HIDDEN
;
146 extern HRESULT
create_textformat(const WCHAR
*,IDWriteFontCollection
*,DWRITE_FONT_WEIGHT
,DWRITE_FONT_STYLE
,DWRITE_FONT_STRETCH
,
147 FLOAT
,const WCHAR
*,IDWriteTextFormat
**) DECLSPEC_HIDDEN
;
148 extern HRESULT
create_textlayout(const struct textlayout_desc
*,IDWriteTextLayout
**) DECLSPEC_HIDDEN
;
149 extern HRESULT
create_trimmingsign(IDWriteFactory5
*,IDWriteTextFormat
*,IDWriteInlineObject
**) DECLSPEC_HIDDEN
;
150 extern HRESULT
create_typography(IDWriteTypography
**) DECLSPEC_HIDDEN
;
151 extern HRESULT
create_localizedstrings(IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
152 extern HRESULT
add_localizedstring(IDWriteLocalizedStrings
*,const WCHAR
*,const WCHAR
*) DECLSPEC_HIDDEN
;
153 extern HRESULT
clone_localizedstring(IDWriteLocalizedStrings
*iface
, IDWriteLocalizedStrings
**strings
) DECLSPEC_HIDDEN
;
154 extern void set_en_localizedstring(IDWriteLocalizedStrings
*,const WCHAR
*) DECLSPEC_HIDDEN
;
155 extern HRESULT
get_system_fontcollection(IDWriteFactory5
*,IDWriteFontCollection1
**) DECLSPEC_HIDDEN
;
156 extern HRESULT
get_eudc_fontcollection(IDWriteFactory5
*,IDWriteFontCollection1
**) DECLSPEC_HIDDEN
;
157 extern IDWriteTextAnalyzer
*get_text_analyzer(void) DECLSPEC_HIDDEN
;
158 extern HRESULT
create_font_file(IDWriteFontFileLoader
*loader
, const void *reference_key
, UINT32 key_size
, IDWriteFontFile
**font_file
) DECLSPEC_HIDDEN
;
159 extern void init_local_fontfile_loader(void) DECLSPEC_HIDDEN
;
160 extern IDWriteFontFileLoader
*get_local_fontfile_loader(void) DECLSPEC_HIDDEN
;
161 extern HRESULT
create_fontface(const struct fontface_desc
*,struct list
*,IDWriteFontFace4
**) DECLSPEC_HIDDEN
;
162 extern HRESULT
create_font_collection(IDWriteFactory5
*,IDWriteFontFileEnumerator
*,BOOL
,IDWriteFontCollection1
**) DECLSPEC_HIDDEN
;
163 extern HRESULT
create_glyphrunanalysis(const struct glyphrunanalysis_desc
*,IDWriteGlyphRunAnalysis
**) DECLSPEC_HIDDEN
;
164 extern BOOL
is_system_collection(IDWriteFontCollection
*) DECLSPEC_HIDDEN
;
165 extern HRESULT
get_local_refkey(const WCHAR
*,const FILETIME
*,void**,UINT32
*) DECLSPEC_HIDDEN
;
166 extern HRESULT
get_filestream_from_file(IDWriteFontFile
*,IDWriteFontFileStream
**) DECLSPEC_HIDDEN
;
167 extern BOOL
is_face_type_supported(DWRITE_FONT_FACE_TYPE
) DECLSPEC_HIDDEN
;
168 extern HRESULT
get_family_names_from_stream(IDWriteFontFileStream
*,UINT32
,DWRITE_FONT_FACE_TYPE
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
169 extern HRESULT
create_colorglyphenum(FLOAT
,FLOAT
,const DWRITE_GLYPH_RUN
*,const DWRITE_GLYPH_RUN_DESCRIPTION
*,DWRITE_MEASURING_MODE
,
170 const DWRITE_MATRIX
*,UINT32
,IDWriteColorGlyphRunEnumerator
**) DECLSPEC_HIDDEN
;
171 extern BOOL
lb_is_newline_char(WCHAR
) DECLSPEC_HIDDEN
;
172 extern HRESULT
create_system_fontfallback(IDWriteFactory5
*,IDWriteFontFallback
**) DECLSPEC_HIDDEN
;
173 extern void release_system_fontfallback(IDWriteFontFallback
*) DECLSPEC_HIDDEN
;
174 extern HRESULT
create_fontfallback_builder(IDWriteFactory5
*,IDWriteFontFallbackBuilder
**) DECLSPEC_HIDDEN
;
175 extern HRESULT
create_matching_font(IDWriteFontCollection
*,const WCHAR
*,DWRITE_FONT_WEIGHT
,DWRITE_FONT_STYLE
,DWRITE_FONT_STRETCH
,
176 IDWriteFont
**) DECLSPEC_HIDDEN
;
177 extern HRESULT
create_fontfacereference(IDWriteFactory5
*,IDWriteFontFile
*,UINT32
,DWRITE_FONT_SIMULATIONS
,
178 IDWriteFontFaceReference
**) DECLSPEC_HIDDEN
;
179 extern HRESULT
factory_get_cached_fontface(IDWriteFactory5
*,IDWriteFontFile
*const*,UINT32
,DWRITE_FONT_SIMULATIONS
,
180 struct list
**,REFIID
,void**) DECLSPEC_HIDDEN
;
181 extern void factory_detach_fontcollection(IDWriteFactory5
*,IDWriteFontCollection1
*) DECLSPEC_HIDDEN
;
182 extern void factory_detach_gdiinterop(IDWriteFactory5
*,IDWriteGdiInterop1
*) DECLSPEC_HIDDEN
;
183 extern struct fontfacecached
*factory_cache_fontface(IDWriteFactory5
*,struct list
*,IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
184 extern void get_logfont_from_font(IDWriteFont
*,LOGFONTW
*) DECLSPEC_HIDDEN
;
185 extern void get_logfont_from_fontface(IDWriteFontFace
*,LOGFONTW
*) DECLSPEC_HIDDEN
;
186 extern HRESULT
get_fontsig_from_font(IDWriteFont
*,FONTSIGNATURE
*) DECLSPEC_HIDDEN
;
187 extern HRESULT
get_fontsig_from_fontface(IDWriteFontFace
*,FONTSIGNATURE
*) DECLSPEC_HIDDEN
;
188 extern HRESULT
create_gdiinterop(IDWriteFactory5
*,IDWriteGdiInterop1
**) DECLSPEC_HIDDEN
;
189 extern void fontface_detach_from_cache(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
190 extern void factory_lock(IDWriteFactory5
*) DECLSPEC_HIDDEN
;
191 extern void factory_unlock(IDWriteFactory5
*) DECLSPEC_HIDDEN
;
192 extern HRESULT
create_inmemory_fileloader(IDWriteFontFileLoader
**) DECLSPEC_HIDDEN
;
194 /* Opentype font table functions */
195 struct dwrite_font_props
{
196 DWRITE_FONT_STYLE style
;
197 DWRITE_FONT_STRETCH stretch
;
198 DWRITE_FONT_WEIGHT weight
;
199 DWRITE_PANOSE panose
;
200 FONTSIGNATURE fontsig
;
204 struct file_stream_desc
{
205 IDWriteFontFileStream
*stream
;
206 DWRITE_FONT_FACE_TYPE face_type
;
210 extern HRESULT
opentype_analyze_font(IDWriteFontFileStream
*,BOOL
*,DWRITE_FONT_FILE_TYPE
*,DWRITE_FONT_FACE_TYPE
*,UINT32
*) DECLSPEC_HIDDEN
;
211 extern HRESULT
opentype_get_font_table(struct file_stream_desc
*,UINT32
,const void**,void**,UINT32
*,BOOL
*) DECLSPEC_HIDDEN
;
212 extern HRESULT
opentype_cmap_get_unicode_ranges(void*,UINT32
,DWRITE_UNICODE_RANGE
*,UINT32
*) DECLSPEC_HIDDEN
;
213 extern void opentype_get_font_properties(struct file_stream_desc
*,struct dwrite_font_props
*) DECLSPEC_HIDDEN
;
214 extern void opentype_get_font_metrics(struct file_stream_desc
*,DWRITE_FONT_METRICS1
*,DWRITE_CARET_METRICS
*) DECLSPEC_HIDDEN
;
215 extern HRESULT
opentype_get_font_info_strings(const void*,DWRITE_INFORMATIONAL_STRING_ID
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
216 extern HRESULT
opentype_get_font_familyname(struct file_stream_desc
*,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
217 extern HRESULT
opentype_get_font_facename(struct file_stream_desc
*,WCHAR
*,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
218 extern HRESULT
opentype_get_typographic_features(IDWriteFontFace
*,UINT32
,UINT32
,UINT32
,UINT32
*,DWRITE_FONT_FEATURE_TAG
*) DECLSPEC_HIDDEN
;
219 extern BOOL
opentype_get_vdmx_size(const void*,INT
,UINT16
*,UINT16
*) DECLSPEC_HIDDEN
;
220 extern UINT32
opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN
;
221 extern UINT32
opentype_get_cpal_paletteentrycount(const void*) DECLSPEC_HIDDEN
;
222 extern HRESULT
opentype_get_cpal_entries(const void*,UINT32
,UINT32
,UINT32
,DWRITE_COLOR_F
*) DECLSPEC_HIDDEN
;
223 extern BOOL
opentype_has_vertical_variants(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
224 extern UINT32
opentype_get_glyph_image_formats(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
225 extern DWRITE_CONTAINER_TYPE
opentype_analyze_container_type(void const *, UINT32
) DECLSPEC_HIDDEN
;
227 struct dwrite_colorglyph
{
228 USHORT layer
; /* [0, num_layers) index indicating current layer */
229 /* base glyph record data, set once on initialization */
232 /* current layer record data, updated every time glyph is switched to next layer */
234 UINT16 palette_index
;
237 extern HRESULT
opentype_get_colr_glyph(const void*,UINT16
,struct dwrite_colorglyph
*) DECLSPEC_HIDDEN
;
238 extern void opentype_colr_next_glyph(const void*,struct dwrite_colorglyph
*) DECLSPEC_HIDDEN
;
241 GASP_GRIDFIT
= 0x0001,
242 GASP_DOGRAY
= 0x0002,
243 GASP_SYMMETRIC_GRIDFIT
= 0x0004,
244 GASP_SYMMETRIC_SMOOTHING
= 0x0008,
247 extern WORD
opentype_get_gasp_flags(const WORD
*,UINT32
,INT
) DECLSPEC_HIDDEN
;
250 extern HRESULT
bidi_computelevels(const WCHAR
*,UINT32
,UINT8
,UINT8
*,UINT8
*) DECLSPEC_HIDDEN
;
251 extern WCHAR
bidi_get_mirrored_char(WCHAR
) DECLSPEC_HIDDEN
;
253 /* FreeType integration */
254 struct dwrite_glyphbitmap
{
255 IDWriteFontFace4
*fontface
;
267 extern BOOL
init_freetype(void) DECLSPEC_HIDDEN
;
268 extern void release_freetype(void) DECLSPEC_HIDDEN
;
269 extern HRESULT
freetype_get_design_glyph_metrics(IDWriteFontFace4
*,UINT16
,UINT16
,DWRITE_GLYPH_METRICS
*) DECLSPEC_HIDDEN
;
270 extern void freetype_notify_cacheremove(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
271 extern BOOL
freetype_is_monospaced(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
272 extern HRESULT
freetype_get_glyphrun_outline(IDWriteFontFace4
*,FLOAT
,UINT16
const*,FLOAT
const*, DWRITE_GLYPH_OFFSET
const*,
273 UINT32
,BOOL
,IDWriteGeometrySink
*) DECLSPEC_HIDDEN
;
274 extern UINT16
freetype_get_glyphcount(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
275 extern void freetype_get_glyphs(IDWriteFontFace4
*,INT
,UINT32
const*,UINT32
,UINT16
*) DECLSPEC_HIDDEN
;
276 extern BOOL
freetype_has_kerning_pairs(IDWriteFontFace4
*) DECLSPEC_HIDDEN
;
277 extern INT32
freetype_get_kerning_pair_adjustment(IDWriteFontFace4
*,UINT16
,UINT16
) DECLSPEC_HIDDEN
;
278 extern void freetype_get_glyph_bbox(struct dwrite_glyphbitmap
*) DECLSPEC_HIDDEN
;
279 extern BOOL
freetype_get_glyph_bitmap(struct dwrite_glyphbitmap
*) DECLSPEC_HIDDEN
;
280 extern INT
freetype_get_charmap_index(IDWriteFontFace4
*,BOOL
*) DECLSPEC_HIDDEN
;
281 extern INT32
freetype_get_glyph_advance(IDWriteFontFace4
*,FLOAT
,UINT16
,DWRITE_MEASURING_MODE
,BOOL
*) DECLSPEC_HIDDEN
;
282 extern void freetype_get_design_glyph_bbox(IDWriteFontFace4
*,UINT16
,UINT16
,RECT
*) DECLSPEC_HIDDEN
;
288 SCRIPT_JUSTIFY_ARABIC_BLANK
,
289 SCRIPT_JUSTIFY_CHARACTER
,
290 SCRIPT_JUSTIFY_RESERVED1
,
291 SCRIPT_JUSTIFY_BLANK
,
292 SCRIPT_JUSTIFY_RESERVED2
,
293 SCRIPT_JUSTIFY_RESERVED3
,
294 SCRIPT_JUSTIFY_ARABIC_NORMAL
,
295 SCRIPT_JUSTIFY_ARABIC_KASHIDA
,
296 SCRIPT_JUSTIFY_ARABIC_ALEF
,
297 SCRIPT_JUSTIFY_ARABIC_HA
,
298 SCRIPT_JUSTIFY_ARABIC_RA
,
299 SCRIPT_JUSTIFY_ARABIC_BA
,
300 SCRIPT_JUSTIFY_ARABIC_BARA
,
301 SCRIPT_JUSTIFY_ARABIC_SEEN
,
302 SCRIPT_JUSTIFY_ARABIC_SEEN_M
305 struct scriptshaping_cache
;
307 struct scriptshaping_context
309 struct scriptshaping_cache
*cache
;
316 UINT32 max_glyph_count
;
319 extern HRESULT
create_scriptshaping_cache(IDWriteFontFace
*,struct scriptshaping_cache
**) DECLSPEC_HIDDEN
;
320 extern void release_scriptshaping_cache(struct scriptshaping_cache
*) DECLSPEC_HIDDEN
;
322 struct scriptshaping_ops
324 HRESULT (*contextual_shaping
)(struct scriptshaping_context
*context
, UINT16
*clustermap
, UINT16
*glyph_indices
, UINT32
* actual_glyph_count
);
325 HRESULT (*set_text_glyphs_props
)(struct scriptshaping_context
*context
, UINT16
*clustermap
, UINT16
*glyph_indices
,
326 UINT32 glyphcount
, DWRITE_SHAPING_TEXT_PROPERTIES
*text_props
, DWRITE_SHAPING_GLYPH_PROPERTIES
*glyph_props
);
329 extern const struct scriptshaping_ops default_shaping_ops DECLSPEC_HIDDEN
;
330 extern const struct scriptshaping_ops latn_shaping_ops DECLSPEC_HIDDEN
;