summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost/context/base/mp-tool.mp
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/metapost/context/base/mp-tool.mp')
-rw-r--r--Master/texmf-dist/metapost/context/base/mp-tool.mp179
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