FeatureRec gsub, gpos;
-OTF_Tag script_tag;
+/* Currently selected script and langsys. */
+OTF_Tag script_tag, langsys_tag;
int glyph_char[128];
int i, n;
char *str, *p;
- if (! rec->features[0].on)
+ if (! rec->langsys || ! rec->features || ! rec->features[0].on)
return NULL;
for (i = n = 0; i < rec->langsys->FeatureCount; i++)
{
int xoff = 0, yoff = 0;
int prev_width;
int advance = bmp->advance;
- int j;
if (! bmp->pixmap)
{
void
setup_feature_rec (FeatureRec *rec)
{
- int i;
+ int i, j;
Arg arg[10];
rec->langsys = NULL;
+ if (! rec->gsub_gpos)
+ return;
for (i = 0; i < rec->gsub_gpos->ScriptList.ScriptCount; i++)
if (rec->gsub_gpos->ScriptList.Script[i].ScriptTag == script_tag)
{
- rec->langsys = &rec->gsub_gpos->ScriptList.Script[i].DefaultLangSys;
+ OTF_Script *script = rec->gsub_gpos->ScriptList.Script + i;
+
+ if (langsys_tag)
+ {
+ for (j = 0; j < script->LangSysCount; j++)
+ if (script->LangSysRecord[j].LangSysTag == langsys_tag)
+ {
+ rec->langsys = script->LangSys + j;
+ break;
+ }
+ }
+ if (! rec->langsys)
+ rec->langsys = &rec->gsub_gpos->ScriptList.Script[i].DefaultLangSys;
break;
}
- if (! rec->features)
- {
- rec->num_features = rec->langsys->FeatureCount;
- rec->features = malloc ((sizeof (FeatureElement)) * rec->num_features);
- memset (rec->features, 0, (sizeof (FeatureElement)) * rec->num_features);
- }
- else if (rec->num_features < rec->langsys->FeatureCount)
- {
- rec->features = realloc (rec->features,
- (sizeof (FeatureElement))
- * rec->langsys->FeatureCount);
- memset (rec->features + rec->num_features, 0,
- (sizeof (FeatureElement))
- * (rec->langsys->FeatureCount - rec->num_features));
- rec->num_features = rec->langsys->FeatureCount;
- }
-
if (! rec->langsys)
i = 0;
else
XtSetArg (arg[0], XtNborderColor, background);
XtSetArg (arg[1], XtNsensitive, False);
XtSetArg (arg[2], XtNlabel, " ");
- for (; i < rec->langsys->FeatureCount; i++)
+ for (; i < rec->num_features; i++)
{
if (! rec->features[i].w)
{
}
void
+compose_script_langsys (OTF_Tag script, OTF_Tag langsys, char *name)
+{
+ OTF_tag_name (script, name);
+ if (langsys)
+ {
+ name[4] = '(';
+ OTF_tag_name (langsys, name + 5);
+ name[9] = ')';
+ name[10] = '\0';
+ }
+}
+
+void
+decompose_script_langsys (OTF_Tag *script, OTF_Tag *langsys, char *name)
+{
+ *script = OTF_tag (name);
+ if (name[4])
+ *langsys = OTF_tag (name + 5);
+ else
+ *langsys = 0;
+}
+
+void
ScriptProc (Widget w, XtPointer client_data, XtPointer call_data)
{
- if (script_tag == (OTF_Tag) client_data)
+ char *name;
+ OTF_Tag script, langsys;
+ Arg arg[1];
+
+ XtSetArg (arg[0], XtNlabel, &name);
+ XtGetValues (w, arg, 1);
+ decompose_script_langsys (&script, &langsys, name);
+ if (script_tag == script && langsys_tag == langsys)
return;
- script_tag = (OTF_Tag) client_data;
+ script_tag = script;
+ langsys_tag = langsys;
setup_feature_rec (&gsub);
setup_feature_rec (&gpos);
update_seq_area ();
{
Widget w;
Arg arg[10];
- int n, i;
- OTF_Tag *scripts;
- char script_name[5];
+ int n, prev_n, i, j;
+ struct {
+ OTF_Tag script;
+ OTF_Tag langsys;
+ } *script_langsys;
+ char name[11];
+ int nfeatures;
XtSetArg (arg[0], XtNborderWidth, 0);
XtSetArg (arg[1], XtNleft, XawChainLeft);
XtSetArg (arg[5], XtNfromVert, prev);
XtSetArg (arg[6], XtNorientation, XtorientHorizontal);
prev = XtCreateManagedWidget ("Script", boxWidgetClass, render_area, arg, 7);
- XtCreateManagedWidget ("script", labelWidgetClass, prev, arg, 1);
+ XtCreateManagedWidget ("script(langsys)", labelWidgetClass, prev, arg, 1);
n = 0;
if (otf->gsub)
- n = otf->gsub->ScriptList.ScriptCount;
+ for (i = 0; i < otf->gsub->ScriptList.ScriptCount; i++)
+ n += otf->gsub->ScriptList.Script[i].LangSysCount + 1;
if (otf->gpos)
- n += otf->gpos->ScriptList.ScriptCount;
- scripts = alloca (sizeof (OTF_Tag) * n);
- i = 0;
+ for (i = 0; i < otf->gpos->ScriptList.ScriptCount; i++)
+ n += otf->gsub->ScriptList.Script[i].LangSysCount + 1;
+ script_langsys = alloca ((sizeof script_langsys[0]) * n);
+ n = 0;
+ nfeatures = 0;
if (otf->gsub)
- for (; i < otf->gsub->ScriptList.ScriptCount; i++)
- scripts[i] = otf->gsub->ScriptList.Script[i].ScriptTag;
- n = i;
+ for (i = 0; i < otf->gsub->ScriptList.ScriptCount; i++)
+ {
+ OTF_Tag tag = otf->gsub->ScriptList.Script[i].ScriptTag;
+
+ script_langsys[n].script = tag;
+ script_langsys[n++].langsys = 0;
+ if (nfeatures
+ < otf->gsub->ScriptList.Script[i].DefaultLangSys.FeatureCount)
+ nfeatures
+ = otf->gsub->ScriptList.Script[i].DefaultLangSys.FeatureCount;
+ for (j = 0; j < otf->gsub->ScriptList.Script[i].LangSysCount; j++)
+ {
+ script_langsys[n].script = tag;
+ script_langsys[n++].langsys
+ = otf->gsub->ScriptList.Script[i].LangSysRecord[j].LangSysTag;
+ if (nfeatures
+ < otf->gsub->ScriptList.Script[i].LangSys[j].FeatureCount)
+ nfeatures
+ = otf->gsub->ScriptList.Script[i].LangSys[j].FeatureCount;
+ }
+ }
+ gsub.num_features = nfeatures;
+ if (nfeatures > 0)
+ {
+ gsub.num_features = nfeatures;
+ gsub.features = malloc ((sizeof (FeatureElement)) * nfeatures);
+ memset (gsub.features, 0, (sizeof (FeatureElement)) * nfeatures);
+ }
+ prev_n = n;
+ nfeatures = 0;
if (otf->gpos)
- for (; i < otf->gpos->ScriptList.ScriptCount; i++)
+ for (i = 0; i < otf->gpos->ScriptList.ScriptCount; i++)
{
OTF_Tag tag = otf->gpos->ScriptList.Script[i].ScriptTag;
- int j;
-
- for (j = 0; j < i; j++)
- if (tag == scripts[j])
+ int k;
+
+ if (nfeatures
+ < otf->gpos->ScriptList.Script[i].DefaultLangSys.FeatureCount)
+ nfeatures
+ = otf->gpos->ScriptList.Script[i].DefaultLangSys.FeatureCount;
+ for (k = 0; k < prev_n; k++)
+ if (tag == script_langsys[k].script)
break;
- if (j == i)
- scripts[n++] = tag;
+ if (k == prev_n)
+ {
+ script_langsys[n].script = tag;
+ script_langsys[n++].langsys = 0;
+ }
+ for (j = 0; j < otf->gsub->ScriptList.Script[i].LangSysCount; j++)
+ {
+ int l;
+
+ if (k < prev_n)
+ {
+ OTF_Script *script = otf->gsub->ScriptList.Script + i;
+
+ for (l = k; l < prev_n && tag == script_langsys[l].script; l++)
+ if (script->LangSysRecord[j].LangSysTag
+ == script_langsys[l].langsys)
+ break;
+ }
+ else
+ l = prev_n;
+ if (l == prev_n)
+ {
+ script_langsys[n].script = tag;
+ script_langsys[n++].langsys = 0;
+ }
+ if (nfeatures
+ < otf->gpos->ScriptList.Script[i].LangSys[j].FeatureCount)
+ nfeatures
+ = otf->gpos->ScriptList.Script[i].LangSys[j].FeatureCount;
+ }
}
+ if (nfeatures > 0)
+ {
+ gpos.num_features = nfeatures;
+ gpos.features = malloc ((sizeof (FeatureElement)) * nfeatures);
+ memset (gpos.features, 0, (sizeof (FeatureElement)) * nfeatures);
+ }
+
if (n == 0)
return prev;
- script_tag = scripts[0];
- OTF_tag_name (scripts[0], script_name);
+ script_tag = script_langsys[0].script;
+ langsys_tag = script_langsys[0].langsys;
+ compose_script_langsys (script_tag, langsys_tag, name);
+
if (n == 1)
{
XtSetArg (arg[0], XtNforeground, background);
XtSetArg (arg[1], XtNbackground, foreground);
- XtCreateManagedWidget (script_name, labelWidgetClass, prev, arg, 2);
+ XtCreateManagedWidget (name, labelWidgetClass, prev, arg, 2);
}
else
{
- char name[5];
-
XtSetArg (arg[0], XtNstate, True);
- w = XtCreateManagedWidget (script_name, toggleWidgetClass, prev, arg, 1);
- XtAddCallback (w, XtNcallback, ScriptProc, (XtPointer) scripts[0]);
+ w = XtCreateManagedWidget (name, toggleWidgetClass, prev, arg, 1);
+ XtAddCallback (w, XtNcallback, ScriptProc, NULL);
XtSetArg (arg[0], XtNradioGroup, w);
for (i = 1; i < n; i++)
{
- OTF_tag_name (scripts[i], name);
+ compose_script_langsys (script_langsys[i].script,
+ script_langsys[i].langsys, name);
w = XtCreateManagedWidget (name, toggleWidgetClass, prev, arg, 1);
- XtAddCallback (w, XtNcallback, ScriptProc, (XtPointer) scripts[i]);
+ XtAddCallback (w, XtNcallback, ScriptProc, NULL);
}
}
return prev;
{
Arg arg[10];
Widget w;
- int i;
XtSetArg (arg[0], XtNborderWidth, 0);
XtSetArg (arg[1], XtNleft, XawChainLeft);