diff options
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mp-tool.mp')
-rw-r--r-- | Master/texmf-dist/metapost/context/base/mp-tool.mp | 179 |
1 files changed, 151 insertions, 28 deletions
diff --git a/Master/texmf-dist/metapost/context/base/mp-tool.mp b/Master/texmf-dist/metapost/context/base/mp-tool.mp index fca61cb346a..24f2e6676fd 100644 --- a/Master/texmf-dist/metapost/context/base/mp-tool.mp +++ b/Master/texmf-dist/metapost/context/base/mp-tool.mp @@ -102,34 +102,88 @@ vardef ddecimal primary p = decimal xpart p & " " & decimal ypart p enddef ; -extra_endfig := extra_endfig - & "special " - & "(" - & ditto - & "%%HiResBoundingBox: " - & ditto - & "&ddecimal llcorner currentpicture" - & "&space" - & "&ddecimal urcorner currentpicture" - & ");"; +% is now built in + +% extra_endfig := extra_endfig +% & "special " +% & "(" +% & ditto +% & "%%HiResBoundingBox: " +% & ditto +% & "&ddecimal llcorner currentpicture" +% & "&space" +% & "&ddecimal urcorner currentpicture" +% & ");"; + +%D Colors: + +nocolormodel := 1 ; +greycolormodel := 3 ; +rgbcolormodel := 5 ; +cmykcolormodel := 7 ; + +let grayscale = numeric ; + +% def colorlike(expr c) text v = % colorlike(a) b, c, d ; +% forsuffixes i=v : % save i ; +% if cmykcolor c : +% cmykcolor i ; +% elseif rgbcolor c : +% rgbcolor i ; +% else : +% grayscale i ; +% fi ; +% endfor ; +% enddef ; + +vardef colorlike(text c) text v = % colorlike(a) b, c, d ; + save _p_ ; picture _p_ ; + forsuffixes i=v : + _p_ := image(draw origin withcolor c ;) ; % intercept pre and postscripts + if (colormodel _p_ = cmykcolormodel) : + cmykcolor i ; + elseif (colormodel _p_ = rgbcolormodel) : + rgbcolor i ; + else : + grayscale i ; + fi ; + endfor ; +enddef ; + +% if (unknown colormodel) : +% def colormodel = +% rgbcolormodel +% enddef ; +% fi ; %D Also handy (when we flush colors): vardef dddecimal primary c = - decimal redpart c & " " & decimal greenpart c & " " & decimal bluepart c + decimal redpart c & " " & decimal greenpart c & " " & decimal bluepart c enddef ; -%D We have standardized data file names: +vardef ddddecimal primary c = + decimal cyanpart c & " " & decimal magentapart c & " " & decimal yellowpart c & " " & decimal blackpart c +enddef ; -if not known _data_prefix_ : +vardef colordecimals primary c = + if cmykcolor c : + decimal cyanpart c & ":" & decimal magentapart c & ":" & decimal yellowpart c & ":" & decimal blackpart c + elseif rgbcolor c : + decimal redpart c & ":" & decimal greenpart c & ":" & decimal bluepart c + else : + decimal c + fi +enddef ; - string _data_prefix_ ; _data_prefix_ = "mpd-" ; - string _data_suffix_ ; _data_suffix_ = ".tmp" ; +%D We have standardized data file names: -fi ; +def job_name = + jobname +enddef ; -def data_file = - _data_prefix_ & decimal charcode & _data_suffix_ +def data_mpd_file = + job_name & "-mp.mpd" enddef ; %D Because \METAPOST\ has a hard coded limit of 4~datafiles, @@ -143,12 +197,12 @@ boolean savingdata ; savingdata := false ; def savedata expr txt = if collapse_data : + write txt to data_mpd_file ; + else : write if savingdata : txt else : "\MPdata{" & decimal charcode & "}{" & txt & "}" fi - & "%" to jobname & _data_suffix_ ; - else : - write txt to data_file ; + & "%" to data_mpd_file ; fi ; enddef ; @@ -158,15 +212,19 @@ def startsavingdata = write "\MPdata{" & decimal charcode & "}{%" to - jobname & _data_suffix_ ; + data_mpd_file ; fi ; enddef ; def stopsavingdata = - savingdata := false ; if collapse_data : - write "}%" to jobname & _data_suffix_ ; + write "}%" to data_mpd_file ; fi ; + savingdata := false ; +enddef ; + +def finishsavingdata = + write EOF to data_mpd_file ; enddef ; %D Instead of a keystroke eating save and allocation @@ -650,6 +708,16 @@ color cyan ; cyan = (0,1,1) ; color magenta ; magenta = (1,0,1) ; color yellow ; yellow = (1,1,0) ; +def colortype(expr c) = + if cmykcolor c : cmykcolor elseif rgbcolor c : rgbcolor else : grayscale fi +enddef ; +vardef whitecolor(expr c) = + if cmykcolor c : (0,0,0,0) elseif rgbcolor c : (1,1,1) else : 1 fi +enddef ; +vardef blackcolor(expr c) = + if cmykcolor c : (0,0,0,1) elseif rgbcolor c : (0,0,0) else : 0 fi +enddef ; + %D Well, this is the dangerous and naive version: def drawfill text t = @@ -819,7 +887,18 @@ primarydef p randomized s = fi elseif pair p : p randomshifted s - elseif color p : + elseif cmykcolor p : + if color s : + (uniformdeviate cyanpart s * cyanpart p, + uniformdeviate magentapart s * magentapart p, + uniformdeviate yellowpart s * yellowpart p, + uniformdeviate blackpart s * blackpart p) + elseif pair s : + ((xpart s + uniformdeviate (ypart s - xpart s)) * p) + else : + (uniformdeviate s * p) + fi + elseif rgbcolor p : if color s : (uniformdeviate redpart s * redpart p, uniformdeviate greenpart s * greenpart p, @@ -829,6 +908,14 @@ primarydef p randomized s = else : (uniformdeviate s * p) fi + elseif color p : + if color s : + (uniformdeviate graypart s * graypart p) + elseif pair s : + ((xpart s + uniformdeviate (ypart s - xpart s)) * p) + else : + (uniformdeviate s * p) + fi else : p + uniformdeviate s fi) @@ -1138,7 +1225,7 @@ def visualizedfill expr c = enddef ; def do_visualizeddraw text t = - draworigin ; + draworigin ; drawpath _c_ t ; drawcontrollines _c_ ; drawcontrolpoints _c_ ; @@ -2220,9 +2307,10 @@ enddef ; % handy for myself def addbackground text t = - begingroup ; save p ; picture p ; + begingroup ; save p, b ; picture p ; path b ; + b := boundingbox currentpicture ; p := currentpicture ; currentpicture := nullpicture ; - fill boundingbox p t ; addto currentpicture also p ; + fill b t ; setbounds currentpicture to b ; addto currentpicture also p ; endgroup ; enddef ; @@ -2371,6 +2459,41 @@ enddef ; % p % enddef ; +%D Handy: + +def break = + exitif true fi ; +enddef ; + +%D New too: + +primarydef p xstretched w = + (p if (bbwidth (p)>0) and (w>0) : xscaled (w/bbwidth (p)) fi) +enddef ; + +primarydef p ystretched h = + (p if (bbheight(p)>0) and (h>0) : yscaled (h/bbheight(p)) fi) +enddef ; + +primarydef p snapped s = + hide ( if path p : + forever : + exitif (bbheight(p) <= s) and (bbwidth(p) <= s) ; + p := p scaled (1/2) ; + endfor ; + elseif numeric p : + forever : + exitif p <= s ; + p := p scaled (1/2) ; + endfor ; + fi ; ) + p +enddef ; + % done endinput ; + +end + +end |