Merge remote-tracking branch 'origin/animated-scale'
This commit is contained in:
@@ -37,8 +37,8 @@ public:
|
||||
void resetPosition();
|
||||
|
||||
/* scale */
|
||||
void scaleBy(double ds, double cx, double cy);
|
||||
void setScale(double scale);
|
||||
void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0);
|
||||
void setScale(double scale, double cx = -1, double cy = -1, double duration = 0);
|
||||
double getScale() const;
|
||||
// void setZoom(double zoom);
|
||||
// void setLonLatZoom(double lon, double lat, double zoom);
|
||||
|
||||
@@ -22,11 +22,11 @@ public:
|
||||
|
||||
// Relative changes
|
||||
void moveBy(double dx, double dy);
|
||||
void scaleBy(double ds, double cx, double cy);
|
||||
void scaleBy(double ds, double cx = -1, double cy = -1, double duration = 0);
|
||||
void rotateBy(double cx, double cy, double sx, double sy, double ex, double ey);
|
||||
|
||||
// Absolute changes
|
||||
void setScale(double scale);
|
||||
void setScale(double scale, double cx = -1, double cy = -1, double duration = 0);
|
||||
void setAngle(double angle, double duration = 0);
|
||||
void setZoom(double zoom);
|
||||
void setLonLat(double lon, double lat);
|
||||
|
||||
@@ -65,8 +65,8 @@ void Map::moveBy(double dx, double dy) {
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::scaleBy(double ds, double cx, double cy) {
|
||||
transform.scaleBy(ds, cx, cy);
|
||||
void Map::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
transform.scaleBy(ds, cx, cy, duration);
|
||||
style.cascade(transform.getZoom());
|
||||
update();
|
||||
|
||||
@@ -83,8 +83,8 @@ void Map::rotateBy(double cx, double cy, double sx, double sy, double ex, double
|
||||
settings.save();
|
||||
}
|
||||
|
||||
void Map::setScale(double scale) {
|
||||
transform.setScale(scale);
|
||||
void Map::setScale(double scale, double cx, double cy, double duration) {
|
||||
transform.setScale(scale, cx, cy, duration);
|
||||
style.cascade(transform.getZoom());
|
||||
update();
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ void Transform::moveBy(double dx, double dy) {
|
||||
y += cos(angle) * dy + sin(-angle) * dx;
|
||||
}
|
||||
|
||||
void Transform::scaleBy(double ds, double cx, double cy) {
|
||||
void Transform::scaleBy(double ds, double cx, double cy, double duration) {
|
||||
// clamp scale to min/max values
|
||||
double new_scale = scale * ds;
|
||||
if (new_scale < min_scale) {
|
||||
@@ -44,13 +44,7 @@ void Transform::scaleBy(double ds, double cx, double cy) {
|
||||
new_scale = max_scale;
|
||||
}
|
||||
|
||||
setScale(new_scale);
|
||||
|
||||
// Correct for non-center scaling location.
|
||||
const double dx = (cx - width / 2) * (1.0 - ds);
|
||||
const double dy = (cy - height / 2) * (1.0 - ds);
|
||||
x += cos(angle) * dx + sin(angle) * dy;
|
||||
y += cos(angle) * dy + sin(-angle) * dx;
|
||||
setScale(new_scale, cx, cy, duration);
|
||||
}
|
||||
|
||||
|
||||
@@ -92,7 +86,7 @@ void Transform::setAngle(double new_angle, double duration) {
|
||||
}
|
||||
}
|
||||
|
||||
void Transform::setScale(double new_scale) {
|
||||
void Transform::setScale(double new_scale, double cx, double cy, double duration) {
|
||||
if (new_scale < min_scale) {
|
||||
new_scale = min_scale;
|
||||
} else if (new_scale > max_scale) {
|
||||
@@ -100,9 +94,18 @@ void Transform::setScale(double new_scale) {
|
||||
}
|
||||
|
||||
const double factor = new_scale / scale;
|
||||
x *= factor;
|
||||
y *= factor;
|
||||
scale = new_scale;
|
||||
const double dx = (cx - width / 2) * (1.0 - factor);
|
||||
const double dy = (cy - height / 2) * (1.0 - factor);
|
||||
|
||||
if (duration == 0) {
|
||||
x = x * factor + dx;
|
||||
y = y * factor + dy;
|
||||
scale = new_scale;
|
||||
} else {
|
||||
animations.emplace_front(x, x * factor + dx, x, duration);
|
||||
animations.emplace_front(y, y * factor + dy, y, duration);
|
||||
animations.emplace_front(scale, new_scale, scale, duration);
|
||||
}
|
||||
|
||||
const double s = scale * size;
|
||||
zc = s / 2;
|
||||
|
||||
Reference in New Issue
Block a user