Nikolay Sivov : dwrite: Added a range data header to distinguish range kinds.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 5 06:46:11 CDT 2015


Module: wine
Branch: master
Commit: 6d87a451a2942aada61f933b3f9a621589bbbb24
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=6d87a451a2942aada61f933b3f9a621589bbbb24

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Jun  4 13:37:01 2015 +0300

dwrite: Added a range data header to distinguish range kinds.

---

 dlls/dwrite/layout.c | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 8f42433..1e70cf1 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -93,8 +93,17 @@ struct layout_range_attr_value {
     } u;
 };
 
-struct layout_range {
+enum layout_range_kind {
+    LAYOUT_RANGE_REGULAR
+};
+
+struct layout_range_header {
     struct list entry;
+    enum layout_range_kind kind;
+};
+
+struct layout_range {
+    struct layout_range_header h;
     DWRITE_TEXT_RANGE range;
     DWRITE_FONT_WEIGHT weight;
     DWRITE_FONT_STYLE style;
@@ -545,7 +554,7 @@ static HRESULT layout_compute_runs(struct dwrite_textlayout *layout)
     if (FAILED(hr))
         return hr;
 
-    LIST_FOR_EACH_ENTRY(range, &layout->ranges, struct layout_range, entry) {
+    LIST_FOR_EACH_ENTRY(range, &layout->ranges, struct layout_range, h.entry) {
         /* inline objects override actual text in a range */
         if (range->object) {
             hr = layout_update_breakpoints_range(layout, range);
@@ -1056,6 +1065,7 @@ static struct layout_range *alloc_layout_range(struct dwrite_textlayout *layout,
     range = heap_alloc(sizeof(*range));
     if (!range) return NULL;
 
+    range->h.kind = LAYOUT_RANGE_REGULAR;
     range->range = *r;
     range->weight = layout->format.weight;
     range->style  = layout->format.style;
@@ -1125,8 +1135,8 @@ static void free_layout_range(struct layout_range *range)
 static void free_layout_ranges_list(struct dwrite_textlayout *layout)
 {
     struct layout_range *cur, *cur2;
-    LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->ranges, struct layout_range, entry) {
-        list_remove(&cur->entry);
+    LIST_FOR_EACH_ENTRY_SAFE(cur, cur2, &layout->ranges, struct layout_range, h.entry) {
+        list_remove(&cur->h.entry);
         free_layout_range(cur);
     }
 }
@@ -1135,7 +1145,7 @@ static struct layout_range *find_outer_range(struct dwrite_textlayout *layout, c
 {
     struct layout_range *cur;
 
-    LIST_FOR_EACH_ENTRY(cur, &layout->ranges, struct layout_range, entry) {
+    LIST_FOR_EACH_ENTRY(cur, &layout->ranges, struct layout_range, h.entry) {
 
         if (cur->range.startPosition > range->startPosition)
             return NULL;
@@ -1154,7 +1164,7 @@ static struct layout_range *get_layout_range_by_pos(struct dwrite_textlayout *la
 {
     struct layout_range *cur;
 
-    LIST_FOR_EACH_ENTRY(cur, &layout->ranges, struct layout_range, entry) {
+    LIST_FOR_EACH_ENTRY(cur, &layout->ranges, struct layout_range, h.entry) {
         DWRITE_TEXT_RANGE *r = &cur->range;
         if (r->startPosition <= pos && pos < r->startPosition + r->length)
             return cur;
@@ -1279,7 +1289,7 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
             if (!left) return E_OUTOFMEMORY;
 
             changed = set_layout_range_attrval(left, attr, value);
-            list_add_before(&outer->entry, &left->entry);
+            list_add_before(&outer->h.entry, &left->h.entry);
             outer->range.startPosition += value->range.length;
             outer->range.length -= value->range.length;
             goto done;
@@ -1291,7 +1301,7 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
             if (!right) return E_OUTOFMEMORY;
 
             changed = set_layout_range_attrval(right, attr, value);
-            list_add_after(&outer->entry, &right->entry);
+            list_add_after(&outer->h.entry, &right->h.entry);
             outer->range.length -= value->range.length;
             goto done;
         }
@@ -1315,8 +1325,8 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
         /* new part */
         set_layout_range_attrval(cur, attr, value);
 
-        list_add_after(&outer->entry, &cur->entry);
-        list_add_after(&cur->entry, &right->entry);
+        list_add_after(&outer->h.entry, &cur->h.entry);
+        list_add_after(&cur->h.entry, &right->h.entry);
 
         return S_OK;
     }
@@ -1332,14 +1342,14 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
         left->range.length -= r.length;
         cur = alloc_layout_range_from(left, &r);
         changed = set_layout_range_attrval(cur, attr, value);
-        list_add_after(&left->entry, &cur->entry);
+        list_add_after(&left->h.entry, &cur->h.entry);
     }
-    cur = LIST_ENTRY(list_next(ranges, &left->entry), struct layout_range, entry);
+    cur = LIST_ENTRY(list_next(ranges, &left->h.entry), struct layout_range, h.entry);
 
     /* for all existing ranges covered by new one update value */
     while (is_in_layout_range(&value->range, &cur->range)) {
         changed = set_layout_range_attrval(cur, attr, value);
-        cur = LIST_ENTRY(list_next(ranges, &cur->entry), struct layout_range, entry);
+        cur = LIST_ENTRY(list_next(ranges, &cur->h.entry), struct layout_range, h.entry);
     }
 
     /* it's possible rightmost range intersects */
@@ -1350,7 +1360,7 @@ static HRESULT set_layout_range_attr(struct dwrite_textlayout *layout, enum layo
         changed = set_layout_range_attrval(left, attr, value);
         cur->range.startPosition += left->range.length;
         cur->range.length -= left->range.length;
-        list_add_before(&cur->entry, &left->entry);
+        list_add_before(&cur->h.entry, &left->h.entry);
     }
 
 done:
@@ -1360,9 +1370,9 @@ done:
         layout->recompute = RECOMPUTE_EVERYTHING;
         i = list_head(ranges);
         while ((next = list_next(ranges, i))) {
-            struct layout_range *next_range = LIST_ENTRY(next, struct layout_range, entry);
+            struct layout_range *next_range = LIST_ENTRY(next, struct layout_range, h.entry);
 
-            cur = LIST_ENTRY(i, struct layout_range, entry);
+            cur = LIST_ENTRY(i, struct layout_range, h.entry);
             if (is_same_layout_attributes(cur, next_range)) {
                 /* remove similar range */
                 cur->range.length += next_range->range.length;
@@ -3098,7 +3108,7 @@ static HRESULT init_textlayout(const WCHAR *str, UINT32 len, IDWriteTextFormat *
         goto fail;
     }
 
-    list_add_head(&layout->ranges, &range->entry);
+    list_add_head(&layout->ranges, &range->h.entry);
     return S_OK;
 
 fail:




More information about the wine-cvs mailing list