Merge pull request #1443 from KLayout/issue-1441

Fixed issue #1441 (RDB support for text attributes like size, font, h…
This commit is contained in:
Matthias Köfferlein 2023-08-06 22:15:45 +02:00 committed by GitHub
commit 112d0843a7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 203 additions and 29 deletions

View File

@ -579,8 +579,8 @@ Path round_path_corners (const Path &path, int rad, int n)
return Path (round_path_corners (db::DPath (path), double (rad), n, 0.5));
}
template class path<Coord>;
template class path<DCoord>;
template class DB_PUBLIC path<Coord>;
template class DB_PUBLIC path<DCoord>;
// explicit instantiations
template DB_PUBLIC void path<Coord>::create_shifted_points (Coord, Coord, Coord, bool, path<Coord>::pointlist_type::iterator, path<Coord>::pointlist_type::iterator, int, box_inserter<path<Coord>::box_type>) const;

View File

@ -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,19 +88,55 @@ StringRef::~StringRef ()
}
}
// ----------------------------------------------------------------------------
// text implementation
template <class C>
std::string text<C>::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 DB_PUBLIC text<Coord>;
template class DB_PUBLIC text<DCoord>;
}
namespace tl
{
template<> void extractor_impl (tl::Extractor &ex, db::Text &p)
template<> DB_PUBLIC void extractor_impl (tl::Extractor &ex, db::Text &p)
{
if (! test_extractor_impl (ex, p)) {
ex.error (tl::to_string (tr ("Expected a text specification")));
}
}
template<> void extractor_impl (tl::Extractor &ex, db::DText &p)
template<> DB_PUBLIC void extractor_impl (tl::Extractor &ex, db::DText &p)
{
if (! test_extractor_impl (ex, p)) {
ex.error (tl::to_string (tr ("Expected a text specification")));
@ -69,6 +160,28 @@ template<class C> bool _test_extractor_impl (tl::Extractor &ex, db::text<C> &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 {
@ -76,12 +189,12 @@ template<class C> bool _test_extractor_impl (tl::Extractor &ex, db::text<C> &t)
}
}
template<> bool test_extractor_impl (tl::Extractor &ex, db::Text &p)
template<> DB_PUBLIC bool test_extractor_impl (tl::Extractor &ex, db::Text &p)
{
return _test_extractor_impl (ex, p);
}
template<> bool test_extractor_impl (tl::Extractor &ex, db::DText &p)
template<> DB_PUBLIC bool test_extractor_impl (tl::Extractor &ex, db::DText &p)
{
return _test_extractor_impl (ex, p);
}

View File

@ -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

View File

@ -1167,7 +1167,7 @@ TEST(5)
EXPECT_EQ (r.text (),
"layout_diff: texts differ for layer 17/0 in cell c2x\n"
"Not in b but in a:\n"
" ('X',r90 2,3)\n"
" ('X',r90 2,3) s=17\n"
"Not in a but in b:\n"
);
@ -1198,10 +1198,10 @@ TEST(5)
"layout_diff: texts differ for layer 17/0 in cell c2x\n"
"Not in b but in a:\n"
"Not in a but in b:\n"
" ('X',r90 2,3)\n"
" ('Y',r90 2,3)\n"
" ('X',r90 3,4)\n"
" ('X',r180 2,3)\n"
" ('X',r90 2,3) s=18\n"
" ('Y',r90 2,3) s=17\n"
" ('X',r90 3,4) s=17\n"
" ('X',r180 2,3) s=17\n"
);
// two more to match more of h:
@ -1216,8 +1216,8 @@ TEST(5)
"layout_diff: texts differ for layer 17/0 in cell c2x\n"
"Not in b but in a:\n"
"Not in a but in b:\n"
" ('Y',r90 2,3)\n"
" ('X',r180 2,3)\n"
" ('Y',r90 2,3) s=17\n"
" ('X',r180 2,3) s=17\n"
);
}

View File

@ -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 ());
}

View File

@ -1102,7 +1102,7 @@ class DBShapes_TestClass < TestBase
arr = []
shapes.each( RBA::Shapes::SAll ) { |s| arr.push( s.to_s ) }
assert_equal( arr, ["edge (1,2;3,4)", "text ('text',r0 100,200)", "text ('blabla',m0 100,200) prop_id=1"] )
assert_equal( arr, ["edge (1,2;3,4)", "text ('text',r0 100,200)", "text ('blabla',m0 100,200) f=3 ha=c va=b prop_id=1"] )
assert_equal( s1.is_valid?, true )
assert_equal( s1.shapes.is_valid?(s1), true )
@ -1316,7 +1316,7 @@ class DBShapes_TestClass < TestBase
arr = []
shapes.each( RBA::Shapes::SAll ) { |s| arr.push( s.to_s ) }
assert_equal( arr, ["edge (1,2;3,4)", "text ('text',r0 100,200)", "text ('blabla',m0 100,200) prop_id=1"] )
assert_equal( arr, ["edge (1,2;3,4)", "text ('text',r0 100,200)", "text ('blabla',m0 100,200) f=3 ha=c va=b prop_id=1"] )
assert_equal( s1.is_valid?, true )
assert_equal( s1.shapes.is_valid?(s1), true )

View File

@ -102,20 +102,20 @@ class DBText_TestClass < TestBase
b = a.dup
assert_equal( a.moved( RBA::DPoint::new( 0, 1 ) ).to_s, "('hallo',m45 5,8)" )
assert_equal( a.moved( RBA::DPoint::new( 0, 1 ) ).to_s, "('hallo',m45 5,8) s=23 f=8 ha=r va=b" )
a.move( RBA::DPoint::new( 1, 0 ) )
assert_equal( a.to_s, "('hallo',m45 6,7)" )
assert_equal( a.to_s, "('hallo',m45 6,7) s=23 f=8 ha=r va=b" )
b = b.transformed( RBA::DTrans::new( RBA::DTrans::R0, RBA::DPoint::new( 1, 0 )) )
assert_equal( b.to_s, "('hallo',m45 6,7)" )
assert_equal( b.to_s, "('hallo',m45 6,7) s=23 f=8 ha=r va=b" )
m = RBA::DCplxTrans::new( RBA::DTrans::new, 1.5 )
assert_equal( a.transformed(m).class.to_s, "RBA::DText" )
assert_equal( a.transformed(m).to_s, "('hallo',m45 9,10.5)" )
assert_equal( a.transformed(m).to_s, "('hallo',m45 9,10.5) s=34.5 f=8 ha=r va=b" )
m = RBA::VCplxTrans::new( 1000.0 )
assert_equal( a.transformed(m).class.to_s, "RBA::Text" )
assert_equal( a.transformed(m).to_s, "('hallo',m45 6000,7000)" )
assert_equal( a.transformed(m).to_s, "('hallo',m45 6000,7000) s=23000 f=8 ha=r va=b" )
end
@ -196,16 +196,16 @@ class DBText_TestClass < TestBase
b = a.dup
assert_equal( a.moved( RBA::Point::new( 0, 1 ) ).to_s, "('hallo',m45 5,8)" )
assert_equal( a.moved( RBA::Point::new( 0, 1 ) ).to_s, "('hallo',m45 5,8) s=23 f=8 ha=l va=t" )
a.move( RBA::Point::new( 1, 0 ) )
assert_equal( a.to_s, "('hallo',m45 6,7)" )
assert_equal( a.to_s, "('hallo',m45 6,7) s=23 f=8 ha=l va=t" )
b = b.transformed( RBA::Trans::new( RBA::Trans::R0, RBA::Point::new( 1, 0 )) )
assert_equal( b.to_s, "('hallo',m45 6,7)" )
assert_equal( b.to_s, "('hallo',m45 6,7) s=23 f=8 ha=l va=t" )
m = RBA::CplxTrans::new( RBA::Trans::new, 1.5 )
assert_equal( a.transformed(m).to_s, "('hallo',m45 9,10.5)" )
assert_equal( a.transformed(RBA::ICplxTrans::new(m)).to_s, "('hallo',m45 9,11)" )
assert_equal( a.transformed(m).to_s, "('hallo',m45 9,10.5) s=34.5 f=8 ha=l va=t" )
assert_equal( a.transformed(RBA::ICplxTrans::new(m)).to_s, "('hallo',m45 9,11) s=35 f=8 ha=l va=t" )
end