Nikolay Sivov : dwrite: Filter out unusable ranges on AddMapping().

Alexandre Julliard julliard at winehq.org
Fri Jul 22 15:38:23 CDT 2022


Module: wine
Branch: master
Commit: 78846236b938b1c5f2d2221ed0050656b54fb08e
URL:    https://gitlab.winehq.org/wine/wine/-/commit/78846236b938b1c5f2d2221ed0050656b54fb08e

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Sat Jul 16 15:13:01 2022 +0300

dwrite: Filter out unusable ranges on AddMapping().

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>

---

 dlls/dwrite/analyzer.c | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

diff --git a/dlls/dwrite/analyzer.c b/dlls/dwrite/analyzer.c
index 2f5f1e1d7fe..1522d7638bc 100644
--- a/dlls/dwrite/analyzer.c
+++ b/dlls/dwrite/analyzer.c
@@ -2374,7 +2374,7 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder
 {
     struct dwrite_fontfallback_builder *builder = impl_from_IDWriteFontFallbackBuilder(iface);
     struct fallback_mapping *mapping;
-    UINT32 i;
+    unsigned int i, count;
 
     TRACE("%p, %p, %u, %p, %u, %p, %s, %s, %f.\n", iface, ranges, ranges_count, families, families_count,
             collection, debugstr_w(locale_name), debugstr_w(base_family), scale);
@@ -2397,8 +2397,22 @@ static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder
     if (!(mapping->ranges = calloc(ranges_count, sizeof(*mapping->ranges))))
         goto failed;
 
-    mapping->ranges_count = ranges_count;
-    memcpy(mapping->ranges, ranges, sizeof(*mapping->ranges) * ranges_count);
+    /* Filter ranges that won't be usable. */
+    for (i = 0, count = 0; i < ranges_count; ++i)
+    {
+        if (ranges[i].first > ranges[i].last) continue;
+        if (ranges[i].first > 0x10ffff) continue;
+        mapping->ranges[count].first = ranges[i].first;
+        mapping->ranges[count].last = min(ranges[i].last, 0x10ffff);
+        count++;
+    }
+    if (!count)
+    {
+        release_fallback_mapping(mapping);
+        return S_OK;
+    }
+
+    mapping->ranges_count = count;
 
     if (!(mapping->families = calloc(families_count, sizeof(*mapping->families))))
         goto failed;




More information about the wine-cvs mailing list