Demonstrator for optimization for test case in issue #2227

This commit is contained in:
Matthias Koefferlein 2025-11-21 17:52:21 +01:00
parent dacb3230d5
commit 92c08a33e0
1 changed files with 17 additions and 10 deletions

View File

@ -1437,7 +1437,7 @@ RedrawThreadWorker::draw_text_layer (bool drawing_context, db::cell_index_type c
} }
void void
RedrawThreadWorker::draw_text_layer (bool drawing_context, db::cell_index_type ci, const db::CplxTrans &trans, const db::Box &vp, int level, CanvasPlane *fill, CanvasPlane *frame, CanvasPlane *vertex, CanvasPlane *text, lay::Bitmap *opt_bitmap) RedrawThreadWorker::draw_text_layer (bool drawing_context, db::cell_index_type ci, const db::CplxTrans &trans, const db::Box &vp_in, int level, CanvasPlane *fill, CanvasPlane *frame, CanvasPlane *vertex, CanvasPlane *text, lay::Bitmap *opt_bitmap)
{ {
test_snapshot (0); test_snapshot (0);
@ -1446,6 +1446,7 @@ RedrawThreadWorker::draw_text_layer (bool drawing_context, db::cell_index_type c
// For small bboxes, the cell outline can be reduced .. // For small bboxes, the cell outline can be reduced ..
db::Box bbox = cell.bbox (m_layer); db::Box bbox = cell.bbox (m_layer);
db::Box vp = vp_in & bbox;
if (m_drop_small_cells && drop_cell (cell, trans)) { if (m_drop_small_cells && drop_cell (cell, trans)) {
@ -1756,9 +1757,12 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
if (level >= from_level && level < to_level) { if (level >= from_level && level < to_level) {
// draw the shapes or insert into the cell cache. // draw the shapes or insert into the cell cache.
for (std::vector<db::Box>::const_iterator v = vv.begin (); v != vv.end (); ++v) { for (std::vector<db::Box>::const_iterator iv = vv.begin (); iv != vv.end (); ++iv) {
if (v->empty ()) { db::Box vp = *iv;
vp &= bbox;
if (vp.empty ()) {
continue; continue;
} }
@ -1768,7 +1772,7 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
size_t current_quad_id = 0; size_t current_quad_id = 0;
size_t current_array_quad_id = 0; size_t current_array_quad_id = 0;
db::ShapeIterator shape (shapes.begin_touching (*v, db::ShapeIterator::Boxes | db::ShapeIterator::Polygons | db::ShapeIterator::Edges | db::ShapeIterator::Paths | db::ShapeIterator::Points, mp_prop_sel, m_inv_prop_sel)); db::ShapeIterator shape (shapes.begin_touching (vp, db::ShapeIterator::Boxes | db::ShapeIterator::Polygons | db::ShapeIterator::Edges | db::ShapeIterator::Paths | db::ShapeIterator::Points, mp_prop_sel, m_inv_prop_sel));
while (! shape.at_end ()) { while (! shape.at_end ()) {
test_snapshot (update_snapshot); test_snapshot (update_snapshot);
@ -1855,9 +1859,12 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
db::box_convert <db::CellInst> bc (*mp_layout, m_layer); db::box_convert <db::CellInst> bc (*mp_layout, m_layer);
// dive down into the hierarchy .. // dive down into the hierarchy ..
for (std::vector<db::Box>::const_iterator v = vv.begin (); v != vv.end (); ++v) { for (std::vector<db::Box>::const_iterator iv = vv.begin (); iv != vv.end (); ++iv) {
if (v->empty ()) { db::Box vp = *iv;
vp &= bbox;
if (vp.empty ()) {
continue; continue;
} }
@ -1865,7 +1872,7 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
db::cell_index_type last_ci = std::numeric_limits<db::cell_index_type>::max (); db::cell_index_type last_ci = std::numeric_limits<db::cell_index_type>::max ();
bool anything = false; bool anything = false;
db::Cell::touching_iterator inst = cell.begin_touching (*v); db::Cell::touching_iterator inst = cell.begin_touching (vp);
while (! inst.at_end ()) { while (! inst.at_end ()) {
test_snapshot (update_snapshot); test_snapshot (update_snapshot);
@ -1900,7 +1907,7 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
if (last_ci != new_ci) { if (last_ci != new_ci) {
// Hint: don't use any_text_shapes on partially visible cells because that will degrade performance // Hint: don't use any_text_shapes on partially visible cells because that will degrade performance
if (new_cell_box.inside (*v)) { if (new_cell_box.inside (vp)) {
last_ci = new_ci; last_ci = new_ci;
anything = any_shapes (new_ci, to_level - (level + 1)); anything = any_shapes (new_ci, to_level - (level + 1));
} else { } else {
@ -1942,13 +1949,13 @@ RedrawThreadWorker::draw_layer_wo_cache (int from_level, int to_level, db::cell_
size_t qid = 0; size_t qid = 0;
for (db::CellInstArray::iterator p = cell_inst.begin_touching (*v, bc); ! p.at_end (); ) { for (db::CellInstArray::iterator p = cell_inst.begin_touching (vp, bc); ! p.at_end (); ) {
if (! m_draw_array_border_instances || if (! m_draw_array_border_instances ||
p.index_a () <= 0 || (unsigned long)p.index_a () == amax - 1 || p.index_b () <= 0 || (unsigned long)p.index_b () == bmax - 1) { p.index_a () <= 0 || (unsigned long)p.index_a () == amax - 1 || p.index_b () <= 0 || (unsigned long)p.index_b () == bmax - 1) {
db::ICplxTrans t (cell_inst.complex_trans (*p)); db::ICplxTrans t (cell_inst.complex_trans (*p));
db::Box new_vp = safe_transformed_box (*v, t.inverted ()); db::Box new_vp = safe_transformed_box (vp, t.inverted ());
draw_layer (from_level, to_level, new_ci, trans * t, new_vp, level + 1, fill, frame, vertex, text, update_snapshot); draw_layer (from_level, to_level, new_ci, trans * t, new_vp, level + 1, fill, frame, vertex, text, update_snapshot);
if (p.quad_id () > 0 && p.quad_id () != qid) { if (p.quad_id () > 0 && p.quad_id () != qid) {