blob: 328bed2a15dc24c7bb8faa93419648785cb93df1 (
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
94
95
96
97
98
99
100
101
102
103
104
|
/*
See license.txt in the root of this project.
*/
# ifndef LMT_BUILDPAGE_H
# define LMT_BUILDPAGE_H
/*tex
The state of |page_contents| is indicated by two special values.
*/
typedef enum contribution_codes {
contribute_nothing,
contribute_insert, /*tex An insert node has been contributed, but no boxes. */
contribute_box, /*tex A box has been contributed. */
contribute_rule, /*tex A rule has been contributed. */
} contribution_codes;
typedef struct page_builder_state_info {
halfword page_tail; /*tex The final node on the current page. */
int contents; /*tex What is on the current page so far? */
scaled max_depth; /*tex The maximum box depth on page being built. */
halfword best_break; /*tex Break here to get the best page known so far. */
int least_cost; /*tex The score for this currently best page. */
scaled best_size; /*tex Its |page_goal| so it can go away. */
scaled goal;
scaled vsize;
scaled total;
scaled depth;
union {
scaled page_so_far[6]; /*tex The height and glue of the current page. */
struct {
scaled initial;
scaled stretch;
scaled filstretch;
scaled fillstretch;
scaled filllstretch;
scaled shrink;
};
};
int insert_penalties; /*tex The sum of the penalties for held-over insertions. */
halfword insert_heights;
halfword last_glue; /*tex Used to implement |\lastskip|. */
halfword last_penalty; /*tex Used to implement |\lastpenalty|. */
scaled last_kern; /*tex Used to implement |\lastkern|. */
int last_extra_used;
halfword last_boundary;
int last_node_type; /*tex Used to implement |\lastnodetype|. */
int last_node_subtype; /*tex Used to implement |\lastnodesubtype|. */
int output_active;
int dead_cycles;
int current_state;
} page_builder_state_info;
extern page_builder_state_info lmt_page_builder_state;
typedef enum page_property_states {
page_initial_state, /* we need an offset and are aligned anyway */
page_stretch_state,
page_filstretch_state,
page_fillstretch_state,
page_filllstretch_state,
page_shrink_state,
} page_property_states;
# define page_state_offset(c) (c - page_stretch_code + page_stretch_state)
/*tex
The data structure definitions here use the fact that the |height| field
appears in the fourth word of a box node.
*/
extern void tex_initialize_buildpage (void);
extern void tex_initialize_pagestate (void);
extern void tex_build_page (void);
extern void tex_resume_after_output (void);
extern void tex_print_page_totals (void);
/*tex The tail of the contribution list: */
# define contribute_tail lmt_nest_state.nest[0].tail
# define page_goal lmt_page_builder_state.goal /*tex The desired height of information on page being built. */
# define page_vsize lmt_page_builder_state.vsize
# define page_total lmt_page_builder_state.total /*tex The height of the current page. */
# define page_depth lmt_page_builder_state.depth /*tex The depth of the current page. */
//# define page_stretch lmt_page_builder_state.page_so_far[page_stretch_state]
//# define page_filstretch lmt_page_builder_state.page_so_far[page_filstretch_state]
//# define page_fillstretch lmt_page_builder_state.page_so_far[page_fillstretch_state]
//# define page_filllstretch lmt_page_builder_state.page_so_far[page_filllstretch_state]
//# define page_shrink lmt_page_builder_state.page_so_far[page_shrink_state]
# define page_stretch lmt_page_builder_state.stretch
# define page_filstretch lmt_page_builder_state.filstretch
# define page_fillstretch lmt_page_builder_state.fillstretch
# define page_filllstretch lmt_page_builder_state.filllstretch
# define page_shrink lmt_page_builder_state.shrink
# endif
|