texlive[42216] Build/source/texk/web2c/mplibdir/mp.w: mplibdir: sync

commits+kakuto at tug.org commits+kakuto at tug.org
Wed Oct 5 23:17:01 CEST 2016


Revision: 42216
          http://tug.org/svn/texlive?view=revision&revision=42216
Author:   kakuto
Date:     2016-10-05 23:17:01 +0200 (Wed, 05 Oct 2016)
Log Message:
-----------
mplibdir: sync with the upstream

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/mplibdir/mp.w

Modified: trunk/Build/source/texk/web2c/mplibdir/mp.w
===================================================================
--- trunk/Build/source/texk/web2c/mplibdir/mp.w	2016-10-05 21:16:56 UTC (rev 42215)
+++ trunk/Build/source/texk/web2c/mplibdir/mp.w	2016-10-05 21:17:01 UTC (rev 42216)
@@ -1,4 +1,4 @@
-% $Id: mp.w 2093 2016-09-20 10:09:14Z luigi $
+% $Id: mp.w 2095 2016-10-05 13:12:00Z luigi $
 %
 % This file is part of MetaPost;
 % the MetaPost program is in the public domain.
@@ -142,16 +142,20 @@
 @ @c
 /*#define DEBUGENVELOPE */
 #ifdef DEBUGENVELOPE 
-#define dbg_n(A) printf("['%s']=%s, ", #A, number_tostring(A))
-#define dbg_in(A) printf("['%s']=%d, ", #A, (int)(A))
-#define dbg_dn(A) printf("['%s']=%.100f, ", #A, (double)(A))
-#define dbg_key(A) printf("['%s']= ", #A)
-#define dbg_sp printf(" ")
-#define dbg_str(A) printf("%s",#A)
-#define dbg_open_t printf("{")
-#define dbg_close_t printf("}")
-#define dbg_comma printf(",")
-#define dbg_nl printf("\n")
+#define dbg_str(A) printf("DEBUGENVELOPE %s",#A)
+#define dbg_n(A) printf("DEBUGENVELOPE ['%s']=%s, ", #A, number_tostring(A))
+#define dbg_in(A) printf("DEBUGENVELOPE ['%s']=%d, ", #A, (int)(A))
+#define dbg_dn(A) printf("DEBUGENVELOPE ['%s']=%.100f, ", #A, (double)(A))
+#define dbg_key(A) printf("DEBUGENVELOPE ['%s']= ", #A)
+#define dbg_key_nval(K,V) printf("DEBUGENVELOPE ['%s']=%s", #K,number_tostring(V))
+#define dbg_key_ival(K,V) printf("DEBUGENVELOPE ['%s']=%d", #K,(int)(V))
+#define dbg_key_dval(K,V) printf("DEBUGENVELOPE ['%s']=%.100f", #K,(double)(V))
+#define dbg_comment(A) printf("DEBUGENVELOPE --[==[%s]==]",#A)
+#define dbg_sp printf("DEBUGENVELOPE  ")
+#define dbg_open_t printf("DEBUGENVELOPE {")
+#define dbg_close_t printf("DEBUGENVELOPE }")
+#define dbg_comma printf("DEBUGENVELOPE ,")
+#define dbg_nl printf("DEBUGENVELOPE \n")
 #endif
 #define KPATHSEA_DEBUG_H 1
 #include <w2c/config.h>
@@ -190,6 +194,7 @@
 mp_number dxin_ap;  /* approximation of dxin */
 mp_number dyin_ap;  /* approximation of dyin */
 mp_number ueps_ap;  /* epsilon for above approximations */
+boolean is_dxdy, is_dxindyin;
 /* END PATCH */
 
 
@@ -205,7 +210,7 @@
 @^system dependencies@>
 
 @<MPlib internal header stuff@>=
-#define DEBUG 0
+/*#define DEBUG 2*/
 #if DEBUG
 #define debug_number(A) printf("%d: %s=%.32f (%d)\n", __LINE__, #A, number_to_double(A), number_to_scaled(A))
 #else
@@ -13251,7 +13256,6 @@
 
 }
 
-
 @ @c
 static mp_knot mp_offset_prep (MP mp, mp_knot c, mp_knot h) {
   int n;   /* the number of vertices in the pen polygon */
@@ -13292,6 +13296,7 @@
   new_number(v0);
   new_number(v1);
   new_number(dx_m);
+  new_number(dy_m);
   new_number(dxin_m);
   new_number(dx_ap);
   new_number(dy_ap);
@@ -13308,6 +13313,8 @@
   k_needed = 0;
 #ifdef DEBUGENVELOPE
 dbg_nl;dbg_str(--[==[BEGIN]==]);dbg_nl; 
+dbg_n(w0->x_coord);
+dbg_n(w0->y_coord);
 #endif
  do {
     q = mp_next_knot (p);
@@ -13317,25 +13324,40 @@
 dbg_n(p->right_x);dbg_n(p->right_y);
 dbg_n(q->left_x);dbg_n(q->left_y);
 dbg_n(q->x_coord);dbg_n(q->y_coord);
+dbg_n(w0->x_coord);
+dbg_n(w0->y_coord);
 #endif 
     @<Split the cubic between |p| and |q|, if necessary, into cubics
       associated with single offsets, after which |q| should
       point to the end of the final such cubic@>;
+#ifdef DEBUGENVELOPE   
+dbg_key(end Split the cubic between |p| and |q|);dbg_open_t;dbg_nl;
+dbg_n(w->x_coord);dbg_n(w->y_coord);
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+dbg_close_t; dbg_comma;dbg_nl;
+#endif
   NOT_FOUND:
     @<Advance |p| to node |q|, removing any ``dead'' cubics that
       might have been introduced by the splitting process@>;
 #ifdef DEBUGENVELOPE
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
 dbg_str(--[==[end loop]==]);dbg_nl; dbg_close_t;dbg_comma;dbg_nl;
 #endif 
   } while (q != c);
 #ifdef DEBUGENVELOPE
  dbg_key(Fix the offset change);dbg_open_t;dbg_nl;
-  dbg_in(mp_knot_info(p));dbg_close_t;dbg_comma;dbg_nl;
+ dbg_n(p->x_coord);dbg_n(p->y_coord);
+ dbg_key_ival(info pre,mp_knot_info(p));dbg_comma;dbg_nl;
+ dbg_n(c->x_coord);dbg_n(c->y_coord);
+ dbg_key_ival(info pre,mp_knot_info(c));dbg_close_t;dbg_comma;dbg_nl;
 #endif
   @<Fix the offset change in |mp_knot_info(c)| and set |c| to the return value of
     |offset_prep|@>;
 #ifdef DEBUGENVELOPE  
-dbg_in(mp_knot_info(p));
+dbg_n(p->x_coord);dbg_n(p->y_coord);
+dbg_key_ival(info post,mp_knot_info(p));dbg_comma;dbg_nl;
+dbg_n(c->x_coord);dbg_n(c->y_coord);
+dbg_key_ival(info post,mp_knot_info(c));
 dbg_close_t;dbg_comma;dbg_nl;
 dbg_nl;dbg_str(--[==[END]==]);dbg_nl;
 #endif
@@ -13370,6 +13392,7 @@
   free_number (v0);
   free_number (v1);
   free_number(dx_m);
+  free_number(dy_m);
   free_number(dxin_m);
   free_number(dx_ap);
   free_number(dy_ap);
@@ -13430,6 +13453,9 @@
 on Sarovar.)
 
 @<Advance |p| to node |q|, removing any ``dead'' cubics...@>=
+#ifdef DEBUGENVELOPE 
+dbg_comment(Advance |p| to node |q|);dbg_nl;
+#endif
 q0 = q;
 do {
   r = mp_next_knot (p);
@@ -13452,6 +13478,11 @@
 
 @ @<Remove the cubic following |p| and update the data structures...@>=
 {
+ #ifdef DEBUGENVELOPE 
+ dbg_key(Remove the cubic following p);dbg_open_t;dbg_nl;
+ dbg_n(p->x_coord);dbg_n(p->y_coord);
+ dbg_key_ival(pre info p,mp_knot_info(p)); dbg_comma; dbg_close_t;dbg_nl;
+ #endif 
   k_needed = mp_knot_info (p) - zero_off;
   if (r == q) {
     q = p;
@@ -13469,6 +13500,11 @@
     mp->spec_p2 = p;
   r = p;
   mp_remove_cubic (mp, p);
+  #ifdef DEBUGENVELOPE 
+  dbg_key(Remove the cubic following p);dbg_open_t;dbg_nl;
+  dbg_n(p->x_coord);dbg_n(p->y_coord);
+  dbg_key_ival(post info p,mp_knot_info (p));dbg_comma; dbg_close_t;dbg_nl;
+  #endif 
 }
 
 
@@ -13537,7 +13573,16 @@
 piece corresponds to a unique offset.
 
 @<Split the cubic between |p| and |q|, if necessary, into cubics...@>=
+#ifdef DEBUGENVELOPE 
+dbg_comment(Split the cubic between |p| and |q|);dbg_nl;
+dbg_key(Split the cubic);dbg_open_t;dbg_nl;
+dbg_key_ival(pre info p,mp_knot_info(p));dbg_comma;
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+#endif 
 mp_knot_info (p) = zero_off + k_needed;
+#ifdef DEBUGENVELOPE 
+dbg_key_ival(post info p,mp_knot_info(p));dbg_comma; dbg_close_t;dbg_nl;
+#endif 
 k_needed = 0;
 @<Prepare for derivative computations;
   |goto not_found| if the current cubic is dead@>;
@@ -13592,6 +13637,7 @@
 mp_number t;     /* where the derivative passes through zero */
 mp_number s;     /* a temporary value */
 mp_number dx_m;     /* signal a pertubation of dx */
+mp_number dy_m;     /* signal a pertubation of dx */
 mp_number dxin_m;   /* signal a pertubation of dxin */
 
 
@@ -13850,7 +13896,13 @@
 degenerate.
 
 @<Find the initial direction |(dx,dy)|@>=
+#ifdef DEBUGENVELOPE
+dbg_nl;
+dbg_comment(Find the initial direction |(dx,dy)|);dbg_nl;
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+#endif
 number_clone(dx_m, zero_t);
+number_clone(dy_m, zero_t);
 number_clone(dx, x0);
 number_clone(dy, y0);
 if (number_zero(dx) && number_zero(dy)) {
@@ -13892,31 +13944,41 @@
 #endif
 mp_dx_dy_approx(mp,&dx_ap,&dy_ap,p,q,ueps_ap); /*|eps|*/
 #ifdef DEBUGENVELOPE
-dbg_n(dx_ap);dbg_n(dy_ap);
-dbg_close_t;dbg_comma;dbg_nl;
 dbg_key(derivatives);dbg_open_t;dbg_nl;
+dbg_n(dx_m);dbg_n(dy_m);
 dbg_n(dx);dbg_n(dy);dbg_n(dx_ap);dbg_n(dy_ap);dbg_close_t;dbg_comma;dbg_nl;
 #endif
 /* BEGIN PATCH */
+/* it should be done also for dy */
+/* TODO: if |p==c| we have also to set dx0 dy0 */
 if (number_zero(dx) && !(number_zero(dy)) && number_zero(x0) && number_zero(x2) && !number_zero(dxin) ){
     number_clone(dx_m, epsilon_t);
     if (number_positive(x1)){      
      set_number_from_addition (dx, dx, epsilon_t); 
+     mp_warn(mp,"x component of derivative at t=0 approximated to epsilon.");
     } else if (number_negative(x1)) {
      set_number_from_substraction (dx, dx, epsilon_t);  
+     mp_warn(mp,"x component of derivative at t=0 approximated to -epsilon.");
     }
 } 
+#ifdef DEBUGENVELOPE
+dbg_key(derivatives after first patch );dbg_open_t;dbg_nl;
+dbg_n(dx_m);dbg_n(dy_m);
+dbg_n(dx);dbg_n(dy);dbg_n(dx_ap);dbg_n(dy_ap);dbg_close_t;dbg_comma;dbg_nl;
+#endif
 /* this patch can conflict with the previous one */
 /* hm what about dx=dy=0 ? */
-if (number_zero(dx_ap) && !number_zero(dx)){
+if (number_zero(dx_ap) && !number_zero(dx) && number_zero(dx_m) ){
   set_number_to_zero(dx);
+  set_number_from_substraction(dx_m, zero_t,epsilon_t);
   if (p == c) {
     set_number_to_zero(dx0);
     }
   mp_warn(mp,"x component of derivative at t=0 approximated to zero.");
  } 
-if (number_zero(dy_ap) && !number_zero(dy)){
+if (number_zero(dy_ap) && !number_zero(dy) && number_zero(dy_m)){
   set_number_to_zero(dy);
+  set_number_from_substraction(dy_m, zero_t,epsilon_t);
   if (p == c) {
     set_number_to_zero(dy0);
     }
@@ -13924,6 +13986,7 @@
  } 
 #ifdef DEBUGENVELOPE
 dbg_key(derivatives patched);dbg_open_t;dbg_nl;
+dbg_n(dx_m);dbg_n(dy_m);
 dbg_n(dx);dbg_n(dy);dbg_n(dx_ap);dbg_n(dy_ap);dbg_close_t;dbg_comma;dbg_nl;
 #endif
 /* END PATCH */
@@ -13941,16 +14004,23 @@
     number_clone(dyin, y0);
   }
 }
+#ifdef DEBUGENVELOPE
+dbg_key(dxin dyin before);dbg_open_t;dbg_nl;
+dbg_n(dxin);dbg_n(dyin);
+dbg_close_t;dbg_comma; 
+#endif
+/* BEGIN PATCH */
 if (number_zero(dxin_ap) && !number_zero(dxin)){
   set_number_to_zero(dxin);
-  mp_warn(mp,"x component of derivative at t=1 approximated at zero");
+  mp_warn(mp,"x component of derivative at t=1 approximated to zero.");
  } 
 if (number_zero(dyin_ap) && !number_zero(dyin)){
   set_number_to_zero(dyin);
-  mp_warn(mp,"y component of derivative at t=1 approximated at zero");
+  mp_warn(mp,"y component of derivative at t=1 approximated to zero.");
  } 
+/* END PATCH */
 #ifdef DEBUGENVELOPE
-dbg_key(dxin dyin);dbg_open_t;dbg_nl;
+dbg_key(dxin dyin after);dbg_open_t;dbg_nl;
 dbg_n(dxin);dbg_n(dyin);
 dbg_close_t;dbg_comma; 
 #endif
@@ -13961,7 +14031,7 @@
 $ 1/3 B'(1-s,0,X_1,0) = (-2s^2 + 2s)X_1 \approx 2sX_1  $ for $s\rightarrow 0$ $\par
 */
 /* Of course the same should be done for dy and dyin */
-if ( ((number_zero(dx)||number_positive(dx_m)) && number_positive(dy)) &&
+if ( ((number_zero(dx) && number_positive(dx_m)) && number_positive(dy)) &&
      (number_zero(dxin) && number_positive(dyin)) ){
      number_clone(dx_m, epsilon_t);
      number_clone(dxin_m, epsilon_t);
@@ -13979,6 +14049,12 @@
        set_number_from_substraction (dx, dx, epsilon_t);  
      }
 }
+#ifdef DEBUGENVELOPE
+dbg_key(dx dy dxin dyin after patch);dbg_open_t;dbg_nl;
+dbg_n(dx);dbg_n(dy);dbg_n(dx_ap);dbg_n(dy_ap);
+dbg_n(dxin);dbg_n(dyin);dbg_n(dxin_ap);dbg_n(dyin_ap);
+dbg_close_t;dbg_comma; 
+#endif
 /* END PATCH ****/
 
 @ The next step is to bracket the initial direction between consecutive
@@ -13995,10 +14071,14 @@
   ab_vs_cd (ab_vs_cd, dy, dxin, dx, dyin);
 #ifdef DEBUGENVELOPE
 dbg_nl;
+dbg_comment(Update |mp_knot_info(p)|);dbg_nl;
 dbg_key(mp_get_turn_amt_dx_dy);dbg_open_t;dbg_str(--[==[call mp_get_turn_amt]==]);dbg_nl; 
 dbg_n(w0->x_coord);dbg_n(w0->y_coord);dbg_n(dx);dbg_n(dy);dbg_in(number_nonnegative(ab_vs_cd));
+dbg_n(ab_vs_cd);
 #endif
+ is_dxdy=true;
  turn_amt = mp_get_turn_amt (mp, w0, dx, dy, number_nonnegative(ab_vs_cd));
+ is_dxdy=false; 
 #ifdef DEBUGENVELOPE
 dbg_dn(turn_amt);
 dbg_close_t;dbg_comma;
@@ -14058,17 +14138,27 @@
 #ifdef DEBUGENVELOPE
      dbg_sp;
      dbg_open_t;dbg_str(--[==[inside mp_get_turn_amt do loop ]==]);dbg_nl; 
-      dbg_n(w->x_coord);dbg_n(w->y_coord);dbg_n(ww->x_coord);dbg_n(ww->y_coord);
-      dbg_n(t);dbg_n(dy);dbg_n(arg1);dbg_n(dx);dbg_n(arg2);
-      dbg_n(t_ap);dbg_n(dy_ap);dbg_n(dx_ap);
+     dbg_n(w->x_coord);dbg_n(w->y_coord);dbg_n(ww->x_coord);dbg_n(ww->y_coord);
+     dbg_n(t);dbg_n(dy);dbg_n(arg1);dbg_n(dx);dbg_n(arg2);
+     dbg_n(t_ap);dbg_n(dy_ap);dbg_n(dx_ap);dbg_n(dyin_ap);dbg_n(dxin_ap);
      dbg_close_t;dbg_comma;
+     dbg_in(number_zero(dx) && number_zero(arg1) && number_positive(dy) && number_positive(arg2) && is_dxdy);
+     dbg_in(is_dxdy && number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_negative(arg2)  && number_positive(dyin_ap)); 
+     dbg_in(is_dxindyin && number_zero(dx) && number_zero(arg1) && number_positive(dy) && number_positive(arg2) && number_negative(dyin_ap));
+     dbg_in(number_zero(dy) && number_zero(arg2) && number_negative(dx) && number_negative(arg1));
+     dbg_in(number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_positive(arg2));
+     dbg_in(number_zero(dy) && number_zero(arg2) && number_positive(dx) && number_negative(arg1));
      dbg_nl;
 #endif
       /* BEGIN PATCH */
-           if (number_zero(dx) && number_zero(arg1) && number_positive(dy) && number_positive(arg2)) 
+      if (number_zero(dx) && number_zero(arg1) && number_positive(dy) && number_positive(arg2) && is_dxdy) 
+        break; 
+      if (is_dxdy && number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_negative(arg2)  && number_positive(dyin_ap)) 
+        break; 
+      if (is_dxindyin && number_zero(dx) && number_zero(arg1) && number_positive(dy) && number_positive(arg2) && number_negative(dyin_ap)) 
+        break; 
+      if (number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_negative(arg2) && !(is_dxdy)) 
         break;
-      if (number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_negative(arg2)) 
-        break;
       if (number_zero(dy) && number_zero(arg2) && number_negative(dx) && number_negative(arg1)) 
         break;
       if (number_zero(dx) && number_zero(arg1) && number_negative(dy) && number_positive(arg2)) 
@@ -14075,7 +14165,6 @@
         set_number_to_unity(t);
       if (number_zero(dy) && number_zero(arg2) && number_positive(dx) && number_negative(arg1)) 
         set_number_to_unity(t);
-     
       /* END PATCH */
       if (number_negative(t)) 
         break;
@@ -14088,6 +14177,21 @@
     set_number_from_substraction (arg1, w->x_coord, ww->x_coord);
     set_number_from_substraction (arg2, w->y_coord, ww->y_coord);
     ab_vs_cd (t, dy, arg1, dx, arg2);
+#ifdef DEBUGENVELOPE
+     dbg_sp;
+     dbg_open_t;dbg_str(--[==[outside mp_get_turn_amt do loop ]==]);dbg_nl; 
+     dbg_n(w->x_coord);dbg_n(w->y_coord);dbg_n(ww->x_coord);dbg_n(ww->y_coord);
+     dbg_n(t);dbg_n(dy);dbg_n(arg1);dbg_n(dx);dbg_n(arg2);
+     dbg_n(t_ap);dbg_n(dy_ap);dbg_n(dx_ap);dbg_n(dyin_ap);dbg_n(dxin_ap);
+     dbg_close_t;dbg_comma;
+     dbg_nl;
+#endif
+     /* BEGIN PATCH */
+     if (number_negative(dy) && number_zero(arg1) && number_zero(dx) && number_negative(arg2)) {
+        set_number_to_unity(t);
+	number_negate(t);
+      }
+      /* END PATCH */ 
     while (number_negative(t)) {
       decr (s);
       w = ww;
@@ -14095,6 +14199,15 @@
       set_number_from_substraction (arg1, w->x_coord, ww->x_coord);
       set_number_from_substraction (arg2, w->y_coord, ww->y_coord);
       ab_vs_cd (t, dy, arg1, dx, arg2);
+#ifdef DEBUGENVELOPE
+     dbg_sp;
+     dbg_open_t;dbg_str(--[==[inside mp_get_turn_amt do loop ]==]);dbg_nl; 
+     dbg_n(w->x_coord);dbg_n(w->y_coord);dbg_n(ww->x_coord);dbg_n(ww->y_coord);
+     dbg_n(t);dbg_n(dy);dbg_n(arg1);dbg_n(dx);dbg_n(arg2);
+     dbg_n(t_ap);dbg_n(dy_ap);dbg_n(dx_ap);
+     dbg_close_t;dbg_comma;
+     dbg_nl;
+#endif
     }
   }
   free_number (t);
@@ -14141,7 +14254,19 @@
 
 @<Complete the offset splitting process@>=
 ww = mp_prev_knot (w);
+#ifdef DEBUGENVELOPE 
+dbg_key(Complete the offset splitting process);dbg_open_t;dbg_nl;
+dbg_n(w->x_coord);dbg_n(w->y_coord);
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+dbg_close_t; dbg_comma;dbg_nl;
+#endif
 @<Compute test coeff...@>;
+#ifdef DEBUGENVELOPE 
+dbg_key(after Compute test coeff);dbg_open_t;dbg_nl;
+dbg_n(w->x_coord);dbg_n(w->y_coord);
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+dbg_close_t; dbg_comma;dbg_nl;
+#endif
 @<Find the first |t| where $d(t)$ crosses $d_{k-1}$ or set
   |t:=fraction_one+1|@>;
 if (number_greater(t, fraction_one_t)) {
@@ -14183,8 +14308,14 @@
     mp_fin_offset_prep (mp, r, ww, x0, x1, x2, y0, y1, y2, -1, (-1 - turn_amt));
   }
 }
+#ifdef DEBUGENVELOPE 
+dbg_key(end Complete the offset splitting process);dbg_open_t;dbg_nl;
+dbg_n(w->x_coord);dbg_n(w->y_coord);
+dbg_n(w0->x_coord);dbg_n(w0->y_coord);
+dbg_in(turn_amt);
+dbg_close_t; dbg_comma;dbg_nl;
+#endif
 
-
 @ @<Split off another rising cubic for |fin_offset_prep|@>=
 mp_split_cubic (mp, r, t);
 mp_knot_info (mp_next_knot (r)) = zero_off + 1;
@@ -14265,8 +14396,16 @@
   ab_vs_cd (ab_vs_cd, dx, dyin, dxin, dy);
 #ifdef DEBUGENVELOPE
 dbg_n(ab_vs_cd);dbg_n(dx);dbg_n(dyin);dbg_n(dxin);dbg_n(dy);
+#endif
+/* BEGIN PATCH */
+ if (number_negative(dy) && number_equal(dy,dyin) && number_equal(dx,epsilon_t))
+        set_number_to_unity(ab_vs_cd);
+#ifdef DEBUGENVELOPE
+dbg_key_nval(ab_vs_cd patched,ab_vs_cd);
 dbg_close_t;dbg_comma;dbg_nl;
 #endif
+
+/* END PATCH */
   if (number_negative (ab_vs_cd))
     d_sign = -1;
   else if (number_zero (ab_vs_cd))
@@ -14296,17 +14435,28 @@
   more than $180^\circ$@>;
 #ifdef DEBUGENVELOPE
 dbg_nl;
+dbg_key(Make |ss| negative if and only if); dbg_open_t;dbg_nl;
 dbg_key(mp_get_turn_amt_dxin_dyin);dbg_open_t;dbg_str(--[==[call mp_get_turn_amt]==]);dbg_nl; ;
 dbg_n(w->x_coord);dbg_n(w->y_coord);dbg_n(dxin);dbg_n(dyin);dbg_in((d_sign > 0));
 #endif
+is_dxindyin=true;
 turn_amt = mp_get_turn_amt (mp, w, dxin, dyin, (d_sign > 0));
+is_dxindyin=false;
 #ifdef DEBUGENVELOPE
-dbg_dn(turn_amt);
-dbg_close_t;dbg_nl;dbg_nl;
+dbg_key_dval(turn_amt 1,turn_amt);dbg_comma;dbg_nl;
+dbg_key_nval(ss,ss);dbg_comma;dbg_nl;
+dbg_key_ival(d_sign,d_sign);dbg_comma;dbg_nl;
+dbg_key_ival(n,n);dbg_comma;dbg_nl;
 #endif
 if (number_negative(ss))
-  turn_amt = turn_amt - d_sign * n
+  turn_amt = turn_amt - d_sign * n;
+#ifdef DEBUGENVELOPE
+dbg_key_dval(turn_amt 2,turn_amt);dbg_comma;dbg_nl;
+dbg_close_t;dbg_comma;dbg_nl;
+dbg_close_t;dbg_comma;dbg_nl;
+#endif
 
+
 @ We check rotation direction by looking at the vector connecting the current
 node with the next. If its angle with incoming and outgoing tangents has the
 same sign, we pick this as |d_sign|, since it means we have a flex, not a cusp.
@@ -14410,9 +14560,8 @@
   set_number_from_addition (ss, r1, r2);
   /* BEGIN PATCH */
 #ifdef DEBUGENVELOPE
-dbg_key(patch ss before);dbg_open_t;dbg_nl;
-dbg_n(ss);
-dbg_close_t;dbg_comma;dbg_nl;
+dbg_key(patch ss before);dbg_open_t;
+dbg_n(ss);dbg_close_t;dbg_comma;
 #endif
   new_number(abs_ss);
   new_number(eps_ss);
@@ -14423,9 +14572,8 @@
     set_number_to_zero(ss);/* a warning here ? */
   }
 #ifdef DEBUGENVELOPE
-dbg_key(patch ss after);dbg_open_t;dbg_nl;
-dbg_n(ss);
-dbg_close_t;dbg_comma;dbg_nl;
+dbg_key(patch ss after);dbg_open_t;
+dbg_n(ss);dbg_close_t;dbg_comma;
 #endif
   free_number(abs_ss);
   free_number(eps_ss);
@@ -14474,6 +14622,14 @@
 {
   w = mp_pen_walk (mp, w, (mp_knot_info (p) - zero_off));
   mp_print (mp, " % ");
+#ifdef DEBUGENVELOPE
+ dbg_nl;dbg_open_t;dbg_str(--[==[START]==]);dbg_nl;
+ dbg_key(Printing mp_knot_info (p));dbg_open_t;dbg_nl;
+ dbg_n(p->x_coord);dbg_n(p->y_coord);
+ dbg_in(mp_knot_info(p));
+ dbg_close_t;dbg_close_t;dbg_comma;dbg_nl;
+ dbg_nl;dbg_str(--[==[STOP]==]);dbg_nl;
+#endif
   if (mp_knot_info (p) > zero_off)
     mp_print (mp, "counter");
   mp_print (mp, "clockwise to offset ");
@@ -23239,8 +23395,27 @@
           set_value_number (magenta_part (t), value_number (green_part (r)));
           mp_type (yellow_part (t)) = mp_type (blue_part (r));
           set_value_number (yellow_part (t), value_number (blue_part (r)));
-          mp_recycle_value (mp, r);
-          r = t;
+	  /*see |mp_stash_in| */
+	  if ( ((mp_type (cyan_part (t))) != mp_independent) && ((mp_type (cyan_part (t))) != mp_known) ) {
+     	     /* Copy the dep list */
+            set_dep_list (cyan_part(t),dep_list ((mp_value_node) red_part(r)));
+            set_prev_dep (cyan_part(t),prev_dep ((mp_value_node) red_part(r)));
+            set_mp_link (prev_dep (cyan_part(t)), (mp_node) cyan_part(t));
+          }		
+	  if ( ((mp_type (magenta_part (t))) != mp_independent) && ((mp_type (magenta_part (t))) != mp_known) ) {
+     	     /* Copy the dep list */
+            set_dep_list (magenta_part(t),dep_list ((mp_value_node) green_part(r)));
+            set_prev_dep (magenta_part(t),prev_dep ((mp_value_node) green_part(r)));
+            set_mp_link (prev_dep (magenta_part(t)), (mp_node) magenta_part(t));
+          }		
+	  if ( ((mp_type (yellow_part (t))) != mp_independent) && ((mp_type (yellow_part (t))) != mp_known)) {
+     	     /* Copy the dep list */
+            set_dep_list (yellow_part(t),dep_list ((mp_value_node) blue_part(r)));
+            set_prev_dep (yellow_part(t),prev_dep ((mp_value_node) blue_part(r)));
+            set_mp_link (prev_dep (yellow_part(t)), (mp_node) yellow_part(t));
+          }
+	  mp_recycle_value (mp, r);
+	  r = t;
           /* Scan the last of a quartet of numerics */
           mp_get_x_next (mp);
           mp_scan_expression (mp);



More information about the tex-live-commits mailing list