mirror of
https://github.com/aseprite/aseprite.git
synced 2024-10-03 21:46:20 +00:00
Avoid div by zero or extreme angles for skew transformation
This commit is contained in:
parent
70a884d8ee
commit
e2db76492b
@ -1108,7 +1108,9 @@ private:
|
|||||||
updateEditor();
|
updateEditor();
|
||||||
}
|
}
|
||||||
void onChangeSkew() {
|
void onChangeSkew() {
|
||||||
m_t.skew(PI * m_skew.textDouble() / 180.0);
|
double newSkew = PI * m_skew.textDouble() / 180.0;
|
||||||
|
newSkew = base::clamp(newSkew, -PI*85.0/180.0, PI*85.0/180.0);
|
||||||
|
m_t.skew(newSkew);
|
||||||
updateEditor();
|
updateEditor();
|
||||||
}
|
}
|
||||||
void updateEditor() {
|
void updateEditor() {
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "app/util/expand_cel_canvas.h"
|
#include "app/util/expand_cel_canvas.h"
|
||||||
#include "app/util/new_image_from_mask.h"
|
#include "app/util/new_image_from_mask.h"
|
||||||
#include "app/util/range_utils.h"
|
#include "app/util/range_utils.h"
|
||||||
|
#include "base/clamp.h"
|
||||||
#include "base/pi.h"
|
#include "base/pi.h"
|
||||||
#include "doc/algorithm/flip_image.h"
|
#include "doc/algorithm/flip_image.h"
|
||||||
#include "doc/algorithm/rotate.h"
|
#include "doc/algorithm/rotate.h"
|
||||||
@ -589,9 +590,7 @@ void PixelsMovement::moveImage(const gfx::PointF& pos, MoveModifier moveModifier
|
|||||||
C.y += delta.y;
|
C.y += delta.y;
|
||||||
|
|
||||||
vec2 toPivot = to_vec2(pivotPoint - (A*(1.0-pivot.y) + C*pivot.y));
|
vec2 toPivot = to_vec2(pivotPoint - (A*(1.0-pivot.y) + C*pivot.y));
|
||||||
// TODO avoid division by zero (which happens when the pivot
|
vec2 toOtherSide = toPivot / (std::fabs(pivot.x) > 0.00001 ? pivot.x: 1.0);
|
||||||
// is in the exact same X pos as the west handle edge)
|
|
||||||
vec2 toOtherSide = toPivot / pivot.x;
|
|
||||||
B = A + to_point(toOtherSide);
|
B = A + to_point(toOtherSide);
|
||||||
D = C + to_point(toOtherSide);
|
D = C + to_point(toOtherSide);
|
||||||
break;
|
break;
|
||||||
@ -604,9 +603,7 @@ void PixelsMovement::moveImage(const gfx::PointF& pos, MoveModifier moveModifier
|
|||||||
D.y += delta.y;
|
D.y += delta.y;
|
||||||
|
|
||||||
vec2 toPivot = to_vec2(pivotPoint - (B*(1.0-pivot.y) + D*pivot.y));
|
vec2 toPivot = to_vec2(pivotPoint - (B*(1.0-pivot.y) + D*pivot.y));
|
||||||
// TODO avoid division by zero (which happens when the pivot
|
vec2 toOtherSide = toPivot / (std::fabs(1.0-pivot.x) > 0.00001 ? (1.0-pivot.x): 1.0);
|
||||||
// is in the exact same X pos as the east handle edge)
|
|
||||||
vec2 toOtherSide = toPivot / (1.0-pivot.x);
|
|
||||||
A = B + to_point(toOtherSide);
|
A = B + to_point(toOtherSide);
|
||||||
C = D + to_point(toOtherSide);
|
C = D + to_point(toOtherSide);
|
||||||
break;
|
break;
|
||||||
@ -669,6 +666,7 @@ void PixelsMovement::moveImage(const gfx::PointF& pos, MoveModifier moveModifier
|
|||||||
|
|
||||||
// Calculate angle between AC and AC0
|
// Calculate angle between AC and AC0
|
||||||
double newSkew = std::atan2(AC.x*AC0.y - AC.y*AC0.x, AC * AC0);
|
double newSkew = std::atan2(AC.x*AC0.y - AC.y*AC0.x, AC * AC0);
|
||||||
|
newSkew = base::clamp(newSkew, -PI*85.0/180.0, PI*85.0/180.0);
|
||||||
newTransformation.skew(newSkew);
|
newTransformation.skew(newSkew);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user