shithub: neatroff

Download patch

ref: dc3d917a36dfc186698a36b208f0ad54d331da25
parent: d173cf1cdc72519809a0e3e01165f616044b2eee
author: Ali Gholami Rudi <ali@rudi.ir>
date: Thu Aug 7 07:40:30 EDT 2014

font: glyph cursive attachments for r2l scripts

--- a/font.c
+++ b/font.c
@@ -99,6 +99,8 @@
 	return dict_get(fn->ch_map, name) != -1;
 }
 
+static int font_findfeat(struct font *fn, char *feat);
+
 /* enable/disable ligatures; first bit for liga and the second bit for rlig */
 static int font_featlg(struct font *fn, int val)
 {
@@ -183,9 +185,13 @@
 {
 	struct grule *gpos = fn->gpos;
 	struct gpat *pats;
+	int curs_feat = dir_do ? font_findfeat(fn, "curs") : -1;
+	int curs_beg = -1;
+	int curs_dif = 0;
 	int i, k;
 	for (i = 0; i < slen; i++) {
 		int idx = -1;
+		int curs_cur = 0;
 		while (1) {
 			int r = font_findrule(fn, 0, 0, src + i, slen - i,
 						src + i, i, &idx);
@@ -192,7 +198,6 @@
 			if (r < 0)
 				break;
 			pats = gpos[r].pats;
-			/* we should accumulate the values... */
 			for (k = 0; k < gpos[r].len; k++) {
 				x[i + k] += pats[k].x;
 				y[i + k] += pats[k].y;
@@ -199,8 +204,22 @@
 				xadv[i + k] += pats[k].xadv;
 				yadv[i + k] += pats[k].yadv;
 			}
+			if (gpos[r].feat == curs_feat) {
+				curs_cur = 1;
+				if (curs_beg < 0)
+					curs_beg = i;
+				for (k = 0; k < gpos[r].len; k++)
+					curs_dif += pats[k].yadv;
+			}
 		}
+		if (curs_beg >= 0 && !curs_cur) {
+			yadv[curs_beg] -= curs_dif;
+			curs_beg = -1;
+			curs_dif = 0;
+		}
 	}
+	if (curs_beg >= 0)
+		yadv[curs_beg] -= curs_dif;
 }
 
 /* find the first gsub rule after pos that matches any glyph in src */