Nikolay Sivov : dwrite: Set some more cluster properties.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Apr 23 07:04:15 CDT 2015


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Thu Apr 23 13:01:18 2015 +0300

dwrite: Set some more cluster properties.

---

 dlls/dwrite/layout.c | 22 ++++++++++++++++++----
 1 file changed, 18 insertions(+), 4 deletions(-)

diff --git a/dlls/dwrite/layout.c b/dlls/dwrite/layout.c
index 9999e6e..f4aa1b6 100644
--- a/dlls/dwrite/layout.c
+++ b/dlls/dwrite/layout.c
@@ -377,6 +377,7 @@ static inline void init_cluster_metrics(const struct dwrite_textlayout *layout,
     UINT16 start_glyph, UINT16 stop_glyph, UINT32 stop_position, DWRITE_CLUSTER_METRICS *metrics)
 {
     UINT8 breakcondition;
+    UINT32 position;
     UINT16 j;
 
     metrics->width = 0.0;
@@ -384,16 +385,29 @@ static inline void init_cluster_metrics(const struct dwrite_textlayout *layout,
         metrics->width += run->run.glyphAdvances[j];
     metrics->length = 0;
 
+    position = stop_position;
     if (stop_glyph == run->run.glyphCount)
         breakcondition = get_effective_breakpoint(layout, stop_position).breakConditionAfter;
-    else
+    else {
         breakcondition = get_effective_breakpoint(layout, stop_position).breakConditionBefore;
+        if (stop_position) position = stop_position - 1;
+    }
 
     metrics->canWrapLineAfter = breakcondition == DWRITE_BREAK_CONDITION_CAN_BREAK ||
                                 breakcondition == DWRITE_BREAK_CONDITION_MUST_BREAK;
-    metrics->isWhitespace = FALSE; /* FIXME */
-    metrics->isNewline = FALSE;    /* FIXME */
-    metrics->isSoftHyphen = FALSE; /* FIXME */
+    if (metrics->length == 1) {
+        WORD type;
+
+        GetStringTypeW(CT_CTYPE1, &layout->str[position], 1, &type);
+        metrics->isWhitespace = type == C1_SPACE;
+        metrics->isNewline = FALSE /* FIXME */;
+        metrics->isSoftHyphen = layout->str[position] == 0x00ad /* Unicode Soft Hyphen */;
+    }
+    else {
+        metrics->isWhitespace = FALSE;
+        metrics->isNewline = FALSE;
+        metrics->isSoftHyphen = FALSE;
+    }
     metrics->isRightToLeft = run->run.bidiLevel & 1;
     metrics->padding = 0;
 }




More information about the wine-cvs mailing list