2 /* Copyright (C) 1989, 1990, 1991, 1992, 2004 Free Software Foundation, Inc.
3 Written by James Clark (jjc@jclark.com)
5 This file is part of groff.
7 groff is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
12 groff is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License along
18 with groff; see the file COPYING. If not, write to the Free Software
19 Foundation, 51 Franklin St - Fifth Floor, Boston, MA 02110-1301, USA. */
25 // SUP_RAISE_FORMAT gives the first baseline
26 // BASELINE_SEP_FORMAT gives the separation between baselines
28 int pile_box::compute_metrics(int style
)
31 for (i
= 0; i
< col
.len
; i
++)
32 col
.p
[i
]->compute_metrics(style
);
33 printf(".nr " WIDTH_FORMAT
" 0", uid
);
34 for (i
= 0; i
< col
.len
; i
++)
35 printf(">?\\n[" WIDTH_FORMAT
"]", col
.p
[i
]->uid
);
37 printf(".nr " BASELINE_SEP_FORMAT
" %dM",
38 uid
, baseline_sep
+col
.space
);
39 for (i
= 1; i
< col
.len
; i
++)
40 printf(">?(\\n[" DEPTH_FORMAT
"]+\\n[" HEIGHT_FORMAT
"]+%dM)",
41 col
.p
[i
-1]->uid
, col
.p
[i
]->uid
, default_rule_thickness
*5);
42 // round it so that it's a multiple of the vertical resolution
43 printf("/\\n(.V+(\\n(.V/2)*\\n(.V\n");
45 printf(".nr " SUP_RAISE_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d/2"
47 uid
, uid
, col
.len
-1, axis_height
- shift_down
);
48 printf(".nr " HEIGHT_FORMAT
" \\n[" SUP_RAISE_FORMAT
"]+\\n["
50 uid
, uid
, col
.p
[0]->uid
);
51 printf(".nr " DEPTH_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d+\\n["
52 DEPTH_FORMAT
"]-\\n[" SUP_RAISE_FORMAT
"]\n",
53 uid
, uid
, col
.len
-1, col
.p
[col
.len
-1]->uid
, uid
);
57 void pile_box::output()
60 printf("\\v'-\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
61 for (i
= 0; i
< col
.len
; i
++) {
66 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
70 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
77 printf("\\h'-\\n[" WIDTH_FORMAT
"]u'", col
.p
[i
]->uid
);
82 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
86 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
93 printf("\\v'\\n[" BASELINE_SEP_FORMAT
"]u'", uid
);
95 printf("\\v'\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
96 printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT
"]u)'", col
.len
- 1, uid
);
97 printf("\\h'\\n[" WIDTH_FORMAT
"]u'", uid
);
100 pile_box::pile_box(box
*pp
) : col(pp
)
104 void pile_box::check_tabs(int level
)
106 col
.list_check_tabs(level
);
109 void pile_box::debug_print()
111 col
.debug_print("pile");
114 int matrix_box::compute_metrics(int style
)
119 for (i
= 0; i
< len
; i
++) {
120 for (j
= 0; j
< p
[i
]->len
; j
++)
121 p
[i
]->p
[j
]->compute_metrics(style
);
122 if (p
[i
]->len
> max_len
)
124 if (p
[i
]->space
> space
)
127 for (i
= 0; i
< len
; i
++) {
128 printf(".nr " COLUMN_WIDTH_FORMAT
" 0", uid
, i
);
129 for (j
= 0; j
< p
[i
]->len
; j
++)
130 printf(">?\\n[" WIDTH_FORMAT
"]", p
[i
]->p
[j
]->uid
);
133 printf(".nr " WIDTH_FORMAT
" %dM",
134 uid
, column_sep
*(len
-1)+2*matrix_side_sep
);
135 for (i
= 0; i
< len
; i
++)
136 printf("+\\n[" COLUMN_WIDTH_FORMAT
"]", uid
, i
);
138 printf(".nr " BASELINE_SEP_FORMAT
" %dM",
139 uid
, baseline_sep
+space
);
140 for (i
= 0; i
< len
; i
++)
141 for (j
= 1; j
< p
[i
]->len
; j
++)
142 printf(">?(\\n[" DEPTH_FORMAT
"]+\\n[" HEIGHT_FORMAT
"]+%dM)",
143 p
[i
]->p
[j
-1]->uid
, p
[i
]->p
[j
]->uid
, default_rule_thickness
*5);
144 // round it so that it's a multiple of the vertical resolution
145 printf("/\\n(.V+(\\n(.V/2)*\\n(.V\n");
146 printf(".nr " SUP_RAISE_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d/2"
148 uid
, uid
, max_len
-1, axis_height
- shift_down
);
149 printf(".nr " HEIGHT_FORMAT
" 0\\n[" SUP_RAISE_FORMAT
"]+(0",
151 for (i
= 0; i
< len
; i
++)
152 printf(">?\\n[" HEIGHT_FORMAT
"]", p
[i
]->p
[0]->uid
);
154 printf(".nr " DEPTH_FORMAT
" \\n[" BASELINE_SEP_FORMAT
"]*%d-\\n["
155 SUP_RAISE_FORMAT
"]+(0",
156 uid
, uid
, max_len
-1, uid
);
157 for (i
= 0; i
< len
; i
++)
158 if (p
[i
]->len
== max_len
)
159 printf(">?\\n[" DEPTH_FORMAT
"]", p
[i
]->p
[max_len
-1]->uid
);
161 return FOUND_NOTHING
;
164 void matrix_box::output()
166 printf("\\h'%dM'", matrix_side_sep
);
167 for (int i
= 0; i
< len
; i
++) {
169 printf("\\v'-\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
170 for (j
= 0; j
< p
[i
]->len
; j
++) {
171 switch (p
[i
]->align
) {
175 printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u/2u'",
176 uid
, i
, p
[i
]->p
[j
]->uid
);
179 printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u-\\n[" WIDTH_FORMAT
"]u'",
180 uid
, i
, p
[i
]->p
[j
]->uid
);
185 p
[i
]->p
[j
]->output();
186 printf("\\h'-\\n[" WIDTH_FORMAT
"]u'", p
[i
]->p
[j
]->uid
);
187 switch (p
[i
]->align
) {
191 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" COLUMN_WIDTH_FORMAT
"]u/2u'",
192 p
[i
]->p
[j
]->uid
, uid
, i
);
195 printf("\\h'\\n[" WIDTH_FORMAT
"]u-\\n[" COLUMN_WIDTH_FORMAT
"]u'",
196 p
[i
]->p
[j
]->uid
, uid
, i
);
201 if (j
!= p
[i
]->len
- 1)
202 printf("\\v'\\n[" BASELINE_SEP_FORMAT
"]u'", uid
);
204 printf("\\v'\\n[" SUP_RAISE_FORMAT
"]u'", uid
);
205 printf("\\v'-(%du*\\n[" BASELINE_SEP_FORMAT
"]u)'", p
[i
]->len
- 1, uid
);
206 printf("\\h'\\n[" COLUMN_WIDTH_FORMAT
"]u'", uid
, i
);
208 printf("\\h'%dM'", column_sep
);
210 printf("\\h'%dM'", matrix_side_sep
);
213 matrix_box::matrix_box(column
*pp
)
216 for (int i
= 0; i
< 10; i
++)
223 matrix_box::~matrix_box()
225 for (int i
= 0; i
< len
; i
++)
230 void matrix_box::append(column
*pp
)
232 if (len
+ 1 > maxlen
) {
235 p
= new column
*[maxlen
];
236 memcpy(p
, oldp
, sizeof(column
*)*len
);
242 void matrix_box::check_tabs(int level
)
244 for (int i
= 0; i
< len
; i
++)
245 p
[i
]->list_check_tabs(level
);
248 void matrix_box::debug_print()
250 fprintf(stderr
, "matrix { ");
251 p
[0]->debug_print("col");
252 for (int i
= 1; i
< len
; i
++) {
253 fprintf(stderr
, " ");
254 p
[i
]->debug_print("col");
256 fprintf(stderr
, " }");
259 column::column(box
*pp
) : box_list(pp
), align(CENTER_ALIGN
), space(0)
263 void column::set_alignment(alignment a
)
268 void column::set_space(int n
)
273 void column::debug_print(const char *s
)
275 char c
= '\0'; // shut up -Wall
289 fprintf(stderr
, "%c%s %d { ", c
, s
, space
);
290 list_debug_print(" above ");
291 fprintf(stderr
, " }");