File: picture.ml

package info (click to toggle)
mlpost 0.8.1-3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,776 kB
  • sloc: ml: 17,440; makefile: 469
file content (110 lines) | stat: -rw-r--r-- 3,954 bytes parent folder | download | duplicates (4)
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
(**************************************************************************)
(*                                                                        *)
(*  Copyright (C) Johannes Kanig, Stephane Lescuyer                       *)
(*  Jean-Christophe Filliatre, Romain Bardou and Francois Bobot           *)
(*                                                                        *)
(*  This software is free software; you can redistribute it and/or        *)
(*  modify it under the terms of the GNU Library General Public           *)
(*  License version 2.1, with the special exception on linking            *)
(*  described in file LICENSE.                                            *)
(*                                                                        *)
(*  This software is distributed in the hope that it will be useful,      *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  *)
(*                                                                        *)
(**************************************************************************)

open Types

type t = commandpic

let tex s = mkPicture (mkPITex s)
let make l = l
let empty = mkSeq []
let bbox pic = mkPABBox pic

let ulcorner pic = mkPTPicCorner pic `Northwest
let llcorner pic = mkPTPicCorner pic `Southwest
let urcorner pic = mkPTPicCorner pic `Northeast
let lrcorner pic = mkPTPicCorner pic `Southeast

let north_west = ulcorner
let south_west = llcorner
let north_east = urcorner
let south_east = lrcorner

let corner_bbox ?(dx=Num.zero) ?(dy=Num.zero) pic = 
  let pdx = Point.pt (dx, Num.zero) in
  let pdy = Point.pt (Num.zero, dy) in
  Path.pathp ~style:Path.jLine ~cycle:Path.jLine 
    [Point.add (Point.sub (ulcorner pic) pdx) pdy;
     Point.sub (Point.sub (llcorner pic) pdx) pdy;
     Point.sub (Point.add (lrcorner pic) pdx) pdy;
     Point.add (Point.add (urcorner pic) pdx) pdy]

let transform trl p = 
  List.fold_left 
    (fun acc tr -> mkPicture (mkPITransformed acc tr)) p trl 

let ctr pic = Point.segment 0.5 (llcorner pic) (urcorner pic)

let scale f p = transform [Transform.scaled f] p
let rotate f p = transform [Transform.rotated f] p
let shift pt p = transform [Transform.shifted pt] p
let yscale n p = transform [Transform.yscaled n] p
let xscale n p = transform [Transform.xscaled n] p

let spin f p = transform [Transform.rotate_around (ctr p) f] p

let place f pic p = shift (Point.sub p (f pic)) pic
let center p pic = place ctr pic p
let place_up_left p pic = place ulcorner pic p
let place_up_right p pic = place urcorner pic p
let place_bot_left p pic = place llcorner pic p
let place_bot_right p pic = place lrcorner pic p

let beside p1 p2 = 
  mkSeq [p1; place_up_left (urcorner p1) p2]

let below p1 p2 =
  mkSeq [p1; place_up_left (llcorner p1) p2]

let clip pic pth = 
  mkPicture (mkPIClip pic pth)

let width p = Point.xpart (Point.sub (urcorner p) (ulcorner p))

let height p = Point.ypart (Point.sub (urcorner p) (lrcorner p))

let north p = Point.segment 0.5 (north_east p) (north_west p)
let south p = Point.segment 0.5 (south_east p) (south_west p)
let west p = Point.segment 0.5 (south_west p) (north_west p)
let east p = Point.segment 0.5 (north_east p) (south_east p)

let corner pos x = 
  match pos_reduce pos with
  | `Northwest -> north_west x
  | `Northeast -> north_east x
  | `Southwest -> south_west x
  | `Southeast -> south_east x
  | `West -> west x
  | `East -> east x
  | `Center -> ctr x
  | `North -> north x
  | `South -> south x

type escaped = 
    [`Backslash
    |`Underscore]

let rec escaped_to_list acc = function
  | [] -> acc
  | `Underscore::l -> escaped_to_list (('_',"\\_")::acc) l
  | `Backslash::l -> escaped_to_list (('\\',"\\backslash")::acc) l

let escape_latex l = Misc.generic_quote_list (escaped_to_list [] l)

let escape_all = escape_latex [`Backslash;`Underscore]


let set_pos = center