From a274872832cdd1e71ce4b019858c61c5a77c6b98 Mon Sep 17 00:00:00 2001 From: Context Git Mirror Bot Date: Tue, 31 May 2016 09:46:19 +0200 Subject: 2016-05-31 09:07:00 --- metapost/context/base/mpiv/mp-abck.mpiv | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'metapost/context/base/mpiv/mp-abck.mpiv') diff --git a/metapost/context/base/mpiv/mp-abck.mpiv b/metapost/context/base/mpiv/mp-abck.mpiv index abd7d8848..68706b1d9 100644 --- a/metapost/context/base/mpiv/mp-abck.mpiv +++ b/metapost/context/base/mpiv/mp-abck.mpiv @@ -267,3 +267,41 @@ enddef ; def anchor_box (expr n,x,y,w,h,d) = currentpicture := currentpicture shifted (-x,-y) ; enddef ; + +vardef shaped (suffix p) = + save l ; pair l[] ; + save r ; pair r[] ; + save i ; i := 1 ; + save n ; n := 0 ; + forever : + exitif unknown p[i] ; + n := n + 1 ; + l[n] := ulcorner p[i] ; + r[n] := urcorner p[i] ; + n := n + 1 ; + l[n] := llcorner p[i] ; + r[n] := lrcorner p[i] ; + i := i + 1 ; + endfor ; + for i = 3 upto n : + if xpart r[i] < xpart r[i-1] : + r[i] := (xpart r[i],ypart r[i-1]) ; + elseif xpart r[i] > xpart r[i-1] : + r[i] := (xpart r[i],ypart r[i-1]) ; + fi ; + if xpart l[i] < xpart l[i-1] : + l[i] := (xpart l[i],ypart l[i-1]) ; + elseif xpart l[i] > xpart l[i-1] : + l[i] := (xpart l[i],ypart l[i-1]) ; + fi ; + endfor ; + if n > 0 : + simplified ( + for i = 1 upto n : r[i] -- endfor + for i = n downto 1 : l[i] -- endfor + cycle + ) + else : + origin -- cycle + fi +enddef ; -- cgit v1.2.3