From 76a1450f326f16e7231a06273911d737b7e085b8 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 1 Aug 2023 22:48:28 +0200 Subject: [PATCH] Fixed issue #1441 (RDB support for text attributes like size, font, halign/valign) --- src/db/db/dbText.cc | 113 +++++++++++++++++++++++++++++++ src/db/db/dbText.h | 5 +- src/db/unit_tests/dbTextTests.cc | 64 +++++++++++++++++ 3 files changed, 178 insertions(+), 4 deletions(-) diff --git a/src/db/db/dbText.cc b/src/db/db/dbText.cc index 5f093c77e..cde5c7f34 100644 --- a/src/db/db/dbText.cc +++ b/src/db/db/dbText.cc @@ -26,6 +26,61 @@ namespace db { +static char halign2code (db::HAlign ha) +{ + if (ha == db::HAlignCenter) { + return 'c'; + } else if (ha == db::HAlignLeft) { + return 'l'; + } else if (ha == db::HAlignRight) { + return 'r'; + } else { + return 0; + } +} + +static db::HAlign extract_halign (tl::Extractor &ex) +{ + if (ex.test ("c")) { + return db::HAlignCenter; + } else if (ex.test ("l")) { + return db::HAlignLeft; + } else if (ex.test ("r")) { + return db::HAlignRight; + } else { + return db::NoHAlign; + } +} + +static char valign2code (db::VAlign va) +{ + if (va == db::VAlignCenter) { + return 'c'; + } else if (va == db::VAlignBottom) { + return 'b'; + } else if (va == db::VAlignTop) { + return 't'; + } else { + return 0; + } +} + +static db::VAlign extract_valign (tl::Extractor &ex) +{ + if (ex.test ("c")) { + return db::VAlignCenter; + } else if (ex.test ("t")) { + return db::VAlignTop; + } else if (ex.test ("b")) { + return db::VAlignBottom; + } else { + return db::NoVAlign; + } +} + +// ---------------------------------------------------------------------------- +// StringRef implementation + StringRef::~StringRef () { if (mp_rep) { @@ -33,6 +88,42 @@ StringRef::~StringRef () } } +// ---------------------------------------------------------------------------- +// text implementation + +template +std::string text::to_string (double dbu) const +{ + std::string s = std::string ("(") + tl::to_quoted_string (string ()) + "," + m_trans.to_string (dbu) + ")"; + + if (size () > 0) { + s += " s="; + s += tl::to_string (size ()); + } + + if (font () >= 0) { + s += " f="; + s += tl::to_string (int (font ())); + } + + char c; + c = halign2code (halign ()); + if (c) { + s += " ha="; + s += c; + } + c = valign2code (valign ()); + if (c) { + s += " va="; + s += c; + } + + return s; +} + +template class text; +template class text; + } namespace tl @@ -69,6 +160,28 @@ template bool _test_extractor_impl (tl::Extractor &ex, db::text &t) ex.expect (")"); + if (ex.test ("s=")) { + C size = 0; + ex.read (size); + t.size (size); + } + + if (ex.test ("f=")) { + int font = -1; + ex.read (font); + t.font (db::Font (font)); + } + + if (ex.test ("ha=")) { + db::HAlign ha = db::extract_halign (ex); + t.halign (ha); + } + + if (ex.test ("va=")) { + db::VAlign va = db::extract_valign (ex); + t.valign (va); + } + return true; } else { diff --git a/src/db/db/dbText.h b/src/db/db/dbText.h index baca06bba..5e678562c 100644 --- a/src/db/db/dbText.h +++ b/src/db/db/dbText.h @@ -757,10 +757,7 @@ public: /** * @brief String conversion */ - std::string to_string (double dbu = 0.0) const - { - return std::string ("(") + tl::to_quoted_string (string ()) + "," + m_trans.to_string (dbu) + ")"; - } + std::string to_string (double dbu = 0.0) const; /** * @brief Reduce the text diff --git a/src/db/unit_tests/dbTextTests.cc b/src/db/unit_tests/dbTextTests.cc index fc6afdd0f..e8fdc762d 100644 --- a/src/db/unit_tests/dbTextTests.cc +++ b/src/db/unit_tests/dbTextTests.cc @@ -133,4 +133,68 @@ TEST(3) EXPECT_EQ (std::string (s2b.text_string ()), "U"); } +std::string string_trip (const db::Text &t) +{ + std::string s = t.to_string (); + tl::Extractor ex (s.c_str ()); + db::Text t2; + ex.read (t2); + + return t2.to_string (); +} + +TEST(4) +{ + db::Text t ("abc", db::Trans (db::Trans::r90)); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0)"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.size (150); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) s=150"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.size (0); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0)"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.halign (db::HAlignCenter); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=c"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.halign (db::HAlignLeft); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=l"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.halign (db::HAlignRight); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.valign (db::VAlignCenter); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=c"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.valign (db::VAlignTop); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=t"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.valign (db::VAlignBottom); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) ha=r va=b"); + EXPECT_EQ (string_trip (t), t.to_string ()); + + t.halign (db::NoHAlign); + t.valign (db::NoVAlign); + t.font (db::Font (17)); + + EXPECT_EQ (t.to_string (), "('abc',r90 0,0) f=17"); + EXPECT_EQ (string_trip (t), t.to_string ()); +}