[Indic] Recognize pre-base reordering Ra anywhere in the syllable

We were doing that only immediately after base.

Fixes another percent in the Khmer failures.  About three more to go...
diff --git a/src/hb-ot-shape-complex-indic.cc b/src/hb-ot-shape-complex-indic.cc
index 10ec5c5..feb5136 100644
--- a/src/hb-ot-shape-complex-indic.cc
+++ b/src/hb-ot-shape-complex-indic.cc
@@ -493,13 +493,17 @@
   }
 
   /* XXX This will not match for old-Indic spec since the Halant-Ra order is reversed already. */
-  if (basic_mask_array[PREF] &&
-      base + 3 <= end &&
-      info[base + 1].indic_category() == OT_H &&
-      info[base + 2].indic_category() == OT_Ra)
+  if (basic_mask_array[PREF] && base + 3 <= end)
   {
-    info[base + 1].mask |= basic_mask_array[PREF];
-    info[base + 2].mask |= basic_mask_array[PREF];
+    /* Find a Halant,Ra sequence and mark it fore pre-base reordering processing. */
+    for (unsigned int i = base + 1; i + 1 < end; i++)
+      if (info[i].indic_category() == OT_H &&
+	  info[i + 1].indic_category() == OT_Ra)
+      {
+	info[i].mask |= basic_mask_array[PREF];
+	info[i + 1].mask |= basic_mask_array[PREF];
+	break;
+      }
   }
 
   /* Apply ZWJ/ZWNJ effects */
@@ -815,40 +819,44 @@
 
   if (pref_mask && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */
   {
-    /*       1. Only reorder a glyph produced by substitution during application
-     *          of the <pref> feature. (Note that a font may shape a Ra consonant with
-     *          the feature generally but block it in certain contexts.)
-     */
-    if ((info[base + 1].mask & pref_mask) != 0 &&
-	(base + 2 == end ||
-	 (info[base + 2].mask & pref_mask) == 0))
-    {
-      /*
-       *       2. Try to find a target position the same way as for pre-base matra.
-       *          If it is found, reorder pre-base consonant glyph.
-       *
-       *       3. If position is not found, reorder immediately before main
-       *          consonant.
-       */
-
-      unsigned int new_pos = base;
-      while (new_pos > start + 1 &&
-	     !(FLAG (info[new_pos - 1].indic_category()) & (FLAG (OT_M) | FLAG (OT_H))))
-	new_pos--;
-
-      if (new_pos > start && info[new_pos - 1].indic_category() == OT_H)
-	/* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
-	if (new_pos < end && is_joiner (info[new_pos]))
-	  new_pos++;
-
+    for (unsigned int i = base + 1; i < end; i++)
+      if ((info[i].mask & pref_mask) != 0)
       {
-	unsigned int old_pos = base + 1;
-	hb_glyph_info_t tmp = info[old_pos];
-	memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0]));
-	info[new_pos] = tmp;
-	start_of_last_cluster = MIN (new_pos, start_of_last_cluster);
+	/*       1. Only reorder a glyph produced by substitution during application
+	 *          of the <pref> feature. (Note that a font may shape a Ra consonant with
+	 *          the feature generally but block it in certain contexts.)
+	 */
+	if (i + 1 == end || (info[i + 1].mask & pref_mask) == 0)
+	{
+	  /*
+	   *       2. Try to find a target position the same way as for pre-base matra.
+	   *          If it is found, reorder pre-base consonant glyph.
+	   *
+	   *       3. If position is not found, reorder immediately before main
+	   *          consonant.
+	   */
+
+	  unsigned int new_pos = base;
+	  while (new_pos > start + 1 &&
+		 !(FLAG (info[new_pos - 1].indic_category()) & (FLAG (OT_M) | FLAG (OT_H))))
+	    new_pos--;
+
+	  if (new_pos > start && info[new_pos - 1].indic_category() == OT_H)
+	    /* -> If ZWJ or ZWNJ follow this halant, position is moved after it. */
+	    if (new_pos < end && is_joiner (info[new_pos]))
+	      new_pos++;
+
+	  {
+	    unsigned int old_pos = i;
+	    hb_glyph_info_t tmp = info[old_pos];
+	    memmove (&info[new_pos + 1], &info[new_pos], (old_pos - new_pos) * sizeof (info[0]));
+	    info[new_pos] = tmp;
+	    start_of_last_cluster = MIN (new_pos, start_of_last_cluster);
+	  }
+	}
+
+        break;
       }
-    }
   }