From 86bfea5faac983d15c47eec27f43ec56e75c69ef Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Fri, 8 Jun 2018 10:23:49 +0200 Subject: 2018-06-08 09:38:00 --- metapost/context/base/mpiv/mp-blob.mpiv | 133 ++++++++++++++++++++++++++------ 1 file changed, 110 insertions(+), 23 deletions(-) (limited to 'metapost/context/base/mpiv/mp-blob.mpiv') diff --git a/metapost/context/base/mpiv/mp-blob.mpiv b/metapost/context/base/mpiv/mp-blob.mpiv index 78fa6bfe9..d2bdf741a 100644 --- a/metapost/context/base/mpiv/mp-blob.mpiv +++ b/metapost/context/base/mpiv/mp-blob.mpiv @@ -28,17 +28,34 @@ enddef ; extra_endfig := extra_endfig & "mfun_reset_tex_blobs ; " ; -vardef mfun_inject_blob(expr n) = - mfun_blob_c := nullpicture ; - mfun_blob_b := lua.mp.blob_dimensions(mfun_blob_n,n) ; - addto mfun_blob_c doublepath unitsquare - xscaled redpart mfun_blob_b - yscaled (greenpart mfun_blob_b + bluepart mfun_blob_b) - shifted (0,- bluepart mfun_blob_b) - withprescript "tb_stage=inject" - withprescript "tb_blob=" & decimal lua.mp.blob_index(mfun_blob_n,n) ; - mfun_blob_c -enddef ; +if mfun_use_one_pass : + + vardef mfun_inject_blob(expr n) = + mfun_blob_c := nullpicture ; + mfun_blob_b := lua.mp.blob_dimensions(mfun_blob_n,n) ; + addto mfun_blob_c doublepath unitsquare + xscaled redpart mfun_blob_b + yscaled (greenpart mfun_blob_b + bluepart mfun_blob_b) + shifted (0,- bluepart mfun_blob_b) + withprescript "tb_blob=" & decimal lua.mp.blob_index(mfun_blob_n,n) ; + mfun_blob_c + enddef ; + +else : + + vardef mfun_inject_blob(expr n) = + mfun_blob_c := nullpicture ; + mfun_blob_b := lua.mp.blob_dimensions(mfun_blob_n,n) ; + addto mfun_blob_c doublepath unitsquare + xscaled redpart mfun_blob_b + yscaled (greenpart mfun_blob_b + bluepart mfun_blob_b) + shifted (0,- bluepart mfun_blob_b) + withprescript "tb_stage=inject" + withprescript "tb_blob=" & decimal lua.mp.blob_index(mfun_blob_n,n) ; + mfun_blob_c + enddef ; + +fi ; % An example of usage: @@ -47,15 +64,12 @@ newinternal tracingfollowtext ; tracingfollowtext := 0 ; newinternal autoscaleupfollowtext ; autoscaleupfollowtext := 2 ; newinternal autoscaledownfollowtext ; autoscaledownfollowtext := 0 ; -vardef followtext(expr pth, txt) = - image ( - mfun_blob_n := mfun_blob_n + 1 ; - if mfun_trial_run : - draw fullcircle scaled 100bp - withprescript "ft_stage=trial" - withprescript "ft_category=" & decimal mfun_blob_n - withpostscript txt ; - else : +if mfun_use_one_pass : + + vardef followtext(expr pth, txt) = + image ( + mfun_blob_n := mfun_blob_n + 1 ; + lua.mp.InjectBlobB(mfun_blob_n,txt); save pat, al, at, pl, pc, wid, pos, ap, ad, pic, len, n, sc ; path pat ; pat := pth ; numeric al, at, pl, pc, wid, pos, len[], n, sc ; @@ -113,6 +127,79 @@ vardef followtext(expr pth, txt) = draw fullcircle scaled 100bp withprescript "ft_stage=final" withprescript "ft_category=" & decimal mfun_blob_n ; - fi ; - ) -enddef ; + ) + enddef ; + +else : + + vardef followtext(expr pth, txt) = + image ( + mfun_blob_n := mfun_blob_n + 1 ; + if mfun_trial_run : + draw fullcircle scaled 100bp + withprescript "ft_stage=trial" + withprescript "ft_category=" & decimal mfun_blob_n + withpostscript txt ; + else : + save pat, al, at, pl, pc, wid, pos, ap, ad, pic, len, n, sc ; + path pat ; pat := pth ; + numeric al, at, pl, pc, wid, pos, len[], n, sc ; + pair ap, ad ; + picture pic[] ; + len[0] := 0 ; + n := lua.mp.blob_size(mfun_blob_n) ; + sc := 0 ; + for i=1 upto n : + pic[i] := mfun_inject_blob(i) ; + pic[i] := pic[i] shifted - llcorner pic[i] ; + len[i] := len[i-1] + lua.mp.blob_width(mfun_blob_n,i) ; + endfor ; + al := arclength pth ; + if al = 0 : + al := len[n] ; + pat := origin -- (al,0) ; + fi ; + if ((al < len[n]) and (autoscaleupfollowtext > 0)) or + ((al > len[n]) and (autoscaledownfollowtext > 0)) : + sc := len[n] /al ; + pat := pat scaled sc ; + al := arclength pat ; + fi ; + if followtextalternative = 1 : + pl := (al-len[n])/(if n>1 : (n-1) else : 1 fi) ; + pc := 0 ; + else : % centered / MP + pl := 0 ; + pc := arclength pat/2 - len[n]/2 ; + fi ; + if tracingfollowtext = 1 : + draw pat withpen pencircle scaled 1pt withcolor blue ; + fi ; + for i=1 upto n : + wid := lua.mp.blob_width(mfun_blob_n,i) ; + pos := len[i]-wid/2 + (i-1)*pl + pc ; + at := arctime pos of pat ; + ap := point at of pat ; + ad := direction at of pat ; + pic[i] := pic[i] shifted (-wid/2,0) rotated(angle(ad)) shifted ap ; + draw pic[i] ; + if tracingfollowtext = 1 : + draw boundingbox pic[i] withpen pencircle scaled .25pt withcolor red ; + draw ap withpen pencircle scaled .50pt withcolor green ; + fi ; + endfor ; + if ((autoscaleupfollowtext = 2) or (autoscaledownfollowtext = 2)) and + (sc <> 0) and (sc <> 1): + currentpicture := currentpicture scaled (1/sc) ; + fi ; + if tracingfollowtext = 1 : + draw boundingbox currentpicture withpen pencircle scaled .25pt withcolor blue ; + fi ; + draw fullcircle scaled 100bp + withprescript "ft_stage=final" + withprescript "ft_category=" & decimal mfun_blob_n ; + fi ; + ) + enddef ; + +fi ; -- cgit v1.2.3