From: handa Date: Mon, 26 Jul 2004 01:36:27 +0000 (+0000) Subject: (adjust_anchor): Type of argument `code' changed. X-Git-Tag: REL-1-1-0~73 X-Git-Url: http://git.chise.org/gitweb/?a=commitdiff_plain;h=09b08fe84c05c942b81ea683bab0b1413bfa08eb;p=m17n%2Fm17n-lib.git (adjust_anchor): Type of argument `code' changed. Caller changed. (mfont__ft_drive_otf): Renamed back from mfont__ft_drive_gsub. Fix handling of GPOS. (mfont__ft_drive_gpos): Delete this function. --- diff --git a/src/font-ft.c b/src/font-ft.c index 2ca60b8..17f8f27 100644 --- a/src/font-ft.c +++ b/src/font-ft.c @@ -885,14 +885,14 @@ mfont__ft_unparse_name (MFont *font) void adjust_anchor (OTF_Anchor *anchor, FT_Face ft_face, - MGlyph *prev, int size, int *x, int *y) + unsigned code, int size, int *x, int *y) { - if (anchor->AnchorFormat == 2 && prev) + if (anchor->AnchorFormat == 2) { FT_Outline *outline; int ap = anchor->f.f1.AnchorPoint; - FT_Load_Glyph (ft_face, (FT_UInt) prev->code, FT_LOAD_MONOCHROME); + FT_Load_Glyph (ft_face, (FT_UInt) code, FT_LOAD_MONOCHROME); outline = &ft_face->glyph->outline; if (ap < outline->n_points) { @@ -908,25 +908,27 @@ adjust_anchor (OTF_Anchor *anchor, FT_Face ft_face, } int -mfont__ft_drive_gsub (MGlyphString *gstring, int from, int to) +mfont__ft_drive_otf (MGlyphString *gstring, int from, int to, + MSymbol script, MSymbol langsys, + MSymbol gsub_features, MSymbol gpos_features) { int len = to - from; - MGlyph g; - int i; + MGlyph *g = MGLYPH (from); + int i, gidx; + MRealizedFont *rfont; MFTInfo *ft_info; OTF *otf; OTF_GlyphString otf_gstring; OTF_Glyph *otfg; char *script_name, *language_name; - char *gsub_feature_names; - int from_pos, to_pos; + char *gsub_feature_names, *gpos_feature_names; int need_cmap; if (len == 0) return from; - g = gstring->glyphs[from]; - ft_info = g.rface->rfont->info; + rfont = g->rface->rfont; + ft_info = rfont->info; if (ft_info->otf_flag < 0) goto simple_copy; otf = ft_info->otf; @@ -946,32 +948,26 @@ mfont__ft_drive_gsub (MGlyphString *gstring, int from, int to) ft_info->otf = otf; } - if (g.otf_cmd->script != Mnil) - script_name = msymbol_name (g.otf_cmd->script); + if (script != Mnil) + script_name = msymbol_name (script); else script_name = NULL; - if (g.otf_cmd->langsys != Mnil) - language_name = msymbol_name (g.otf_cmd->langsys); + if (langsys != Mnil) + language_name = msymbol_name (langsys); else language_name = NULL; gsub_feature_names - = (g.otf_cmd->gsub_features == Mt ? "*" - : g.otf_cmd->gsub_features == Mnil ? NULL - : msymbol_name (g.otf_cmd->gsub_features)); + = (gsub_features == Mt ? "*" + : gsub_features == Mnil ? NULL + : msymbol_name (gsub_features)); if (gsub_feature_names && OTF_check_table (otf, "GSUB") < 0) gsub_feature_names = NULL; - if (! gsub_feature_names) - goto simple_copy; - - from_pos = g.pos; - to_pos = g.to; - for (i = from + 1; i < to; i++) - { - if (from_pos > gstring->glyphs[i].pos) - from_pos = gstring->glyphs[i].pos; - if (to_pos < gstring->glyphs[i].to) - to_pos = gstring->glyphs[i].to; - } + gpos_feature_names + = (gpos_features == Mt ? "*" + : gpos_features == Mnil ? NULL + : msymbol_name (gpos_features)); + if (gpos_feature_names && OTF_check_table (otf, "GPOS") < 0) + gpos_feature_names = NULL; otf_gstring.size = otf_gstring.used = len; otf_gstring.glyphs = (OTF_Glyph *) alloca (sizeof (OTF_Glyph) * len); @@ -992,165 +988,132 @@ mfont__ft_drive_gsub (MGlyphString *gstring, int from, int to) if (need_cmap && OTF_drive_cmap (otf, &otf_gstring) < 0) goto simple_copy; - if (OTF_drive_gsub (otf, &otf_gstring, script_name, language_name, - gsub_feature_names) < 0) - goto simple_copy; - g.pos = from_pos; - g.to = to_pos; - for (i = 0, otfg = otf_gstring.glyphs; i < otf_gstring.used; i++, otfg++) + gidx = gstring->used; + + if (gsub_feature_names) { - g.combining_code = 0; - g.c = otfg->c; - if (otfg->glyph_id) + if (OTF_drive_gsub (otf, &otf_gstring, script_name, language_name, + gsub_feature_names) < 0) + goto simple_copy; + for (i = 0, otfg = otf_gstring.glyphs; i < otf_gstring.used; i++, otfg++) { - g.code = otfg->glyph_id; - g.otf_encoded = 1; - } - else - { - g.code = otfg->c; - g.otf_encoded = 0; - } - MLIST_APPEND1 (gstring, glyphs, g, MERROR_FONT_OTF); - } - return to; + MGlyph temp = *(MGLYPH (from + otfg->f.index.from)); - simple_copy: - for (i = 0; i < len; i++) - { - g = gstring->glyphs[from + i]; - MLIST_APPEND1 (gstring, glyphs, g, MERROR_FONT_OTF); + temp.c = otfg->c; + temp.combining_code = 0; + if (otfg->glyph_id) + { + temp.code = otfg->glyph_id; + temp.otf_encoded = 1; + } + else + { + temp.code = temp.c; + temp.otf_encoded = 0; + } + temp.to = MGLYPH (from + otfg->f.index.to)->to; + MLIST_APPEND1 (gstring, glyphs, temp, MERROR_FONT_OTF); + } } - return to; -} - -int -mfont__ft_drive_gpos (MGlyphString *gstring, int from, int to) -{ - int len = to - from; - MGlyph *g; - int i; - MFTInfo *ft_info; - OTF *otf; - OTF_GlyphString otf_gstring; - char *script_name, *language_name; - char *gpos_feature_names; - int u; - int size10, size; - int inc, from_idx, to_idx; - - if (len == 0) - return from; - - g = MGLYPH (from); - ft_info = g->rface->rfont->info; - if (ft_info->otf_flag < 0) - return to; - otf = ft_info->otf; - if (! otf) - return to; - if (g->otf_cmd->script != Mnil) - script_name = msymbol_name (g->otf_cmd->script); - else - script_name = NULL; - if (g->otf_cmd->langsys != Mnil) - language_name = msymbol_name (g->otf_cmd->langsys); else - language_name = NULL; - gpos_feature_names - = (g->otf_cmd->gpos_features == Mt ? "*" - : g->otf_cmd->gpos_features == Mnil ? NULL - : msymbol_name (g->otf_cmd->gpos_features)); - if (gpos_feature_names && OTF_check_table (otf, "GPOS") < 0) - gpos_feature_names = NULL; - if (! gpos_feature_names) - return to; + for (i = 0; i < len; i++) + { + MGlyph temp = gstring->glyphs[from + i]; + MLIST_APPEND1 (gstring, glyphs, temp, MERROR_FONT_OTF); + } - otf_gstring.size = otf_gstring.used = len; - otf_gstring.glyphs = (OTF_Glyph *) alloca (sizeof (OTF_Glyph) * len); - memset (otf_gstring.glyphs, 0, sizeof (OTF_Glyph) * len); - if (g->bidi_level & 1) - from_idx = len - 1, to_idx = -1, inc = -1; - else - from_idx = 0, to_idx = len, inc = 1; + ft_find_metric (rfont, gstring, gidx, gstring->used); - for (i = from_idx; i != to_idx; i += inc) - { - otf_gstring.glyphs[i].c = gstring->glyphs[from + i].c; - otf_gstring.glyphs[i].glyph_id = gstring->glyphs[from + i].code; - } - if (OTF_drive_gpos (otf, &otf_gstring, script_name, language_name, - gpos_feature_names) < 0) - return to; - - u = otf->head->unitsPerEm; - size10 = g->rface->rfont->font.property[MFONT_SIZE]; - size = size10 / 10; - if (inc < 0) - g = MGLYPH (from + len - 1); - for (i = 0; i < len; i++, g += inc) + if (gpos_feature_names) { - OTF_Glyph *otfg = otf_gstring.glyphs + i; + int u; + int size10, size; + MGlyph *prev = NULL; + + if (OTF_drive_gpos (otf, &otf_gstring, script_name, language_name, + gpos_feature_names) < 0) + return to; + + u = otf->head->unitsPerEm; + size10 = rfont->font.property[MFONT_SIZE]; + size = size10 / 10; - switch (otfg->positioning_type) + for (i = 0, otfg = otf_gstring.glyphs, g = MGLYPH (gidx); + i < otf_gstring.used; i++, otfg++, g++) { - case 0: - break; - case 1: case 2: - { - int format = otfg->f.f1.format; - - if (format & OTF_XPlacement) - g->xoff = otfg->f.f1.value->XPlacement * size10 / u / 10; - if (format & OTF_XPlaDevice) - g->xoff += DEVICE_DELTA (otfg->f.f1.value->XPlaDevice, size); - if (format & OTF_YPlacement) - g->yoff = otfg->f.f1.value->YPlacement * size10 / u / 10; - if (format & OTF_YPlaDevice) - g->yoff += DEVICE_DELTA (otfg->f.f1.value->YPlaDevice, size); - } - break; - case 3: - /* Not yet supported. */ - break; - case 4: - { - int base_x, base_y, mark_x, mark_y; - - base_x = otfg->f.f4.base_anchor->XCoordinate * size10 / u / 10; - base_y = otfg->f.f4.base_anchor->YCoordinate * size10 / u / 10; - mark_x = otfg->f.f4.mark_anchor->XCoordinate * size10 / u / 10; - mark_y = otfg->f.f4.mark_anchor->YCoordinate * size10 / u / 10; - - if (otfg->f.f4.base_anchor->AnchorFormat != 1) - adjust_anchor (otfg->f.f4.base_anchor, ft_info->ft_face, - g - inc, size, &base_x, &base_y); - if (otfg->f.f4.mark_anchor->AnchorFormat != 1) - adjust_anchor (otfg->f.f4.mark_anchor, ft_info->ft_face, - g, size, &mark_x, &mark_y); - g->xoff = (base_x - (g - inc)->width) - mark_x; - g->yoff = base_y - mark_y; - if (inc < 0) + if (! otfg->glyph_id) + continue; + switch (otfg->positioning_type) + { + case 0: + break; + case 1: case 2: { - MGlyph temp = *g; - - *g = g[1]; - g[1] = temp; + int format = otfg->f.f1.format; + + if (format & OTF_XPlacement) + g->xoff = otfg->f.f1.value->XPlacement * size10 / u / 10; + if (format & OTF_XPlaDevice) + g->xoff += DEVICE_DELTA (otfg->f.f1.value->XPlaDevice, size); + if (format & OTF_YPlacement) + g->yoff = otfg->f.f1.value->YPlacement * size10 / u / 10; + if (format & OTF_YPlaDevice) + g->yoff += DEVICE_DELTA (otfg->f.f1.value->YPlaDevice, size); + if (format & OTF_XAdvance) + g->width += otfg->f.f1.value->XAdvance * size10 / u / 10; + if (format & OTF_XAdvDevice) + g->width += DEVICE_DELTA (otfg->f.f1.value->XAdvDevice, size); } - } - break; - case 5: - /* Not yet supported. */ - break; - default: /* i.e case 6 */ - /* Not yet supported. */ - break; + break; + case 3: + /* Not yet supported. */ + break; + case 4: + if (! prev) + break; + { + int base_x, base_y, mark_x, mark_y; + + base_x = otfg->f.f4.base_anchor->XCoordinate * size10 / u / 10; + base_y = otfg->f.f4.base_anchor->YCoordinate * size10 / u / 10; + mark_x = otfg->f.f4.mark_anchor->XCoordinate * size10 / u / 10; + mark_y = otfg->f.f4.mark_anchor->YCoordinate * size10 / u / 10; + + if (otfg->f.f4.base_anchor->AnchorFormat != 1) + adjust_anchor (otfg->f.f4.base_anchor, ft_info->ft_face, + prev->code, size, &base_x, &base_y); + if (otfg->f.f4.mark_anchor->AnchorFormat != 1) + adjust_anchor (otfg->f.f4.mark_anchor, ft_info->ft_face, + g->code, size, &mark_x, &mark_y); + g->xoff = (base_x - prev->width) - mark_x; + g->yoff = base_y - mark_y; + g->bidi_sensitive = 1; + } + break; + case 5: + /* Not yet supported. */ + break; + default: /* i.e case 6 */ + /* Not yet supported. */ + break; + } + prev = g; } } return to; + + simple_copy: + ft_find_metric (rfont, gstring, from, to); + for (i = 0; i < len; i++) + { + MGlyph temp = gstring->glyphs[from + i]; + MLIST_APPEND1 (gstring, glyphs, temp, MERROR_FONT_OTF); + } + return to; } + int mfont__ft_decode_otf (MGlyph *g) {