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++)