summaryrefslogtreecommitdiff
path: root/macros/luatex/generic/minim-mp/minim.mp
blob: b0df361b94988884909e759b8196221deb3d7f6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93

if known minim.mp:
    message "skipping: already read";
    expandafter endinput fi
minim.mp := 1.3;

% This file only contains code that is not specific to the minim metapost 
% processor. See minim-mp.mp for the wireup of minim-mp’s extensions.

message "Loading general minim extension macros";

% redefine some constants to work with the new numerical engines
numeric mm, cm, pt, pc, dd, cc;
pc = 12 pt; cc = 12 dd; cm = 10 mm;
803 pt = 800; 127 mm = 360; 1157 dd = 1238 pt;
eps := 1/2048; infinity := 64*64-epsilon;

% constants
pi := 355/113;

% shorthands
primarydef p xshifted x = p shifted (x,0) enddef;
primarydef p yshifted y = p shifted (0,y) enddef;

% reverse paths to allow „p & vflip p”
def hflip primary p = if path p: reverse fi p xscaled -1 enddef;
def vflip primary p = if path p: reverse fi p yscaled -1 enddef;

% missing definitions
path fullsquare, unitcircle ;
fullsquare := unitsquare shifted - center unitsquare ;
unitcircle := fullcircle shifted urcorner fullcircle ;

% complement counterclockwise
vardef clockwise primary c =
    if turningnumber c > 0: reverse fi c enddef;

% clipping
vardef clipto text t =
    clip currentpicture to bbox currentpicture
        for c = t: -- c -- cycle endfor -- cycle enddef;
vardef clipout text t =
    clip currentpicture to
        for c = t: c -- cycle -- endfor cycle enddef;

% cmyk colours
cmykcolor cyan, magenta, yellow, key;
cyan    = (1,0,0,0);
magenta = (0,1,0,0);
yellow  = (0,0,1,0);
key     = (0,0,0,1);

% also in minim-mp.mp
if unknown rgb_to_gray red:
    vardef rgb_to_gray expr c =
        0.2126*redpart c + 0.7152*greenpart c + 0.0722*bluepart c
    enddef;
fi

% shorthands
def save_pen       text t = save t; pen       t; enddef;
def save_pair      text t = save t; pair      t; enddef;
def save_path      text t = save t; path      t; enddef;
def save_color     text t = save t; color     t; enddef;
def save_cmykcolor text t = save t; cmykcolor t; enddef;
def save_transform text t = save t; transform t; enddef;
def save_picture   text t = save t; picture   t; enddef;
def save_boolean   text t = save t; boolean   t; enddef;
def save_string    text t = save t; string    t; enddef;

% missing trigonometric functions
vardef tand    primary x = sind(x)/cosd(x) enddef;
vardef arcsind primary x = angle(1+-+x, x) enddef;
vardef arccosd primary x = angle(x, 1+-+x) enddef;
vardef arctand primary x = angle(1, x) enddef;

% segments of the circle (counterclockwise)
vardef arc (expr thetafrom, thetalen) =
    save n, d, l, theta; save_path a; save_pair p, c;
    n = ceiling(thetalen / 45); % number of segments (45° is max segment length)
    d = thetalen / n;           % angle of each segment
    l = 4/3 * tand(d/4);        % length of control points
    theta := thetafrom;
    p := (cosd theta, sind theta);
    c := l * (-sind theta, cosd theta);
    a := p for _ = 1 upto n:
        .. controls (p + c)
        hide(theta := theta + d;
            p := (cosd theta, sind theta);
            c := l * (-sind theta, cosd theta);)
        and (p - c) .. p
    endfor; a enddef;