#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,
if (i < len)
return 0;
to = from + len;
- MDEBUG_PRINT1 (" (SEQ 0x%X", rule->src.seq.codes[0]);
+ MDEBUG_PRINT3 ("\n [FLT] %*s(SEQ 0x%X", depth, "",
+ rule->src.seq.codes[0]);
}
else if (rule->src_type == SRC_RANGE)
{
return 0;
ctx->code_offset = head - rule->src.range.from;
to = from + 1;
- MDEBUG_PRINT2 (" (RANGE 0x%X-0x%X",
+ MDEBUG_PRINT4 ("\n [FLT] %*s(RANGE 0x%X-0x%X", depth, "",
rule->src.range.from, rule->src.range.to);
}
else if (rule->src_type == SRC_REGEX)
NMATCH, pmatch, 0);
if (result == 0 && pmatch[0].rm_so == 0)
{
- MDEBUG_PRINT3 (" (REGEX \"%s\" \"%s\" %d",
+ MDEBUG_PRINT5 ("\n [FLT] %*s(REGEX \"%s\" \"%s\" %d", depth, "",
rule->src.re.pattern,
ctx->encoded + from - ctx->encoded_offset,
pmatch[0].rm_eo);
if (from < 0)
return 0;
to = ctx->match_indices[rule->src.match_idx * 2 + 1];
- MDEBUG_PRINT1 (" (INDEX %d", rule->src.match_idx);
+ MDEBUG_PRINT3 ("\n [FLT] %*s(INDEX %d", depth, "", rule->src.match_idx);
}
consumed = 0;
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);
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;
}
g = *(MGLYPH (from - 1));
g.type = GLYPH_CHAR;
g.code = ctx->code_offset + id;
- MDEBUG_PRINT1 (" (DIRECT 0x%X", g.code);
+ MDEBUG_PRINT3 ("\n [FLT] %*s(DIRECT 0x%X", depth, "", g.code);
if (ctx->combining_code)
g.combining_code = ctx->combining_code;
if (ctx->left_padding)
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);
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);
}
case CMD_ID_CLUSTER_BEGIN:
if (! ctx->cluster_begin_idx)
{
- MDEBUG_PRINT1 (" <%d", MGLYPH (from)->pos);
+ MDEBUG_PRINT3 ("\n [FLT] %*s<%d", depth, "", MGLYPH (from)->pos);
ctx->cluster_begin_idx = gstring->used;
ctx->cluster_begin_pos = MGLYPH (from)->pos;
ctx->cluster_end_pos = MGLYPH (from)->to;
int len = to - from;
int result;
- MDEBUG_PRINT1 ("\n [FLT] (STAGE %d", stage_idx);
+ MDEBUG_PRINT2 ("\n [FLT] (STAGE %d \"%s\"", stage_idx, ctx.encoded);
+ if (mdebug__flag & mdebug_mask
+ && ctx.encoded_offset < to)
+ {
+ if (gstring->glyphs[ctx.encoded_offset].type == GLYPH_PAD)
+ fprintf (stderr, " (|");
+ else
+ fprintf (stderr, " (%X", gstring->glyphs[ctx.encoded_offset].code);
+ for (i = ctx.encoded_offset + 1; i < to; i++)
+ {
+ if (gstring->glyphs[i].type == GLYPH_PAD)
+ fprintf (stderr, " |");
+ else
+ fprintf (stderr, " %X", gstring->glyphs[i].code);
+ }
+ fprintf (stderr, ")");
+ }
+
gidx = gstring->used;
ctx.stage = stage;
- result = run_command (2, INDEX_TO_CMD_ID (0), gstring,
+ result = run_command (4, INDEX_TO_CMD_ID (0), gstring,
ctx.encoded_offset, to, &ctx);
MDEBUG_PRINT (")");
if (result < 0)
ctx.match_indices[1] = to;
}
- MDEBUG_PRINT (")\n");
-
if (from == to)
{
/* Somehow there's no glyph contributing to characters between
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;
}