2
/******************************************************************************
4
* DESCRIPTION: the low level box structure
5
* and formatting routines
6
* COPYRIGHT : (C) 1999 Joris van der Hoeven
7
*******************************************************************************
8
* This software falls under the GNU general public license version 3 or later.
9
* It comes WITHOUT ANY WARRANTY WHATSOEVER. For details, see the file LICENSE
10
* in the root directory or <http://www.gnu.org/licenses/gpl-3.0.html>.
11
******************************************************************************/
16
#include "rectangles.hpp"
18
#include "renderer.hpp"
20
#include "language.hpp"
21
#include "hashmap.hpp"
22
#include "Graphics/frame.hpp"
23
#include "Graphics/grid.hpp"
25
#define MAX_SI 0x7fffffff
26
#define MIN_SI 0x80000000
34
/******************************************************************************
36
******************************************************************************/
38
struct cursor_rep: concrete_struct {
39
SI ox, oy; // main cursor position
40
SI delta; // infinitesimal shift to the right
41
SI y1; // under base line
42
SI y2; // upper base line
43
double slope; // slope of cursor
44
bool valid; // the cursor is valid
49
cursor (SI x=0, SI y=0, SI delta=0, SI y1=0, SI y2=0,
50
double slope=0.0, bool valid=true);
52
CONCRETE_CODE(cursor);
54
cursor copy (cursor cu);
55
bool operator == (cursor cu1, cursor cu2);
56
bool operator != (cursor cu1, cursor cu2);
57
ostream& operator << (ostream& out, cursor cu);
59
/******************************************************************************
61
******************************************************************************/
63
struct selection_rep: concrete_struct {
72
selection (rectangles rs= rectangles(),
73
path start= path(), path end= path (),
76
CONCRETE_CODE(selection);
78
bool operator == (selection sel1, selection sel2);
79
bool operator != (selection sel1, selection sel2);
80
ostream& operator << (ostream& out, selection sel);
82
/******************************************************************************
83
* The graphical selection class
84
******************************************************************************/
86
struct gr_selection_rep;
88
CONCRETE(gr_selection);
89
gr_selection (array<path> cp= array<path> (), SI dist= 0);
92
ostream& operator << (ostream& out, gr_selection sel);
94
typedef array<gr_selection> gr_selections;
95
tree as_tree (gr_selections sels);
97
/******************************************************************************
99
******************************************************************************/
103
typedef array<double> point;
107
inline box operator [] (int i);
108
box operator [] (path p);
110
bool operator == (box b2);
111
bool operator != (box b2);
112
friend inline int N (box b);
115
class box_rep: public abstract_struct {
117
SI x0, y0; // offset w.r.t. parent box
120
SI x1, y1; // under left corner (logical)
121
SI x2, y2; // upper right corner (logical)
122
SI x3, y3; // under left corner (ink)
123
SI x4, y4; // upper right corner (ink)
125
path ip; // corresponding inverse path in source tree
127
/****************************** main routines ******************************/
129
inline box_rep (path ip);
130
inline virtual ~box_rep ();
131
void relocate (path p, bool force= false);
132
virtual box transform (frame fr);
133
virtual operator tree () = 0;
134
virtual void pre_display (renderer& ren);
135
virtual void post_display (renderer& ren);
136
virtual void display (renderer ren) = 0;
137
virtual void clear_incomplete (rectangles& rs, SI pixel,
138
int i, int i1, int i2);
139
virtual int subnr ();
140
virtual box subbox (int i);
141
virtual tree action (tree t, SI x, SI y, SI delta);
142
virtual void loci (SI x, SI y, SI d, list<string>& ids, rectangles& rs);
143
virtual void position_at (SI x, SI y, rectangles& change_log);
144
virtual void collect_page_numbers (hashmap<string,tree>& h, tree page);
145
virtual path find_tag (string name);
147
virtual int reindex (int i, int item, int n);
148
void redraw (renderer ren, path p, rectangles& l);
149
void redraw (renderer ren, path p, rectangles& l, SI x, SI y);
151
/*************************** positioning routines **************************/
155
inline SI& sx (int i);
156
inline SI& sy (int i);
157
inline SI sx1 (int i);
158
inline SI sy1 (int i);
159
inline SI sx2 (int i);
160
inline SI sy2 (int i);
161
inline SI sx3 (int i);
162
inline SI sy3 (int i);
163
inline SI sx4 (int i);
164
inline SI sy4 (int i);
165
inline bool test_in (SI x, SI y);
167
inline bool accessible ();
168
inline bool decoration ();
170
SI distance (int i, SI x, SI y, SI delta);
171
bool in_rectangle (SI x1, SI y1, SI x2, SI y2);
172
bool contains_rectangle (SI x1, SI y1, SI x2, SI y2);
174
/******************* path conversions and cursor routines ******************/
176
virtual path find_lip ();
177
virtual path find_rip ();
178
virtual path find_left_box_path ();
179
virtual path find_right_box_path ();
180
virtual path find_box_path (SI x, SI y, SI delta, bool force);
181
virtual cursor find_cursor (path bp);
182
virtual selection find_selection (path lbp, path rbp);
183
virtual path find_tree_path (path bp);
184
virtual path find_box_path (path p, bool& found);
186
path find_tree_path (SI x, SI y, SI delta);
187
cursor find_check_cursor (path p);
188
selection find_check_selection (path lp, path rp);
190
/************************ fine typesetting routines ************************/
192
virtual double left_slope ();
193
virtual double right_slope ();
194
virtual SI left_correction ();
195
virtual SI right_correction ();
196
virtual SI lsub_correction ();
197
virtual SI lsup_correction ();
198
virtual SI rsub_correction ();
199
virtual SI rsup_correction ();
200
virtual SI sub_lo_base (int level);
201
virtual SI sub_hi_lim (int level);
202
virtual SI sup_lo_lim (int level);
203
virtual SI sup_lo_base (int level);
204
virtual SI sup_hi_lim (int level);
206
/*************************** for graphical boxes ***************************/
208
virtual frame get_frame ();
209
virtual grid get_grid ();
210
virtual void get_limits (point& lim1, point& lim2);
212
frame find_frame (path bp, bool last= false);
213
grid find_grid (path bp);
214
void find_limits (path bp, point& lim1, point& lim2);
216
virtual SI graphical_distance (SI x, SI y);
217
virtual gr_selections graphical_select (SI x, SI y, SI dist);
218
virtual gr_selections graphical_select (SI x1, SI y1, SI x2, SI y2);
220
/************************** retrieving information *************************/
222
virtual int get_type ();
223
virtual tree get_info (tree in);
224
virtual int get_leaf_left_pos ();
225
virtual int get_leaf_right_pos ();
226
virtual string get_leaf_string ();
227
virtual font get_leaf_font ();
228
virtual color get_leaf_color ();
229
virtual language get_leaf_language ();
230
virtual tree get_leaf_tree ();
231
virtual lazy get_leaf_lazy ();
232
virtual SI get_leaf_offset (string search);
234
/******************************** animations *******************************/
236
virtual int anim_length ();
237
virtual bool anim_started ();
238
virtual bool anim_finished ();
239
virtual void anim_start_at (time_t at);
240
virtual void anim_finish_now ();
241
virtual time_t anim_next_update ();
242
void anim_check_invalid (bool& flag, time_t& at, rectangles& rs);
243
virtual void anim_get_invalid (bool& flag, time_t& at, rectangles& rs);
245
/********************************* obsolete ********************************/
247
friend struct page_box_rep; // temporary friends for accessing x0 and y0
248
friend struct lazy_paragraph_rep;
249
friend class phrase_box_rep;
250
friend class remember_box_rep;
251
friend void make_eps (url dest, box b, int dpi= 600);
253
ABSTRACT_NULL_CODE(box);
255
extern int box_count;
256
inline box_rep::box_rep (path ip2):
257
x0(0), y0(0), x1(0), y1(0), x2(0), y2(0), x3(0), y3(0), x4(0), y4(0),
258
ip (ip2) { DEBUG(box_count++); }
259
inline box_rep::~box_rep () { DEBUG(box_count--); }
260
inline bool box_rep::test_in (SI x, SI y) {
261
return (x>=x1) && (x<x2) && (y>=y1) && (y<y2); }
262
inline SI box_rep::w () { return x2-x1; }
263
inline SI box_rep::h () { return y2-y1; }
264
inline SI& box_rep::sx (int i) { return subbox(i)->x0; }
265
inline SI& box_rep::sy (int i) { return subbox(i)->y0; }
266
inline SI box_rep::sx1 (int i) { box b= subbox(i); return b->x0+ b->x1; }
267
inline SI box_rep::sy1 (int i) { box b= subbox(i); return b->y0+ b->y1; }
268
inline SI box_rep::sx2 (int i) { box b= subbox(i); return b->x0+ b->x2; }
269
inline SI box_rep::sy2 (int i) { box b= subbox(i); return b->y0+ b->y2; }
270
inline SI box_rep::sx3 (int i) { box b= subbox(i); return b->x0+ b->x3; }
271
inline SI box_rep::sy3 (int i) { box b= subbox(i); return b->y0+ b->y3; }
272
inline SI box_rep::sx4 (int i) { box b= subbox(i); return b->x0+ b->x4; }
273
inline SI box_rep::sy4 (int i) { box b= subbox(i); return b->y0+ b->y4; }
275
inline box box::operator [] (int i) { return rep->subbox(i); }
276
inline int N (box b) { return b.rep->subnr(); }
277
ostream& operator << (ostream& out, box b);
278
SI get_delta (SI x, SI x1, SI x2);
279
bool outside (SI x, SI delta, SI x1, SI x2);
280
void make_eps (url dest, box b, int dpi);
281
path find_innermost_scroll (box b, path p);
282
path find_scrolled_tree_path (box b, path sp, SI x, SI y, SI delta);
283
void find_canvas_info (box b, path sp, SI& x, SI& y, SI& sx, SI& sy,
284
rectangle& outer, rectangle& inner);
286
extern bool refresh_needed;
287
extern time_t refresh_next;
288
void refresh_at (time_t t);
290
#define DECORATION (-1)
291
#define DECORATION_LEFT (-2)
292
#define DECORATION_MIDDLE (-3)
293
#define DECORATION_RIGHT (-4)
294
#define DETACHED (-5)
295
#define is_accessible(p) ((is_nil (p)) || ((p)->item >= 0))
296
#define is_decoration(p) ((!is_nil (p)) && ((p)->item < 0))
297
inline path descend (path ip, int i) {
298
return (is_nil (ip) || (ip->item >= 0))? path (i, ip): ip; }
299
inline path decorate () {
300
return path (DECORATION); }
301
inline path decorate (path ip) {
302
return (is_nil (ip) || (ip->item >= 0))? path (DECORATION, ip): ip; }
303
inline path decorate_left (path ip) {
304
return (is_nil (ip) || (ip->item >= 0))? path (DECORATION_LEFT, ip): ip; }
305
inline path decorate_middle (path ip) {
306
return (is_nil (ip) || (ip->item >= 0))? path (DECORATION_MIDDLE, ip): ip; }
307
inline path decorate_right (path ip) {
308
return (is_nil (ip) || (ip->item >= 0))? path (DECORATION_RIGHT, ip): ip; }
309
path descend_decode (path ip, int side);
311
inline bool box_rep::accessible () { return is_accessible (find_lip ()); }
312
inline bool box_rep::decoration () { return is_decoration (find_lip ()); }
314
tree attach_dip (tree ref, path ip);
315
#define attach_here(t,ip) attach_dip(t,ip),ip
316
#define attach_deco(t,ip) attach_dip(t,decorate(ip)),decorate(ip)
317
#define attach_left(t,ip) attach_dip(t,decorate_left(ip)),decorate_left(ip)
318
#define attach_middle(t,ip) \
319
attach_dip(t,decorate_middle(ip)),decorate_middle(ip)
320
#define attach_right(t,ip) attach_dip(t,decorate_right(ip)),decorate_right(ip)
322
/******************************************************************************
323
* The graphical selection class (continued)
324
******************************************************************************/
326
struct gr_selection_rep: concrete_struct {
333
CONCRETE_CODE(gr_selection);
335
#endif // defined BOXES_H