summaryrefslogtreecommitdiff
path: root/metapost/context/base/mpiv/mp-blob.mpiv
diff options
context:
space:
mode:
Diffstat (limited to 'metapost/context/base/mpiv/mp-blob.mpiv')
-rw-r--r--metapost/context/base/mpiv/mp-blob.mpiv133
1 files changed, 110 insertions, 23 deletions
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 ;