If enabled in the preferences menu, pen and marker strokes will be
replaced by a simplified stroke after they are drawn.
The algorithm is very basic (for now): if three points are almost lined
up (the threshold angle can be specified in the config file), then the
middle one is removed. This is repeated over the whole stroke; new
polygons are then generated based on the simplified stroke points.
This typically cuts down on number of points and polygons by a factor of
about 10, while having minimal visual impact.
Due to antialiasing, adjacent polygons are separated by a very fine
space. The previous solution attempted to hide this by adding a border
to the polygons. The border of adjacent polygons would overlap, which
was visible (despite the attempted color correction) and, more
importantly, caused massive lags especially on Linux.
Therefore it has been removed but feel free to revert this commit some
day and try to fix this more cleanly.
Long version:
UBGraphicsPolygonItem::shape() sometimes caused OpenBoard to crash due to
inifinite recursion. This is easily replicated by trying to use the
highlighting tool.
The reason is: shape() calls boundingRect(); this function's definition is:
QRectF QGraphicsPolygonItem::boundingRect() const
{
Q_D(const QGraphicsPolygonItem);
if (d->boundingRect.isNull()) {
qreal pw = pen().style() == Qt::NoPen ? qreal(0) : pen().widthF();
if (pw == 0.0)
d->boundingRect = d->polygon.boundingRect();
else
d->boundingRect = shape().controlPointRect();
}
return d->boundingRect;
}
In the case where pw != 0, the shape() function is called. However, it
is shape() from the derived class, not the base class, which is called.
In other words, UBGraphicsPolygonItem::shape() is called rather than
QGraphicsPolygonItem::shape().
This means that boundingRect() is called again from within shape(), and
so on, causing the program to crash.
The fix was simply to remove UBGraphicsPolygonItem::shape(), as it
appears to provide the same (or very similar) functionality to that of
the base class's shape() function.
In case this shape() function actually is needed, another workaround
should be implemented to prevent this infinite recursion.
Now coping creates a full copy of already created item. Copy has it's own content (like video, audio or folder) and stores original item properties (like locked, pos, size, freezed e.t.c.).