]> O.S.I.I.S - jp/vkvg.git/commitdiff
add nan test in _build_vb_step to prevent stroke building for two consecutive points...
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 22 Jan 2020 20:06:44 +0000 (21:06 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Wed, 22 Jan 2020 20:06:44 +0000 (21:06 +0100)
src/vectors.c
src/vectors.h
src/vkvg_context_internal.c

index 686db85f1340bd88702a73d92116e7ddfd9ccdf8..b29180b2dd7d0ab6599aae3b2ccb9e586184222e 100644 (file)
@@ -108,3 +108,11 @@ void vec2_inv (vec2* v){
     v->x = -v->x;
     v->y = -v->y;
 }
+// test if one component of float vector is nan
+inline bool vec2_isnan (vec2 v){
+    return (bool)(isnanf (v.x) || isnanf (v.y));
+}
+// test if one component of double vector is nan
+inline bool vec2d_isnan (vec2d v){
+    return (bool)(isnan (v.x) || isnan (v.y));
+}
index 6352e5ebecaf2e43cfa1f3dc6237be0cd083e3a7..97b0f6c48df3be7e171ed39266f6d0fc66626450 100644 (file)
@@ -80,6 +80,7 @@ vec2          vec2_sub        (vec2 a, vec2 b);
 vec2           vec2_mult       (vec2 a, float m);
 bool           vec2_equ        (vec2 a, vec2 b);
 vec2           vec2_line_norm  (vec2 a, vec2 b);
+bool        vec2_isnan  (vec2 v);
 
 double         vec2d_length(vec2d v);
 vec2d          vec2d_norm      (vec2d a);
@@ -88,6 +89,7 @@ vec2d         vec2d_add       (vec2d a, vec2d b);
 vec2d          vec2d_sub       (vec2d a, vec2d b);
 vec2d          vec2d_mult      (vec2d a, double m);
 vec2d          vec2d_line_norm(vec2d a, vec2d b);
+bool        vec2d_isnan  (vec2d v);
 
 vec2           vec2d_to_vec2(vec2d vd);
 void        vec2_inv    (vec2* v);
index e3136a701af24b7838f99ffd3cbfadfe05b18d41..76e7f0aed62997c3ca48fd9c1c441e3c751b612a 100644 (file)
@@ -665,8 +665,13 @@ void _init_descriptor_sets (VkvgContext ctx){
 }
 
 float _build_vb_step (vkvg_context* ctx, Vertex v, float hw, uint32_t iL, uint32_t i, uint32_t iR, bool isCurve){
+    //if two of the three points are equal, normal is null
     vec2 v0n = vec2_line_norm(ctx->points[iL], ctx->points[i]);
+    if (vec2_isnan(v0n))
+        return 0;
     vec2 v1n = vec2_line_norm(ctx->points[i], ctx->points[iR]);
+    if (vec2_isnan(v1n))
+        return 0;
 
     vec2 bisec = vec2_norm(vec2_add(v0n,v1n));