shithub: fnt

Download patch

ref: e20b6c643f188f387549db5af1891d8159db8a64
parent: 37fcd30775ca915df70714c32b0a0b5c98512990
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Jul 18 22:35:18 EDT 2024

make it build with clang

--- a/meson.build
+++ b/meson.build
@@ -49,6 +49,12 @@
 
 cc = meson.get_compiler('c')
 math = cc.find_library('m', required: false)
+if cc.get_id() == 'clang'
+	add_project_arguments(
+		'-Wno-mathematical-notation-identifier-extension',
+		language: 'c',
+	)
+endif
 
 executable(
 	'fntest',
--- a/rast.c
+++ b/rast.c
@@ -22,6 +22,8 @@
 #include "otfsys.h"
 #include "otf.h"
 
+#pragma clang float_control(precise, on)
+
 typedef struct SegQ SegQ;
 typedef struct SegC SegC;
 typedef struct Spt Spt;
@@ -59,7 +61,7 @@
 
 #define MAXCOMPONENTS 16
 #define ε 1.0e-9
-#define ₀(v) ((v) > -ε && (v) < ε)
+#define is₀(v) ((v) > -ε && (v) < ε)
 #define min(a,b) ((a)<(b)?(a):(b))
 #define max(a,b) ((a)>(b)?(a):(b))
 
@@ -81,8 +83,8 @@
 	Sval p, q, d;
 	int n;
 
-	if(₀(a)){
-		if(₀(b))
+	if(is₀(a)){
+		if(is₀(b))
 			return 0;
 		qs[0] = -c/b;
 		return qs[0] > 0 && qs[0] < 1;
@@ -92,7 +94,7 @@
 	q = c/a;
 	d = p*p - q;
 
-	if(₀(d)){
+	if(is₀(d)){
 		qs[0] = -p;
 		return qs[0] > 0 && qs[0] < 1;
 	}
@@ -178,11 +180,11 @@
 
 		z.p0.y = e(a, y);
 		z.p2.y = e(b, y);
-		if(₀(z.p0.y) && ₀(z.p2.y))
+		if(is₀(z.p0.y) && is₀(z.p2.y))
 			continue;
 		z.p0.x = e(a, x);
 		z.p2.x = e(b, x);
-		if(₀(z.p0.x) && ₀(z.p2.x))
+		if(is₀(z.p0.x) && is₀(z.p2.x))
 			continue;
 #undef e
 
@@ -333,20 +335,20 @@
 static int
 qbzr(SegQ *seg, int ns, int dw, int dh, Sval *p)
 {
-	int ₂ju, ₂j, w, h, i, j, ju, px, py;
-	Sval r₂ju, s₀, s, *c, *c₀x, *c₀y, *cs, zx, zy;
+	int ju², j², w, h, i, j, ju, px, py;
+	Sval rju², s₀, s, *c, *c₀x, *c₀y, *cs, zx, zy;
 	u64int *ma, *mb, all, nall;
 
-	₂ju = closest²(dh);
-	if(₂ju < (j = closest²(dw)))
-		₂ju = j;
-	r₂ju = 1.0 / ₂ju;
-	for(ju = 1; (1<<ju) < ₂ju; ju++);
+	ju² = closest²(dh);
+	if(ju² < (j = closest²(dw)))
+		ju² = j;
+	rju² = 1.0 / ju²;
+	for(ju = 1; (1<<ju) < ju²; ju++);
 
 	/* scale */
 	for(i = 0; i < ns; i++){
 		for(j = 0; j < nelem(seg->v); j++)
-			seg[i].v[j] *= r₂ju;
+			seg[i].v[j] *= rju²;
 	}
 
 	/* calculate area */
@@ -388,12 +390,12 @@
 	all = 1;
 	nall = 0;
 	/* first few loops build the test bitmasks: 1x1 -> 4x4 -> 8x8 */
-	for(j = 0, ₂j = 1; j < ju && j <= 3; j++, ₂j <<= 1){
-		for(px = 0; px < ₂j; px++){
-			for(py = 0; py < ₂j; py++, c += 3){
-				u64int tm = 1ULL<<(px*₂j + py);
+	for(j = 0, j² = 1; j < ju && j <= 3; j++, j² <<= 1){
+		for(px = 0; px < j²; px++){
+			for(py = 0; py < j²; py++, c += 3){
+				u64int tm = 1ULL<<(px*j² + py);
 				if(all & tm)
-					nall |= qCxy(seg, ns, ₂j, px, py, c, ma, tm);
+					nall |= qCxy(seg, ns, j², px, py, c, ma, tm);
 			}
 		}
 		if(j != 3){
@@ -407,16 +409,16 @@
 	}
 
 	/* no more bitmasks, just calculate coefficients */
-	for(; j < ju; j++, ₂j <<= 1){
-		for(px = 0; px < ₂j; px++){
+	for(; j < ju; j++, j² <<= 1){
+		for(px = 0; px < j²; px++){
 			/* bitmasks are expanded only up to 8x8 (64 bits)
 			 * so use that for more coarse testing
 			 */
 			u64int tm₀ = 1ULL<<((px>>(j-3))*8);
-			for(py = 0; py < ₂j; py++, c += 3){
+			for(py = 0; py < j²; py++, c += 3){
 				u64int tm = tm₀ << (py>>(j-3));
 				if(all & tm)
-					qCxy(seg, ns, ₂j, px, py, c, ma, tm);
+					qCxy(seg, ns, j², px, py, c, ma, tm);
 			}
 		}
 	}
@@ -426,15 +428,15 @@
 		for(w = 0; w < dw; w++){
 			c = cs;
 			s = s₀;
-			for(₂j = 1; ₂j < ₂ju; ₂j *= 2){
-				zx = r₂ju * ₂j * w;
+			for(j² = 1; j² < ju²; j² *= 2){
+				zx = rju² * j² * w;
 				c₀x = c;
 				px = (int)zx;
 				zx -= px;
-				c += px*3*₂j;
-				for(; zx >= 0; px++, zx--, c = c₀y + 3*₂j){
+				c += px*3*j²;
+				for(; zx >= 0; px++, zx--, c = c₀y + 3*j²){
 					c₀y = c;
-					zy = r₂ju * ₂j * h;
+					zy = rju² * j² * h;
 					py = (int)zy;
 					zy -= py;
 					c += 3*py;
@@ -447,7 +449,7 @@
 						}
 					}
 				}
-				c = c₀x + 3*₂j*₂j;
+				c = c₀x + 3*j²*j²;
 			}
 			*p++ = s;
 		}
@@ -661,6 +663,7 @@
 
 	npx = w*h;
 	fp = malloc(npx*sizeof(*fp));
+	fp[0] = 0;
 	if(qbzr(s₀, s-s₀, w, h, fp) == 0){
 		b = (u8int*)fp;
 		for(i = 0; i < npx; i++)