shithub: neatmkfn

Download patch

ref: 578fbfe20f6a9e06f201768beb95f0580f034545
parent: 9a4d1780efb0d45e07934b7181d5b31768d74b2b
author: Ali Gholami Rudi <ali@rudi.ir>
date: Sat Dec 17 18:34:20 EST 2016

otf: use gpos rules for cursive attachments

This removes the need for gcur rules.

--- a/otf.c
+++ b/otf.c
@@ -445,26 +445,47 @@
 {
 	int fmt = U16(sub, 0);
 	int cov[NGLYPHS];
+	int icov[NGLYPHS];
+	int ocov[NGLYPHS];
 	int i, n;
+	int icnt = 0;
+	int ocnt = 0;
+	int igrp, ogrp;
 	coverage(sub + U16(sub, 2), cov);
 	if (fmt != 1)
 		return;
 	n = U16(sub, 4);
+	for (i = 0; i < n; i++)
+		if (U16(sub, 6 + 4 * i))
+			ocov[ocnt++] = cov[i];
+	for (i = 0; i < n; i++)
+		if (U16(sub, 6 + 4 * i + 2))
+			icov[icnt++] = cov[i];
+	igrp = ggrp_coverage(icov, icnt);
+	ogrp = ggrp_coverage(ocov, ocnt);
 	for (i = 0; i < n; i++) {
 		int prev = U16(sub, 6 + 4 * i);
 		int next = U16(sub, 6 + 4 * i + 2);
-		printf("gcur %s %s", feat, glyph_name[cov[i]]);
-		if (prev)
-			printf(" %d %d", uwid(S16(sub, prev + 2)),
-					uwid(S16(sub, prev + 4)));
-		else
-			printf(" - -");
-		if (next)
-			printf(" %d %d", uwid(S16(sub, next + 2)),
-					uwid(S16(sub, next + 4)));
-		else
-			printf(" - -");
-		printf("\n");
+		if (prev) {
+			int dx = -uwid(S16(sub, prev + 2));
+			int dy = -uwid(S16(sub, prev + 4));
+			if (otf_r2l(feat)) {
+				dx += uwid(glyph_wid[cov[i]]);
+			}
+			printf("gpos %s 2 @%d %s:%+d%+d%+d%+d\n",
+				feat, igrp, glyph_name[cov[i]],
+				0, 0, dx, dy);
+		}
+		if (next) {
+			int dx = uwid(S16(sub, next + 2)) - uwid(glyph_wid[cov[i]]);
+			int dy = uwid(S16(sub, next + 4));
+			if (otf_r2l(feat)) {
+				dx += uwid(glyph_wid[cov[i]]);
+			}
+			printf("gpos %s 2 %s @%d:%+d%+d%+d%+d\n",
+				feat, glyph_name[cov[i]], ogrp,
+				0, 0, dx, dy);
+		}
 	}
 }