From a802cd0e911c9aeba00907eb31171692098162d2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 3 Aug 2024 18:41:55 +0200 Subject: [PATCH] Proper scaling with resolution - stipple display in layer list now follows view resolution - using DCoord for text default size for cases where default size < DBU --- src/laybasic/laybasic/layBitmapRenderer.cc | 8 +++--- src/laybasic/laybasic/layLayoutCanvas.h | 8 ++++++ src/laybasic/laybasic/layLayoutViewBase.cc | 25 ++++++++++++------- src/laybasic/laybasic/layLayoutViewBase.h | 5 ++++ src/laybasic/laybasic/layMarker.cc | 6 ++--- .../laybasic/layRedrawThreadWorker.cc | 2 +- src/laybasic/laybasic/layRenderer.cc | 8 +++--- src/laybasic/laybasic/layRenderer.h | 16 ++++++------ src/layui/layui/layLayerControlPanel.cc | 7 ++++++ src/layui/layui/layLayerControlPanel.h | 1 + 10 files changed, 57 insertions(+), 29 deletions(-) diff --git a/src/laybasic/laybasic/layBitmapRenderer.cc b/src/laybasic/laybasic/layBitmapRenderer.cc index a3037ed95..ef7b3517d 100644 --- a/src/laybasic/laybasic/layBitmapRenderer.cc +++ b/src/laybasic/laybasic/layBitmapRenderer.cc @@ -386,12 +386,12 @@ BitmapRenderer::draw (const db::Shape &shape, const db::CplxTrans &trans, if (m_draw_texts && text) { db::DFTrans fp (db::DFTrans::r0); - db::DCoord h = trans.ctrans (m_default_text_size); + db::DCoord h = trans.mag () * m_default_text_size; db::Font font = shape.text_font () == db::NoFont ? m_font : shape.text_font (); if (m_apply_text_trans && font != db::NoFont && font != db::DefaultFont) { fp = db::DFTrans (trans.fp_trans () * shape.text_trans ()); - h = trans.ctrans (shape.text_size () > 0 ? shape.text_size () : m_default_text_size); + h = trans.mag () * (shape.text_size () > 0 ? shape.text_size () : m_default_text_size); } db::HAlign halign = shape.text_halign (); @@ -1087,12 +1087,12 @@ BitmapRenderer::draw (const db::Text &txt, const db::CplxTrans &trans, if (m_draw_texts && text) { db::DFTrans fp (db::DFTrans::r0); - db::DCoord h = trans.ctrans (m_default_text_size); + db::DCoord h = trans.mag () * m_default_text_size; db::Font font = txt.font () == db::NoFont ? m_font : txt.font (); if (m_apply_text_trans && font != db::NoFont && font != db::DefaultFont) { fp = db::DFTrans (trans.fp_trans () * txt.trans ()); - h = trans.ctrans (txt.size () > 0 ? txt.size () : m_default_text_size); + h = trans.mag () * (txt.size () > 0 ? txt.size () : m_default_text_size); } double fy = 0.0; diff --git a/src/laybasic/laybasic/layLayoutCanvas.h b/src/laybasic/laybasic/layLayoutCanvas.h index a841bb5ee..2bc68edf7 100644 --- a/src/laybasic/laybasic/layLayoutCanvas.h +++ b/src/laybasic/laybasic/layLayoutCanvas.h @@ -338,6 +338,14 @@ public: */ double resolution () const; + /** + * @brief Gets the gamma value + */ + double gamma () const + { + return m_gamma; + } + /** * @brief Reimplementation of ViewObjectCanvas: Background color */ diff --git a/src/laybasic/laybasic/layLayoutViewBase.cc b/src/laybasic/laybasic/layLayoutViewBase.cc index af25ce5cb..bfef34ba5 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.cc +++ b/src/laybasic/laybasic/layLayoutViewBase.cc @@ -780,21 +780,30 @@ LayoutViewBase::configure (const std::string &name, const std::string &value) int os = 1; tl::from_string (value, os); - mp_canvas->set_oversampling (os); + if (os != mp_canvas->oversampling ()) { + mp_canvas->set_oversampling (os); + resolution_changed_event (); + } return true; } else if (name == cfg_highres_mode) { bool hrm = false; tl::from_string (value, hrm); - mp_canvas->set_highres_mode (hrm); + if (hrm != mp_canvas->highres_mode ()) { + mp_canvas->set_highres_mode (hrm); + resolution_changed_event (); + } return true; } else if (name == cfg_subres_mode) { bool srm = false; tl::from_string (value, srm); - mp_canvas->set_subres_mode (srm); + if (srm != mp_canvas->subres_mode ()) { + mp_canvas->set_subres_mode (srm); + resolution_changed_event (); + } return true; } else if (name == cfg_image_cache_size) { @@ -1565,14 +1574,12 @@ tl::PixelBuffer LayoutViewBase::icon_for_layer (const LayerPropertiesConstIterator &iter, unsigned int w, unsigned int h, double dpr, unsigned int di_off, bool no_state) { if (dpr < 0.0) { - dpr = canvas ()->dpr (); + dpr = canvas () ? canvas ()->dpr () : 1.0; } - int oversampling = canvas () ? canvas ()->oversampling () : 1; - double gamma = 2.0; - - bool hrm = canvas () ? canvas ()->highres_mode () : false; - double dpr_drawing = oversampling * (hrm ? 1.0 : dpr); + double gamma = canvas () ? canvas ()->gamma () : 2.0; + double dpr_drawing = canvas () ? 1.0 / canvas ()->resolution () : 1.0; + unsigned int oversampling = canvas () ? canvas ()->oversampling () : 1; h = std::max ((unsigned int) 16, h) * oversampling * dpr + 0.5; w = std::max ((unsigned int) 16, w) * oversampling * dpr + 0.5; diff --git a/src/laybasic/laybasic/layLayoutViewBase.h b/src/laybasic/laybasic/layLayoutViewBase.h index c6181b6b9..e18dee2bc 100644 --- a/src/laybasic/laybasic/layLayoutViewBase.h +++ b/src/laybasic/laybasic/layLayoutViewBase.h @@ -789,6 +789,11 @@ public: */ tl::Event cell_visibility_changed_event; + /** + * @brief An event signalling that the resolution has changed + */ + tl::Event resolution_changed_event; + /** * @brief Save the given cellview into the given file (with options) * If "update" is true, the cell view's properties will be updated (options, filename etc.). diff --git a/src/laybasic/laybasic/layMarker.cc b/src/laybasic/laybasic/layMarker.cc index 017b22f74..2f08d2289 100644 --- a/src/laybasic/laybasic/layMarker.cc +++ b/src/laybasic/laybasic/layMarker.cc @@ -637,7 +637,7 @@ ShapeMarker::render (const Viewport &vp, ViewObjectCanvas &canvas) r.set_font (db::Font (view ()->text_font ())); r.apply_text_trans (view ()->apply_text_trans ()); - r.default_text_size (db::Coord (view ()->default_text_size () / ly->dbu ())); + r.default_text_size (view ()->default_text_size () / ly->dbu ()); r.set_precise (true); if (trans_vector ()) { @@ -1168,7 +1168,7 @@ Marker::render (const Viewport &vp, ViewObjectCanvas &canvas) r.set_font (db::Font (view ()->text_font ())); r.apply_text_trans (view ()->apply_text_trans ()); - r.default_text_size (db::Coord (view ()->default_text_size () / dbu ())); + r.default_text_size (view ()->default_text_size () / dbu ()); r.set_precise (true); if (! trans_vector ()) { @@ -1316,7 +1316,7 @@ DMarker::render (const Viewport &vp, ViewObjectCanvas &canvas) r.set_font (db::Font (view ()->text_font ())); r.apply_text_trans (view ()->apply_text_trans ()); - r.default_text_size (view ()->default_text_size ()); + r.default_text_size_dbl (view ()->default_text_size ()); r.set_precise (true); db::DCplxTrans t = vp.trans (); diff --git a/src/laybasic/laybasic/layRedrawThreadWorker.cc b/src/laybasic/laybasic/layRedrawThreadWorker.cc index b6046cd72..8232d3520 100644 --- a/src/laybasic/laybasic/layRedrawThreadWorker.cc +++ b/src/laybasic/laybasic/layRedrawThreadWorker.cc @@ -204,7 +204,7 @@ RedrawThreadWorker::perform_task (tl::Task *task) mp_renderer->draw_texts (m_text_visible); mp_renderer->draw_properties (m_show_properties); mp_renderer->draw_description_property (false); - mp_renderer->default_text_size (db::Coord (m_default_text_size / mp_layout->dbu ())); + mp_renderer->default_text_size (m_default_text_size / mp_layout->dbu ()); mp_renderer->set_font (db::Font (m_text_font)); mp_renderer->apply_text_trans (m_apply_text_trans); diff --git a/src/laybasic/laybasic/layRenderer.cc b/src/laybasic/laybasic/layRenderer.cc index 6af40f40a..247f89403 100644 --- a/src/laybasic/laybasic/layRenderer.cc +++ b/src/laybasic/laybasic/layRenderer.cc @@ -40,8 +40,8 @@ Renderer::Renderer (unsigned int width, unsigned int height, double resolution) : m_draw_texts (true), m_draw_properties (false), m_draw_description_property (false), - m_default_text_size (16), - m_default_text_size_dbl (16), + m_default_text_size (1000), + m_default_text_size_dbl (1.0), m_apply_text_trans (true), m_precise (false), m_xfill (false), @@ -94,7 +94,7 @@ Renderer::draw_propstring (db::properties_id_type id, lay::CanvasPlane *text, const db::CplxTrans &trans) { db::DPoint tp1 (pref + db::DVector (2.0, -2.0)); - db::DPoint tp2 (pref + db::DVector (2.0, -2.0 - trans.ctrans (m_default_text_size))); + db::DPoint tp2 (pref + db::DVector (2.0, -2.0 - trans.mag () * m_default_text_size)); std::string ptext; @@ -119,7 +119,7 @@ Renderer::draw_description_propstring (db::properties_id_type id, lay::CanvasPlane *text, const db::CplxTrans &trans) { db::DPoint tp1 (pref + db::DVector (5.0, -5.0)); - db::DPoint tp2 (pref + db::DVector (5.0, -5.0 - trans.ctrans (m_default_text_size))); + db::DPoint tp2 (pref + db::DVector (5.0, -5.0 - trans.mag () * m_default_text_size)); const db::PropertiesRepository::properties_set &props = prep->properties (id); // TODO: get rid of this const_cast hack (i.e. by a mutable definition inside the properties repository) diff --git a/src/laybasic/laybasic/layRenderer.h b/src/laybasic/laybasic/layRenderer.h index e3078fd02..a1ddaf5fc 100644 --- a/src/laybasic/laybasic/layRenderer.h +++ b/src/laybasic/laybasic/layRenderer.h @@ -116,31 +116,31 @@ public: } /** - * @brief The default text size to use for draw(db::Text..) + * @brief The default text size to use for draw(db::Text..) - i.e in DBU units */ - void default_text_size (db::Coord sz) + void default_text_size (db::DCoord sz) { m_default_text_size = sz; } /** - * @brief Get the default text size + * @brief Get the default text size to use for draw(db::Text..) - i.e in DBU units */ - db::Coord default_text_size () const + db::DCoord default_text_size () const { return m_default_text_size; } /** - * @brief The default text size to use for draw(db::DText..) + * @brief The default text size to use for draw(db::DText..) - i.e. in micron units */ - void default_text_size (double sz) + void default_text_size_dbl (double sz) { m_default_text_size_dbl = sz; } /** - * @brief Get the default text size for draw (DText ...) + * @brief Get the default text size for draw (DText ...) - i.e. in micron units */ double default_text_size_dbl () const { @@ -404,7 +404,7 @@ protected: bool m_draw_texts; bool m_draw_properties; bool m_draw_description_property; - db::Coord m_default_text_size; + db::DCoord m_default_text_size; double m_default_text_size_dbl; bool m_apply_text_trans; bool m_precise; diff --git a/src/layui/layui/layLayerControlPanel.cc b/src/layui/layui/layLayerControlPanel.cc index 5b501993f..86155f090 100644 --- a/src/layui/layui/layLayerControlPanel.cc +++ b/src/layui/layui/layLayerControlPanel.cc @@ -338,6 +338,7 @@ LayerControlPanel::LayerControlPanel (lay::LayoutViewBase *view, db::Manager *ma mp_view->cellview_changed_event.add (this, &LayerControlPanel::signal_cv_changed_with_int); mp_view->viewport_changed_event.add (this, &LayerControlPanel::signal_vp_changed); mp_view->hier_levels_changed_event.add (this, &LayerControlPanel::signal_vp_changed); + mp_view->resolution_changed_event.add (this, &LayerControlPanel::signal_resolution_changed); QFrame *tb = new QFrame (this); l->addWidget (tb); @@ -2051,6 +2052,12 @@ LayerControlPanel::redo (db::Op *op) } } +void +LayerControlPanel::signal_resolution_changed () +{ + m_do_update_content_dm (); +} + void LayerControlPanel::signal_vp_changed () { diff --git a/src/layui/layui/layLayerControlPanel.h b/src/layui/layui/layLayerControlPanel.h index acd6617d9..0a77f19bd 100644 --- a/src/layui/layui/layLayerControlPanel.h +++ b/src/layui/layui/layLayerControlPanel.h @@ -385,6 +385,7 @@ private: void signal_cv_changed (); void signal_cv_changed_with_int (int index); void signal_vp_changed (); + void signal_resolution_changed (); void do_update_content (); void do_update_visibility ();