#ifdef FLT_GUI
-typedef struct
+typedef struct _MFLTFont MFLTFont;
+
+struct _MFLTFont
{
+ int x_ppem, y_ppem;
+ void (*get_glyph_id) (void);
+ void (*get_metric) (void);
+ void (*suitable_p) (void);
+ void (*drive_otf) (void);
MFont *font;
FT_Face face;
-} MFLTFont;
+};
+
+void get_glyph_id (void) {}
+void get_metric (void) {}
+void suitable_p (void) {}
+void drive_otf (void) {}
MFrame *frame;
m17n_object_unref (frame);
}
-int
-flt (MText *mt, int from, int to, MFLTFont *font, char *flt_name)
-{
- MDrawControl control;
-
- memset (&control, 0, sizeof (MDrawControl));
- control.two_dimensional = 1;
- control.enable_bidi = 1;
- control.anti_alias = 1;
- /*control.disable_caching = 1;*/
- mtext_put_prop (mt, from, to, Mfont, font->font);
- mdraw_text_extents (frame, mt, from, to, &control, NULL, NULL, NULL);
- return 0;
-}
-
#elif defined (FLT_OTF) || defined (FLT_HB)
typedef struct {
return 0;
}
-int
-flt (MText *mt, int from, int to, MFLTFont *font, char *flt_name)
-{
- MFLTGlyphString gstring;
- int len = to - from;
- int i;
-
- memset (&gstring, 0, sizeof (MFLTGlyphString));
- gstring.glyph_size = sizeof (MFLTGlyph);
- gstring.allocated = len * 2;
- gstring.glyphs = alloca (sizeof (MFLTGlyph) * gstring.allocated);
- for (i = 0; i < len; i++)
- gstring.glyphs[i].c = mtext_ref_char (mt, from + i);
- gstring.used = len;
- return mflt_run (&gstring, 0, len, font, msymbol (flt_name));
-}
-
#ifdef FLT_OTF
typedef struct {
{
FontInfoPango *font_info = (FontInfoPango *) font;
- g->code = pango_fc_font_get_glyph (font_info->pango_font, g->c);
+ g->code = pango_fc_font_get_glyph (font_info->pango_font, g->code);
return (g->code ? 0 : -1);
}
#define PANGO_SCALE_TO_26_6 (PANGO_SCALE / (1<<6))
+#if 0
int
get_metric (MFLTFont *font, MFLTGlyphString *gstring, int from, int to)
{
}
return 0;
}
+#else
+int (*get_metric) (MFLTFont *font, MFLTGlyphString *gstring, int from, int to) = NULL;
+#endif
#ifndef PANGO_OT_DEFAULT_LANGUAGE
#define PANGO_OT_DEFAULT_LANGUAGE ((guint) 0xFFFF)
}
info->count = i;
info->ruleset = pango_ot_ruleset_new (ot_info);
+#if 1
for (i = 0; i < info->count; i++)
pango_ot_ruleset_add_feature (info->ruleset, type, info->indices[i],
PANGO_OT_ALL_GLYPHS);
+#else
+ for (i = info->count - 1; i >= 0; i--)
+ pango_ot_ruleset_add_feature (info->ruleset, type, info->indices[i],
+ PANGO_OT_ALL_GLYPHS);
+#endif
}
GsubGposInfo *
g_object_unref (font_info->fontmap);
}
+#endif
+
+#ifdef FLT_GUI
+
int
-flt (MText *mt, int from, int to, MFLTFont *font, char *flt_name)
+run_flt (MText *mt, int from, int to, MFLTFont *font, char *flt_name)
{
- MFLTGlyphString gstring;
- int len = to - from;
- int i;
+ MDrawControl control;
- memset (&gstring, 0, sizeof (MFLTGlyphString));
- gstring.glyph_size = sizeof (MFLTGlyph);
- gstring.allocated = len * 2;
- gstring.glyphs = alloca (sizeof (MFLTGlyph) * gstring.allocated);
- for (i = 0; i < len; i++)
- gstring.glyphs[i].c = mtext_ref_char (mt, from + i);
- gstring.used = len;
- return mflt_run (&gstring, 0, len, font, msymbol (flt_name));
+ memset (&control, 0, sizeof (MDrawControl));
+ control.two_dimensional = 1;
+ control.enable_bidi = 1;
+ control.anti_alias = 1;
+ /*control.disable_caching = 1;*/
+ mtext_put_prop (mt, from, to, Mfont, font->font);
+ mdraw_text_extents (frame, mt, from, to, &control, NULL, NULL, NULL);
+ return 0;
}
+#else
+
+int
+run_flt (MText *mt, int from, int to, MFLTFont *font, char *flt_name)
+{
+ static MFLT *flt = NULL;
+ MCharTable *coverage;
+ static MFLTGlyphString gstring;
+
+ if (! flt
+ && ! (flt = mflt_get (flt_name)))
+ {
+ fprintf (stderr, "Invalid FLT name: %s\n", flt_name);
+ exit (1);
+ }
+ coverage = mflt_coverage (flt);
+ while (from < to)
+ {
+ int len = 0, i;
+
+ for (; from < to; from++)
+ if (mchartable_lookup (coverage, mtext_ref_char (mt, from)))
+ {
+ for (i = from + 1; i < to; i++)
+ if (! mchartable_lookup (coverage, mtext_ref_char (mt, i)))
+ break;
+ len = i - from;
+ break;
+ }
+ if (len > 0)
+ {
+ if (gstring.allocated < len)
+ {
+ gstring.allocated = len * 2;
+ gstring.glyphs = realloc (gstring.glyphs,
+ sizeof (MFLTGlyph) * len * 2);
+ }
+ gstring.glyph_size = sizeof (MFLTGlyph);
+ for (i = 0; i < len; i++)
+ gstring.glyphs[i].c = mtext_ref_char (mt, from + i);
+ gstring.used = len;
+ i = mflt_run (&gstring, 0, len, font, flt);
+ if (i < 0)
+ return i;
+ from += len;
+ }
+ }
+ return to;
+}
#endif
+
int
main (int argc, char **argv)
{
if (j < 0)
j = len;
- to = flt (mt, i, j, font, flt_name);
+ to = run_flt (mt, i, j, font, flt_name);
if (to < 0)
{
fprintf (stderr, "Error in FLT processing.\n");
exit (1);
}
- while (to < j
-
+ i = j;
}
m17n_object_unref (mt);
close_font (font);