Make apply_stch() give a more precise fit
authorjfkthame <jfkthame@gmail.com>
Sat, 5 Dec 2015 17:47:37 +0000 (17:47 +0000)
committerjfkthame <jfkthame@gmail.com>
Sat, 5 Dec 2015 17:47:37 +0000 (17:47 +0000)
This aims to make Syriac Abbr Mark sizing more accurate when repeating segments are used, by adding an extra repeat and tightening up the spacing slightly rather than leaving a shortfall corresponding to a partial repeat-width.

src/hb-ot-shape-complex-arabic.cc

index 5075477..6d9d093 100644 (file)
@@ -542,7 +542,18 @@ apply_stch (const hb_ot_shape_plan_t *plan,
 
       hb_position_t w_remaining = w_total - w_fixed - overlap;
       if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0)
-       n_copies = (sign * w_remaining + sign * w_repeating / 4) / (sign * w_repeating) - 1;
+       n_copies = (sign * w_remaining) / (sign * w_repeating) - 1;
+
+      /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */
+      hb_position_t extra_repeat_overlap = 0;
+      hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1);
+      if (shortfall > 0)
+      {
+        ++n_copies;
+        hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining;
+        if (excess > 0)
+          extra_repeat_overlap = excess / (n_copies * n_repeating);
+      }
 
       if (step == MEASURE)
       {
@@ -568,6 +579,8 @@ apply_stch (const hb_ot_shape_plan_t *plan,
          for (unsigned int n = 0; n < repeat; n++)
          {
            x_offset -= extents.width;
+           if (n > 0)
+             x_offset += extra_repeat_overlap;
            pos[k - 1].x_offset = x_offset;
            /* Append copy. */
            --j;