Include <stdio.h>.
[m17n/m17n-lib.git] / src / font-flt.c
index 07d3a7d..b4fdc69 100644 (file)
@@ -263,6 +263,17 @@ static MSymbol Mcond, Mrange;
 
 #define GLYPH_CODE_INDEX(code) ((code) - GLYPH_CODE_MIN)
 
+#define UPDATE_CLUSTER_RANGE(ctx, g)           \
+  do {                                         \
+    if ((ctx)->cluster_begin_idx)              \
+      {                                                \
+       if (ctx->cluster_begin_pos > (g).pos)   \
+         ctx->cluster_begin_pos = (g).pos;     \
+       if (ctx->cluster_end_pos < (g).to)      \
+         ctx->cluster_end_pos = (g).to;        \
+      }                                                \
+  } while (0);
+
 enum FontLayoutCmdRuleSrcType
   {
     SRC_REGEX,
@@ -1078,13 +1089,6 @@ run_rule (int depth,
            continue;
          i--;
        }
-      if (ctx->cluster_begin_idx)
-       {
-         if (ctx->cluster_begin_pos > MGLYPH (from)->pos)
-           ctx->cluster_begin_pos = MGLYPH (from)->pos;
-         if (ctx->cluster_end_pos < MGLYPH (to)->pos)
-           ctx->cluster_end_pos = MGLYPH (to)->pos;
-       }
       pos = run_command (depth, rule->cmd_ids[i], gstring, from, to, ctx);
       if (pos < 0)
        MERROR (MERROR_DRAW, -1);
@@ -1127,9 +1131,19 @@ run_otf (int depth,
         FontLayoutContext *ctx)
 {
 #ifdef HAVE_OTF
+  int from_idx = gstring->used;
+
+  MDEBUG_PRINT4 ("\n [FLT] %*s(OTF %s,%s)", depth, "",
+                (otf_cmd->gsub_features == Mnil ? ""
+                 : MSYMBOL_NAME (otf_cmd->gsub_features)),
+                (otf_cmd->gpos_features == Mnil ? ""
+                 : MSYMBOL_NAME (otf_cmd->gpos_features)));
   to = mfont__ft_drive_otf (gstring, from, to,
                            otf_cmd->script, otf_cmd->langsys,
                            otf_cmd->gsub_features, otf_cmd->gpos_features);
+  if (ctx->cluster_begin_idx)
+    for (; from_idx < gstring->used; from_idx++)
+      UPDATE_CLUSTER_RANGE (ctx, gstring->glyphs[from_idx]);
 #endif
   return to;
 }
@@ -1167,6 +1181,7 @@ run_command (int depth, int id, MGlyphString *gstring, int from, int to,
            g.to = tmp->to;
        }
       APPEND_GLYPH (gstring, g);
+      UPDATE_CLUSTER_RANGE (ctx, g);
       ctx->code_offset = ctx->combining_code = ctx->left_padding = 0;
       MDEBUG_PRINT (")");
       return (from);
@@ -1210,6 +1225,7 @@ run_command (int depth, int id, MGlyphString *gstring, int from, int to,
        if (ctx->left_padding)
          g.left_padding = ctx->left_padding;
        APPEND_GLYPH (gstring, g);
+       UPDATE_CLUSTER_RANGE (ctx, g);
        MDEBUG_PRINT3 ("\n [FLT] %*s(COPY 0x%X)", depth, "", g.code);
        ctx->code_offset = ctx->combining_code = ctx->left_padding = 0;
        return (from + 1);
@@ -1455,8 +1471,6 @@ mfont__flt_run (MGlyphString *gstring, int from, int to, MRealizedFace *rface)
       ctx.match_indices[1] = to;
     }
 
-  MDEBUG_PRINT (")\n");
-
   if (from == to)
     {
       /* Somehow there's no glyph contributing to characters between
@@ -1517,6 +1531,25 @@ mfont__flt_run (MGlyphString *gstring, int from, int to, MRealizedFace *rface)
            latest = glyphs[i];
        }
     }
+  MDEBUG_PRINT ("\n [FLT]   (RESULT (");
+  if (mdebug__flag & mdebug_mask
+      && ctx.encoded_offset < to)
+    {
+      if (gstring->glyphs[from].type == GLYPH_PAD)
+       fprintf (stderr, "|");
+      else
+       fprintf (stderr, "%X", gstring->glyphs[from].code);
+      for (from++; from < to; from++)
+       {
+         if (gstring->glyphs[from].type == GLYPH_PAD)
+           fprintf (stderr, " |");
+         else
+           fprintf (stderr, " %X", gstring->glyphs[from].code);
+       }
+      fprintf (stderr, "))");
+    }
+  MDEBUG_PRINT (")\n");
+
   return to;
 }