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/unicode.h"
25 static const DWRITE_MATRIX identity
=
32 static inline void *heap_alloc(size_t len
)
34 return HeapAlloc(GetProcessHeap(), 0, len
);
37 static inline void *heap_alloc_zero(size_t len
)
39 return HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, len
);
42 static inline void *heap_realloc(void *mem
, size_t len
)
44 return HeapReAlloc(GetProcessHeap(), 0, mem
, len
);
47 static inline void *heap_realloc_zero(void *mem
, size_t len
)
49 return HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, mem
, len
);
52 static inline BOOL
heap_free(void *mem
)
54 return HeapFree(GetProcessHeap(), 0, mem
);
57 static inline LPWSTR
heap_strdupW(const WCHAR
*str
)
64 size
= (strlenW(str
)+1)*sizeof(WCHAR
);
65 ret
= heap_alloc(size
);
67 memcpy(ret
, str
, size
);
73 static inline LPWSTR
heap_strdupnW(const WCHAR
*str
, UINT32 len
)
79 ret
= heap_alloc((len
+1)*sizeof(WCHAR
));
82 memcpy(ret
, str
, len
*sizeof(WCHAR
));
90 static inline const char *debugstr_range(const DWRITE_TEXT_RANGE
*range
)
92 return wine_dbg_sprintf("%u:%u", range
->startPosition
, range
->length
);
95 static inline const char *debugstr_matrix(const DWRITE_MATRIX
*m
)
97 if (!m
) return "(null)";
98 return wine_dbg_sprintf("{%.2f,%.2f,%.2f,%.2f,%.2f,%.2f}", m
->m11
, m
->m12
, m
->m21
, m
->m22
,
102 static inline unsigned short get_table_entry(const unsigned short *table
, WCHAR ch
)
104 return table
[table
[table
[ch
>> 8] + ((ch
>> 4) & 0x0f)] + (ch
& 0xf)];
107 static inline FLOAT
get_scaled_advance_width(INT32 advance
, FLOAT emSize
, const DWRITE_FONT_METRICS
*metrics
)
109 return (FLOAT
)advance
* emSize
/ (FLOAT
)metrics
->designUnitsPerEm
;
112 extern HRESULT
convert_fontface_to_logfont(IDWriteFontFace
*, LOGFONTW
*) DECLSPEC_HIDDEN
;
113 extern HRESULT
create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD
,const WCHAR
*locale
,BOOL
,IDWriteNumberSubstitution
**) DECLSPEC_HIDDEN
;
114 extern HRESULT
create_textformat(const WCHAR
*,IDWriteFontCollection
*,DWRITE_FONT_WEIGHT
,DWRITE_FONT_STYLE
,DWRITE_FONT_STRETCH
,
115 FLOAT
,const WCHAR
*,IDWriteTextFormat
**) DECLSPEC_HIDDEN
;
116 extern HRESULT
create_textlayout(const WCHAR
*,UINT32
,IDWriteTextFormat
*,FLOAT
,FLOAT
,IDWriteTextLayout
**) DECLSPEC_HIDDEN
;
117 extern HRESULT
create_gdicompat_textlayout(const WCHAR
*,UINT32
,IDWriteTextFormat
*,FLOAT
,FLOAT
,FLOAT
,const DWRITE_MATRIX
*,BOOL
,IDWriteTextLayout
**) DECLSPEC_HIDDEN
;
118 extern HRESULT
create_trimmingsign(IDWriteFactory2
*,IDWriteTextFormat
*,IDWriteInlineObject
**) DECLSPEC_HIDDEN
;
119 extern HRESULT
create_typography(IDWriteTypography
**) DECLSPEC_HIDDEN
;
120 extern HRESULT
create_gdiinterop(IDWriteFactory2
*,IDWriteGdiInterop
**) DECLSPEC_HIDDEN
;
121 extern void release_gdiinterop(IDWriteGdiInterop
*) DECLSPEC_HIDDEN
;
122 extern HRESULT
create_localizedstrings(IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
123 extern HRESULT
add_localizedstring(IDWriteLocalizedStrings
*,const WCHAR
*,const WCHAR
*) DECLSPEC_HIDDEN
;
124 extern HRESULT
clone_localizedstring(IDWriteLocalizedStrings
*iface
, IDWriteLocalizedStrings
**strings
) DECLSPEC_HIDDEN
;
125 extern void set_en_localizedstring(IDWriteLocalizedStrings
*,const WCHAR
*) DECLSPEC_HIDDEN
;
126 extern HRESULT
get_system_fontcollection(IDWriteFactory2
*,IDWriteFontCollection
**) DECLSPEC_HIDDEN
;
127 extern HRESULT
get_eudc_fontcollection(IDWriteFactory2
*,IDWriteFontCollection
**) DECLSPEC_HIDDEN
;
128 extern HRESULT
get_textanalyzer(IDWriteTextAnalyzer
**) DECLSPEC_HIDDEN
;
129 extern HRESULT
create_font_file(IDWriteFontFileLoader
*loader
, const void *reference_key
, UINT32 key_size
, IDWriteFontFile
**font_file
) DECLSPEC_HIDDEN
;
130 extern HRESULT
create_localfontfileloader(IDWriteLocalFontFileLoader
** iface
) DECLSPEC_HIDDEN
;
131 extern HRESULT
create_fontface(DWRITE_FONT_FACE_TYPE
,UINT32
,IDWriteFontFile
* const*,UINT32
,DWRITE_FONT_SIMULATIONS
,IDWriteFontFace2
**) DECLSPEC_HIDDEN
;
132 extern HRESULT
create_font_collection(IDWriteFactory2
*,IDWriteFontFileEnumerator
*,BOOL
,IDWriteFontCollection
**) DECLSPEC_HIDDEN
;
133 extern HRESULT
create_glyphrunanalysis(DWRITE_RENDERING_MODE
,DWRITE_MEASURING_MODE
,DWRITE_GLYPH_RUN
const*,FLOAT
,const DWRITE_MATRIX
*,
134 DWRITE_GRID_FIT_MODE
,DWRITE_TEXT_ANTIALIAS_MODE
,FLOAT
,FLOAT
,IDWriteGlyphRunAnalysis
**) DECLSPEC_HIDDEN
;
135 extern BOOL
is_system_collection(IDWriteFontCollection
*) DECLSPEC_HIDDEN
;
136 extern HRESULT
get_local_refkey(const WCHAR
*,const FILETIME
*,void**,UINT32
*) DECLSPEC_HIDDEN
;
137 extern HRESULT
get_filestream_from_file(IDWriteFontFile
*,IDWriteFontFileStream
**) DECLSPEC_HIDDEN
;
138 extern BOOL
is_face_type_supported(DWRITE_FONT_FACE_TYPE
) DECLSPEC_HIDDEN
;
139 extern HRESULT
get_family_names_from_stream(IDWriteFontFileStream
*,UINT32
,DWRITE_FONT_FACE_TYPE
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
140 extern HRESULT
create_colorglyphenum(FLOAT
,FLOAT
,const DWRITE_GLYPH_RUN
*,const DWRITE_GLYPH_RUN_DESCRIPTION
*,DWRITE_MEASURING_MODE
,
141 const DWRITE_MATRIX
*,UINT32
,IDWriteColorGlyphRunEnumerator
**) DECLSPEC_HIDDEN
;
143 /* Opentype font table functions */
144 struct dwrite_font_props
{
145 DWRITE_FONT_STYLE style
;
146 DWRITE_FONT_STRETCH stretch
;
147 DWRITE_FONT_WEIGHT weight
;
148 DWRITE_PANOSE panose
;
151 extern HRESULT
opentype_analyze_font(IDWriteFontFileStream
*,UINT32
*,DWRITE_FONT_FILE_TYPE
*,DWRITE_FONT_FACE_TYPE
*,BOOL
*) DECLSPEC_HIDDEN
;
152 extern HRESULT
opentype_get_font_table(IDWriteFontFileStream
*,DWRITE_FONT_FACE_TYPE
,UINT32
,UINT32
,const void**,void**,UINT32
*,BOOL
*) DECLSPEC_HIDDEN
;
153 extern HRESULT
opentype_cmap_get_unicode_ranges(void*,UINT32
,DWRITE_UNICODE_RANGE
*,UINT32
*) DECLSPEC_HIDDEN
;
154 extern void opentype_get_font_properties(IDWriteFontFileStream
*,DWRITE_FONT_FACE_TYPE
,UINT32
,struct dwrite_font_props
*) DECLSPEC_HIDDEN
;
155 extern void opentype_get_font_metrics(IDWriteFontFileStream
*,DWRITE_FONT_FACE_TYPE
,UINT32
,DWRITE_FONT_METRICS1
*,DWRITE_CARET_METRICS
*) DECLSPEC_HIDDEN
;
156 extern HRESULT
opentype_get_font_info_strings(const void*,DWRITE_INFORMATIONAL_STRING_ID
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
157 extern HRESULT
opentype_get_font_familyname(IDWriteFontFileStream
*,DWRITE_FONT_FACE_TYPE
,UINT32
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
158 extern HRESULT
opentype_get_font_facename(IDWriteFontFileStream
*,DWRITE_FONT_FACE_TYPE
,UINT32
,IDWriteLocalizedStrings
**) DECLSPEC_HIDDEN
;
159 extern HRESULT
opentype_get_typographic_features(IDWriteFontFace
*,UINT32
,UINT32
,UINT32
,UINT32
*,DWRITE_FONT_FEATURE_TAG
*) DECLSPEC_HIDDEN
;
160 extern BOOL
opentype_get_vdmx_size(const void*,INT
,UINT16
*,UINT16
*) DECLSPEC_HIDDEN
;
161 extern UINT32
opentype_get_cpal_palettecount(const void*) DECLSPEC_HIDDEN
;
162 extern UINT32
opentype_get_cpal_paletteentrycount(const void*) DECLSPEC_HIDDEN
;
163 extern HRESULT
opentype_get_cpal_entries(const void*,UINT32
,UINT32
,UINT32
,DWRITE_COLOR_F
*) DECLSPEC_HIDDEN
;
166 GASP_GRIDFIT
= 0x0001,
167 GASP_DOGRAY
= 0x0002,
168 GASP_SYMMETRIC_GRIDFIT
= 0x0004,
169 GASP_SYMMETRIC_SMOOTHING
= 0x0008,
172 extern WORD
opentype_get_gasp_flags(const WORD
*,UINT32
,INT
) DECLSPEC_HIDDEN
;
175 extern HRESULT
bidi_computelevels(const WCHAR
*,UINT32
,UINT8
,UINT8
*,UINT8
*) DECLSPEC_HIDDEN
;
176 extern WCHAR
bidi_get_mirrored_char(WCHAR
) DECLSPEC_HIDDEN
;
178 enum outline_point_tag
{
179 OUTLINE_POINT_START
= 1 << 0,
180 OUTLINE_POINT_END
= 1 << 1,
181 OUTLINE_POINT_BEZIER
= 1 << 2,
182 OUTLINE_POINT_LINE
= 1 << 3
185 struct glyph_outline
{
186 D2D1_POINT_2F
*points
;
192 extern HRESULT
new_glyph_outline(UINT32
,struct glyph_outline
**) DECLSPEC_HIDDEN
;
194 /* FreeType integration */
195 struct dwrite_glyphbitmap
{
196 IDWriteFontFace2
*fontface
;
203 DWRITE_TEXTURE_TYPE type
;
207 extern BOOL
init_freetype(void) DECLSPEC_HIDDEN
;
208 extern void release_freetype(void) DECLSPEC_HIDDEN
;
209 extern HRESULT
freetype_get_design_glyph_metrics(IDWriteFontFace2
*,UINT16
,UINT16
,DWRITE_GLYPH_METRICS
*) DECLSPEC_HIDDEN
;
210 extern void freetype_notify_cacheremove(IDWriteFontFace2
*) DECLSPEC_HIDDEN
;
211 extern BOOL
freetype_is_monospaced(IDWriteFontFace2
*) DECLSPEC_HIDDEN
;
212 extern HRESULT
freetype_get_glyph_outline(IDWriteFontFace2
*,FLOAT
,UINT16
,USHORT
,struct glyph_outline
**) DECLSPEC_HIDDEN
;
213 extern UINT16
freetype_get_glyphcount(IDWriteFontFace2
*) DECLSPEC_HIDDEN
;
214 extern UINT16
freetype_get_glyphindex(IDWriteFontFace2
*,UINT32
,INT
) DECLSPEC_HIDDEN
;
215 extern BOOL
freetype_has_kerning_pairs(IDWriteFontFace2
*) DECLSPEC_HIDDEN
;
216 extern INT32
freetype_get_kerning_pair_adjustment(IDWriteFontFace2
*,UINT16
,UINT16
) DECLSPEC_HIDDEN
;
217 extern void freetype_get_glyph_bbox(struct dwrite_glyphbitmap
*) DECLSPEC_HIDDEN
;
218 extern BOOL
freetype_get_glyph_bitmap(struct dwrite_glyphbitmap
*) DECLSPEC_HIDDEN
;
219 extern INT
freetype_get_charmap_index(IDWriteFontFace2
*,BOOL
*) DECLSPEC_HIDDEN
;
220 extern INT32
freetype_get_glyph_advance(IDWriteFontFace2
*,FLOAT
,UINT16
,DWRITE_MEASURING_MODE
) DECLSPEC_HIDDEN
;
226 SCRIPT_JUSTIFY_ARABIC_BLANK
,
227 SCRIPT_JUSTIFY_CHARACTER
,
228 SCRIPT_JUSTIFY_RESERVED1
,
229 SCRIPT_JUSTIFY_BLANK
,
230 SCRIPT_JUSTIFY_RESERVED2
,
231 SCRIPT_JUSTIFY_RESERVED3
,
232 SCRIPT_JUSTIFY_ARABIC_NORMAL
,
233 SCRIPT_JUSTIFY_ARABIC_KASHIDA
,
234 SCRIPT_JUSTIFY_ARABIC_ALEF
,
235 SCRIPT_JUSTIFY_ARABIC_HA
,
236 SCRIPT_JUSTIFY_ARABIC_RA
,
237 SCRIPT_JUSTIFY_ARABIC_BA
,
238 SCRIPT_JUSTIFY_ARABIC_BARA
,
239 SCRIPT_JUSTIFY_ARABIC_SEEN
,
240 SCRIPT_JUSTIFY_ARABIC_SEEN_M
243 struct scriptshaping_cache
;
245 struct scriptshaping_context
247 struct scriptshaping_cache
*cache
;
254 UINT32 max_glyph_count
;
257 extern HRESULT
create_scriptshaping_cache(IDWriteFontFace
*,struct scriptshaping_cache
**) DECLSPEC_HIDDEN
;
258 extern void release_scriptshaping_cache(struct scriptshaping_cache
*) DECLSPEC_HIDDEN
;
260 struct scriptshaping_ops
262 HRESULT (*contextual_shaping
)(struct scriptshaping_context
*context
, UINT16
*clustermap
, UINT16
*glyph_indices
, UINT32
* actual_glyph_count
);
263 HRESULT (*set_text_glyphs_props
)(struct scriptshaping_context
*context
, UINT16
*clustermap
, UINT16
*glyph_indices
,
264 UINT32 glyphcount
, DWRITE_SHAPING_TEXT_PROPERTIES
*text_props
, DWRITE_SHAPING_GLYPH_PROPERTIES
*glyph_props
);
267 extern const struct scriptshaping_ops default_shaping_ops DECLSPEC_HIDDEN
;
268 extern const struct scriptshaping_ops latn_shaping_ops DECLSPEC_HIDDEN
;