Merge branch 'master' into wip

This commit is contained in:
Matthias Koefferlein 2024-01-06 17:28:51 +01:00
commit 0ae2ed49f8
14 changed files with 257 additions and 58 deletions

View File

@ -1,3 +1,17 @@
0.28.15 (2023-01-04):
* Bugfix: %GITHUB%/issues/1578 Missing strm2*.exe in the Windows portable binary package (*.zip)
* Enhancement: %GITHUB%/issues/1569 Make "toggle (selected) layer" key-bindable
- Plus feature: "visibility follows selection"
* Bugfix: %GITHUB%/issues/1565 quit() raises an error in KLayout Python Console
* Bugfix: %GITHUB%/issues/1556 Cannot shrink Marker Browser window
* Bugfix: %GITHUB%/issues/1539 Misleading description in 'Flatten Cell'
* Enhancement: Supporting UCRT runtime option in MSYS2 deployment
* Bugfix: DRC, LVS and other higher-level functionality now supported on 64 bit coordinate builds
* Bugfix: initial tip dialogs appear on same screen than application
* New binaries:
- Windows binaries now include UCRT (64 bit) and 64 bit coordinate versions
- RockyLinux 9 RPMs included
0.28.14 (2023-12-08):
* Bugfix: %GITHUB%/issues/1563 Duplicated Tabs in the Macro Development Tool
* Bugfix: %GITHUB%/issues/1560 git+https package installation on windows fails

View File

@ -1,3 +1,10 @@
klayout (0.28.15-1) unstable; urgency=low
* New features and bugfixes
- See changelog
-- Matthias Köfferlein <matthias@koefferlein.de> Mon, 01 Jan 2024 17:16:00 +0100
klayout (0.28.14-1) unstable; urgency=low
* New features and bugfixes

View File

@ -101,8 +101,8 @@ else
echo "ERROR: not in mingw32 or mingw64 system."
fi
target=$pwd/bin-release-$arch
build=$pwd/build-release-$arch
target=$pwd/bin-release-$arch$KLAYOUT_BUILD_SUFFIX
build=$pwd/build-release-$arch$KLAYOUT_BUILD_SUFFIX
src=$pwd/src
scripts=$pwd/scripts
# Update in NSIS script too:
@ -284,7 +284,7 @@ echo "Making .zip file $zipname.zip .."
rm -rf $zipname $zipname.zip
mkdir $zipname
cp -Rv *.dll cert.pem .*-paths.txt db_plugins lay_plugins pymod $plugins lib $zipname | sed -u 's/.*/echo -n ./' | sh
cp -Rv strm*.exe *.dll cert.pem .*-paths.txt db_plugins lay_plugins pymod $plugins lib $zipname | sed -u 's/.*/echo -n ./' | sh
cp klayout.exe $zipname/klayout_app.exe
cp klayout.exe $zipname/klayout_vo_app.exe
echo ""

View File

@ -94,8 +94,8 @@ else
echo "ERROR: not in ucrt64 system."
fi
target=$pwd/bin-release-$arch
build=$pwd/build-release-$arch
target=$pwd/bin-release-$arch$KLAYOUT_BUILD_SUFFIX
build=$pwd/build-release-$arch$KLAYOUT_BUILD_SUFFIX
src=$pwd/src
scripts=$pwd/scripts
# Update in NSIS script too:
@ -292,7 +292,7 @@ echo "Making .zip file $zipname.zip .."
rm -rf $zipname $zipname.zip
mkdir $zipname
cp -Rv *.dll cert.pem .*-paths.txt db_plugins lay_plugins $plugins lib $zipname | sed -u 's/.*/echo -n ./' | sh
cp -Rv strm*.exe *.dll cert.pem .*-paths.txt db_plugins lay_plugins $plugins lib $zipname | sed -u 's/.*/echo -n ./' | sh
cp klayout.exe $zipname/klayout_app.exe
cp klayout.exe $zipname/klayout_vo_app.exe
echo ""

View File

@ -1,19 +1,6 @@
#
# spec file for package klayout
#
# Copyright (c) 2017 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.
# Please submit bugfixes or comments via http://bugs.opensuse.org/
#
Name: klayout
Version: %{git_version}
@ -31,10 +18,32 @@ Source0: http://www.klayout.de/downloads/%{name}-%{version}.tar.gz
# so's of klayout itself)
AutoReqProv: no
# RockyLinux9 requirements
%if "%{target_system}" == "rockylinux9"
Requires: ruby >= 3.0.0
Requires: python3 >= 3.9.0
Requires: qt5-qtbase >= 5.15.9
Requires: qt5-qtmultimedia >= 5.15.9
Requires: qt5-qtxmlpatterns >= 5.15.9
Requires: qt5-qtsvg >= 5.15.9
Requires: qt5-qttools >= 5.15.9
# NOTE: this package is required for libQt5Designer and pulls in a lot of devel stuff.
# Maybe it's worth considering to drop designer support and replace by QUiLoader.
Requires: qt5-qttools-devel >= 5.15.9
# Needed by something else (still?)
Requires: http-parser >= 2.9.4
%define buildopt -j2
# libgit2 is not available as standard package, but through EPEL
# So we include it explicitly
%define copylibs /usr/lib64/libgit2.so*
%define __python /usr/bin/python3
%endif
# CentOS8 requirements
%if "%{target_system}" == "centos8"
Requires: ruby >= 2.5.5
Requires: python3 >= 3.6.0
Requires: ruby >= 2.5.5
Requires: python3 >= 3.6.0
Requires: libgit2 >= 0.26.8
Requires: qt5-qtbase >= 5.11.1
Requires: qt5-qtmultimedia >= 5.11.1
@ -51,8 +60,8 @@ Requires: qt5-qttools-devel >= 5.11.1
# CentOS7 requirements
%if "%{target_system}" == "centos7"
Requires: ruby >= 2.0.0
Requires: python3 >= 3.6.0
Requires: ruby >= 2.0.0
Requires: python3 >= 3.6.0
Requires: qt-x11 >= 4.8.5
Requires: libgit2 >= 0.26.8
%define buildopt -j2
@ -69,25 +78,25 @@ Requires: qt-x11 >= 4.6.2
%if "%{target_system}" == "opensuse42_2"
# OpenSuSE 42.2 requirements
Requires: ruby2.3 >= 2.3.1
Requires: python3 >= 3.4.6
Requires: ruby2.3 >= 2.3.1
Requires: python3 >= 3.4.6
Requires: libqt4-x11 >= 4.8.6
%define buildopt -j2 -nolibgit2
%endif
%if "%{target_system}" == "opensuse42_3"
# OpenSuSE 42.3 requirements
Requires: ruby2.3 >= 2.3.1
Requires: python3 >= 3.4.6
Requires: ruby2.3 >= 2.3.1
Requires: python3 >= 3.4.6
Requires: libqt4-x11 >= 4.8.6
%define buildopt -j2 -nolibgit2
%endif
%if "%{target_system}" == "opensuse15"
# OpenSuSE Leap 15 requirements
Requires: ruby >= 2.5
Requires: python3 >= 3.6
Requires: libgit2-1_3 >= 1.3.0
Requires: ruby >= 2.5
Requires: python3 >= 3.6
Requires: libgit2-1_3 >= 1.3.0
Requires: libqt5-qtbase >= 5.15.2
Requires: libQt5PrintSupport5 >= 5.15.2
Requires: libQt5Designer5 >= 5.15.2
@ -151,6 +160,9 @@ cp -pd %{_builddir}/bin.$TARGET/lib*.so* %{buildroot}%{_libdir}/klayout
cp -pd %{_builddir}/bin.$TARGET/db_plugins/lib*.so* %{buildroot}%{_libdir}/klayout/db_plugins
cp -pd %{_builddir}/bin.$TARGET/lay_plugins/lib*.so* %{buildroot}%{_libdir}/klayout/lay_plugins
cp -rpd %{_builddir}/bin.$TARGET/pymod/* %{buildroot}%{_libdir}/klayout/pymod
%if %{defined copylibs}
cp -pd %{copylibs} %{buildroot}%{_libdir}/klayout
%endif
chmod 644 %{buildroot}%{_libdir}/klayout/*.so*
chmod 644 %{buildroot}%{_libdir}/klayout/db_plugins/*.so*
chmod 644 %{buildroot}%{_libdir}/klayout/lay_plugins/*.so*

View File

@ -40,6 +40,21 @@ namespace db {
template <class Coord> class generic_repository;
class ArrayRepository;
template <class C>
inline C box_world_min () { return std::numeric_limits<C>::min (); }
template <class C>
inline C box_world_max () { return std::numeric_limits<C>::max (); }
// NOTE: for 64bit coordinates the world coordinates do not fully exploit the coordinate
// range but only as much as can represented exactly by double (64bit) values.
template <>
inline int64_t box_world_min<int64_t> () { return -(int64_t (1) << 53); }
template <>
inline int64_t box_world_max<int64_t> () { return (int64_t (1) << 53); }
/**
* @brief A box class
*
@ -134,7 +149,7 @@ struct DB_PUBLIC_TEMPLATE box
*/
static box world ()
{
return box (std::numeric_limits<C>::min (), std::numeric_limits<C>::min (), std::numeric_limits<C>::max (), std::numeric_limits<C>::max ());
return box (box_world_min<C> (), box_world_min<C> (), box_world_max<C> (), box_world_max<C> ());
}
/**

View File

@ -245,3 +245,15 @@ TEST(13)
EXPECT_EQ (b.perimeter (), 8000000000.0);
}
TEST(14)
{
// world, specifically with 64bit coordinates and
// transfer via double coordinates
db::Box b = db::Box::world ();
EXPECT_EQ (b == db::Box::world (), true);
db::ICplxTrans t;
EXPECT_EQ (t * b == db::Box::world (), true);
EXPECT_EQ (t.inverted () * b == db::Box::world (), true);
}

View File

@ -1263,7 +1263,11 @@ TEST(21)
#if !defined(_MSC_VER)
ms.clear ();
poly.mem_stat (&ms, db::MemStatistics::None, 0);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (ms.reqd, (sizeof(void *)-4)*5+116);
#else
EXPECT_EQ (ms.reqd, (sizeof(void *)-4)*5+68);
#endif
#endif
}
@ -1277,7 +1281,11 @@ TEST(21)
#if !defined(_MSC_VER)
ms.clear ();
poly.mem_stat (&ms, db::MemStatistics::None, 0);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (ms.reqd, (sizeof(void *)-4)*5+84);
#else
EXPECT_EQ (ms.reqd, (sizeof(void *)-4)*5+52);
#endif
#endif
}
{

View File

@ -1730,8 +1730,44 @@ TEST(7)
"box (150,150;2150,1050) #12\n"
);
} else if (sizeof (db::ShortBox) > 8) {
EXPECT_EQ (shapes_to_string (_this, copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
} else {
// 16 bit coordinate overflow happens during ShortBox array expansion
EXPECT_EQ (shapes_to_string (_this, copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
@ -1808,8 +1844,44 @@ TEST(7)
"box (150,150;2150,1050) #12\n"
);
} else if (sizeof (db::ShortBox) > 8) {
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
"box (150,150;2150,1050) #0\n"
"box (50,-1050;1050,-50) #0\n"
"box (50,8950;1050,9950) #0\n"
"box (50,18950;1050,19950) #0\n"
"box (11050,-1050;12050,-50) #0\n"
"box (11050,8950;12050,9950) #0\n"
"box (11050,18950;12050,19950) #0\n"
"box (22050,-1050;23050,-50) #0\n"
"box (22050,8950;23050,9950) #0\n"
"box (22050,18950;23050,19950) #0\n"
"box (33050,-1050;34050,-50) #0\n"
"box (33050,8950;34050,9950) #0\n"
"box (33050,18950;34050,19950) #0\n"
"box (0,100;2000,1000) #10\n"
"box (100,200;2100,1100) #11\n"
"box (150,150;2150,1050) #12\n"
"box (50,-1050;1050,-50) #20\n"
"box (50,8950;1050,9950) #20\n"
"box (50,18950;1050,19950) #20\n"
"box (11050,-1050;12050,-50) #20\n"
"box (11050,8950;12050,9950) #20\n"
"box (11050,18950;12050,19950) #20\n"
"box (22050,-1050;23050,-50) #20\n"
"box (22050,8950;23050,9950) #20\n"
"box (22050,18950;23050,19950) #20\n"
"box (33050,-1050;34050,-50) #20\n"
"box (33050,8950;34050,9950) #20\n"
"box (33050,18950;34050,19950) #20\n"
);
} else {
// 16 bit coordinate overflow happens during ShortBox array expansion
EXPECT_EQ (shapes_to_string (_this, sa_copy),
"box (0,100;2000,1000) #0\n"
"box (100,200;2100,1100) #0\n"
@ -3185,19 +3257,35 @@ TEST(21)
s = shapes.begin_touching (db::Box (-500, -500, 500, 500), db::ShapeIterator::All);
size_t qid = s.quad_id ();
EXPECT_EQ (qid != 0, true);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;9007199254740992,9007199254740992)");
#else
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;2147483647,2147483647)");
#endif
EXPECT_EQ (s->to_string (), "box (100,100;200,200)");
++s;
EXPECT_EQ (qid == s.quad_id (), true);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;9007199254740992,9007199254740992)");
#else
EXPECT_EQ (s.quad_box ().to_string (), "(0,0;2147483647,2147483647)");
#endif
EXPECT_EQ (s->to_string (), "box (100,100;200,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (s.quad_box ().to_string (), "(-9007199254740992,0;0,9007199254740992)");
#else
EXPECT_EQ (s.quad_box ().to_string (), "(-2147483648,0;0,2147483647)");
#endif
EXPECT_EQ (s->to_string (), "box (-200,100;-100,200)");
s.skip_quad ();
EXPECT_EQ (qid != s.quad_id (), true);
#if defined(HAVE_64BIT_COORD)
EXPECT_EQ (s.quad_box ().to_string (), "(0,-9007199254740992;9007199254740992,0)");
#else
EXPECT_EQ (s.quad_box ().to_string (), "(0,-2147483648;2147483647,0)");
#endif
EXPECT_EQ (s->to_string (), "box (100,-200;200,-100)");
s.skip_quad ();
EXPECT_EQ (s.at_end (), true);

View File

@ -8,28 +8,36 @@
<keyword name="Editing"/>
<p>
The "flatten cell" operation flattens a cell into all of its parents.
This basically removes a cell by promoting her shapes and instances up in the hierarchy.
A "flat" cell is a cell without hierarchy. This means that the cell contains
only shapes, but no instances of child cells. Flat cells are disconnected from
other cells, hence flattening is a way to "freeze" the contents of a cell: when
a cell is flat, changing any other cell does not have an effect on this cell or
in other places of the cell. On the other hand, flat cells store each shape
individually, hence cannot make use of data compression be reuse of geometry.
</p>
<p>
Cell flattening can be applied to single instances or cells as a whole.
When applied to an instance, the individual instance is resolved into shapes. The
instantiated cell will still exist afterwards. When applied to a cell, the cell
will disappear and replaced by its contents in all places it is used.
A hierarchical cell can be flattened by choosing "Edit/Cell/Flatten Cell" or "Flatten Cell"
from the cell list context menu.
The flatten operation offers some options, i.e. the number of hierarchy levels to
flatten and how to deal with child cells which become obsolete through this operation ("orphan cells").
By enabling this "prune" option, all child cells are removed when they are no longer needed.
Otherwise, new top level cells will appear in that case - these are the cells which are not longer instantiated.
</p>
<p>
"Flatten" can also be applied to instances. In that case, the cell instance is removed
and replaced by the objects inside this cell. So instance flattening is a way to pull
the contents of a cell into the parent cell. One reason for doing so is to make the
cell contents accessible for editing, without having to change the child cell itself.
This prevents potential side effects when editing a cell would make the edits visible
in other places.
</p>
<p>
Instance-wise flattening is available by choosing "Edit/Selection/Flatten Instances".
Cell-wise flattening is available by choosing "Edit/Cell/Flatten Cell" or "Flatten Cell"
from the cell list's context menu.
</p>
<p>
The flatten operation offers some options, i.e. the number of hierarchy levels to
flatten and how to deal with child cells which become obsolete through this operation.
By enabling this "prune" option, all child cells are removed when they are no longer needed.
Otherwise, new top level cells will appear - these are the cells which are not longer instantiated.
Again, options are available to choose the number of hierarchy levels to flatten and
how to treat orphan cells.
</p>
</doc>

View File

@ -713,12 +713,17 @@ MainWindow::close_all ()
void
MainWindow::about_to_exec ()
{
// NOTE: empirically by using "0" for the parent of the TipDialogs (not "this"),
// these dialog appear on the same screen than the application window. With "this"
// they usually appear somewhere else. Maybe because this method is called before
// the main window is properly set up.
bool f;
f = false;
dispatcher ()->config_get (cfg_full_hier_new_cell, f);
if (!f) {
TipDialog td (this,
TipDialog td (0,
tl::to_string (QObject::tr ("<html><body>"
"<p>With the current settings, only the top cell's content is shown initially, but the child cells are not drawn.</p>"
"<p>This can be confusing, since the full layout becomes visible only after selecting "
@ -744,7 +749,7 @@ MainWindow::about_to_exec ()
// TODO: later, each view may get its own editable flag
if (lay::ApplicationBase::instance () && !lay::ApplicationBase::instance ()->is_editable ()) {
TipDialog td (this,
TipDialog td (0,
tl::to_string (QObject::tr ("KLayout has been started in viewer mode. In this mode, editor functions are not available.\n\nTo enable these functions, start KLayout in editor mode by using the \"-e\" command line switch or select it as the default mode in the setup dialog. Choose \"Setup\" in the \"File\" menu and check \"Use editing mode by default\" on the \"Editing Mode\" page in the \"Application\" section.")),
"editor-mode");
if (td.exec_dialog ()) {
@ -756,7 +761,7 @@ MainWindow::about_to_exec ()
f = false;
dispatcher ()->config_get (cfg_no_stipple, f);
if (f) {
TipDialog td (this,
TipDialog td (0,
tl::to_string (QObject::tr ("Layers are shown without fill because fill has been intentionally turned off. This can be confusing since selecting a stipple does not have an effect in this case.\n\nTo turn this feature off, uncheck \"Show Layers Without Fill\" in the \"View\" menu.")),
"no-stipple");
if (td.exec_dialog ()) {
@ -768,7 +773,7 @@ MainWindow::about_to_exec ()
f = false;
dispatcher ()->config_get (cfg_markers_visible, f);
if (! f) {
TipDialog td (this,
TipDialog td (0,
tl::to_string (QObject::tr ("Markers are not visible because they have been turned off.\nYou may not see markers when using the marker browser feature.\n\nTo turn markers on, check \"Show Markers\" in the \"View\" menu.")),
"show-markers");
if (td.exec_dialog ()) {
@ -780,7 +785,7 @@ MainWindow::about_to_exec ()
f = false;
dispatcher ()->config_get (cfg_hide_empty_layers, f);
if (f) {
TipDialog td (this,
TipDialog td (0,
tl::to_string (QObject::tr ("The \"Hide Empty Layers\" feature is enabled. This can be confusing, in particular in edit mode, because layers are not shown although they are actually present.\n\nTo disable this feature, uncheck \"Hide Empty Layers\" in the layer panel's context menu.")),
"hide-empty-layers");
if (td.exec_dialog ()) {

View File

@ -1335,8 +1335,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$2}}\n"
" {{S_TOP_CELL} {$1}}\n"
" {17 {17value}}\n"
@ -1439,8 +1444,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$2}}\n"
" {{S_TOP_CELL} {$1}}\n"
" {{S_BOUNDING_BOXES_AVAILABLE} {2}}\n"
@ -1499,8 +1509,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$2}}\n"
" {{S_TOP_CELL} {$1}}\n"
" {{S_BOUNDING_BOXES_AVAILABLE} {2}}\n"
@ -1561,8 +1576,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$2}}\n"
" {{S_TOP_CELL} {$1}}\n"
" {{name} {117}}\n"
@ -1617,8 +1637,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$1}}\n"
" {17 {17value}}\n"
" {{name} {117}}\n"
@ -1668,8 +1693,13 @@ TEST(116)
const char *expected =
"set props {\n"
#if defined(HAVE_64BIT_COORD)
" {{S_MAX_SIGNED_INTEGER_WIDTH} {8}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {8}}\n"
#else
" {{S_MAX_SIGNED_INTEGER_WIDTH} {4}}\n"
" {{S_MAX_UNSIGNED_INTEGER_WIDTH} {4}}\n"
#endif
" {{S_TOP_CELL} {$2}}\n"
" {17 {17value}}\n"
" {{name} {117}}\n"

View File

@ -119,14 +119,14 @@ class DBPath_TestClass < TestBase
a = RBA::Path::new
assert_equal( a.to_s, "() w=0 bx=0 ex=0 r=false" )
assert_equal( a.area.to_s, "0" )
assert_equal( a.area.to_f.to_s, "0.0" )
assert_equal( a.length.to_s, "0" )
assert_equal( RBA::Path::from_s(a.to_s).to_s, a.to_s )
b = a.dup
a = RBA::Path::new( [ RBA::Point::new( 0, 10 ), RBA::Point::new( 10, 50 ) ], 25 )
assert_equal( a.to_s, "(0,10;10,50) w=25 bx=0 ex=0 r=false" )
assert_equal( a.area.to_s, "1025" )
assert_equal( a.area.to_f.to_s, "1025.0" )
assert_equal( a.length.to_s, "41" )
assert_equal( RBA::Path::from_s(a.to_s).to_s, a.to_s )
c = a.dup

View File

@ -2,10 +2,10 @@
# This script is sourced to define the main version parameters
# The main version
KLAYOUT_VERSION="0.28.14"
KLAYOUT_VERSION="0.28.15"
# The version used for PyPI (don't use variables here!)
KLAYOUT_PYPI_VERSION="0.28.14"
KLAYOUT_PYPI_VERSION="0.28.15"
# The build date
KLAYOUT_VERSION_DATE=$(date "+%Y-%m-%d")