Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/dwrite_private.h | 9 +++++++++ dlls/dwrite/font.c | 35 ++++++++++++++++++++++++++++++++-- dlls/dwrite/freetype.c | 37 ++++++++++++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 4 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 7cca4c5c4f9..9735ffd2605 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -241,6 +241,10 @@ extern UINT16 opentype_cmap_get_glyph(const struct dwrite_cmap *cmap, unsigned i extern HRESULT opentype_cmap_get_unicode_ranges(const struct dwrite_cmap *cmap, unsigned int max_count, DWRITE_UNICODE_RANGE *ranges, unsigned int *count) DECLSPEC_HIDDEN;
+struct dwrite_fontface; +typedef void * font_object_handle; +typedef font_object_handle (*p_dwrite_fontface_get_font_object)(struct dwrite_fontface *fontface); + struct dwrite_fontface { IDWriteFontFace5 IDWriteFontFace5_iface; @@ -253,6 +257,9 @@ struct dwrite_fontface
IDWriteFactory7 *factory; struct fontfacecached *cached; + font_object_handle font_object; + void *data_context; + p_dwrite_fontface_get_font_object get_font_object;
USHORT simulations; DWRITE_FONT_FACE_TYPE type; @@ -731,6 +738,8 @@ struct font_callback_funcs
struct font_backend_funcs { + font_object_handle (CDECL *create_font_object)(const void *data_ptr, UINT64 data_size, unsigned int index); + void (CDECL *release_font_object)(font_object_handle object); void (CDECL *notify_release)(void *key); int (CDECL *get_glyph_outline)(void *key, float em_size, unsigned int simulations, UINT16 glyph, struct dwrite_outline *outline); diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index b7071314bb2..85868c6bfd8 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -636,8 +636,6 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface) IDWriteFontFace5_ReleaseFontTable(iface, fontface->kern.context); if (fontface->file) IDWriteFontFile_Release(fontface->file); - if (fontface->stream) - IDWriteFontFileStream_Release(fontface->stream); if (fontface->names) IDWriteLocalizedStrings_Release(fontface->names); if (fontface->family_names) @@ -652,6 +650,12 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface) heap_free(fontface->glyphs[i]);
font_funcs->notify_release(iface); + font_funcs->release_font_object(fontface->font_object); + if (fontface->stream) + { + IDWriteFontFileStream_ReleaseFileFragment(fontface->stream, fontface->data_context); + IDWriteFontFileStream_Release(fontface->stream); + }
dwrite_cmap_release(&fontface->cmap); IDWriteFactory7_Release(fontface->factory); @@ -5013,6 +5017,32 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke return S_OK; }
+static font_object_handle dwrite_fontface_get_font_object(struct dwrite_fontface *fontface) +{ + font_object_handle font_object; + const void *data_ptr; + void *data_context; + UINT64 size; + + if (!fontface->font_object && SUCCEEDED(IDWriteFontFileStream_GetFileSize(fontface->stream, &size))) + { + if (SUCCEEDED(IDWriteFontFileStream_ReadFileFragment(fontface->stream, &data_ptr, 0, size, &data_context))) + { + if (!(font_object = font_funcs->create_font_object(data_ptr, size, fontface->index))) + { + WARN("Backend failed to create font object.\n"); + IDWriteFontFileStream_ReleaseFileFragment(fontface->stream, data_context); + return NULL; + } + + if (InterlockedCompareExchangePointer((void **)&fontface->font_object, font_object, NULL)) + font_funcs->release_font_object(font_object); + } + } + + return fontface->font_object; +} + HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_list, IDWriteFontFace5 **ret) { struct file_stream_desc stream_desc; @@ -5102,6 +5132,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li release_font_data(font_data);
fontface->cached = factory_cache_fontface(fontface->factory, cached_list, &fontface->IDWriteFontFace5_iface); + fontface->get_font_object = dwrite_fontface_get_font_object;
*ret = &fontface->IDWriteFontFace5_iface;
diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c index 1ece99e08c9..5c32ec725f6 100644 --- a/dlls/dwrite/freetype.c +++ b/dlls/dwrite/freetype.c @@ -69,6 +69,7 @@ typedef struct static const struct font_callback_funcs *callback_funcs;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL +MAKE_FUNCPTR(FT_Done_Face); MAKE_FUNCPTR(FT_Done_FreeType); MAKE_FUNCPTR(FT_Done_Glyph); MAKE_FUNCPTR(FT_Get_First_Char); @@ -143,12 +144,14 @@ static BOOL init_freetype(void) FT_Version_t FT_Version;
ft_handle = dlopen(SONAME_LIBFREETYPE, RTLD_NOW); - if (!ft_handle) { + if (!ft_handle) + { WINE_MESSAGE("Wine cannot find the FreeType font library.\n"); - return FALSE; + return FALSE; }
#define LOAD_FUNCPTR(f) if((p##f = dlsym(ft_handle, #f)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;} + LOAD_FUNCPTR(FT_Done_Face) LOAD_FUNCPTR(FT_Done_FreeType) LOAD_FUNCPTR(FT_Done_Glyph) LOAD_FUNCPTR(FT_Get_First_Char) @@ -211,6 +214,23 @@ sym_not_found: return FALSE; }
+static font_object_handle CDECL freetype_create_font_object(const void *data_ptr, UINT64 data_size, unsigned int index) +{ + FT_Face face = NULL; + FT_Error fterror; + + fterror = pFT_New_Memory_Face(library, data_ptr, data_size, index, &face); + if (fterror != FT_Err_Ok) + WARN("Failed to create a face object, error %d.\n", fterror); + + return face; +} + +static void CDECL freetype_release_font_object(font_object_handle object) +{ + pFT_Done_Face(object); +} + static void CDECL freetype_notify_release(void *key) { RtlEnterCriticalSection(&freetype_cs); @@ -777,6 +797,8 @@ static INT32 CDECL freetype_get_glyph_advance(void *key, float emSize, UINT16 in
const static struct font_backend_funcs freetype_funcs = { + freetype_create_font_object, + freetype_release_font_object, freetype_notify_release, freetype_get_glyph_outline, freetype_get_glyph_count, @@ -803,6 +825,15 @@ static NTSTATUS release_freetype_lib(void)
#else /* HAVE_FREETYPE */
+static font_object_handle CDECL null_create_font_object(const void *data_ptr, UINT64 data_size, unsigned int index) +{ + return NULL; +} + +static void CDECL null_release_font_object(font_object_handle object) +{ +} + static void CDECL null_notify_release(void *key) { } @@ -842,6 +873,8 @@ static void CDECL null_get_design_glyph_metrics(void *key, UINT16 upem, UINT16 a
const static struct font_backend_funcs null_funcs = { + null_create_font_object, + null_release_font_object, null_notify_release, null_get_glyph_outline, null_get_glyph_count,
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/dwrite_private.h | 2 +- dlls/dwrite/font.c | 4 +++- dlls/dwrite/freetype.c | 15 ++++----------- 3 files changed, 8 insertions(+), 13 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 9735ffd2605..75bc1be902a 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -743,7 +743,7 @@ struct font_backend_funcs void (CDECL *notify_release)(void *key); int (CDECL *get_glyph_outline)(void *key, float em_size, unsigned int simulations, UINT16 glyph, struct dwrite_outline *outline); - UINT16 (CDECL *get_glyph_count)(void *key); + UINT16 (CDECL *get_glyph_count)(font_object_handle object); INT32 (CDECL *get_glyph_advance)(void *key, float em_size, UINT16 index, DWRITE_MEASURING_MODE measuring_mode, BOOL *has_contours); void (CDECL *get_glyph_bbox)(struct dwrite_glyphbitmap *bitmap_desc); diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 85868c6bfd8..5f4f5587a62 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -734,9 +734,11 @@ static void WINAPI dwritefontface_GetMetrics(IDWriteFontFace5 *iface, DWRITE_FON
static UINT16 WINAPI dwritefontface_GetGlyphCount(IDWriteFontFace5 *iface) { + struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface); + TRACE("%p.\n", iface);
- return font_funcs->get_glyph_count(iface); + return font_funcs->get_glyph_count(fontface->get_font_object(fontface)); }
static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace5 *iface, diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c index 5c32ec725f6..6b566649edc 100644 --- a/dlls/dwrite/freetype.c +++ b/dlls/dwrite/freetype.c @@ -527,17 +527,10 @@ static int CDECL freetype_get_glyph_outline(void *key, float emSize, unsigned in return ret; }
-static UINT16 CDECL freetype_get_glyph_count(void *key) +static UINT16 CDECL freetype_get_glyph_count(font_object_handle object) { - UINT16 count = 0; - FT_Face face; - - RtlEnterCriticalSection(&freetype_cs); - if (pFTC_Manager_LookupFace(cache_manager, key, &face) == 0) - count = face->num_glyphs; - RtlLeaveCriticalSection(&freetype_cs); - - return count; + FT_Face face = object; + return face ? face->num_glyphs : 0; }
static inline void ft_matrix_from_dwrite_matrix(const DWRITE_MATRIX *m, FT_Matrix *ft_matrix) @@ -844,7 +837,7 @@ static int CDECL null_get_glyph_outline(void *key, float emSize, unsigned int si return 1; }
-static UINT16 CDECL null_get_glyph_count(void *key) +static UINT16 CDECL null_get_glyph_count(font_object_handle object) { return 0; }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/dwrite_private.h | 3 +- dlls/dwrite/font.c | 23 ++++++---- dlls/dwrite/freetype.c | 89 +++++++++++++++++++++++------------- 3 files changed, 72 insertions(+), 43 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 75bc1be902a..3d445cddae2 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -260,6 +260,7 @@ struct dwrite_fontface font_object_handle font_object; void *data_context; p_dwrite_fontface_get_font_object get_font_object; + CRITICAL_SECTION cs;
USHORT simulations; DWRITE_FONT_FACE_TYPE type; @@ -748,7 +749,7 @@ struct font_backend_funcs BOOL *has_contours); void (CDECL *get_glyph_bbox)(struct dwrite_glyphbitmap *bitmap_desc); BOOL (CDECL *get_glyph_bitmap)(struct dwrite_glyphbitmap *bitmap_desc); - void (CDECL *get_design_glyph_metrics)(void *key, UINT16 upem, UINT16 ascent, unsigned int simulations, + void (CDECL *get_design_glyph_metrics)(font_object_handle object, UINT16 upem, UINT16 ascent, unsigned int simulations, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics); };
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 5f4f5587a62..4b135b83d68 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -659,6 +659,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface)
dwrite_cmap_release(&fontface->cmap); IDWriteFactory7_Release(fontface->factory); + DeleteCriticalSection(&fontface->cs); heap_free(fontface); }
@@ -745,8 +746,8 @@ static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace5 *ifa UINT16 const *glyphs, UINT32 glyph_count, DWRITE_GLYPH_METRICS *ret, BOOL is_sideways) { struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface); + HRESULT hr = S_OK; unsigned int i; - HRESULT hr;
TRACE("%p, %p, %u, %p, %d.\n", iface, glyphs, glyph_count, ret, is_sideways);
@@ -756,22 +757,23 @@ static HRESULT WINAPI dwritefontface_GetDesignGlyphMetrics(IDWriteFontFace5 *ifa if (is_sideways) FIXME("sideways metrics are not supported.\n");
- for (i = 0; i < glyph_count; i++) { + EnterCriticalSection(&fontface->cs); + for (i = 0; i < glyph_count; ++i) + { DWRITE_GLYPH_METRICS metrics;
- hr = get_cached_glyph_metrics(fontface, glyphs[i], &metrics); - if (hr != S_OK) + if (get_cached_glyph_metrics(fontface, glyphs[i], &metrics) != S_OK) { - font_funcs->get_design_glyph_metrics(iface, fontface->metrics.designUnitsPerEm, - fontface->typo_metrics.ascent, fontface->simulations, glyphs[i], &metrics); - hr = set_cached_glyph_metrics(fontface, glyphs[i], &metrics); - if (FAILED(hr)) - return hr; + font_funcs->get_design_glyph_metrics(fontface->get_font_object(fontface), + fontface->metrics.designUnitsPerEm, fontface->typo_metrics.ascent, + fontface->simulations, glyphs[i], &metrics); + if (FAILED(hr = set_cached_glyph_metrics(fontface, glyphs[i], &metrics))) break; } ret[i] = metrics; } + LeaveCriticalSection(&fontface->cs);
- return S_OK; + return hr; }
static HRESULT WINAPI dwritefontface_GetGlyphIndices(IDWriteFontFace5 *iface, UINT32 const *codepoints, @@ -5076,6 +5078,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li IDWriteFontFile_AddRef(fontface->file); fontface->stream = desc->stream; IDWriteFontFileStream_AddRef(fontface->stream); + InitializeCriticalSection(&fontface->cs);
stream_desc.stream = fontface->stream; stream_desc.face_type = desc->face_type; diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c index 6b566649edc..b19ae3616bc 100644 --- a/dlls/dwrite/freetype.c +++ b/dlls/dwrite/freetype.c @@ -33,6 +33,7 @@ #include FT_FREETYPE_H #include FT_OUTLINE_H #include FT_TRUETYPE_TABLES_H +#include FT_SIZES_H #endif /* HAVE_FT2BUILD_H */
#include "ntstatus.h" @@ -69,9 +70,11 @@ typedef struct static const struct font_callback_funcs *callback_funcs;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f = NULL +MAKE_FUNCPTR(FT_Activate_Size); MAKE_FUNCPTR(FT_Done_Face); MAKE_FUNCPTR(FT_Done_FreeType); MAKE_FUNCPTR(FT_Done_Glyph); +MAKE_FUNCPTR(FT_Done_Size); MAKE_FUNCPTR(FT_Get_First_Char); MAKE_FUNCPTR(FT_Get_Kerning); MAKE_FUNCPTR(FT_Get_Sfnt_Table); @@ -84,6 +87,7 @@ MAKE_FUNCPTR(FT_Load_Glyph); MAKE_FUNCPTR(FT_Matrix_Multiply); MAKE_FUNCPTR(FT_MulDiv); MAKE_FUNCPTR(FT_New_Memory_Face); +MAKE_FUNCPTR(FT_New_Size); MAKE_FUNCPTR(FT_Outline_Copy); MAKE_FUNCPTR(FT_Outline_Decompose); MAKE_FUNCPTR(FT_Outline_Done); @@ -92,6 +96,7 @@ MAKE_FUNCPTR(FT_Outline_Get_Bitmap); MAKE_FUNCPTR(FT_Outline_New); MAKE_FUNCPTR(FT_Outline_Transform); MAKE_FUNCPTR(FT_Outline_Translate); +MAKE_FUNCPTR(FT_Set_Pixel_Sizes); MAKE_FUNCPTR(FTC_ImageCache_Lookup); MAKE_FUNCPTR(FTC_ImageCache_New); MAKE_FUNCPTR(FTC_Manager_New); @@ -139,6 +144,28 @@ static FT_Error face_requester(FTC_FaceID face_id, FT_Library library, FT_Pointe return fterror; }
+static FT_Size freetype_set_face_size(FT_Face face, FT_UInt emsize) +{ + FT_Size size; + + if (pFT_New_Size(face, &size)) return NULL; + + pFT_Activate_Size(size); + + if (pFT_Set_Pixel_Sizes(face, emsize, emsize)) + { + pFT_Done_Size(size); + return NULL; + } + + return size; +} + +static BOOL freetype_glyph_has_contours(FT_Face face) +{ + return face->glyph->format == FT_GLYPH_FORMAT_OUTLINE && face->glyph->outline.n_contours; +} + static BOOL init_freetype(void) { FT_Version_t FT_Version; @@ -151,9 +178,11 @@ static BOOL init_freetype(void) }
#define LOAD_FUNCPTR(f) if((p##f = dlsym(ft_handle, #f)) == NULL){WARN("Can't find symbol %s\n", #f); goto sym_not_found;} + LOAD_FUNCPTR(FT_Activate_Size) LOAD_FUNCPTR(FT_Done_Face) LOAD_FUNCPTR(FT_Done_FreeType) LOAD_FUNCPTR(FT_Done_Glyph) + LOAD_FUNCPTR(FT_Done_Size) LOAD_FUNCPTR(FT_Get_First_Char) LOAD_FUNCPTR(FT_Get_Kerning) LOAD_FUNCPTR(FT_Get_Sfnt_Table) @@ -166,6 +195,7 @@ static BOOL init_freetype(void) LOAD_FUNCPTR(FT_Matrix_Multiply) LOAD_FUNCPTR(FT_MulDiv) LOAD_FUNCPTR(FT_New_Memory_Face) + LOAD_FUNCPTR(FT_New_Size) LOAD_FUNCPTR(FT_Outline_Copy) LOAD_FUNCPTR(FT_Outline_Decompose) LOAD_FUNCPTR(FT_Outline_Done) @@ -174,6 +204,7 @@ static BOOL init_freetype(void) LOAD_FUNCPTR(FT_Outline_New) LOAD_FUNCPTR(FT_Outline_Transform) LOAD_FUNCPTR(FT_Outline_Translate) + LOAD_FUNCPTR(FT_Set_Pixel_Sizes) LOAD_FUNCPTR(FTC_ImageCache_Lookup) LOAD_FUNCPTR(FTC_ImageCache_New) LOAD_FUNCPTR(FTC_Manager_New) @@ -238,43 +269,37 @@ static void CDECL freetype_notify_release(void *key) RtlLeaveCriticalSection(&freetype_cs); }
-static void CDECL freetype_get_design_glyph_metrics(void *key, UINT16 upem, UINT16 ascent, +static void CDECL freetype_get_design_glyph_metrics(font_object_handle object, UINT16 upem, UINT16 ascent, unsigned int simulations, UINT16 glyph, DWRITE_GLYPH_METRICS *ret) { - FTC_ScalerRec scaler; + FT_Face face = object; FT_Size size;
- scaler.face_id = key; - scaler.width = upem; - scaler.height = upem; - scaler.pixel = 1; - scaler.x_res = 0; - scaler.y_res = 0; + if (!(size = freetype_set_face_size(face, upem))) + return;
- RtlEnterCriticalSection(&freetype_cs); - if (pFTC_Manager_LookupSize(cache_manager, &scaler, &size) == 0) { - if (pFT_Load_Glyph(size->face, glyph, FT_LOAD_NO_SCALE) == 0) { - FT_Glyph_Metrics *metrics = &size->face->glyph->metrics; - - ret->leftSideBearing = metrics->horiBearingX; - ret->advanceWidth = metrics->horiAdvance; - ret->rightSideBearing = metrics->horiAdvance - metrics->horiBearingX - metrics->width; - - ret->advanceHeight = metrics->vertAdvance; - ret->verticalOriginY = ascent; - ret->topSideBearing = ascent - metrics->horiBearingY; - ret->bottomSideBearing = metrics->vertAdvance - metrics->height - ret->topSideBearing; - - /* Adjust in case of bold simulation, glyphs without contours are ignored. */ - if (simulations & DWRITE_FONT_SIMULATIONS_BOLD && - size->face->glyph->format == FT_GLYPH_FORMAT_OUTLINE && size->face->glyph->outline.n_contours) - { - if (ret->advanceWidth) - ret->advanceWidth += (upem + 49) / 50; - } - } + if (!pFT_Load_Glyph(face, glyph, FT_LOAD_NO_SCALE)) + { + FT_Glyph_Metrics *metrics = &face->glyph->metrics; + + ret->leftSideBearing = metrics->horiBearingX; + ret->advanceWidth = metrics->horiAdvance; + ret->rightSideBearing = metrics->horiAdvance - metrics->horiBearingX - metrics->width; + + ret->advanceHeight = metrics->vertAdvance; + ret->verticalOriginY = ascent; + ret->topSideBearing = ascent - metrics->horiBearingY; + ret->bottomSideBearing = metrics->vertAdvance - metrics->height - ret->topSideBearing; + + /* Adjust in case of bold simulation, glyphs without contours are ignored. */ + if (simulations & DWRITE_FONT_SIMULATIONS_BOLD && freetype_glyph_has_contours(face)) + { + if (ret->advanceWidth) + ret->advanceWidth += (upem + 49) / 50; + } } - RtlLeaveCriticalSection(&freetype_cs); + + pFT_Done_Size(size); }
struct decompose_context @@ -859,7 +884,7 @@ static BOOL CDECL null_get_glyph_bitmap(struct dwrite_glyphbitmap *bitmap) return FALSE; }
-static void CDECL null_get_design_glyph_metrics(void *key, UINT16 upem, UINT16 ascent, unsigned int simulations, +static void CDECL null_get_design_glyph_metrics(font_object_handle object, UINT16 upem, UINT16 ascent, unsigned int simulations, UINT16 glyph, DWRITE_GLYPH_METRICS *metrics) { }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/dwrite_private.h | 2 +- dlls/dwrite/font.c | 27 +++++++++++++++++--- dlls/dwrite/freetype.c | 48 +++++++++++++++++------------------- 3 files changed, 46 insertions(+), 31 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 3d445cddae2..2b9651a906c 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -742,7 +742,7 @@ struct font_backend_funcs font_object_handle (CDECL *create_font_object)(const void *data_ptr, UINT64 data_size, unsigned int index); void (CDECL *release_font_object)(font_object_handle object); void (CDECL *notify_release)(void *key); - int (CDECL *get_glyph_outline)(void *key, float em_size, unsigned int simulations, UINT16 glyph, + int (CDECL *get_glyph_outline)(font_object_handle object, float emsize, unsigned int simulations, UINT16 glyph, struct dwrite_outline *outline); UINT16 (CDECL *get_glyph_count)(font_object_handle object); INT32 (CDECL *get_glyph_advance)(void *key, float em_size, UINT16 index, DWRITE_MEASURING_MODE measuring_mode, diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 4b135b83d68..20bb6b3159f 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -835,12 +835,13 @@ static HRESULT WINAPI dwritefontface_GetGlyphRunOutline(IDWriteFontFace5 *iface, { struct dwrite_fontface *fontface = impl_from_IDWriteFontFace5(iface); D2D1_POINT_2F *origins, baseline_origin = { 0 }; - struct dwrite_outline outline = {{ 0 }}; + struct dwrite_outline outline, outline_size; D2D1_BEZIER_SEGMENT segment; D2D1_POINT_2F point; DWRITE_GLYPH_RUN run; unsigned int i, j, p; HRESULT hr; + int ret;
TRACE("%p, %.8e, %p, %p, %p, %u, %d, %d, %p.\n", iface, emSize, glyphs, advances, offsets, count, is_sideways, is_rtl, sink); @@ -871,14 +872,32 @@ static HRESULT WINAPI dwritefontface_GetGlyphRunOutline(IDWriteFontFace5 *iface,
ID2D1SimplifiedGeometrySink_SetFillMode(sink, D2D1_FILL_MODE_WINDING);
+ memset(&outline_size, 0, sizeof(outline_size)); + memset(&outline, 0, sizeof(outline)); + for (i = 0; i < count; ++i) { outline.tags.count = outline.points.count = 0; - if (font_funcs->get_glyph_outline(iface, emSize, fontface->simulations, glyphs[i], &outline)) + + EnterCriticalSection(&fontface->cs); + if (!(ret = font_funcs->get_glyph_outline(fontface->get_font_object(fontface), emSize, fontface->simulations, + glyphs[i], &outline_size))) { - WARN("Failed to get glyph outline for glyph %u.\n", glyphs[i]); - continue; + dwrite_array_reserve((void **)&outline.tags.values, &outline.tags.size, outline_size.tags.count, + sizeof(*outline.tags.values)); + dwrite_array_reserve((void **)&outline.points.values, &outline.points.size, outline_size.points.count, + sizeof(*outline.points.values)); + + if ((ret = font_funcs->get_glyph_outline(fontface->get_font_object(fontface), emSize, fontface->simulations, + glyphs[i], &outline))) + { + WARN("Failed to get glyph outline for glyph %u.\n", glyphs[i]); + } } + LeaveCriticalSection(&fontface->cs); + + if (ret) + continue;
for (j = 0, p = 0; j < outline.tags.count; ++j) { diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c index b19ae3616bc..503f8b04496 100644 --- a/dlls/dwrite/freetype.c +++ b/dlls/dwrite/freetype.c @@ -318,11 +318,8 @@ static inline void ft_vector_to_d2d_point(const FT_Vector *v, D2D1_POINT_2F *p)
static int dwrite_outline_push_tag(struct dwrite_outline *outline, unsigned char tag) { - if (!dwrite_array_reserve((void **)&outline->tags.values, &outline->tags.size, outline->tags.count + 1, - sizeof(*outline->tags.values))) - { + if (outline->tags.size < outline->tags.count + 1) return 1; - }
outline->tags.values[outline->tags.count++] = tag;
@@ -331,11 +328,8 @@ static int dwrite_outline_push_tag(struct dwrite_outline *outline, unsigned char
static int dwrite_outline_push_points(struct dwrite_outline *outline, const D2D1_POINT_2F *points, unsigned int count) { - if (!dwrite_array_reserve((void **)&outline->points.values, &outline->points.size, outline->points.count + count, - sizeof(*outline->points.values))) - { + if (outline->points.size < outline->points.count + count) return 1; - }
memcpy(&outline->points.values[outline->points.count], points, sizeof(*points) * count); outline->points.count += count; @@ -512,30 +506,25 @@ static void embolden_glyph(FT_Glyph glyph, FLOAT emsize) embolden_glyph_outline(&outline_glyph->outline, emsize); }
-static int CDECL freetype_get_glyph_outline(void *key, float emSize, unsigned int simulations, +static int CDECL freetype_get_glyph_outline(font_object_handle object, float emsize, unsigned int simulations, UINT16 glyph, struct dwrite_outline *outline) { - FTC_ScalerRec scaler; + FT_Face face = object; FT_Size size; - int ret; + int ret = 0;
- scaler.face_id = key; - scaler.width = emSize; - scaler.height = emSize; - scaler.pixel = 1; - scaler.x_res = 0; - scaler.y_res = 0; + if (!(size = freetype_set_face_size(face, emsize))) + return 0;
- RtlEnterCriticalSection(&freetype_cs); - if (!(ret = pFTC_Manager_LookupSize(cache_manager, &scaler, &size))) + if (!pFT_Load_Glyph(face, glyph, FT_LOAD_NO_BITMAP)) { - if (pFT_Load_Glyph(size->face, glyph, FT_LOAD_NO_BITMAP) == 0) - { - FT_Outline *ft_outline = &size->face->glyph->outline; - FT_Matrix m; + FT_Outline *ft_outline = &face->glyph->outline; + FT_Matrix m;
+ if (outline->points.values) + { if (simulations & DWRITE_FONT_SIMULATIONS_BOLD) - embolden_glyph_outline(ft_outline, emSize); + embolden_glyph_outline(ft_outline, emsize);
m.xx = 1 << 16; m.xy = simulations & DWRITE_FONT_SIMULATIONS_OBLIQUE ? (1 << 16) / 3 : 0; @@ -546,8 +535,15 @@ static int CDECL freetype_get_glyph_outline(void *key, float emSize, unsigned in
ret = decompose_outline(ft_outline, outline); } + else + { + /* Intentionally overestimate numbers to keep it simple. */ + outline->points.count = ft_outline->n_points * 3; + outline->tags.count = ft_outline->n_points + ft_outline->n_contours * 2; + } } - RtlLeaveCriticalSection(&freetype_cs); + + pFT_Done_Size(size);
return ret; } @@ -856,7 +852,7 @@ static void CDECL null_notify_release(void *key) { }
-static int CDECL null_get_glyph_outline(void *key, float emSize, unsigned int simulations, +static int CDECL null_get_glyph_outline(font_object_handle object, float emSize, unsigned int simulations, UINT16 glyph, struct dwrite_outline *outline) { return 1;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/dwrite/analyzer.c | 123 +++++++------ dlls/dwrite/bidi.c | 41 ++--- dlls/dwrite/dwrite_private.h | 24 +-- dlls/dwrite/font.c | 337 ++++++++++++++++++----------------- dlls/dwrite/gdiinterop.c | 34 ++-- dlls/dwrite/layout.c | 251 +++++++++++++------------- dlls/dwrite/main.c | 87 +++++---- dlls/dwrite/opentype.c | 38 ++-- dlls/dwrite/shape.c | 11 +- 9 files changed, 461 insertions(+), 485 deletions(-)
diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c index e8a30a7ae45..7112ca71932 100644 --- a/dlls/dwrite/analyzer.c +++ b/dlls/dwrite/analyzer.c @@ -456,8 +456,7 @@ static HRESULT analyze_linebreaks(const WCHAR *text, UINT32 count, DWRITE_LINE_B short *break_class; int i, j;
- break_class = heap_calloc(count, sizeof(*break_class)); - if (!break_class) + if (!(break_class = calloc(count, sizeof(*break_class)))) return E_OUTOFMEMORY;
state.breakpoints = breakpoints; @@ -817,7 +816,7 @@ static HRESULT analyze_linebreaks(const WCHAR *text, UINT32 count, DWRITE_LINE_B set_break_condition(i, BreakConditionAfter, DWRITE_BREAK_CONDITION_CAN_BREAK, &state); }
- heap_free(break_class); + free(break_class); return S_OK; }
@@ -866,7 +865,7 @@ static HRESULT get_text_source_ptr(IDWriteTextAnalysisSource *source, UINT32 pos if (len < length) { UINT32 read;
- *buff = heap_alloc(length*sizeof(WCHAR)); + *buff = malloc(length * sizeof(WCHAR)); if (!*buff) return E_OUTOFMEMORY; memcpy(*buff, *text, len*sizeof(WCHAR)); @@ -876,8 +875,9 @@ static HRESULT get_text_source_ptr(IDWriteTextAnalysisSource *source, UINT32 pos *text = NULL; len = 0; hr = IDWriteTextAnalysisSource_GetTextAtPosition(source, read, text, &len); - if (FAILED(hr)) { - heap_free(*buff); + if (FAILED(hr)) + { + free(*buff); return hr; } memcpy(*buff + read, *text, min(len, length-read)*sizeof(WCHAR)); @@ -907,7 +907,7 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeScript(IDWriteTextAnalyzer2 *ifa return hr;
hr = analyze_script(text, position, length, sink); - heap_free(buff); + free(buff);
return hr; } @@ -931,8 +931,8 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface if (FAILED(hr)) return hr;
- levels = heap_calloc(length, sizeof(*levels)); - explicit = heap_calloc(length, sizeof(*explicit)); + levels = calloc(length, sizeof(*levels)); + explicit = calloc(length, sizeof(*explicit));
if (!levels || !explicit) { hr = E_OUTOFMEMORY; @@ -967,9 +967,9 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface hr = IDWriteTextAnalysisSink_SetBidiLevel(sink, pos, seq_length, explicit_level, level);
done: - heap_free(explicit); - heap_free(levels); - heap_free(buff); + free(explicit); + free(levels); + free(buff);
return hr; } @@ -1007,8 +1007,7 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeLineBreakpoints(IDWriteTextAnaly if (len < length) { UINT32 read;
- buff = heap_calloc(length, sizeof(*buff)); - if (!buff) + if (!(buff = calloc(length, sizeof(*buff)))) return E_OUTOFMEMORY; memcpy(buff, text, len*sizeof(WCHAR)); read = len; @@ -1026,8 +1025,8 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeLineBreakpoints(IDWriteTextAnaly text = buff; }
- breakpoints = heap_calloc(length, sizeof(*breakpoints)); - if (!breakpoints) { + if (!(breakpoints = calloc(length, sizeof(*breakpoints)))) + { hr = E_OUTOFMEMORY; goto done; } @@ -1039,8 +1038,8 @@ static HRESULT WINAPI dwritetextanalyzer_AnalyzeLineBreakpoints(IDWriteTextAnaly hr = IDWriteTextAnalysisSink_SetLineBreakpoints(sink, position, length, breakpoints);
done: - heap_free(breakpoints); - heap_free(buff); + free(breakpoints); + free(buff);
return hr; } @@ -1178,8 +1177,8 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface, context.length = length; context.is_rtl = is_rtl; context.is_sideways = is_sideways; - context.u.subst.glyphs = heap_calloc(glyph_count, sizeof(*glyphs)); - context.u.subst.glyph_props = heap_calloc(glyph_count, sizeof(*glyph_props)); + context.u.subst.glyphs = calloc(glyph_count, sizeof(*glyphs)); + context.u.subst.glyph_props = calloc(glyph_count, sizeof(*glyph_props)); context.u.subst.text_props = text_props; context.u.subst.clustermap = clustermap; context.u.subst.max_glyph_count = max_glyph_count; @@ -1189,7 +1188,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface, context.user_features.features = features; context.user_features.range_lengths = feature_range_lengths; context.user_features.range_count = feature_ranges; - context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos)); + context.glyph_infos = calloc(glyph_count, sizeof(*context.glyph_infos)); context.table = &context.cache->gsub;
*actual_glyph_count = 0; @@ -1210,9 +1209,9 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface, }
failed: - heap_free(context.u.subst.glyph_props); - heap_free(context.u.subst.glyphs); - heap_free(context.glyph_infos); + free(context.u.subst.glyph_props); + free(context.u.subst.glyphs); + free(context.glyph_infos);
return hr; } @@ -1272,7 +1271,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2 context.user_features.features = features; context.user_features.range_lengths = feature_range_lengths; context.user_features.range_count = feature_ranges; - context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos)); + context.glyph_infos = calloc(glyph_count, sizeof(*context.glyph_infos)); context.table = &context.cache->gpos;
if (!context.glyph_infos) @@ -1285,7 +1284,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2 hr = shape_get_positions(&context, scriptprops->scripttags);
failed: - heap_free(context.glyph_infos); + free(context.glyph_infos);
return hr; } @@ -1349,7 +1348,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite context.user_features.features = features; context.user_features.range_lengths = feature_range_lengths; context.user_features.range_count = feature_ranges; - context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos)); + context.glyph_infos = calloc(glyph_count, sizeof(*context.glyph_infos)); context.table = &context.cache->gpos;
if (!context.glyph_infos) @@ -1362,7 +1361,7 @@ static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWrite hr = shape_get_positions(&context, scriptprops->scripttags);
failed: - heap_free(context.glyph_infos); + free(context.glyph_infos);
return hr; } @@ -1398,8 +1397,7 @@ static HRESULT apply_cluster_spacing(float leading_spacing, float trailing_spaci break; }
- deltas = heap_calloc(end - start + 1, sizeof(*deltas)); - if (!deltas) + if (!(deltas = calloc(end - start + 1, sizeof(*deltas)))) return E_OUTOFMEMORY;
/* Cluster advance, note that properties are ignored. */ @@ -1479,7 +1477,7 @@ static HRESULT apply_cluster_spacing(float leading_spacing, float trailing_spaci modified_advances[i - 1]; }
- heap_free(deltas); + free(deltas);
return S_OK; } @@ -1693,16 +1691,18 @@ static HRESULT WINAPI dwritetextanalyzer1_GetTextComplexity(IDWriteTextAnalyzer2 *len_read = i;
/* fetch indices */ - if (*is_simple && indices) { - UINT32 *codepoints = heap_calloc(*len_read, sizeof(*codepoints)); - if (!codepoints) + if (*is_simple && indices) + { + UINT32 *codepoints; + + if (!(codepoints = calloc(*len_read, sizeof(*codepoints)))) return E_OUTOFMEMORY;
for (i = 0; i < *len_read; i++) codepoints[i] = text[i];
hr = IDWriteFontFace_GetGlyphIndices(face, codepoints, *len_read, indices); - heap_free(codepoints); + free(codepoints); }
return hr; @@ -1830,14 +1830,14 @@ static HRESULT WINAPI dwritetextanalyzer2_CheckTypographicFeature(IDWriteTextAna
context.cache = fontface_get_shaping_cache(font_obj); context.language_tag = get_opentype_language(locale); - if (!(context.glyph_infos = heap_calloc(glyph_count, sizeof(*context.glyph_infos)))) + if (!(context.glyph_infos = calloc(glyph_count, sizeof(*context.glyph_infos)))) return E_OUTOFMEMORY;
props = &dwritescripts_properties[sa.script];
hr = shape_check_typographic_feature(&context, props->scripttags, feature, glyph_count, glyphs, feature_applies);
- heap_free(context.glyph_infos); + free(context.glyph_infos);
return hr; } @@ -1913,8 +1913,8 @@ static ULONG WINAPI dwritenumbersubstitution_Release(IDWriteNumberSubstitution *
if (!refcount) { - heap_free(object->locale); - heap_free(object); + free(object->locale); + free(object); }
return refcount; @@ -1947,17 +1947,17 @@ HRESULT create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD method, cons if (method != DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE && !IsValidLocaleName(locale)) return E_INVALIDARG;
- substitution = heap_alloc(sizeof(*substitution)); - if (!substitution) + if (!(substitution = calloc(1, sizeof(*substitution)))) return E_OUTOFMEMORY;
substitution->IDWriteNumberSubstitution_iface.lpVtbl = &numbersubstitutionvtbl; substitution->refcount = 1; substitution->ignore_user_override = ignore_user_override; substitution->method = method; - substitution->locale = heap_strdupW(locale); - if (locale && !substitution->locale) { - heap_free(substitution); + substitution->locale = wcsdup(locale); + if (locale && !substitution->locale) + { + free(substitution); return E_OUTOFMEMORY; }
@@ -2185,7 +2185,7 @@ static HRESULT WINAPI fontfallback_MapCharacters(IDWriteFontFallback1 *iface, ID }
done: - heap_free(buff); + free(buff); return hr; }
@@ -2215,8 +2215,7 @@ HRESULT create_system_fontfallback(IDWriteFactory7 *factory, IDWriteFontFallback
*ret = NULL;
- fallback = heap_alloc(sizeof(*fallback)); - if (!fallback) + if (!(fallback = calloc(1, sizeof(*fallback)))) return E_OUTOFMEMORY;
fallback->IDWriteFontFallback1_iface.lpVtbl = &fontfallbackvtbl; @@ -2234,7 +2233,7 @@ void release_system_fontfallback(IDWriteFontFallback1 *iface) { struct dwrite_fontfallback *fallback = impl_from_IDWriteFontFallback1(iface); IDWriteFontCollection1_Release(fallback->systemcollection); - heap_free(fallback); + free(fallback); }
static ULONG WINAPI customfontfallback_AddRef(IDWriteFontFallback1 *iface) @@ -2257,7 +2256,7 @@ static ULONG WINAPI customfontfallback_Release(IDWriteFontFallback1 *iface) if (!refcount) { IDWriteFactory7_Release(fallback->factory); - heap_free(fallback); + free(fallback); }
return refcount; @@ -2336,18 +2335,18 @@ static ULONG WINAPI fontfallbackbuilder_Release(IDWriteFontFallbackBuilder *ifac UINT32 j;
for (j = 0; j < mapping->families_count; j++) - heap_free(mapping->families[j]); - heap_free(mapping->families); + free(mapping->families[j]); + free(mapping->families);
if (mapping->collection) IDWriteFontCollection_Release(mapping->collection); - heap_free(mapping->ranges); - heap_free(mapping->locale); + free(mapping->ranges); + free(mapping->locale); }
IDWriteFactory7_Release(fallbackbuilder->factory); - heap_free(fallbackbuilder->mappings); - heap_free(fallbackbuilder); + free(fallbackbuilder->mappings); + free(fallbackbuilder); }
return refcount; @@ -2378,17 +2377,17 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder
mapping = &fallbackbuilder->mappings[fallbackbuilder->count++];
- mapping->ranges = heap_calloc(ranges_count, sizeof(*mapping->ranges)); + mapping->ranges = calloc(ranges_count, sizeof(*mapping->ranges)); memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count); mapping->ranges_count = ranges_count; - mapping->families = heap_calloc(families_count, sizeof(*mapping->families)); + mapping->families = calloc(families_count, sizeof(*mapping->families)); mapping->families_count = families_count; for (i = 0; i < families_count; i++) - mapping->families[i] = heap_strdupW(target_families[i]); + mapping->families[i] = wcsdup(target_families[i]); mapping->collection = collection; if (mapping->collection) IDWriteFontCollection_AddRef(mapping->collection); - mapping->locale = heap_strdupW(locale); + mapping->locale = wcsdup(locale); mapping->scale = scale;
return S_OK; @@ -2411,8 +2410,7 @@ static HRESULT WINAPI fontfallbackbuilder_CreateFontFallback(IDWriteFontFallback
*ret = NULL;
- fallback = heap_alloc(sizeof(*fallback)); - if (!fallback) + if (!(fallback = calloc(1, sizeof(*fallback)))) return E_OUTOFMEMORY;
fallback->IDWriteFontFallback1_iface.lpVtbl = &customfontfallbackvtbl; @@ -2440,8 +2438,7 @@ HRESULT create_fontfallback_builder(IDWriteFactory7 *factory, IDWriteFontFallbac
*ret = NULL;
- builder = heap_alloc_zero(sizeof(*builder)); - if (!builder) + if (!(builder = calloc(1, sizeof(*builder)))) return E_OUTOFMEMORY;
builder->IDWriteFontFallbackBuilder_iface.lpVtbl = &fontfallbackbuildervtbl; diff --git a/dlls/dwrite/bidi.c b/dlls/dwrite/bidi.c index 0cfca0fd95b..cc62509b557 100644 --- a/dlls/dwrite/bidi.c +++ b/dlls/dwrite/bidi.c @@ -633,14 +633,16 @@ static BracketPair *bidi_compute_bracket_pairs(IsolatedRun *iso_run) int pair_count = 0; int i;
- open_stack = heap_alloc(sizeof(WCHAR) * iso_run->length); - stack_index = heap_alloc(sizeof(int) * iso_run->length); + open_stack = malloc(sizeof(WCHAR) * iso_run->length); + stack_index = malloc(sizeof(int) * iso_run->length);
for (i = 0; i < iso_run->length; i++) { unsigned short ubv = get_table_entry(bidi_bracket_table, iso_run->item[i].ch); - if (ubv) { - if (!out) { - out = heap_alloc(sizeof(BracketPair)); + if (ubv) + { + if (!out) + { + out = malloc(sizeof(BracketPair)); out[0].start = -1; }
@@ -663,7 +665,7 @@ static BracketPair *bidi_compute_bracket_pairs(IsolatedRun *iso_run) out[pair_count].start = stack_index[j]; out[pair_count].end = i; pair_count++; - out = heap_realloc(out, sizeof(BracketPair) * (pair_count+1)); + out = realloc(out, sizeof(BracketPair) * (pair_count+1)); out[pair_count].start = -1; stack_top = j+1; break; @@ -672,15 +674,16 @@ static BracketPair *bidi_compute_bracket_pairs(IsolatedRun *iso_run) } } } - if (pair_count == 0) { - heap_free(out); + if (pair_count == 0) + { + free(out); out = NULL; } else if (pair_count > 1) qsort(out, pair_count, sizeof(BracketPair), bracketpair_compr);
- heap_free(open_stack); - heap_free(stack_index); + free(open_stack); + free(stack_index); return out; }
@@ -774,7 +777,7 @@ static void bidi_resolve_neutrals(IsolatedRun *run) i++; p = &pairs[i]; } - heap_free(pairs); + free(pairs); }
/* N1 */ @@ -920,8 +923,7 @@ static HRESULT bidi_compute_isolating_runs_set(UINT8 baselevel, UINT8 *classes, HRESULT hr = S_OK; Run *runs;
- runs = heap_calloc(count, sizeof(*runs)); - if (!runs) + if (!(runs = calloc(count, sizeof(*runs)))) return E_OUTOFMEMORY;
list_init(set); @@ -949,8 +951,8 @@ static HRESULT bidi_compute_isolating_runs_set(UINT8 baselevel, UINT8 *classes, int type_fence, real_end; int j;
- current_isolated = heap_alloc(sizeof(IsolatedRun) + sizeof(RunChar)*count); - if (!current_isolated) { + if (!(current_isolated = malloc(sizeof(IsolatedRun) + sizeof(RunChar)*count))) + { hr = E_OUTOFMEMORY; break; } @@ -1040,7 +1042,7 @@ search: i++; }
- heap_free(runs); + free(runs); return hr; }
@@ -1053,8 +1055,7 @@ HRESULT bidi_computelevels(const WCHAR *string, UINT32 count, UINT8 baselevel, U
TRACE("%s, %u\n", debugstr_wn(string, count), count);
- chartype = heap_alloc(count*sizeof(*chartype)); - if (!chartype) + if (!(chartype = malloc(count * sizeof(*chartype)))) return E_OUTOFMEMORY;
bidi_classify(string, chartype, count); @@ -1081,7 +1082,7 @@ HRESULT bidi_computelevels(const WCHAR *string, UINT32 count, UINT8 baselevel, U if (TRACE_ON(bidi)) iso_dump_types("after neutrals", iso_run);
list_remove(&iso_run->entry); - heap_free(iso_run); + free(iso_run); }
if (TRACE_ON(bidi)) bidi_dump_types("before implicit", chartype, 0, count); @@ -1091,6 +1092,6 @@ HRESULT bidi_computelevels(const WCHAR *string, UINT32 count, UINT8 baselevel, U bidi_resolve_resolved(baselevel, chartype, levels, 0, count-1);
done: - heap_free(chartype); + free(chartype); return hr; } diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h index 2b9651a906c..10617983b69 100644 --- a/dlls/dwrite/dwrite_private.h +++ b/dlls/dwrite/dwrite_private.h @@ -21,7 +21,6 @@ #include "winternl.h"
#include "wine/debug.h" -#include "wine/heap.h" #include "wine/list.h"
#define MS_GSUB_TAG DWRITE_MAKE_OPENTYPE_TAG('G','S','U','B') @@ -34,29 +33,13 @@ static const DWRITE_MATRIX identity = 0.0f, 0.0f };
-static inline LPWSTR heap_strdupW(const WCHAR *str) -{ - LPWSTR ret = NULL; - - if(str) { - DWORD size; - - size = (lstrlenW(str) + 1)*sizeof(WCHAR); - ret = heap_alloc(size); - if(ret) - memcpy(ret, str, size); - } - - return ret; -} - static inline LPWSTR heap_strdupnW(const WCHAR *str, UINT32 len) { WCHAR *ret = NULL;
if (len) { - ret = heap_alloc((len+1)*sizeof(WCHAR)); + ret = malloc((len+1)*sizeof(WCHAR)); if(ret) { memcpy(ret, str, len*sizeof(WCHAR)); @@ -97,10 +80,7 @@ static inline BOOL dwrite_array_reserve(void **elements, size_t *capacity, size_ if (new_capacity < count) new_capacity = max_capacity;
- if (!*elements) - new_elements = RtlAllocateHeap(GetProcessHeap(), 0, new_capacity * size); - else - new_elements = RtlReAllocateHeap(GetProcessHeap(), 0, *elements, new_capacity * size); + new_elements = realloc(*elements, new_capacity * size); if (!new_elements) return FALSE;
diff --git a/dlls/dwrite/font.c b/dlls/dwrite/font.c index 20bb6b3159f..174ab7a3ded 100644 --- a/dlls/dwrite/font.c +++ b/dlls/dwrite/font.c @@ -420,10 +420,10 @@ static HRESULT set_cached_glyph_metrics(struct dwrite_fontface *fontface, UINT16 { DWRITE_GLYPH_METRICS **block = &fontface->glyphs[glyph >> GLYPH_BLOCK_SHIFT];
- if (!*block) { + if (!*block) + { /* start new block */ - *block = heap_alloc_zero(sizeof(*metrics) * GLYPH_BLOCK_SIZE); - if (!*block) + if (!(*block = calloc(GLYPH_BLOCK_SIZE, sizeof(*metrics)))) return E_OUTOFMEMORY; }
@@ -511,8 +511,8 @@ static void release_font_data(struct dwrite_font_data *data)
dwrite_cmap_release(&data->cmap); IDWriteFontFile_Release(data->file); - heap_free(data->facename); - heap_free(data); + free(data->facename); + free(data); }
static void release_fontfamily_data(struct dwrite_fontfamily_data *data) @@ -524,9 +524,9 @@ static void release_fontfamily_data(struct dwrite_fontfamily_data *data)
for (i = 0; i < data->count; ++i) release_font_data(data->fonts[i]); - heap_free(data->fonts); + free(data->fonts); IDWriteLocalizedStrings_Release(data->familyname); - heap_free(data); + free(data); }
void fontface_detach_from_cache(IDWriteFontFace5 *iface) @@ -621,7 +621,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface) factory_lock(fontface->factory); list_remove(&fontface->cached->entry); factory_unlock(fontface->factory); - heap_free(fontface->cached); + free(fontface->cached); } release_scriptshaping_cache(fontface->shaping_cache); if (fontface->vdmx.context) @@ -647,7 +647,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface) }
for (i = 0; i < ARRAY_SIZE(fontface->glyphs); i++) - heap_free(fontface->glyphs[i]); + free(fontface->glyphs[i]);
font_funcs->notify_release(iface); font_funcs->release_font_object(fontface->font_object); @@ -660,7 +660,7 @@ static ULONG WINAPI dwritefontface_Release(IDWriteFontFace5 *iface) dwrite_cmap_release(&fontface->cmap); IDWriteFactory7_Release(fontface->factory); DeleteCriticalSection(&fontface->cs); - heap_free(fontface); + free(fontface); }
return refcount; @@ -861,12 +861,12 @@ static HRESULT WINAPI dwritefontface_GetGlyphRunOutline(IDWriteFontFace5 *iface, run.isSideways = is_sideways; run.bidiLevel = is_rtl ? 1 : 0;
- if (!(origins = heap_alloc(sizeof(*origins) * count))) + if (!(origins = malloc(sizeof(*origins) * count))) return E_OUTOFMEMORY;
if (FAILED(hr = compute_glyph_origins(&run, DWRITE_MEASURING_MODE_NATURAL, baseline_origin, NULL, origins))) { - heap_free(origins); + free(origins); return hr; }
@@ -924,9 +924,9 @@ static HRESULT WINAPI dwritefontface_GetGlyphRunOutline(IDWriteFontFace5 *iface, } }
- heap_free(outline.tags.values); - heap_free(outline.points.values); - heap_free(origins); + free(outline.tags.values); + free(outline.points.values); + free(origins);
return S_OK; } @@ -2011,7 +2011,7 @@ static ULONG WINAPI dwritefont_Release(IDWriteFont3 *iface) { IDWriteFontFamily2_Release(&font->family->IDWriteFontFamily2_iface); release_font_data(font->data); - heap_free(font); + free(font); }
return refcount; @@ -2321,7 +2321,7 @@ static HRESULT create_font(struct dwrite_fontfamily *family, UINT32 index, IDWri
*font = NULL;
- if (!(object = heap_alloc(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteFont3_iface.lpVtbl = &dwritefontvtbl; @@ -2377,13 +2377,13 @@ static ULONG WINAPI dwritefontlist_Release(IDWriteFontList2 *iface)
if (!refcount) { - UINT32 i; + unsigned int i;
for (i = 0; i < fontlist->font_count; i++) release_font_data(fontlist->fonts[i]); IDWriteFontFamily2_Release(&fontlist->family->IDWriteFontFamily2_iface); - heap_free(fontlist->fonts); - heap_free(fontlist); + free(fontlist->fonts); + free(fontlist); }
return refcount; @@ -2546,7 +2546,7 @@ static ULONG WINAPI dwritefontfamily_Release(IDWriteFontFamily2 *iface) { IDWriteFontCollection3_Release(&family->collection->IDWriteFontCollection3_iface); release_fontfamily_data(family->data); - heap_free(family); + free(family); }
return refcount; @@ -2713,14 +2713,13 @@ static HRESULT WINAPI dwritefontfamily_GetMatchingFonts(IDWriteFontFamily2 *ifac
*ret = NULL;
- fonts = heap_alloc(sizeof(*fonts)); - if (!fonts) + if (!(fonts = malloc(sizeof(*fonts)))) return E_OUTOFMEMORY;
/* Allocate as many as family has, not all of them will be necessary used. */ - fonts->fonts = heap_calloc(family->data->count, sizeof(*fonts->fonts)); - if (!fonts->fonts) { - heap_free(fonts); + if (!(fonts->fonts = calloc(family->data->count, sizeof(*fonts->fonts)))) + { + free(fonts); return E_OUTOFMEMORY; }
@@ -2921,8 +2920,7 @@ static HRESULT create_fontfamily(struct dwrite_fontcollection *collection, UINT3
*family = NULL;
- object = heap_alloc(sizeof(*object)); - if (!object) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteFontFamily2_iface.lpVtbl = &fontfamilyvtbl; @@ -3016,8 +3014,8 @@ static ULONG WINAPI dwritefontcollection_Release(IDWriteFontCollection3 *iface) factory_detach_fontcollection(collection->factory, iface); for (i = 0; i < collection->count; ++i) release_fontfamily_data(collection->family_data[i]); - heap_free(collection->family_data); - heap_free(collection); + free(collection->family_data); + free(collection); }
return refcount; @@ -3384,8 +3382,10 @@ static BOOL match_pattern_list(struct list *tokens, const struct name_pattern *p int len_part1 = wcslen(pattern->part1); int len_part2 = pattern->part2 ? wcslen(pattern->part2) : 0;
- LIST_FOR_EACH_ENTRY(token, tokens, struct name_token, entry) { - if (len_part2 == 0) { + LIST_FOR_EACH_ENTRY(token, tokens, struct name_token, entry) + { + if (!len_part2) + { /* simple case with single part pattern */ if (token->len != len_part1) continue; @@ -3394,11 +3394,12 @@ static BOOL match_pattern_list(struct list *tokens, const struct name_pattern *p { if (match) *match = *token; list_remove(&token->entry); - heap_free(token); + free(token); return TRUE; } } - else { + else + { struct name_token *next_token; struct list *next_entry;
@@ -3418,7 +3419,7 @@ static BOOL match_pattern_list(struct list *tokens, const struct name_pattern *p /* combined string match */ if (match) *match = *token; list_remove(&token->entry); - heap_free(token); + free(token); return TRUE; }
@@ -3445,8 +3446,8 @@ static BOOL match_pattern_list(struct list *tokens, const struct name_pattern *p } list_remove(&token->entry); list_remove(&next_token->entry); - heap_free(next_token); - heap_free(token); + free(next_token); + free(token); return TRUE; } } @@ -3839,8 +3840,9 @@ static void fontname_tokenize(struct list *tokens, const WCHAR *nameW) list_init(tokens); ptr = nameW;
- while (*ptr) { - struct name_token *token = heap_alloc(sizeof(*token)); + while (*ptr) + { + struct name_token *token = malloc(sizeof(*token)); token->ptr = ptr; token->len = 0; token->fulllen = 0; @@ -3874,7 +3876,7 @@ static void fontname_tokens_to_str(struct list *tokens, WCHAR *nameW) memcpy(nameW, token->ptr, len * sizeof(WCHAR)); nameW += len;
- heap_free(token); + free(token); } *nameW = 0; } @@ -4052,8 +4054,7 @@ static HRESULT init_font_data(const struct fontface_desc *desc, struct dwrite_fo
*ret = NULL;
- data = heap_alloc_zero(sizeof(*data)); - if (!data) + if (!(data = calloc(1, sizeof(*data)))) return E_OUTOFMEMORY;
data->refcount = 1; @@ -4112,8 +4113,7 @@ static HRESULT init_font_data_from_font(const struct dwrite_font_data *src, DWRI
*ret = NULL;
- data = heap_alloc_zero(sizeof(*data)); - if (!data) + if (!(data = calloc(1, sizeof(*data)))) return E_OUTOFMEMORY;
*data = *src; @@ -4141,8 +4141,7 @@ static HRESULT init_fontfamily_data(IDWriteLocalizedStrings *familyname, struct { struct dwrite_fontfamily_data *data;
- data = heap_alloc_zero(sizeof(*data)); - if (!data) + if (!(data = calloc(1, sizeof(*data)))) return E_OUTOFMEMORY;
data->refcount = 1; @@ -4349,8 +4348,8 @@ static void fontcollection_add_replacements(struct dwrite_fontcollection *collec }
max_namelen++; /* returned value doesn't include room for '\0' */ - name = heap_alloc(max_namelen * sizeof(WCHAR)); - data = heap_alloc(max_datalen); + name = malloc(max_namelen * sizeof(WCHAR)); + data = malloc(max_datalen);
datalen = max_datalen; namelen = max_namelen; @@ -4374,8 +4373,8 @@ static void fontcollection_add_replacements(struct dwrite_fontcollection *collec namelen = max_namelen; }
- heap_free(data); - heap_free(name); + free(data); + free(name); RegCloseKey(hkey); }
@@ -4395,12 +4394,13 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat
*ret = NULL;
- collection = heap_alloc(sizeof(struct dwrite_fontcollection)); - if (!collection) return E_OUTOFMEMORY; + if (!(collection = calloc(1, sizeof(*collection)))) + return E_OUTOFMEMORY;
hr = init_font_collection(collection, is_system); - if (FAILED(hr)) { - heap_free(collection); + if (FAILED(hr)) + { + free(collection); return hr; }
@@ -4453,7 +4453,7 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat }
/* add to scanned list */ - fileenum = heap_alloc(sizeof(*fileenum)); + fileenum = malloc(sizeof(*fileenum)); fileenum->file = file; list_add_tail(&scannedfiles, &fileenum->entry);
@@ -4520,10 +4520,11 @@ HRESULT create_font_collection(IDWriteFactory7 *factory, IDWriteFontFileEnumerat IDWriteFontFileStream_Release(stream); }
- LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) { + LIST_FOR_EACH_ENTRY_SAFE(fileenum, fileenum2, &scannedfiles, struct fontfile_enum, entry) + { IDWriteFontFile_Release(fileenum->file); list_remove(&fileenum->entry); - heap_free(fileenum); + free(fileenum); }
for (i = 0; i < collection->count; ++i) @@ -4589,8 +4590,8 @@ static ULONG WINAPI systemfontfileenumerator_Release(IDWriteFontFileEnumerator * { IDWriteFactory7_Release(enumerator->factory); RegCloseKey(enumerator->hkey); - heap_free(enumerator->filename); - heap_free(enumerator); + free(enumerator->filename); + free(enumerator); }
return refcount; @@ -4650,16 +4651,17 @@ static HRESULT WINAPI systemfontfileenumerator_MoveNext(IDWriteFontFileEnumerato NULL, &type, (BYTE *)enumerator->filename, &data_size); if (r == ERROR_MORE_DATA) { if (name_count >= max_name_count) { - if (name != name_buf) heap_free(name); + if (name != name_buf) free(name); max_name_count *= 2; - name = heap_alloc(max_name_count * sizeof(*name)); + name = malloc(max_name_count * sizeof(*name)); if (!name) return E_OUTOFMEMORY; } - if (data_size > enumerator->filename_size - sizeof(*enumerator->filename)) { - heap_free(enumerator->filename); + if (data_size > enumerator->filename_size - sizeof(*enumerator->filename)) + { + free(enumerator->filename); enumerator->filename_size = max(data_size + sizeof(*enumerator->filename), enumerator->filename_size * 2); - enumerator->filename = heap_alloc(enumerator->filename_size); - if (!enumerator->filename) { + if (!(enumerator->filename = malloc(enumerator->filename_size))) + { hr = E_OUTOFMEMORY; goto err; } @@ -4681,7 +4683,7 @@ static HRESULT WINAPI systemfontfileenumerator_MoveNext(IDWriteFontFileEnumerato TRACE("index = %d, current = %d\n", enumerator->index, *current);
err: - if (name != name_buf) heap_free(name); + if (name != name_buf) free(name); return hr; }
@@ -4700,8 +4702,7 @@ static HRESULT create_system_fontfile_enumerator(IDWriteFactory7 *factory, IDWri
*ret = NULL;
- enumerator = heap_alloc(sizeof(*enumerator)); - if (!enumerator) + if (!(enumerator = calloc(1, sizeof(*enumerator)))) return E_OUTOFMEMORY;
enumerator->IDWriteFontFileEnumerator_iface.lpVtbl = &systemfontfileenumeratorvtbl; @@ -4709,9 +4710,10 @@ static HRESULT create_system_fontfile_enumerator(IDWriteFactory7 *factory, IDWri enumerator->factory = factory; enumerator->index = -1; enumerator->filename_size = MAX_PATH * sizeof(*enumerator->filename); - enumerator->filename = heap_alloc(enumerator->filename_size); - if (!enumerator->filename) { - heap_free(enumerator); + enumerator->filename = malloc(enumerator->filename_size); + if (!enumerator->filename) + { + free(enumerator); return E_OUTOFMEMORY; }
@@ -4722,8 +4724,8 @@ static HRESULT create_system_fontfile_enumerator(IDWriteFactory7 *factory, IDWri { ERR("failed to open fonts list key\n"); IDWriteFactory7_Release(factory); - heap_free(enumerator->filename); - heap_free(enumerator); + free(enumerator->filename); + free(enumerator); return E_FAIL; }
@@ -4847,12 +4849,13 @@ HRESULT get_eudc_fontcollection(IDWriteFactory7 *factory, IDWriteFontCollection3
*ret = NULL;
- collection = heap_alloc(sizeof(struct dwrite_fontcollection)); - if (!collection) return E_OUTOFMEMORY; + if (!(collection = calloc(1, sizeof(*collection)))) + return E_OUTOFMEMORY;
hr = init_font_collection(collection, FALSE); - if (FAILED(hr)) { - heap_free(collection); + if (FAILED(hr)) + { + free(collection); return hr; }
@@ -4943,8 +4946,8 @@ static ULONG WINAPI dwritefontfile_Release(IDWriteFontFile *iface) IDWriteFontFileLoader_Release(file->loader); if (file->stream) IDWriteFontFileStream_Release(file->stream); - heap_free(file->reference_key); - heap_free(file); + free(file->reference_key); + free(file); }
return refcount; @@ -5018,11 +5021,12 @@ HRESULT create_font_file(IDWriteFontFileLoader *loader, const void *reference_ke
*ret = NULL;
- file = heap_alloc(sizeof(*file)); - key = heap_alloc(key_size); - if (!file || !key) { - heap_free(file); - heap_free(key); + file = calloc(1, sizeof(*file)); + key = malloc(key_size); + if (!file || !key) + { + free(file); + free(key); return E_OUTOFMEMORY; }
@@ -5076,8 +5080,7 @@ HRESULT create_fontface(const struct fontface_desc *desc, struct list *cached_li
*ret = NULL;
- fontface = heap_alloc_zero(sizeof(struct dwrite_fontface)); - if (!fontface) + if (!(fontface = calloc(1, sizeof(*fontface)))) return E_OUTOFMEMORY;
fontface->IDWriteFontFace5_iface.lpVtbl = &dwritefontfacevtbl; @@ -5252,8 +5255,8 @@ static void release_inmemory_stream(struct dwrite_inmemory_stream_data *stream) if (stream->owner) IUnknown_Release(stream->owner); else - heap_free(stream->data); - heap_free(stream); + free(stream->data); + free(stream); } }
@@ -5295,8 +5298,8 @@ static ULONG WINAPI localfontfilestream_AddRef(IDWriteFontFileStream *iface) static inline void release_cached_stream(struct local_cached_stream *stream) { list_remove(&stream->entry); - heap_free(stream->key); - heap_free(stream); + free(stream->key); + free(stream); }
static ULONG WINAPI localfontfilestream_Release(IDWriteFontFileStream *iface) @@ -5314,7 +5317,7 @@ static ULONG WINAPI localfontfilestream_Release(IDWriteFontFileStream *iface) release_cached_stream(stream->entry); LeaveCriticalSection(&local_fontfile_loader.cs);
- heap_free(stream); + free(stream); }
return refcount; @@ -5387,7 +5390,7 @@ static HRESULT create_localfontfilestream(const void *file_ptr, UINT64 size, str
*ret = NULL;
- if (!(object = heap_alloc(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteFontFileStream_iface.lpVtbl = &localfontfilestreamvtbl; @@ -5473,27 +5476,27 @@ static HRESULT create_local_cached_stream(const void *key, UINT32 key_size, stru return E_FAIL; }
- stream = heap_alloc(sizeof(*stream)); - if (!stream) { + if (!(stream = malloc(sizeof(*stream)))) + { UnmapViewOfFile(file_ptr); return E_OUTOFMEMORY; }
- stream->key = heap_alloc(key_size); - if (!stream->key) { + if (!(stream->key = malloc(key_size))) + { UnmapViewOfFile(file_ptr); - heap_free(stream); + free(stream); return E_OUTOFMEMORY; }
stream->key_size = key_size; memcpy(stream->key, key, key_size);
- hr = create_localfontfilestream(file_ptr, size.QuadPart, stream, &filestream); - if (FAILED(hr)) { + if (FAILED(hr = create_localfontfilestream(file_ptr, size.QuadPart, stream, &filestream))) + { UnmapViewOfFile(file_ptr); - heap_free(stream->key); - heap_free(stream); + free(stream->key); + free(stream); return hr; }
@@ -5608,8 +5611,7 @@ HRESULT get_local_refkey(const WCHAR *path, const FILETIME *writetime, void **ke *size = FIELD_OFFSET(struct local_refkey, name) + (wcslen(path)+1)*sizeof(WCHAR); *key = NULL;
- refkey = heap_alloc(*size); - if (!refkey) + if (!(refkey = malloc(*size))) return E_OUTOFMEMORY;
if (writetime) @@ -5668,10 +5670,10 @@ static ULONG WINAPI glyphrunanalysis_Release(IDWriteGlyphRunAnalysis *iface) { if (analysis->run.fontFace) IDWriteFontFace_Release(analysis->run.fontFace); - heap_free(analysis->glyphs); - heap_free(analysis->origins); - heap_free(analysis->bitmap); - heap_free(analysis); + free(analysis->glyphs); + free(analysis->origins); + free(analysis->bitmap); + free(analysis); }
return refcount; @@ -5795,7 +5797,8 @@ static HRESULT glyphrunanalysis_render(struct dwrite_glyphrunanalysis *analysis) size = (analysis->bounds.right - analysis->bounds.left)*(analysis->bounds.bottom - analysis->bounds.top); if (analysis->texture_type == DWRITE_TEXTURE_CLEARTYPE_3x1) size *= 3; - if (!(analysis->bitmap = heap_alloc_zero(size))) { + if (!(analysis->bitmap = calloc(1, size))) + { WARN("Failed to allocate run bitmap, %s, type %s.\n", wine_dbgstr_rect(&analysis->bounds), analysis->texture_type == DWRITE_TEXTURE_CLEARTYPE_3x1 ? "3x1" : "1x1"); IDWriteFontFace4_Release(fontface); @@ -5812,7 +5815,8 @@ static HRESULT glyphrunanalysis_render(struct dwrite_glyphrunanalysis *analysis) glyph_bitmap.aliased = analysis->rendering_mode == DWRITE_RENDERING_MODE1_ALIASED; if (analysis->flags & RUNANALYSIS_USE_TRANSFORM) glyph_bitmap.m = &analysis->m; - if (!(glyph_bitmap.buf = heap_alloc(analysis->max_glyph_bitmap_size))) { + if (!(glyph_bitmap.buf = malloc(analysis->max_glyph_bitmap_size))) + { IDWriteFontFace4_Release(fontface); return E_OUTOFMEMORY; } @@ -5882,15 +5886,15 @@ static HRESULT glyphrunanalysis_render(struct dwrite_glyphrunanalysis *analysis) } } } - heap_free(glyph_bitmap.buf); + free(glyph_bitmap.buf);
IDWriteFontFace4_Release(fontface);
analysis->flags |= RUNANALYSIS_BITMAP_READY;
/* we don't need this anymore */ - heap_free(analysis->glyphs); - heap_free(analysis->origins); + free(analysis->glyphs); + free(analysis->origins); IDWriteFontFace_Release(analysis->run.fontFace);
analysis->glyphs = NULL; @@ -6060,8 +6064,7 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit if ((UINT32)desc->measuring_mode > DWRITE_MEASURING_MODE_GDI_NATURAL) return E_INVALIDARG;
- analysis = heap_alloc_zero(sizeof(*analysis)); - if (!analysis) + if (!(analysis = calloc(1, sizeof(*analysis)))) return E_OUTOFMEMORY;
analysis->IDWriteGlyphRunAnalysis_iface.lpVtbl = &glyphrunanalysisvtbl; @@ -6076,12 +6079,13 @@ HRESULT create_glyphrunanalysis(const struct glyphrunanalysis_desc *desc, IDWrit
analysis->run = *desc->run; IDWriteFontFace_AddRef(analysis->run.fontFace); - analysis->glyphs = heap_calloc(desc->run->glyphCount, sizeof(*analysis->glyphs)); - analysis->origins = heap_calloc(desc->run->glyphCount, sizeof(*analysis->origins)); + analysis->glyphs = calloc(desc->run->glyphCount, sizeof(*analysis->glyphs)); + analysis->origins = calloc(desc->run->glyphCount, sizeof(*analysis->origins));
- if (!analysis->glyphs || !analysis->origins) { - heap_free(analysis->glyphs); - heap_free(analysis->origins); + if (!analysis->glyphs || !analysis->origins) + { + free(analysis->glyphs); + free(analysis->origins);
analysis->glyphs = NULL; analysis->origins = NULL; @@ -6149,16 +6153,16 @@ static ULONG WINAPI colorglyphenum_Release(IDWriteColorGlyphRunEnumerator1 *ifac
if (!refcount) { - heap_free(glyphenum->advances); - heap_free(glyphenum->color_advances); - heap_free(glyphenum->offsets); - heap_free(glyphenum->color_offsets); - heap_free(glyphenum->glyphindices); - heap_free(glyphenum->glyphs); + free(glyphenum->advances); + free(glyphenum->color_advances); + free(glyphenum->offsets); + free(glyphenum->color_offsets); + free(glyphenum->glyphindices); + free(glyphenum->glyphs); if (glyphenum->colr.context) IDWriteFontFace5_ReleaseFontTable(glyphenum->fontface, glyphenum->colr.context); IDWriteFontFace5_Release(glyphenum->fontface); - heap_free(glyphenum); + free(glyphenum); }
return refcount; @@ -6349,8 +6353,7 @@ HRESULT create_colorglyphenum(float originX, float originY, const DWRITE_GLYPH_R if (!colorfont) return DWRITE_E_NOCOLOR;
- colorglyphenum = heap_alloc_zero(sizeof(*colorglyphenum)); - if (!colorglyphenum) + if (!(colorglyphenum = calloc(1, sizeof(*colorglyphenum)))) return E_OUTOFMEMORY;
colorglyphenum->IDWriteColorGlyphRunEnumerator1_iface.lpVtbl = &colorglyphenumvtbl; @@ -6371,7 +6374,7 @@ HRESULT create_colorglyphenum(float originX, float originY, const DWRITE_GLYPH_R colorglyphenum->current_layer = 0; colorglyphenum->max_layer_num = 0;
- colorglyphenum->glyphs = heap_alloc_zero(run->glyphCount * sizeof(*colorglyphenum->glyphs)); + colorglyphenum->glyphs = calloc(run->glyphCount, sizeof(*colorglyphenum->glyphs));
has_colored_glyph = FALSE; colorglyphenum->has_regular_glyphs = FALSE; @@ -6391,12 +6394,12 @@ HRESULT create_colorglyphenum(float originX, float originY, const DWRITE_GLYPH_R return DWRITE_E_NOCOLOR; }
- colorglyphenum->advances = heap_calloc(run->glyphCount, sizeof(*colorglyphenum->advances)); - colorglyphenum->color_advances = heap_calloc(run->glyphCount, sizeof(*colorglyphenum->color_advances)); - colorglyphenum->glyphindices = heap_calloc(run->glyphCount, sizeof(*colorglyphenum->glyphindices)); + colorglyphenum->advances = calloc(run->glyphCount, sizeof(*colorglyphenum->advances)); + colorglyphenum->color_advances = calloc(run->glyphCount, sizeof(*colorglyphenum->color_advances)); + colorglyphenum->glyphindices = calloc(run->glyphCount, sizeof(*colorglyphenum->glyphindices)); if (run->glyphOffsets) { - colorglyphenum->offsets = heap_calloc(run->glyphCount, sizeof(*colorglyphenum->offsets)); - colorglyphenum->color_offsets = heap_calloc(run->glyphCount, sizeof(*colorglyphenum->color_offsets)); + colorglyphenum->offsets = calloc(run->glyphCount, sizeof(*colorglyphenum->offsets)); + colorglyphenum->color_offsets = calloc(run->glyphCount, sizeof(*colorglyphenum->color_offsets)); memcpy(colorglyphenum->offsets, run->glyphOffsets, run->glyphCount * sizeof(*run->glyphOffsets)); }
@@ -6465,8 +6468,8 @@ static ULONG WINAPI fontfacereference_Release(IDWriteFontFaceReference1 *iface) { IDWriteFontFile_Release(reference->file); IDWriteFactory7_Release(reference->factory); - heap_free(reference->axis_values); - heap_free(reference); + free(reference->axis_values); + free(reference); }
return refcount; @@ -6707,8 +6710,7 @@ HRESULT create_fontfacereference(IDWriteFactory7 *factory, IDWriteFontFile *file if (!is_simulation_valid(simulations)) return E_INVALIDARG;
- object = heap_alloc_zero(sizeof(*object)); - if (!object) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteFontFaceReference1_iface.lpVtbl = &fontfacereferencevtbl; @@ -6722,7 +6724,7 @@ HRESULT create_fontfacereference(IDWriteFactory7 *factory, IDWriteFontFile *file object->simulations = simulations; if (axis_values_count) { - if (!(object->axis_values = heap_alloc(axis_values_count * sizeof(*axis_values)))) + if (!(object->axis_values = malloc(axis_values_count * sizeof(*axis_values)))) { IDWriteFontFaceReference1_Release(&object->IDWriteFontFaceReference1_iface); return E_OUTOFMEMORY; @@ -6772,7 +6774,7 @@ static ULONG WINAPI inmemoryfilestream_Release(IDWriteFontFileStream *iface) if (!refcount) { release_inmemory_stream(stream->data); - heap_free(stream); + free(stream); }
return refcount; @@ -6875,8 +6877,8 @@ static ULONG WINAPI inmemoryfontfileloader_Release(IDWriteInMemoryFontFileLoader { for (i = 0; i < loader->count; ++i) release_inmemory_stream(loader->streams[i]); - heap_free(loader->streams); - heap_free(loader); + free(loader->streams); + free(loader); }
return refcount; @@ -6901,7 +6903,7 @@ static HRESULT WINAPI inmemoryfontfileloader_CreateStreamFromKey(IDWriteInMemory if (index >= loader->count) return E_INVALIDARG;
- if (!(stream = heap_alloc(sizeof(*stream)))) + if (!(stream = malloc(sizeof(*stream)))) return E_OUTOFMEMORY;
stream->IDWriteFontFileStream_iface.lpVtbl = &inmemoryfilestreamvtbl; @@ -6928,7 +6930,7 @@ static HRESULT WINAPI inmemoryfontfileloader_CreateInMemoryFontFileReference(IDW if (!dwrite_array_reserve((void **)&loader->streams, &loader->size, loader->count + 1, sizeof(*loader->streams))) return E_OUTOFMEMORY;
- if (!(stream = heap_alloc(sizeof(*stream)))) + if (!(stream = malloc(sizeof(*stream)))) return E_OUTOFMEMORY;
stream->refcount = 1; @@ -6939,8 +6941,9 @@ static HRESULT WINAPI inmemoryfontfileloader_CreateInMemoryFontFileReference(IDW stream->data = (void *)data; } else { - if (!(stream->data = heap_alloc(data_size))) { - heap_free(stream); + if (!(stream->data = malloc(data_size))) + { + free(stream); return E_OUTOFMEMORY; } memcpy(stream->data, data, data_size); @@ -6978,8 +6981,7 @@ HRESULT create_inmemory_fileloader(IDWriteInMemoryFontFileLoader **ret)
*ret = NULL;
- loader = heap_alloc_zero(sizeof(*loader)); - if (!loader) + if (!(loader = calloc(1, sizeof(*loader)))) return E_OUTOFMEMORY;
loader->IDWriteInMemoryFontFileLoader_iface.lpVtbl = &inmemoryfontfileloadervtbl; @@ -7028,7 +7030,7 @@ static ULONG WINAPI dwritefontresource_Release(IDWriteFontResource *iface) { IDWriteFactory7_Release(resource->factory); IDWriteFontFile_Release(resource->file); - heap_free(resource); + free(resource); }
return refcount; @@ -7175,8 +7177,7 @@ HRESULT create_font_resource(IDWriteFactory7 *factory, IDWriteFontFile *file, UI
*ret = NULL;
- resource = heap_alloc_zero(sizeof(*resource)); - if (!resource) + if (!(resource = calloc(1, sizeof(*resource)))) return E_OUTOFMEMORY;
resource->IDWriteFontResource_iface.lpVtbl = &fontresourcevtbl; @@ -7235,7 +7236,7 @@ static void release_fontset_entry(struct dwrite_fontset_entry *entry) if (entry->props[i] && entry->props[i] != MISSING_SET_PROP) IDWriteLocalizedStrings_Release(entry->props[i]); } - heap_free(entry); + free(entry); }
static struct dwrite_fontset_entry * addref_fontset_entry(struct dwrite_fontset_entry *entry) @@ -7306,8 +7307,8 @@ static ULONG WINAPI dwritefontset_Release(IDWriteFontSet3 *iface) IDWriteFactory7_Release(set->factory); for (i = 0; i < set->count; ++i) release_fontset_entry(set->entries[i]); - heap_free(set->entries); - heap_free(set); + free(set->entries); + free(set); }
return refcount; @@ -7461,12 +7462,12 @@ static HRESULT WINAPI dwritefontset_GetMatchingFonts(IDWriteFontSet3 *iface, DWR if (!props && count) return E_INVALIDARG;
- if (!(object = heap_alloc_zero(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
- if (!(entries = heap_calloc(set->count, sizeof(*entries)))) + if (!(entries = calloc(set->count, sizeof(*entries)))) { - heap_free(object); + free(object); return E_OUTOFMEMORY; }
@@ -7480,7 +7481,7 @@ static HRESULT WINAPI dwritefontset_GetMatchingFonts(IDWriteFontSet3 *iface, DWR
if (!matched_count) { - heap_free(entries); + free(entries); entries = NULL; }
@@ -7667,7 +7668,7 @@ static HRESULT fontset_create_entry(IDWriteFontFile *file, DWRITE_FONT_FACE_TYPE { struct dwrite_fontset_entry *entry;
- if (!(entry = heap_alloc_zero(sizeof(*entry)))) + if (!(entry = calloc(1, sizeof(*entry)))) return E_OUTOFMEMORY;
entry->refcount = 1; @@ -7700,12 +7701,12 @@ static HRESULT fontset_create_from_font_data(IDWriteFactory7 *factory, struct dw struct dwrite_fontset *object; unsigned int i;
- if (!(object = heap_alloc_zero(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
if (count) { - entries = heap_calloc(count, sizeof(*entries)); + entries = calloc(count, sizeof(*entries));
/* FIXME: set available properties too */
@@ -7729,12 +7730,12 @@ static HRESULT fontset_builder_create_fontset(IDWriteFactory7 *factory, struct d struct dwrite_fontset *object; unsigned int i;
- if (!(object = heap_alloc_zero(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
if (count) { - entries = heap_calloc(count, sizeof(*entries)); + entries = calloc(count, sizeof(*entries));
for (i = 0; i < count; ++i) entries[i] = addref_fontset_entry(src_entries[i]); @@ -7789,8 +7790,8 @@ static ULONG WINAPI dwritefontsetbuilder_Release(IDWriteFontSetBuilder2 *iface) IDWriteFactory7_Release(builder->factory); for (i = 0; i < builder->count; ++i) release_fontset_entry(builder->entries[i]); - heap_free(builder->entries); - heap_free(builder); + free(builder->entries); + free(builder); }
return refcount; @@ -7952,7 +7953,7 @@ HRESULT create_fontset_builder(IDWriteFactory7 *factory, IDWriteFontSetBuilder2
*ret = NULL;
- if (!(builder = heap_alloc_zero(sizeof(*builder)))) + if (!(builder = calloc(1, sizeof(*builder)))) return E_OUTOFMEMORY;
builder->IDWriteFontSetBuilder2_iface.lpVtbl = &fontsetbuildervtbl; @@ -8005,7 +8006,7 @@ static int CDECL get_font_data_cb(void *key, const void **data_ptr, UINT64 *data return 1; }
- if (!(context = heap_alloc(sizeof(*context)))) + if (!(context = malloc(sizeof(*context)))) { IDWriteFontFileStream_Release(stream); return 1; @@ -8025,7 +8026,7 @@ static void CDECL release_font_data_cb(struct font_data_context *context) if (!context) return; IDWriteFontFileStream_ReleaseFileFragment(context->stream, context->context); IDWriteFontFileStream_Release(context->stream); - heap_free(context); + free(context); }
struct font_callback_funcs callback_funcs = diff --git a/dlls/dwrite/gdiinterop.c b/dlls/dwrite/gdiinterop.c index 8df3f9f97ca..e8b4a747e29 100644 --- a/dlls/dwrite/gdiinterop.c +++ b/dlls/dwrite/gdiinterop.c @@ -267,7 +267,7 @@ static ULONG WINAPI rendertarget_Release(IDWriteBitmapRenderTarget1 *iface) { IDWriteFactory7_Release(target->factory); DeleteDC(target->hdc); - heap_free(target); + free(target); }
return refcount; @@ -460,8 +460,8 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac color = colorref_to_pixel_888(color); if (texturetype == DWRITE_TEXTURE_CLEARTYPE_3x1) size *= 3; - bitmap = heap_alloc_zero(size); - if (!bitmap) { + if (!(bitmap = calloc(1, size))) + { IDWriteGlyphRunAnalysis_Release(analysis); return E_OUTOFMEMORY; } @@ -477,7 +477,7 @@ static HRESULT WINAPI rendertarget_DrawGlyphRun(IDWriteBitmapRenderTarget1 *ifac if (bbox_ret) *bbox_ret = target_rect; }
- heap_free(bitmap); + free(bitmap); }
IDWriteGlyphRunAnalysis_Release(analysis); @@ -605,8 +605,8 @@ static HRESULT create_rendertarget(IDWriteFactory7 *factory, HDC hdc, UINT32 wid
*ret = NULL;
- target = heap_alloc(sizeof(struct rendertarget)); - if (!target) return E_OUTOFMEMORY; + if (!(target = malloc(sizeof(*target)))) + return E_OUTOFMEMORY;
target->IDWriteBitmapRenderTarget1_iface.lpVtbl = &rendertargetvtbl; target->ID2D1SimplifiedGeometrySink_iface.lpVtbl = &rendertargetsinkvtbl; @@ -671,7 +671,7 @@ static ULONG WINAPI gdiinterop_Release(IDWriteGdiInterop1 *iface) { IDWriteFactory7_UnregisterFontFileLoader(interop->factory, &interop->IDWriteFontFileLoader_iface); factory_detach_gdiinterop(interop->factory, iface); - heap_free(interop); + free(interop); }
return refcount; @@ -795,12 +795,12 @@ static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface return E_FAIL; }
- fileinfo = heap_alloc(needed); - if (!fileinfo) + if (!(fileinfo = malloc(needed))) return E_OUTOFMEMORY;
- if (!GetFontFileInfo(info.instance_id, 0, fileinfo, needed, &needed)) { - heap_free(fileinfo); + if (!GetFontFileInfo(info.instance_id, 0, fileinfo, needed, &needed)) + { + free(fileinfo); return E_FAIL; }
@@ -810,7 +810,7 @@ static HRESULT WINAPI gdiinterop_CreateFontFaceFromHdc(IDWriteGdiInterop1 *iface hr = IDWriteFactory7_CreateCustomFontFileReference(interop->factory, &info.instance_id, sizeof(info.instance_id), &interop->IDWriteFontFileLoader_iface, &file);
- heap_free(fileinfo); + free(fileinfo); if (FAILED(hr)) return hr;
@@ -962,7 +962,7 @@ static ULONG WINAPI memresourcestream_Release(IDWriteFontFileStream *iface) TRACE("%p, refcount %d.\n", iface, refcount);
if (!refcount) - heap_free(stream); + free(stream);
return refcount; } @@ -986,7 +986,7 @@ static HRESULT WINAPI memresourcestream_ReadFileFragment(IDWriteFontFileStream * if ((offset >= fileinfo.size.QuadPart - 1) || (fragment_size > fileinfo.size.QuadPart - offset)) return E_INVALIDARG;
- if (!(fragment = heap_alloc(fragment_size))) + if (!(fragment = malloc(fragment_size))) return E_OUTOFMEMORY;
if (!GetFontFileData(stream->key, 0, offset, fragment, fragment_size)) @@ -1000,7 +1000,7 @@ static void WINAPI memresourcestream_ReleaseFileFragment(IDWriteFontFileStream * { TRACE("%p, %p.\n", iface, fragment_context);
- heap_free(fragment_context); + free(fragment_context); }
static HRESULT WINAPI memresourcestream_GetFileSize(IDWriteFontFileStream *iface, UINT64 *size) @@ -1073,7 +1073,7 @@ static HRESULT WINAPI memresourceloader_CreateStreamFromKey(IDWriteFontFileLoade if (!key || key_size != sizeof(DWORD)) return E_INVALIDARG;
- if (!(stream = heap_alloc(sizeof(*stream)))) + if (!(stream = malloc(sizeof(*stream)))) return E_OUTOFMEMORY;
stream->IDWriteFontFileStream_iface.lpVtbl = &memresourcestreamvtbl; @@ -1099,7 +1099,7 @@ HRESULT create_gdiinterop(IDWriteFactory7 *factory, IDWriteGdiInterop1 **ret)
*ret = NULL;
- if (!(interop = heap_alloc(sizeof(*interop)))) + if (!(interop = malloc(sizeof(*interop)))) return E_OUTOFMEMORY;
interop->IDWriteGdiInterop1_iface.lpVtbl = &gdiinteropvtbl; diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c index 26744e1b303..b2e71e7f436 100644 --- a/dlls/dwrite/layout.c +++ b/dlls/dwrite/layout.c @@ -329,9 +329,9 @@ static void release_format_data(struct dwrite_textformat_data *data) if (data->collection) IDWriteFontCollection_Release(data->collection); if (data->fallback) IDWriteFontFallback_Release(data->fallback); if (data->trimmingsign) IDWriteInlineObject_Release(data->trimmingsign); - heap_free(data->family_name); - heap_free(data->locale); - heap_free(data->axis_values); + free(data->family_name); + free(data->locale); + free(data->axis_values); }
static inline struct dwrite_textlayout *impl_from_IDWriteTextLayout4(IDWriteTextLayout4 *iface) @@ -472,13 +472,13 @@ static inline HRESULT format_set_linespacing(struct dwrite_textformat_data *form static HRESULT format_set_font_axisvalues(struct dwrite_textformat_data *format, DWRITE_FONT_AXIS_VALUE const *axis_values, unsigned int num_values) { - heap_free(format->axis_values); + free(format->axis_values); format->axis_values = NULL; format->axis_values_count = 0;
if (num_values) { - if (!(format->axis_values = heap_calloc(num_values, sizeof(*axis_values)))) + if (!(format->axis_values = calloc(num_values, sizeof(*axis_values)))) return E_OUTOFMEMORY; memcpy(format->axis_values, axis_values, num_values * sizeof(*axis_values)); format->axis_values_count = num_values; @@ -552,7 +552,7 @@ static BOOL is_run_rtl(const struct layout_effective_run *run) static HRESULT alloc_layout_run(enum layout_run_kind kind, unsigned int start_position, struct layout_run **run) { - if (!(*run = heap_alloc_zero(sizeof(**run)))) + if (!(*run = calloc(1, sizeof(**run)))) return E_OUTOFMEMORY;
(*run)->kind = kind; @@ -564,17 +564,19 @@ static HRESULT alloc_layout_run(enum layout_run_kind kind, unsigned int start_po static void free_layout_runs(struct dwrite_textlayout *layout) { struct layout_run *cur, *cur2; - LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->runs, struct layout_run, entry) { + LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->runs, struct layout_run, entry) + { list_remove(&cur->entry); - if (cur->kind == LAYOUT_RUN_REGULAR) { + if (cur->kind == LAYOUT_RUN_REGULAR) + { if (cur->u.regular.run.fontFace) IDWriteFontFace_Release(cur->u.regular.run.fontFace); - heap_free(cur->u.regular.glyphs); - heap_free(cur->u.regular.clustermap); - heap_free(cur->u.regular.advances); - heap_free(cur->u.regular.offsets); + free(cur->u.regular.glyphs); + free(cur->u.regular.clustermap); + free(cur->u.regular.advances); + free(cur->u.regular.offsets); } - heap_free(cur); + free(cur); } }
@@ -585,25 +587,29 @@ static void free_layout_eruns(struct dwrite_textlayout *layout) struct layout_strikethrough *s, *s2; struct layout_underline *u, *u2;
- LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->eruns, struct layout_effective_run, entry) { + LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->eruns, struct layout_effective_run, entry) + { list_remove(&cur->entry); - heap_free(cur->clustermap); - heap_free(cur); + free(cur->clustermap); + free(cur); }
- LIST_FOR_EACH_ENTRY_SAFE(in, in2, &layout->inlineobjects, struct layout_effective_inline, entry) { + LIST_FOR_EACH_ENTRY_SAFE(in, in2, &layout->inlineobjects, struct layout_effective_inline, entry) + { list_remove(&in->entry); - heap_free(in); + free(in); }
- LIST_FOR_EACH_ENTRY_SAFE(u, u2, &layout->underlines, struct layout_underline, entry) { + LIST_FOR_EACH_ENTRY_SAFE(u, u2, &layout->underlines, struct layout_underline, entry) + { list_remove(&u->entry); - heap_free(u); + free(u); }
- LIST_FOR_EACH_ENTRY_SAFE(s, s2, &layout->strikethrough, struct layout_strikethrough, entry) { + LIST_FOR_EACH_ENTRY_SAFE(s, s2, &layout->strikethrough, struct layout_strikethrough, entry) + { list_remove(&s->entry); - heap_free(s); + free(s); } }
@@ -647,9 +653,9 @@ static HRESULT layout_update_breakpoints_range(struct dwrite_textlayout *layout, if (FAILED(hr)) after = before = DWRITE_BREAK_CONDITION_NEUTRAL;
- if (!layout->actual_breakpoints) { - layout->actual_breakpoints = heap_calloc(layout->len, sizeof(*layout->actual_breakpoints)); - if (!layout->actual_breakpoints) + if (!layout->actual_breakpoints) + { + if (!(layout->actual_breakpoints = calloc(layout->len, sizeof(*layout->actual_breakpoints)))) return E_OUTOFMEMORY; memcpy(layout->actual_breakpoints, layout->nominal_breakpoints, sizeof(DWRITE_LINE_BREAKPOINT)*layout->len); } @@ -1020,18 +1026,18 @@ static void layout_shape_clear_user_features_context(struct shaping_context *con
for (i = 0; i < context->user_features.range_count; ++i) { - heap_free(context->user_features.features[i]->features); - heap_free(context->user_features.features[i]); + free(context->user_features.features[i]->features); + free(context->user_features.features[i]); } - heap_free(context->user_features.features); + free(context->user_features.features); memset(&context->user_features, 0, sizeof(context->user_features)); }
static void layout_shape_clear_context(struct shaping_context *context) { layout_shape_clear_user_features_context(context); - heap_free(context->glyph_props); - heap_free(context->text_props); + free(context->glyph_props); + free(context->text_props); }
static HRESULT layout_shape_add_empty_user_features_range(struct shaping_context *context, unsigned int length) @@ -1039,7 +1045,7 @@ static HRESULT layout_shape_add_empty_user_features_range(struct shaping_context DWRITE_TYPOGRAPHIC_FEATURES *features; unsigned int r = context->user_features.range_count;
- if (!(context->user_features.features[r] = heap_alloc_zero(sizeof(*features)))) + if (!(context->user_features.features[r] = calloc(1, sizeof(*features)))) return E_OUTOFMEMORY;
context->user_features.range_lengths[r] = length; @@ -1061,9 +1067,9 @@ static HRESULT layout_shape_get_user_features(struct dwrite_textlayout *layout, if (range->h.range.length >= run->descr.stringLength && !range->iface) return S_OK;
- if (!(context->user_features.features = heap_calloc(run->descr.stringLength, sizeof(*context->user_features.features)))) + if (!(context->user_features.features = calloc(run->descr.stringLength, sizeof(*context->user_features.features)))) goto failed; - if (!(context->user_features.range_lengths = heap_calloc(run->descr.stringLength, sizeof(*context->user_features.range_lengths)))) + if (!(context->user_features.range_lengths = calloc(run->descr.stringLength, sizeof(*context->user_features.range_lengths)))) goto failed;
for (i = run->descr.textPosition; i < run->descr.textPosition + run->descr.stringLength; ++i) @@ -1087,13 +1093,13 @@ static HRESULT layout_shape_get_user_features(struct dwrite_textlayout *layout, }
r = context->user_features.range_count; - if (!(features = context->user_features.features[r] = heap_alloc(sizeof(*features)))) + if (!(features = context->user_features.features[r] = malloc(sizeof(*features)))) goto failed;
context->user_features.range_lengths[r] = length = min(run->descr.textPosition + run->descr.stringLength, range->h.range.startPosition + range->h.range.length) - i; features->featureCount = feature_count; - if (!(features->features = heap_calloc(feature_count, sizeof(*features->features)))) + if (!(features->features = calloc(feature_count, sizeof(*features->features)))) goto failed;
for (f = 0; f < feature_count; ++f) @@ -1129,17 +1135,17 @@ static HRESULT layout_shape_get_glyphs(struct dwrite_textlayout *layout, struct HRESULT hr;
run->descr.localeName = get_layout_range_by_pos(layout, run->descr.textPosition)->locale; - run->clustermap = heap_calloc(run->descr.stringLength, sizeof(*run->clustermap)); + run->clustermap = calloc(run->descr.stringLength, sizeof(*run->clustermap)); if (!run->clustermap) return E_OUTOFMEMORY;
max_count = 3 * run->descr.stringLength / 2 + 16; - run->glyphs = heap_calloc(max_count, sizeof(*run->glyphs)); + run->glyphs = calloc(max_count, sizeof(*run->glyphs)); if (!run->glyphs) return E_OUTOFMEMORY;
- context->text_props = heap_calloc(run->descr.stringLength, sizeof(*context->text_props)); - context->glyph_props = heap_calloc(max_count, sizeof(*context->glyph_props)); + context->text_props = calloc(run->descr.stringLength, sizeof(*context->text_props)); + context->glyph_props = calloc(max_count, sizeof(*context->glyph_props)); if (!context->text_props || !context->glyph_props) return E_OUTOFMEMORY;
@@ -1155,13 +1161,13 @@ static HRESULT layout_shape_get_glyphs(struct dwrite_textlayout *layout, struct context->glyph_props, &run->glyphcount); if (hr == E_NOT_SUFFICIENT_BUFFER) { - heap_free(run->glyphs); - heap_free(context->glyph_props); + free(run->glyphs); + free(context->glyph_props);
max_count *= 2;
- run->glyphs = heap_calloc(max_count, sizeof(*run->glyphs)); - context->glyph_props = heap_calloc(max_count, sizeof(*context->glyph_props)); + run->glyphs = calloc(max_count, sizeof(*run->glyphs)); + context->glyph_props = calloc(max_count, sizeof(*context->glyph_props)); if (!run->glyphs || !context->glyph_props) { hr = E_OUTOFMEMORY; @@ -1211,7 +1217,8 @@ static HRESULT layout_shape_apply_character_spacing(struct dwrite_textlayout *la } if (!first) return S_OK;
- if (!(clustermap = heap_calloc(run->descr.stringLength, sizeof(*clustermap)))) return E_OUTOFMEMORY; + if (!(clustermap = calloc(run->descr.stringLength, sizeof(*clustermap)))) + return E_OUTOFMEMORY;
pos = run->descr.textPosition;
@@ -1254,7 +1261,7 @@ static HRESULT layout_shape_apply_character_spacing(struct dwrite_textlayout *la if (cur == last) break; }
- heap_free(clustermap); + free(clustermap);
return S_OK; } @@ -1264,8 +1271,8 @@ static HRESULT layout_shape_get_positions(struct dwrite_textlayout *layout, stru struct regular_layout_run *run = context->run; HRESULT hr;
- run->advances = heap_calloc(run->glyphcount, sizeof(*run->advances)); - run->offsets = heap_calloc(run->glyphcount, sizeof(*run->offsets)); + run->advances = calloc(run->glyphcount, sizeof(*run->advances)); + run->offsets = calloc(run->glyphcount, sizeof(*run->offsets)); if (!run->advances || !run->offsets) return E_OUTOFMEMORY;
@@ -1334,12 +1341,14 @@ static HRESULT layout_compute_runs(struct dwrite_textlayout *layout) free_layout_runs(layout);
/* Cluster data arrays are allocated once, assuming one text position per cluster. */ - if (!layout->clustermetrics && layout->len) { - layout->clustermetrics = heap_calloc(layout->len, sizeof(*layout->clustermetrics)); - layout->clusters = heap_calloc(layout->len, sizeof(*layout->clusters)); - if (!layout->clustermetrics || !layout->clusters) { - heap_free(layout->clustermetrics); - heap_free(layout->clusters); + if (!layout->clustermetrics && layout->len) + { + layout->clustermetrics = calloc(layout->len, sizeof(*layout->clustermetrics)); + layout->clusters = calloc(layout->len, sizeof(*layout->clusters)); + if (!layout->clustermetrics || !layout->clusters) + { + free(layout->clustermetrics); + free(layout->clusters); return E_OUTOFMEMORY; } } @@ -1424,8 +1433,7 @@ static HRESULT layout_compute(struct dwrite_textlayout *layout) { IDWriteTextAnalyzer2 *analyzer;
- layout->nominal_breakpoints = heap_calloc(layout->len, sizeof(*layout->nominal_breakpoints)); - if (!layout->nominal_breakpoints) + if (!(layout->nominal_breakpoints = calloc(layout->len, sizeof(*layout->nominal_breakpoints)))) return E_OUTOFMEMORY;
analyzer = get_text_analyzer(); @@ -1436,7 +1444,7 @@ static HRESULT layout_compute(struct dwrite_textlayout *layout) WARN("Line breakpoints analysis failed, hr %#x.\n", hr); }
- heap_free(layout->actual_breakpoints); + free(layout->actual_breakpoints); layout->actual_breakpoints = NULL;
hr = layout_compute_runs(layout); @@ -1536,11 +1544,11 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const UINT32 i, start, length, last_cluster; struct layout_effective_run *run;
- if (r->kind == LAYOUT_RUN_INLINE) { + if (r->kind == LAYOUT_RUN_INLINE) + { struct layout_effective_inline *inlineobject;
- inlineobject = heap_alloc(sizeof(*inlineobject)); - if (!inlineobject) + if (!(inlineobject = malloc(sizeof(*inlineobject)))) return E_OUTOFMEMORY;
inlineobject->object = r->u.object.object; @@ -1565,8 +1573,7 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const return S_OK; }
- run = heap_alloc(sizeof(*run)); - if (!run) + if (!(run = malloc(sizeof(*run)))) return E_OUTOFMEMORY;
/* No need to iterate for that, use simple fact that: @@ -1575,9 +1582,9 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const length = layout->clusters[last_cluster].position - layout->clusters[first_cluster].position + layout->clustermetrics[last_cluster].length;
- run->clustermap = heap_calloc(length, sizeof(*run->clustermap)); - if (!run->clustermap) { - heap_free(run); + if (!(run->clustermap = calloc(length, sizeof(*run->clustermap)))) + { + free(run); return E_OUTOFMEMORY; }
@@ -1618,12 +1625,12 @@ static HRESULT layout_add_effective_run(struct dwrite_textlayout *layout, const /* Strikethrough style is guaranteed to be consistent within effective run, its width equals to run width, thickness and offset are derived from font metrics, rest of the values are from layout or run itself */ - if (params->strikethrough) { + if (params->strikethrough) + { struct layout_strikethrough *s; DWRITE_FONT_METRICS metrics;
- s = heap_alloc(sizeof(*s)); - if (!s) + if (!(s = malloc(sizeof(*s)))) return E_OUTOFMEMORY;
layout_get_erun_font_metrics(layout, run, &metrics); @@ -2021,8 +2028,7 @@ static HRESULT layout_add_underline(struct dwrite_textlayout *layout, struct lay cur = next; }
- u = heap_alloc(sizeof(*u)); - if (!u) + if (!(u = malloc(sizeof(*u)))) return E_OUTOFMEMORY;
w = cur; @@ -2200,8 +2206,7 @@ static void layout_add_line(struct dwrite_textlayout *layout, UINT32 first_clust if (append_trimming_run) { struct layout_effective_inline *trimming_sign;
- trimming_sign = heap_alloc(sizeof(*trimming_sign)); - if (!trimming_sign) + if (!(trimming_sign = calloc(1, sizeof(*trimming_sign)))) return;
trimming_sign->object = layout->format.trimmingsign; @@ -2506,18 +2511,18 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout * { struct layout_range *range;
- range = heap_alloc_zero(sizeof(*range)); - if (!range) return NULL; + if (!(range = calloc(1, sizeof(*range)))) + return NULL;
range->weight = layout->format.weight; range->style = layout->format.style; range->stretch = layout->format.stretch; range->fontsize = layout->format.fontsize;
- range->fontfamily = heap_strdupW(layout->format.family_name); + range->fontfamily = wcsdup(layout->format.family_name); if (!range->fontfamily) { - heap_free(range); + free(range); return NULL; }
@@ -2534,8 +2539,8 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout * { struct layout_range_bool *range;
- range = heap_alloc_zero(sizeof(*range)); - if (!range) return NULL; + if (!(range = calloc(1, sizeof(*range)))) + return NULL;
h = &range->h; break; @@ -2545,8 +2550,8 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout * { struct layout_range_iface *range;
- range = heap_alloc_zero(sizeof(*range)); - if (!range) return NULL; + if (!(range = calloc(1, sizeof(*range)))) + return NULL;
h = &range->h; break; @@ -2555,8 +2560,8 @@ static struct layout_range_header *alloc_layout_range(struct dwrite_textlayout * { struct layout_range_spacing *range;
- range = heap_alloc_zero(sizeof(*range)); - if (!range) return NULL; + if (!(range = calloc(1, sizeof(*range)))) + return NULL;
h = &range->h; break; @@ -2579,15 +2584,16 @@ static struct layout_range_header *alloc_layout_range_from(struct layout_range_h { case LAYOUT_RANGE_REGULAR: { - struct layout_range *from = (struct layout_range*)h; + struct layout_range *from = (struct layout_range *)h, *range;
- struct layout_range *range = heap_alloc(sizeof(*range)); - if (!range) return NULL; + if (!(range = malloc(sizeof(*range)))) + return NULL;
*range = *from; - range->fontfamily = heap_strdupW(from->fontfamily); - if (!range->fontfamily) { - heap_free(range); + range->fontfamily = wcsdup(from->fontfamily); + if (!range->fontfamily) + { + free(range); return NULL; }
@@ -2602,7 +2608,7 @@ static struct layout_range_header *alloc_layout_range_from(struct layout_range_h case LAYOUT_RANGE_UNDERLINE: case LAYOUT_RANGE_STRIKETHROUGH: { - struct layout_range_bool *strike = heap_alloc(sizeof(*strike)); + struct layout_range_bool *strike = malloc(sizeof(*strike)); if (!strike) return NULL;
*strike = *(struct layout_range_bool*)h; @@ -2612,7 +2618,7 @@ static struct layout_range_header *alloc_layout_range_from(struct layout_range_h case LAYOUT_RANGE_EFFECT: case LAYOUT_RANGE_TYPOGRAPHY: { - struct layout_range_iface *effect = heap_alloc(sizeof(*effect)); + struct layout_range_iface *effect = malloc(sizeof(*effect)); if (!effect) return NULL;
*effect = *(struct layout_range_iface*)h; @@ -2623,7 +2629,7 @@ static struct layout_range_header *alloc_layout_range_from(struct layout_range_h } case LAYOUT_RANGE_SPACING: { - struct layout_range_spacing *spacing = heap_alloc(sizeof(*spacing)); + struct layout_range_spacing *spacing = malloc(sizeof(*spacing)); if (!spacing) return NULL;
*spacing = *(struct layout_range_spacing*)h; @@ -2654,7 +2660,7 @@ static void free_layout_range(struct layout_range_header *h) IDWriteInlineObject_Release(range->object); if (range->collection) IDWriteFontCollection_Release(range->collection); - heap_free(range->fontfamily); + free(range->fontfamily); break; } case LAYOUT_RANGE_EFFECT: @@ -2669,7 +2675,7 @@ static void free_layout_range(struct layout_range_header *h) ; }
- heap_free(h); + free(h); }
static void free_layout_ranges_list(struct dwrite_textlayout *layout) @@ -2798,8 +2804,8 @@ static BOOL set_layout_range_attrval(struct layout_range_header *h, enum layout_ changed = !!wcscmp(dest->fontfamily, value->u.fontfamily); if (changed) { - heap_free(dest->fontfamily); - dest->fontfamily = heap_strdupW(value->u.fontfamily); + free(dest->fontfamily); + dest->fontfamily = wcsdup(value->u.fontfamily); } break; case LAYOUT_RANGE_ATTR_SPACING: @@ -3115,13 +3121,13 @@ static ULONG WINAPI dwritetextlayout_Release(IDWriteTextLayout4 *iface) free_layout_eruns(layout); free_layout_runs(layout); release_format_data(&layout->format); - heap_free(layout->nominal_breakpoints); - heap_free(layout->actual_breakpoints); - heap_free(layout->clustermetrics); - heap_free(layout->clusters); - heap_free(layout->lines); - heap_free(layout->str); - heap_free(layout); + free(layout->nominal_breakpoints); + free(layout->actual_breakpoints); + free(layout->clustermetrics); + free(layout->clusters); + free(layout->lines); + free(layout->str); + free(layout); }
return refcount; @@ -3946,13 +3952,13 @@ static void layout_get_erun_bbox(struct dwrite_textlayout *layout, struct layout
bbox = &glyph_bitmap.bbox;
- if (!(origins = heap_calloc(glyph_run.glyphCount, sizeof(*origins)))) + if (!(origins = calloc(glyph_run.glyphCount, sizeof(*origins)))) return;
if (FAILED(hr = compute_glyph_origins(&glyph_run, layout->measuringmode, baseline_origin, &layout->transform, origins))) { WARN("Failed to compute glyph origins, hr %#x.\n", hr); - heap_free(origins); + free(origins); return; }
@@ -3972,7 +3978,7 @@ static void layout_get_erun_bbox(struct dwrite_textlayout *layout, struct layout d2d_rect_union(&run->bbox, &glyph_bbox); }
- heap_free(origins); + free(origins); }
*bbox = run->bbox; @@ -5335,12 +5341,12 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I if ((textformat = unsafe_impl_from_IDWriteTextFormat(format))) { layout->format = textformat->format;
- layout->format.locale = heap_strdupW(textformat->format.locale); - layout->format.family_name = heap_strdupW(textformat->format.family_name); + layout->format.locale = wcsdup(textformat->format.locale); + layout->format.family_name = wcsdup(textformat->format.family_name); if (!layout->format.locale || !layout->format.family_name) { - heap_free(layout->format.locale); - heap_free(layout->format.family_name); + free(layout->format.locale); + free(layout->format.family_name); return E_OUTOFMEMORY; }
@@ -5375,8 +5381,7 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I
/* locale name and length */ len = IDWriteTextFormat_GetLocaleNameLength(format); - layout->format.locale = heap_alloc((len+1)*sizeof(WCHAR)); - if (!layout->format.locale) + if (!(layout->format.locale = malloc((len + 1) * sizeof(WCHAR)))) return E_OUTOFMEMORY;
hr = IDWriteTextFormat_GetLocaleName(format, layout->format.locale, len+1); @@ -5386,8 +5391,7 @@ static HRESULT layout_format_from_textformat(struct dwrite_textlayout *layout, I
/* font family name and length */ len = IDWriteTextFormat_GetFontFamilyNameLength(format); - layout->format.family_name = heap_alloc((len+1)*sizeof(WCHAR)); - if (!layout->format.family_name) + if (!(layout->format.family_name = malloc((len + 1) * sizeof(WCHAR)))) return E_OUTOFMEMORY;
hr = IDWriteTextFormat_GetFontFamilyName(format, layout->format.family_name, len+1); @@ -5509,7 +5513,7 @@ HRESULT create_textlayout(const struct textlayout_desc *desc, IDWriteTextLayout if (!desc->format || !desc->string) return E_INVALIDARG;
- if (!(object = heap_alloc_zero(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
hr = init_textlayout(desc, object); @@ -5555,7 +5559,7 @@ static ULONG WINAPI dwritetrimmingsign_Release(IDWriteInlineObject *iface) if (!refcount) { IDWriteTextLayout_Release(sign->layout); - heap_free(sign); + free(sign); }
return refcount; @@ -5672,7 +5676,7 @@ HRESULT create_trimmingsign(IDWriteFactory7 *factory, IDWriteTextFormat *format, (is_reading_direction_vert(reading) && is_flow_direction_vert(flow))) return DWRITE_E_FLOWDIRECTIONCONFLICTS;
- if (!(object = heap_alloc(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteInlineObject_iface.lpVtbl = &dwritetrimmingsignvtbl; @@ -5681,7 +5685,7 @@ HRESULT create_trimmingsign(IDWriteFactory7 *factory, IDWriteTextFormat *format, hr = IDWriteFactory7_CreateTextLayout(factory, &ellipsisW, 1, format, 0.0f, 0.0f, &object->layout); if (FAILED(hr)) { - heap_free(object); + free(object); return hr; }
@@ -5736,7 +5740,7 @@ static ULONG WINAPI dwritetextformat_Release(IDWriteTextFormat3 *iface) if (!refcount) { release_format_data(&format->format); - heap_free(format); + free(format); }
return refcount; @@ -6208,14 +6212,14 @@ HRESULT create_textformat(const WCHAR *family_name, IDWriteFontCollection *colle ((UINT32)style > DWRITE_FONT_STYLE_ITALIC)) return E_INVALIDARG;
- if (!(object = heap_alloc_zero(sizeof(*object)))) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteTextFormat3_iface.lpVtbl = &dwritetextformatvtbl; object->refcount = 1; - object->format.family_name = heap_strdupW(family_name); + object->format.family_name = wcsdup(family_name); object->format.family_len = wcslen(family_name); - object->format.locale = heap_strdupW(locale); + object->format.locale = wcsdup(locale); object->format.locale_len = wcslen(locale); /* Force locale name to lower case, layout will inherit this modified value. */ wcslwr(object->format.locale); @@ -6269,8 +6273,8 @@ static ULONG WINAPI dwritetypography_Release(IDWriteTypography *iface)
if (!refcount) { - heap_free(typography->features); - heap_free(typography); + free(typography->features); + free(typography); }
return refcount; @@ -6331,8 +6335,7 @@ HRESULT create_typography(IDWriteTypography **ret)
*ret = NULL;
- typography = heap_alloc_zero(sizeof(*typography)); - if (!typography) + if (!(typography = calloc(1, sizeof(*typography)))) return E_OUTOFMEMORY;
typography->IDWriteTypography_iface.lpVtbl = &dwritetypographyvtbl; diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c index 2a0b69400f4..d0dd4dd99e9 100644 --- a/dlls/dwrite/main.c +++ b/dlls/dwrite/main.c @@ -113,7 +113,7 @@ static ULONG WINAPI renderingparams_Release(IDWriteRenderingParams3 *iface) TRACE("%p, refcount %d.\n", iface, refcount);
if (!refcount) - heap_free(params); + free(params);
return refcount; } @@ -235,7 +235,7 @@ static HRESULT create_renderingparams(float gamma, float contrast, float graysca if ((UINT32)gridfit > DWRITE_GRID_FIT_MODE_ENABLED || (UINT32)geometry > DWRITE_PIXEL_GEOMETRY_BGR) return E_INVALIDARG;
- if (!(object = heap_alloc(sizeof(*object)))) + if (!(object = malloc(sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteRenderingParams3_iface.lpVtbl = &renderingparamsvtbl; @@ -312,12 +312,12 @@ static ULONG WINAPI localizedstrings_Release(IDWriteLocalizedStrings *iface) { for (i = 0; i < strings->count; ++i) { - heap_free(strings->data[i].locale); - heap_free(strings->data[i].string); + free(strings->data[i].locale); + free(strings->data[i].string); }
- heap_free(strings->data); - heap_free(strings); + free(strings->data); + free(strings); }
return refcount; @@ -449,8 +449,7 @@ HRESULT create_localizedstrings(IDWriteLocalizedStrings **strings)
*strings = NULL;
- object = heap_alloc_zero(sizeof(*object)); - if (!object) + if (!(object = calloc(1, sizeof(*object)))) return E_OUTOFMEMORY;
object->IDWriteLocalizedStrings_iface.lpVtbl = &localizedstringsvtbl; @@ -477,12 +476,12 @@ HRESULT add_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *locale, if (!dwrite_array_reserve((void **)&strings->data, &strings->size, strings->count + 1, sizeof(*strings->data))) return E_OUTOFMEMORY;
- strings->data[count].locale = heap_strdupW(locale); - strings->data[count].string = heap_strdupW(string); + strings->data[count].locale = wcsdup(locale); + strings->data[count].string = wcsdup(string); if (!strings->data[count].locale || !strings->data[count].string) { - heap_free(strings->data[count].locale); - heap_free(strings->data[count].string); + free(strings->data[count].locale); + free(strings->data[count].string); return E_OUTOFMEMORY; } wcslwr(strings->data[count].locale); @@ -503,14 +502,13 @@ HRESULT clone_localizedstrings(IDWriteLocalizedStrings *iface, IDWriteLocalizedS return S_FALSE;
strings = impl_from_IDWriteLocalizedStrings(iface); - strings_clone = heap_alloc_zero(sizeof(*strings_clone)); - if (!strings_clone) + if (!(strings_clone = calloc(1, sizeof(*strings_clone)))) return E_OUTOFMEMORY;
if (!dwrite_array_reserve((void **)&strings_clone->data, &strings_clone->size, strings->count, sizeof(*strings_clone->data))) { - heap_free(strings_clone); + free(strings_clone); return E_OUTOFMEMORY; }
@@ -520,8 +518,8 @@ HRESULT clone_localizedstrings(IDWriteLocalizedStrings *iface, IDWriteLocalizedS
for (i = 0; i < strings_clone->count; ++i) { - strings_clone->data[i].locale = heap_strdupW(strings->data[i].locale); - strings_clone->data[i].string = heap_strdupW(strings->data[i].string); + strings_clone->data[i].locale = wcsdup(strings->data[i].locale); + strings_clone->data[i].string = wcsdup(strings->data[i].string); }
*ret = &strings_clone->IDWriteLocalizedStrings_iface; @@ -538,8 +536,8 @@ void set_en_localizedstring(IDWriteLocalizedStrings *iface, const WCHAR *string) { if (!wcsicmp(strings->data[i].locale, L"en-US")) { - heap_free(strings->data[i].string); - strings->data[i].string = heap_strdupW(string); + free(strings->data[i].string); + strings->data[i].string = wcsdup(string); break; } } @@ -622,7 +620,7 @@ static void release_fontface_cache(struct list *fontfaces) LIST_FOR_EACH_ENTRY_SAFE(fontface, fontface2, fontfaces, struct fontfacecached, entry) { list_remove(&fontface->entry); fontface_detach_from_cache(fontface->fontface); - heap_free(fontface); + free(fontface); } }
@@ -631,7 +629,7 @@ static void release_fileloader(struct fileloader *fileloader) list_remove(&fileloader->entry); release_fontface_cache(&fileloader->fontfaces); IDWriteFontFileLoader_Release(fileloader->loader); - heap_free(fileloader); + free(fileloader); }
static void release_dwritefactory(struct dwritefactory *factory) @@ -646,7 +644,7 @@ static void release_dwritefactory(struct dwritefactory *factory) LIST_FOR_EACH_ENTRY_SAFE(loader, loader2, &factory->collection_loaders, struct collectionloader, entry) { list_remove(&loader->entry); IDWriteFontCollectionLoader_Release(loader->loader); - heap_free(loader); + free(loader); }
LIST_FOR_EACH_ENTRY_SAFE(fileloader, fileloader2, &factory->file_loaders, struct fileloader, entry) @@ -661,7 +659,7 @@ static void release_dwritefactory(struct dwritefactory *factory)
factory->cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&factory->cs); - heap_free(factory); + free(factory); }
static void release_shared_factory(IDWriteFactory7 *iface) @@ -820,8 +818,7 @@ static HRESULT WINAPI dwritefactory_RegisterFontCollectionLoader(IDWriteFactory7 if (factory_get_collection_loader(factory, loader)) return DWRITE_E_ALREADYREGISTERED;
- entry = heap_alloc(sizeof(*entry)); - if (!entry) + if (!(entry = malloc(sizeof(*entry)))) return E_OUTOFMEMORY;
entry->loader = loader; @@ -848,7 +845,7 @@ static HRESULT WINAPI dwritefactory_UnregisterFontCollectionLoader(IDWriteFactor
IDWriteFontCollectionLoader_Release(found->loader); list_remove(&found->entry); - heap_free(found); + free(found);
return S_OK; } @@ -871,7 +868,7 @@ static HRESULT WINAPI dwritefactory_CreateFontFileReference(IDWriteFactory7 *ifa return hr;
hr = create_font_file(factory->localfontfileloader, key, key_size, font_file); - heap_free(key); + free(key);
return hr; } @@ -986,8 +983,7 @@ struct fontfacecached *factory_cache_fontface(IDWriteFactory7 *iface, struct lis struct fontfacecached *cached;
/* new cache entry */ - cached = heap_alloc(sizeof(*cached)); - if (!cached) + if (!(cached = malloc(sizeof(*cached)))) return NULL;
cached->fontface = fontface; @@ -1128,8 +1124,7 @@ static HRESULT WINAPI dwritefactory_RegisterFontFileLoader(IDWriteFactory7 *ifac if (factory_get_file_loader(factory, loader)) return DWRITE_E_ALREADYREGISTERED;
- entry = heap_alloc(sizeof(*entry)); - if (!entry) + if (!(entry = malloc(sizeof(*entry)))) return E_OUTOFMEMORY;
entry->loader = loader; @@ -1525,17 +1520,17 @@ static HRESULT create_system_path_list(WCHAR ***ret, unsigned int *ret_count) }
value_size = MAX_PATH * sizeof(*value); - value = heap_alloc(value_size); + value = malloc(value_size);
max_name_count = MAX_PATH; - name = heap_alloc(max_name_count * sizeof(*name)); + name = malloc(max_name_count * sizeof(*name));
for (;;) { if (!value) { value_size = MAX_PATH * sizeof(*value); - value = heap_alloc(value_size); + value = malloc(value_size); }
do @@ -1549,15 +1544,15 @@ static HRESULT create_system_path_list(WCHAR ***ret, unsigned int *ret_count) if (name_count >= max_name_count) { max_name_count *= 2; - heap_free(name); - name = heap_alloc(max_name_count * sizeof(*name)); + free(name); + name = malloc(max_name_count * sizeof(*name)); }
if (data_size > value_size - sizeof(*value)) { - heap_free(value); + free(value); value_size = max(data_size + sizeof(*value), value_size * 2); - value = heap_alloc(value_size); + value = malloc(value_size); } } } while (r == ERROR_MORE_DATA); @@ -1574,12 +1569,12 @@ static HRESULT create_system_path_list(WCHAR ***ret, unsigned int *ret_count) { WCHAR *ptrW;
- ptrW = heap_alloc((MAX_PATH + wcslen(value)) * sizeof(WCHAR)); + ptrW = malloc((MAX_PATH + wcslen(value)) * sizeof(WCHAR)); GetWindowsDirectoryW(ptrW, MAX_PATH); wcscat(ptrW, L"\fonts\"); wcscat(ptrW, value);
- heap_free(value); + free(value); value = ptrW; }
@@ -1590,8 +1585,8 @@ static HRESULT create_system_path_list(WCHAR ***ret, unsigned int *ret_count) index++; }
- heap_free(value); - heap_free(name); + free(value); + free(name);
*ret = paths; *ret_count = count; @@ -1636,8 +1631,8 @@ static HRESULT create_system_fontset(IDWriteFactory7 *factory, REFIID riid, void }
for (i = 0; i < count; ++i) - heap_free(paths[i]); - heap_free(paths); + free(paths[i]); + free(paths); }
if (SUCCEEDED(hr = IDWriteFontSetBuilder2_CreateFontSet(builder, &fontset))) @@ -2075,8 +2070,8 @@ HRESULT WINAPI DWriteCreateFactory(DWRITE_FACTORY_TYPE type, REFIID riid, IUnkno if (type == DWRITE_FACTORY_TYPE_SHARED && shared_factory) return IDWriteFactory7_QueryInterface(shared_factory, riid, (void**)ret);
- factory = heap_alloc(sizeof(struct dwritefactory)); - if (!factory) return E_OUTOFMEMORY; + if (!(factory = calloc(1, sizeof(*factory)))) + return E_OUTOFMEMORY;
init_dwritefactory(factory, type);
diff --git a/dlls/dwrite/opentype.c b/dlls/dwrite/opentype.c index d7f8701fbbe..452b00240b8 100644 --- a/dlls/dwrite/opentype.c +++ b/dlls/dwrite/opentype.c @@ -2332,7 +2332,7 @@ static BOOL opentype_decode_namerecord(const struct dwrite_fonttable *table, uns if (codepage) { DWORD len = MultiByteToWideChar(codepage, 0, name, length, NULL, 0); - name_string = heap_alloc(sizeof(WCHAR) * (len+1)); + name_string = malloc(sizeof(WCHAR) * (len+1)); MultiByteToWideChar(codepage, 0, name, length, name_string, len); name_string[len] = 0; } @@ -2346,7 +2346,7 @@ static BOOL opentype_decode_namerecord(const struct dwrite_fonttable *table, uns
TRACE("string %s for locale %s found\n", debugstr_w(name_string), debugstr_w(locale)); add_localizedstring(strings, locale, name_string); - heap_free(name_string); + free(name_string);
ret = !wcscmp(locale, L"en-US"); } @@ -2507,9 +2507,9 @@ static HRESULT opentype_get_font_strings_from_meta(const struct file_stream_desc
if ((data = table_read_ensure(&meta, GET_BE_DWORD(maps[i].offset), length))) { - WCHAR *ptrW = heap_alloc((length + 1) * sizeof(WCHAR)), *ctx, *token; + WCHAR *ptrW, *ctx, *token;
- if (!ptrW) + if (!(ptrW = malloc((length + 1) * sizeof(WCHAR)))) { hr = E_OUTOFMEMORY; goto end; @@ -2528,7 +2528,7 @@ static HRESULT opentype_get_font_strings_from_meta(const struct file_stream_desc token = meta_get_lng_name(NULL, &ctx); }
- heap_free(ptrW); + free(ptrW); } } } @@ -2644,13 +2644,13 @@ HRESULT opentype_get_font_facename(struct file_stream_desc *stream_desc, WCHAR * WCHAR *nameW;
IDWriteLocalizedStrings_GetStringLength(lfnames, index, &length); - nameW = heap_alloc((length + 1) * sizeof(WCHAR)); + nameW = malloc((length + 1) * sizeof(WCHAR)); if (nameW) { *nameW = 0; IDWriteLocalizedStrings_GetString(lfnames, index, nameW, length + 1); lstrcpynW(lfname, nameW, LF_FACESIZE); - heap_free(nameW); + free(nameW); } }
@@ -4880,7 +4880,7 @@ void opentype_layout_apply_gpos_features(struct scriptshaping_context *context, } }
- heap_free(lookups.lookups); + free(lookups.lookups);
if (context->has_gpos_attachment) { @@ -4955,11 +4955,11 @@ static BOOL opentype_layout_gsub_ensure_buffer(struct scriptshaping_context *con
new_capacity = context->u.subst.capacity * 2;
- if ((glyphs = heap_realloc(context->u.subst.glyphs, new_capacity * sizeof(*glyphs)))) + if ((glyphs = realloc(context->u.subst.glyphs, new_capacity * sizeof(*glyphs)))) context->u.subst.glyphs = glyphs; - if ((glyph_props = heap_realloc(context->u.subst.glyph_props, new_capacity * sizeof(*glyph_props)))) + if ((glyph_props = realloc(context->u.subst.glyph_props, new_capacity * sizeof(*glyph_props)))) context->u.subst.glyph_props = glyph_props; - if ((glyph_infos = heap_realloc(context->glyph_infos, new_capacity * sizeof(*glyph_infos)))) + if ((glyph_infos = realloc(context->glyph_infos, new_capacity * sizeof(*glyph_infos)))) context->glyph_infos = glyph_infos;
if ((ret = (glyphs && glyph_props && glyph_infos))) @@ -6110,7 +6110,7 @@ void opentype_layout_apply_gsub_features(struct scriptshaping_context *context, for (j = context->glyph_infos[start_idx].start_text_idx; j < context->length; ++j) context->u.buffer.clustermap[j] = start_idx;
- heap_free(lookups.lookups); + free(lookups.lookups); }
static BOOL opentype_layout_contextual_lookup_is_glyph_covered(struct scriptshaping_context *context, UINT16 glyph, @@ -6339,7 +6339,7 @@ BOOL opentype_layout_check_feature(struct scriptshaping_context *context, unsign break; }
- heap_free(lookups.lookups); + free(lookups.lookups);
return ret; } @@ -6396,7 +6396,7 @@ BOOL opentype_has_vertical_variants(struct dwrite_fontface *fontface) } }
- heap_free(lookups.lookups); + free(lookups.lookups);
if (count) fontface->flags |= FONTFACE_VERTICAL_VARIANTS; @@ -6422,10 +6422,10 @@ HRESULT opentype_get_vertical_glyph_variants(struct dwrite_fontface *fontface, u
context.cache = fontface_get_shaping_cache(fontface); context.u.subst.glyphs = glyphs; - context.u.subst.glyph_props = heap_calloc(glyph_count, sizeof(*context.u.subst.glyph_props)); + context.u.subst.glyph_props = calloc(glyph_count, sizeof(*context.u.subst.glyph_props)); context.u.subst.max_glyph_count = glyph_count; context.u.subst.capacity = glyph_count; - context.glyph_infos = heap_alloc_zero(sizeof(*context.glyph_infos) * glyph_count); + context.glyph_infos = calloc(glyph_count, sizeof(*context.glyph_infos)); context.table = &context.cache->gsub;
vert_feature.tag = DWRITE_MAKE_OPENTYPE_TAG('v','e','r','t'); @@ -6456,9 +6456,9 @@ HRESULT opentype_get_vertical_glyph_variants(struct dwrite_fontface *fontface, u } }
- heap_free(context.u.subst.glyph_props); - heap_free(context.glyph_infos); - heap_free(lookups.lookups); + free(context.u.subst.glyph_props); + free(context.glyph_infos); + free(lookups.lookups);
return S_OK; } diff --git a/dlls/dwrite/shape.c b/dlls/dwrite/shape.c index 2d098fb5688..177ad1d06fe 100644 --- a/dlls/dwrite/shape.c +++ b/dlls/dwrite/shape.c @@ -44,8 +44,7 @@ struct scriptshaping_cache *create_scriptshaping_cache(void *context, const stru { struct scriptshaping_cache *cache;
- cache = heap_alloc_zero(sizeof(*cache)); - if (!cache) + if (!(cache = calloc(1, sizeof(*cache)))) return NULL;
cache->font = font_ops; @@ -65,7 +64,7 @@ void release_scriptshaping_cache(struct scriptshaping_cache *cache) cache->font->release_font_table(cache->context, cache->gdef.table.context); cache->font->release_font_table(cache->context, cache->gsub.table.context); cache->font->release_font_table(cache->context, cache->gpos.table.context); - heap_free(cache); + free(cache); }
static unsigned int shape_select_script(const struct scriptshaping_cache *cache, DWORD kind, const DWORD *scripts, @@ -269,7 +268,7 @@ HRESULT shape_get_positions(struct scriptshaping_context *context, const unsigne if (context->u.pos.glyph_props[i].isZeroWidthSpace) context->advances[i] = 0.0f;
- heap_free(features.features); + free(features.features);
return S_OK; } @@ -347,7 +346,7 @@ HRESULT shape_get_glyphs(struct scriptshaping_context *context, const unsigned i shape_get_script_lang_index(context, scripts, MS_GSUB_TAG, &script_index, &language_index); opentype_layout_apply_gsub_features(context, script_index, language_index, &features);
- heap_free(features.features); + free(features.features);
return (context->glyph_count <= context->u.subst.max_glyph_count) ? S_OK : E_NOT_SUFFICIENT_BUFFER; } @@ -393,7 +392,7 @@ HRESULT shape_get_typographic_features(struct scriptshaping_context *context, co
*actual_tagcount = t.count;
- heap_free(t.tags); + free(t.tags);
return t.count <= max_tagcount ? S_OK : E_NOT_SUFFICIENT_BUFFER; }