diff --git a/src/Kernel/Types/rectangles.cpp b/src/Kernel/Types/rectangles.cpp index 0b2c554963..d2735f019a 100644 --- a/src/Kernel/Types/rectangles.cpp +++ b/src/Kernel/Types/rectangles.cpp @@ -271,6 +271,20 @@ least_upper_bound (rectangles l) { return r1; } +rectangle +least_upper_bound (array l) { + ASSERT (N (l) != 0, "no rectangles in list"); + rectangle r1= l[0]; + for (int i=1; ix1= min (r1->x1, r2->x1); + r1->y1= min (r1->y1, r2->y1); + r1->x2= max (r1->x2, r2->x2); + r1->y2= max (r1->y2, r2->y2); + } + return r1; +} + double area (rectangles r) { double sum= 0.0; diff --git a/src/Kernel/Types/rectangles.hpp b/src/Kernel/Types/rectangles.hpp index 5380bc0253..140dbd53e8 100644 --- a/src/Kernel/Types/rectangles.hpp +++ b/src/Kernel/Types/rectangles.hpp @@ -60,6 +60,7 @@ rectangles outlines (rectangles l, SI pixel); rectangles correct (rectangles l); rectangles simplify (rectangles l); rectangle least_upper_bound (rectangles l); +rectangle least_upper_bound (array l); double area (rectangles r); #endif // defined RECTANGLES_H diff --git a/src/Typeset/Boxes/Basic/boxes.cpp b/src/Typeset/Boxes/Basic/boxes.cpp index dcd28ffccd..e4edbe8dea 100644 --- a/src/Typeset/Boxes/Basic/boxes.cpp +++ b/src/Typeset/Boxes/Basic/boxes.cpp @@ -850,7 +850,7 @@ box_rep::display_links (renderer ren) { } void -box_rep::position_at (SI x, SI y, rectangles& change_log) { +box_rep::position_at (SI x, SI y, array& change_log) { int i, n= subnr (); x += x0; y += y0; for (i=0; iposition_at (x, y, change_log); diff --git a/src/Typeset/Boxes/Composite/concat_boxes.cpp b/src/Typeset/Boxes/Composite/concat_boxes.cpp index daa93bb6ad..110b2dfa48 100644 --- a/src/Typeset/Boxes/Composite/concat_boxes.cpp +++ b/src/Typeset/Boxes/Composite/concat_boxes.cpp @@ -620,11 +620,11 @@ concat_box_rep::graphical_select (SI x1, SI y1, SI x2, SI y2) { class phrase_box_rep: public concat_box_rep { public: - rectangles* logs_ptr; + array* logs_ptr; SI ox, oy; phrase_box_rep (path ip, array bs, array spc); ~phrase_box_rep (); - void position_at (SI x, SI y, rectangles& change_log_ptr); + void position_at (SI x, SI y, array& change_log_ptr); void display (renderer ren); }; @@ -633,20 +633,23 @@ phrase_box_rep::phrase_box_rep (path ip, array bs, array spc): phrase_box_rep::~phrase_box_rep () { if (logs_ptr != NULL) { - rectangles& logs= *logs_ptr; - logs= rectangles (rectangle (ox+x3, oy+y3, ox+x4, oy+y4), logs); - logs= rectangles (rectangle (0, 0, 0, 0), logs); + array& logs= *logs_ptr; + logs= array(rectangle (0, 0, 0, 0), rectangle (ox+x3, oy+y3, ox+x4, oy+y4)); // cout << " 8=X " << rectangle (ox+x3, oy+y3, ox+x4, oy+y4) << "\n"; } } void -phrase_box_rep::position_at (SI x, SI y, rectangles& logs) { +phrase_box_rep::position_at (SI x, SI y, array& logs) { x += x0; y += y0; - if (logs_ptr == NULL) logs= rectangles (rectangle (0, 0, 0, 0), logs); - else logs= rectangles (rectangle (ox+x3, oy+y3, ox+x4, oy+y4), logs); + if (logs_ptr == NULL) { + logs << rectangle (0, 0, 0, 0); + } + else { + logs << rectangle (ox+x3, oy+y3, ox+x4, oy+y4); + } ox= x; oy= y; - logs= rectangles (rectangle (ox+x3, oy+y3, ox+x4, oy+y4), logs); + logs << rectangle (ox+x3, oy+y3, ox+x4, oy+y4); logs_ptr= &logs; } diff --git a/src/Typeset/Bridge/impl_typesetter.hpp b/src/Typeset/Bridge/impl_typesetter.hpp index ac864a49db..c9b6be35d7 100644 --- a/src/Typeset/Bridge/impl_typesetter.hpp +++ b/src/Typeset/Bridge/impl_typesetter.hpp @@ -17,7 +17,7 @@ class typesetter_rep { public: edit_env& env; bridge br; - rectangles change_log; + array change_log; array old_bgs; array l; // current lines diff --git a/src/Typeset/Bridge/typesetter.cpp b/src/Typeset/Bridge/typesetter.cpp index 1122e85b63..27919868bd 100644 --- a/src/Typeset/Bridge/typesetter.cpp +++ b/src/Typeset/Bridge/typesetter.cpp @@ -105,16 +105,15 @@ typesetter_rep::local_end (array& prev_l, stack_border& prev_sb) { * Main typesetting routines ******************************************************************************/ -static rectangles -requires_update (rectangles log) { - rectangles rs; - while (!is_nil (log)) { - rectangle r1= log->item; - rectangle r2= log->next->item; - if (r1 == rectangle (0, 0, 0, 0)) rs= rectangles (r2, rs); - else if (r2 == rectangle (0, 0, 0, 0)) rs= rectangles (r1, rs); - else if (r1 != r2) rs= rectangles (r1, rectangles (r2, rs)); - log= log->next->next; +static array +requires_update (array log) { + array rs; + for (int i=0; 2*i+1position_at (0, 0, change_log); change_log= requires_update (change_log); rectangle r (0, 0, 0, 0); - if (!is_nil (change_log)) r= least_upper_bound (change_log); + if (N(change_log) != 0) r= least_upper_bound (change_log); array new_bgs; array rs; b->collect_page_colors (new_bgs, rs); @@ -190,7 +189,7 @@ typesetter_rep::typeset (SI& x1b, SI& y1b, SI& x2b, SI& y2b) { r= least_upper_bound (r, rs[i]); old_bgs= new_bgs; x1b= r->x1; y1b= r->y1; x2b= r->x2; y2b= r->y2; - change_log= rectangles (); + change_log= array (); return b; } diff --git a/src/Typeset/boxes.hpp b/src/Typeset/boxes.hpp index 92ef02eeeb..d01da14aa4 100644 --- a/src/Typeset/boxes.hpp +++ b/src/Typeset/boxes.hpp @@ -146,7 +146,7 @@ class box_rep: public abstract_struct { virtual tree message (tree t, SI x, SI y, rectangles& rs); virtual void loci (SI x, SI y, SI d, list& ids, rectangles& rs); virtual void display_links (renderer ren); - virtual void position_at (SI x, SI y, rectangles& change_log); + virtual void position_at (SI x, SI y, array& change_log); virtual void collect_page_numbers (hashmap& h, tree page); virtual void collect_page_colors (array& bs, array& rs); virtual path find_tag (string name);