The purpose of this fix is to match polygon preview with the polygon
result when using Polygon Tool (before this fix, we were been see few
pixels differences on the shape closing segment). To achieve this, the
way how we draw the entire joinStroke has to match how polygon
function interpolate the final stroke which closes the shape. So, the
input vertices of doPointshapeLine function were swapped.
This fix is intended to create a polygon that matches with its preview
in one drawing step (needed when we want to draw with Contour or
Polygon tool with custom brushes with alpha content). Before this fix,
the polygon was being created in a first step, and then a second step
that patches the contour (over writing the Image with an extra
joinStroke execution of the entire contour).
- Added createUnion function in polygon.cpp to force drawing of the
input points in each scan line render.
- Added algo_line_continuous inside polygon function to interpolate
holes between input vertices.
- Deleted extra joinStroke execution in fillStroke function in class
IntertwineAsLines and class IntertwineAsPixelPerfect inside
intertwines.h
- Added Stroke::erase function to Stroke class. It is needed inside
IntertwineAsPixelPerfect class to get a clear m_pts (without the
extra points due to mini L shapes, due to pixel perfect process). In
fillStroke function in class IntertwineAsPixelPerfect inside
intertwiners.h, when it executed, m_pts is delivered to polygon
function instead of stroke argument in order to pass a pixel perfect
processed vector instead of stroke vector which is a raw vector of
vertices.
We've changed the way the "recover files" option works:
* Now it's an option that is always available (so we can open files
even from sessions that were correctly closed in the past)
* We can open sessions from other Aseprite versions (as in a "best
effort" approach, if it works, ok, if it doesn't -> contact user
support)
This generated a lot of controversy. The new center ((w-1)/2
, (h-1)/2) was useful for scripts, but not too useful for right-handed
users that prefer the most bigger part of even-sized brushes to be in
the top-left edge (instead of bottom-right edge which was the new
behavior).
With this patch we revert the changes, and we'll see if we can add a
new option to change the default brush center which might be useful
for left-handed users.
The "Repeat Last Export" command needs to copy DocPref to params, even
when the UI not used (also we must copy the DocPref to the params only
if sprite sheet type is not defined, which means that a script didn't
specify it).
From time to time the app::BackupObserver::backgroundThread() will use
ui::execute_from_ui_thread() to show/hide the backup notification icon
in the StatusBar (see SwitchBackupIcon class). This
ui::execute_from_ui_thread() function enqueues a ui::FunctionMessage
calling the Manager::enqueueMessage(). The issue here is that
enqueueMessage() uses ui::is_ui_thread() to check if the thread that
wants to enqueue the message is the UI thread or other thread, and
depending on this decission the message will be directly added to
msg_queue or enqueued into concurrent_msg_queue.
The issue was that ui::is_ui_thread() was not working correctly on
Windows because GetCurrentThread() is not useful to check the current
thread with a previous call of GetCurrentThread() from other
thread (the function always return the same value, a special generic
value that identifies the current thread whatever it is).