]> O.S.I.I.S - jp/vkvg.git/commitdiff
add nan test in _build_vb_step to prevent stroke building for two consecutive points... newvertex 32/head
authorJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 22 Nov 2019 10:43:18 +0000 (11:43 +0100)
committerJean-Philippe Bruyère <jp_bruyere@hotmail.com>
Fri, 22 Nov 2019 10:43:18 +0000 (11:43 +0100)
src/vectors.c
src/vectors.h
src/vkvg_context_internal.c
tests/curved_rect.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 7721be8d8f38e597967b2a2a0950f166a7a69ea4..d9578ad151cf52f93f2ed6da986ca3ad4aeb1165 100644 (file)
@@ -773,8 +773,13 @@ void add_line(vkvg_context* ctx, vec2 p1, vec2 p2, vec4 col){
 }
 
 void _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;
     vec2 v1n = vec2_line_norm(ctx->points[i], ctx->points[iR]);
+    if (vec2_isnan(v1n))
+        return;
 
     vec2 bisec = vec2_norm(vec2_add(v0n,v1n));
 
index e7363d53f35c5bb2f94e6d31b59ddeb940dca1ec..34e739f46470489fc715412d29ad4328d702388a 100644 (file)
@@ -6,6 +6,7 @@ void test(){
     float x = 50, y = 50, width = 150, height = 140, radius = 30;
 
     vkvg_scale(ctx,2,2);
+    //vkvg_rotate(ctx,0.5f);
 
     vkvg_set_line_width(ctx,15);
     vkvg_set_source_rgba(ctx, 0, 0.5f, 0.4f, 1);
@@ -15,16 +16,16 @@ void test(){
         radius = MIN(height / 2, width / 2);
 
     vkvg_move_to(ctx, x, y + radius);
-    //vkvg_arc(ctx, x + radius, y + radius, radius, M_PIF, (float)-M_PI_2);
+    vkvg_arc(ctx, x + radius, y + radius, radius, M_PIF, (float)-M_PI_2);
     vkvg_line_to(ctx, x + width - radius, y);
-    //vkvg_arc(ctx, x + width - radius, y + radius, radius, (float)-M_PI_2, 0);
-    /*vkvg_line_to(ctx, x + width, y + height - radius);
+    vkvg_arc(ctx, x + width - radius, y + radius, radius, (float)-M_PI_2, 0);
+    vkvg_line_to(ctx, x + width, y + height - radius);
     vkvg_arc(ctx, x + width - radius, y + height - radius, radius, 0, (float)M_PI_2);
     vkvg_line_to(ctx, x + radius, y + height);
     vkvg_arc(ctx, x + radius, y + height - radius, radius, (float)M_PI_2, M_PIF);
     vkvg_line_to(ctx, x, y + radius);
     vkvg_close_path(ctx);
-    vkvg_fill_preserve(ctx);*/
+    vkvg_fill_preserve(ctx);
     vkvg_set_source_rgba(ctx,0.5,0,0,0.5);
     vkvg_stroke(ctx);