diff --git a/src/laybasic/laybasic/gsiDeclLayLayoutView.cc b/src/laybasic/laybasic/gsiDeclLayLayoutView.cc index 862744309..10b39367d 100644 --- a/src/laybasic/laybasic/gsiDeclLayLayoutView.cc +++ b/src/laybasic/laybasic/gsiDeclLayLayoutView.cc @@ -1136,6 +1136,11 @@ Class decl_LayoutView (QT_EXTERNAL_BASE (QWidget) "lay", "Layou "Show the layout in full depth down to the deepest level of hierarchy. " "This method may cause a redraw." ) + + gsi::method ("resize", static_cast (&lay::LayoutView::resize), + "@brief Resizes the layout view to the given dimension\n" + "\n" + "This method has been made available in all builds in 0.28.\n" + ) + #if defined(HAVE_QT) && defined(HAVE_QTBINDINGS) gsi::method ("get_screenshot", static_cast (&lay::LayoutView::get_screenshot), "@brief Gets a screenshot as a \\QImage\n" diff --git a/src/laybasic/laybasic/layLayoutCanvas.cc b/src/laybasic/laybasic/layLayoutCanvas.cc index 8d830b78a..7f533ff30 100644 --- a/src/laybasic/laybasic/layLayoutCanvas.cc +++ b/src/laybasic/laybasic/layLayoutCanvas.cc @@ -1007,38 +1007,47 @@ LayoutCanvas::screenshot () } #if defined(HAVE_QT) - void LayoutCanvas::resizeEvent (QResizeEvent *) { - // clear the image cache - m_image_cache.clear (); - - // set the viewport to the new size - m_viewport.set_size (width () * m_dpr, height () * m_dpr); - m_viewport_l.set_size (width () * m_oversampling * m_dpr, height () * m_oversampling * m_dpr); - mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ()); - do_redraw_all (true); - viewport_changed_event (); + do_resize (width (), height ()); } - -#else +#endif void LayoutCanvas::resize (unsigned int width, unsigned int height) { - // clear the image cache - m_image_cache.clear (); + // don't wait until the layout system informs us - which may never take place when + // the widget isn't shown. + do_resize (width, height); - // set the viewport to the new size - m_viewport.set_size (width * m_dpr, height * m_dpr); - m_viewport_l.set_size (width * m_oversampling * m_dpr, height * m_oversampling * m_dpr); - mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ()); - do_redraw_all (true); - viewport_changed_event (); +#if defined(HAVE_QT) + QWidget::resize (width, height); +#endif } -#endif +void +LayoutCanvas::do_resize (unsigned int width, unsigned int height) +{ + unsigned int w = width * m_dpr, h = height * m_dpr; + unsigned int wl = width * m_oversampling * m_dpr, hl = height * m_oversampling * m_dpr; + + if (m_viewport.width () != w || m_viewport.height () != h || + m_viewport_l.width () != wl || m_viewport_l.height () != hl) { + + // clear the image cache + m_image_cache.clear (); + + // set the viewport to the new size + m_viewport.set_size (width * m_dpr, height * m_dpr); + m_viewport_l.set_size (width * m_oversampling * m_dpr, height * m_oversampling * m_dpr); + + mouse_event_trans (db::DCplxTrans (1.0 / double (m_dpr)) * m_viewport.trans ()); + do_redraw_all (true); + viewport_changed_event (); + + } +} void LayoutCanvas::update_viewport () diff --git a/src/laybasic/laybasic/layLayoutCanvas.h b/src/laybasic/laybasic/layLayoutCanvas.h index 8af843e87..574abf17d 100644 --- a/src/laybasic/laybasic/layLayoutCanvas.h +++ b/src/laybasic/laybasic/layLayoutCanvas.h @@ -341,6 +341,11 @@ public: return m_viewport; } + /** + * @brief Resizes the canvas object in the Qt-less case + */ + void resize (unsigned int width, unsigned int height); + /** * @brief An event indicating that the viewport was changed. * If the viewport (the rectangle that is shown) changes, this event is fired. @@ -361,7 +366,7 @@ private: lay::LayoutViewBase *mp_view; lay::PixelBuffer *mp_image; lay::PixelBuffer *mp_image_bg; -#if defined(HAVE_QT) // @@@ +#if defined(HAVE_QT) QPixmap *mp_pixmap; #endif db::DBox m_precious_box; @@ -396,8 +401,6 @@ private: virtual void paintEvent (QPaintEvent *); virtual void resizeEvent (QResizeEvent *); virtual bool event (QEvent *e); -#else - void resize (unsigned int width, unsigned int height); #endif virtual void key_event (unsigned int key, unsigned int buttons); @@ -411,6 +414,7 @@ private: void do_update_image (); void do_end_of_drawing (); void do_redraw_all (bool force_redraw = true); + void do_resize (unsigned int width, unsigned int height); void prepare_drawing (); }; diff --git a/src/laybasic/laybasic/layLayoutView.h b/src/laybasic/laybasic/layLayoutView.h index 20a399634..3766b4e1c 100644 --- a/src/laybasic/laybasic/layLayoutView.h +++ b/src/laybasic/laybasic/layLayoutView.h @@ -413,6 +413,14 @@ public: return mp_editor_options_frame; } + /** + * @brief Resizes the view to the given width and height in pixels + */ + void resize (unsigned int width, unsigned int height) + { + LayoutViewBase::resize (width, height); + } + /** * @brief Copies to clipboard * diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index 8901d20bd..c5b448825 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -485,6 +485,11 @@ LayoutViewBase::~LayoutViewBase () mp_canvas = 0; } +void LayoutViewBase::resize (unsigned int width, unsigned int height) +{ + mp_canvas->resize (width, height); +} + void LayoutViewBase::update_event_handlers () { tl::Object::detach_from_all_events (); diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index d2a91e26f..91022595e 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -1637,6 +1637,11 @@ public: return mp_canvas->viewport (); } + /** + * @brief Resizes the view to the given width and height in pixels + */ + void resize (unsigned int width, unsigned int height); + /** * @brief Background color property */ diff --git a/src/laybasic/unit_tests/layLayoutViewTests.cc b/src/laybasic/unit_tests/layLayoutViewTests.cc index 3e0936add..5d9018461 100644 --- a/src/laybasic/unit_tests/layLayoutViewTests.cc +++ b/src/laybasic/unit_tests/layLayoutViewTests.cc @@ -24,6 +24,7 @@ #include "tlUnitTest.h" #include "tlTimer.h" +#include "tlSleep.h" #if defined(HAVE_QT) @@ -150,6 +151,28 @@ TEST(3) } #endif +TEST(4) +{ + lay::LayoutView lv (0, false, 0); + lv.set_drawing_workers (2); + lv.cell_box_color (lay::Color (0, 0, 0)); + + lv.load_layout (tl::testsrc () + "/testdata/gds/t10.gds", true); + + lv.resize (42, 117); + tl::msleep (250); + + lay::PixelBuffer img = lv.get_screenshot_pb (); + EXPECT_EQ (img.width (), 42); + EXPECT_EQ (img.height (), 117); + + lv.resize (142, 217); + + img = lv.get_screenshot_pb (); + EXPECT_EQ (img.width (), 142); + EXPECT_EQ (img.height (), 217); +} + #if defined(HAVE_PNG) TEST(11) { diff --git a/testdata/ruby/layLayoutView.rb b/testdata/ruby/layLayoutView.rb index e3d44b36f..28c59f72a 100644 --- a/testdata/ruby/layLayoutView.rb +++ b/testdata/ruby/layLayoutView.rb @@ -454,6 +454,23 @@ class LAYLayoutView_TestClass < TestBase end + def test_5 + + lv = RBA::LayoutView::new + lv.load_layout(File.join($ut_testsrc, "testdata/gds/t10.gds"), true) + + lv.resize(42, 117) + img = lv.get_screenshot_pixels + assert_equal(img.width, 42) + assert_equal(img.height, 117) + + lv.resize(142, 217) + img = lv.get_screenshot_pixels + assert_equal(img.width, 142) + assert_equal(img.height, 217) + + end + end load("test_epilogue.rb")