X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Ffont-flt.c;h=0fe41350bb49858a56e87b312caa102838ca3bde;hb=6ac495c3a791ab71a4fb0a19b2d9f88f77efb558;hp=28841b9c9a9b18084573587435d5aa4b381265e0;hpb=7d310ff8b92482c8cda3113a91ee73f3d4283e13;p=m17n%2Fm17n-lib.git diff --git a/src/font-flt.c b/src/font-flt.c index 28841b9..0fe4135 100644 --- a/src/font-flt.c +++ b/src/font-flt.c @@ -17,7 +17,7 @@ You should have received a copy of the GNU Lesser General Public License along with the m17n library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 02111-1307, USA. */ #include "config.h" @@ -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, @@ -314,19 +325,11 @@ enum FontLayoutCmdType typedef struct { - MSymbol script; - MSymbol langsys; - MSymbol gsub_features; - MSymbol gpos_features; -} FontLayoutCmdOTF; - -typedef struct -{ enum FontLayoutCmdType type; union { FontLayoutCmdRule rule; FontLayoutCmdCond cond; - FontLayoutCmdOTF otf; + MFontCapability *otf; } body; } FontLayoutCmd; @@ -399,49 +402,31 @@ load_category_table (MPlist *plist) [FEATURE[,FEATURE]*] | ' ' */ static int -load_otf_command (FontLayoutCmd *cmd, char *name) +load_otf_command (FontLayoutCmd *cmd, MSymbol sym) { - char *p = name, *beg; - - cmd->type = FontLayoutCmdTypeOTF; - cmd->body.otf.script = cmd->body.otf.langsys = Mnil; - cmd->body.otf.gsub_features = cmd->body.otf.gpos_features = Mt; + char *name = MSYMBOL_NAME (sym); - while (*p) + if (name[0] != ':') { - if (*p == ':') - { - for (beg = ++p; *p && *p != '/' && *p != '=' && *p != '+'; p++); - if (beg < p) - cmd->body.otf.script = msymbol__with_len (beg, p - beg); - } - else if (*p == '/') - { - for (beg = ++p; *p && *p != '=' && *p != '+'; p++); - if (beg < p) - cmd->body.otf.langsys = msymbol__with_len (beg, p - beg); - } - else if (*p == '=') - { - for (beg = ++p; *p && *p != '+'; p++); - if (beg < p) - cmd->body.otf.gsub_features = msymbol__with_len (beg, p - beg); - else - cmd->body.otf.gsub_features = Mnil; - } - else if (*p == '+') - { - for (beg = ++p; *p && *p != '+'; p++); - if (beg < p) - cmd->body.otf.gpos_features = msymbol__with_len (beg, p - beg); - else - cmd->body.otf.gpos_features = Mnil; - } - else - p++; + /* This is old format of "otf:...". Change it to ":otf=...". */ + char *str = alloca (MSYMBOL_NAMELEN (sym) + 2); + + sprintf (str, ":otf="); + strcat (str, name + 4); + sym = msymbol (str); } - return (cmd->body.otf.script == Mnil ? -1 : 0); + cmd->body.otf = mfont__get_capability (sym); + if (! cmd->body.otf) + return -1; + if (cmd->body.otf->script == Mnil) + { + cmd->body.otf = NULL; + return -1; + } + M17N_OBJECT_REF (cmd->body.otf); + cmd->type = FontLayoutCmdTypeOTF; + return 0; } @@ -725,8 +710,11 @@ load_command (FontLayoutStage *stage, MPlist *plist, FontLayoutCmd cmd; if (len > 4 - && ! strncmp (name, "otf:", 4) - && load_otf_command (&cmd, name + 3) >= 0) + && ((name[0] == 'o' && name[1] == 't' + && name[2] == 'f' && name[3] == ':') + || (name[0] == ':' && name[1] == 'o' && name[2] == 't' + && name[3] == 'f' && name[4] == '=')) + && load_otf_command (&cmd, sym) >= 0) { if (id == INVALID_CMD_ID) { @@ -803,6 +791,8 @@ free_flt_command (FontLayoutCmd *cmd) } else if (cmd->type == FontLayoutCmdTypeCond) free (cmd->body.cond.cmd_ids); + else if (cmd->type == FontLayoutCmdTypeOTF) + M17N_OBJECT_UNREF (cmd->body.otf); } /* Load a generator from PLIST into a newly allocated FontLayoutStage, @@ -1078,13 +1068,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); @@ -1123,22 +1106,27 @@ run_cond (int depth, static int run_otf (int depth, - FontLayoutCmdOTF *otf_cmd, MGlyphString *gstring, int from, int to, + MFontCapability *otf_cmd, MGlyphString *gstring, int from, int to, FontLayoutContext *ctx) { #ifdef HAVE_OTF - 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); + int from_idx = gstring->used; + + MDEBUG_PRINT4 ("\n [FLT] %*s(OTF %s,%s)", depth, "", + (! otf_cmd->features[MFONT_OTT_GSUB].str ? "" + : otf_cmd->features[MFONT_OTT_GSUB].str), + (! otf_cmd->features[MFONT_OTT_GPOS].str ? "" + : otf_cmd->features[MFONT_OTT_GPOS].str)); + to = mfont__ft_drive_otf (gstring, from, to, otf_cmd); + if (ctx->cluster_begin_idx) + for (; from_idx < gstring->used; from_idx++) + UPDATE_CLUSTER_RANGE (ctx, gstring->glyphs[from_idx]); #endif return to; } +extern char *dump_combining_code (int code); + static int run_command (int depth, int id, MGlyphString *gstring, int from, int to, FontLayoutContext *ctx) @@ -1172,6 +1160,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); @@ -1190,7 +1179,7 @@ run_command (int depth, int id, MGlyphString *gstring, int from, int to, else if (cmd->type == FontLayoutCmdTypeCond) to = run_cond (depth, &cmd->body.cond, gstring, from, to, ctx); else if (cmd->type == FontLayoutCmdTypeOTF) - to = run_otf (depth, &cmd->body.otf, gstring, from, to, ctx); + to = run_otf (depth, cmd->body.otf, gstring, from, to, ctx); if (to < 0) return -1; @@ -1200,6 +1189,8 @@ run_command (int depth, int id, MGlyphString *gstring, int from, int to, if (id <= CMD_ID_OFFSET_COMBINING) { ctx->combining_code = CMD_ID_TO_COMBINING_CODE (id); + MDEBUG_PRINT3 ("\n [FLT] %*s(CMB %s)", depth, "", + dump_combining_code (ctx->combining_code)); return from; } @@ -1215,6 +1206,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); @@ -1259,12 +1251,16 @@ run_command (int depth, int id, MGlyphString *gstring, int from, int to, } case CMD_ID_LEFT_PADDING: + MDEBUG_PRINT2 ("\n [FLT] %*s[", depth, ""); ctx->left_padding = 1; return from; case CMD_ID_RIGHT_PADDING: if (gstring->used > 0) - gstring->glyphs[gstring->used - 1].right_padding = 1; + { + MDEBUG_PRINT2 ("\n [FLT] %*s]", depth, ""); + gstring->glyphs[gstring->used - 1].right_padding = 1; + } return from; } @@ -1327,7 +1323,7 @@ mfont__flt_run (MGlyphString *gstring, int from, int to, MRealizedFace *rface) MCharTable *table; int encoded_len; int match_indices[NMATCH]; - MSymbol layouter_name = rface->rfont->layouter; + MSymbol layouter_name = rface->layouter; MFontLayoutTable *layouter = get_font_layout_table (layouter_name); MRealizedFace *ascii_rface = rface->ascii_rface; FontLayoutStage *stage; @@ -1388,6 +1384,7 @@ mfont__flt_run (MGlyphString *gstring, int from, int to, MRealizedFace *rface) int len = to - from; int result; + ctx.code_offset = ctx.combining_code = ctx.left_padding = 0; MDEBUG_PRINT2 ("\n [FLT] (STAGE %d \"%s\"", stage_idx, ctx.encoded); if (mdebug__flag & mdebug_mask && ctx.encoded_offset < to) @@ -1460,8 +1457,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 @@ -1489,8 +1484,8 @@ mfont__flt_run (MGlyphString *gstring, int from, int to, MRealizedFace *rface) for (g = MGLYPH (from); g != gend; g++) if (g->type == GLYPH_CHAR && ! g->otf_encoded) - g->code - = (rface->rfont->driver->encode_char) (rface->rfont, g->code); + g->code = ((rface->rfont->driver->encode_char) + (NULL, (MFont *) rface->rfont, NULL, g->code)); for (i = 0; i < len; i++) glyphs[i] = NULL; for (g = MGLYPH (from); g != gend; g++) @@ -1522,6 +1517,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; }