mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
reverted to previous version of the trench checking algorithm
This commit is contained in:
parent
92ff278dcd
commit
02976e5207
@ -105,7 +105,23 @@ Trench.prototype = {
|
||||
var xRange = {min: rect.left, max: rect.left + rect.width};
|
||||
var yRange = {min: rect.top, max: rect.top + rect.height};
|
||||
|
||||
switch (edge) {
|
||||
var edgeToCheck;
|
||||
if (this.type == "border") {
|
||||
if (this.edge == "left")
|
||||
edgeToCheck = "right";
|
||||
else if (this.edge == "right")
|
||||
edgeToCheck = "left";
|
||||
else if (this.edge == "top")
|
||||
edgeToCheck = "bottom";
|
||||
else if (this.edge == "bottom")
|
||||
edgeToCheck = "top";
|
||||
} else if (this.type == "guide") {
|
||||
edgeToCheck = this.edge;
|
||||
}
|
||||
|
||||
rect.adjustedEdge = edgeToCheck;
|
||||
|
||||
switch (edgeToCheck) {
|
||||
case "left":
|
||||
if (this.ruleOverlaps(rect.left, yRange)) {
|
||||
rect.left = this.position;
|
||||
@ -178,44 +194,13 @@ var Trenches = {
|
||||
delete self.trenches[id];
|
||||
});
|
||||
},
|
||||
comparePosition: function Trenches_comparePosition(a,b) {
|
||||
return a.position - b.position;
|
||||
},
|
||||
activateOthersTrenches: function Trenches_activateOthersTrenches(element) {
|
||||
var aT = this.activeTrenches;
|
||||
aT.left = [];
|
||||
aT.right = [];
|
||||
aT.top = [];
|
||||
aT.bottom = [];
|
||||
this.safeRegionCache = {left:{},right:{},top:{},bottom:{}};
|
||||
this.trenches.forEach(function(t) {
|
||||
if (t.el === element)
|
||||
return;
|
||||
t.active = true;
|
||||
t.show(); // debug
|
||||
|
||||
var relevantEdge;
|
||||
if (t.type == "border") {
|
||||
if (t.edge == "left")
|
||||
relevantEdge = "right";
|
||||
else if (t.edge == "right")
|
||||
relevantEdge = "left";
|
||||
else if (t.edge == "top")
|
||||
relevantEdge = "bottom";
|
||||
else if (t.edge == "bottom")
|
||||
relevantEdge = "top";
|
||||
} else if (t.type == "guide" || t.type == "barrier") {
|
||||
relevantEdge = t.edge;
|
||||
}
|
||||
|
||||
aT[relevantEdge].push({id: t.id, position: t.position, toString: function(){return '' + t.id + ':' + t.position}});
|
||||
|
||||
});
|
||||
|
||||
aT.left.sort(this.comparePosition);
|
||||
aT.right.sort(this.comparePosition);
|
||||
aT.top.sort(this.comparePosition);
|
||||
aT.bottom.sort(this.comparePosition);
|
||||
},
|
||||
disactivate: function Trenches_disactivate() {
|
||||
this.trenches.forEach(function(t) {
|
||||
@ -223,74 +208,6 @@ var Trenches = {
|
||||
t.show();
|
||||
});
|
||||
},
|
||||
snapEdge: function Trenches_snapEdge(rect,edge,assumeConstantSize,keepProportional) {
|
||||
|
||||
var aT = this.activeTrenches;
|
||||
|
||||
var position;
|
||||
switch (edge) {
|
||||
case 'left':
|
||||
position = rect.left; break;
|
||||
case 'right':
|
||||
position = rect.left + rect.width; break;
|
||||
case 'top':
|
||||
position = rect.top; break;
|
||||
case 'bottom':
|
||||
position = rect.top + rect.height; break;
|
||||
}
|
||||
|
||||
var safeRegionCache = this.safeRegionCache;
|
||||
|
||||
if ('min' in safeRegionCache[edge] && 'max' in safeRegionCache[edge]) {
|
||||
if (safeRegionCache[edge].min < position && position < safeRegionCache[edge].max) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Find the relevant trenches to compare to:
|
||||
// What we're doing here is planting a "rat" within the ordered list of edges that matter
|
||||
// We then sort the resulting array, use indexOf on the rat, and figure out which trenches
|
||||
// are closest to the edge in question.
|
||||
var rat = {id:'rat',position:position};
|
||||
var index = aT[edge].concat(rat).sort(this.comparePosition).indexOf(rat);
|
||||
|
||||
// Now we know to check aT[edge][index-1] and aT[edge][index]
|
||||
|
||||
var newRect;
|
||||
var updated = false;
|
||||
if (index-1 >= 0) {
|
||||
var trench = this.getById(aT[edge][index-1].id);
|
||||
newRect = trench.rectOverlaps(rect,edge,assumeConstantSize,keepProportional);
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
delete safeRegionCache[edge].min;
|
||||
} else {
|
||||
safeRegionCache[edge].min = trench.position + trench.radius;
|
||||
}
|
||||
} else {
|
||||
safeRegionCache[edge].min = -10;
|
||||
}
|
||||
if (index < aT[edge].length) {
|
||||
var trench = this.getById(aT[edge][index].id);
|
||||
newRect = trench.rectOverlaps(rect,edge,assumeConstantSize,keepProportional);
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
delete safeRegionCache[edge].max;
|
||||
} else {
|
||||
safeRegionCache[edge].max = trench.position - trench.radius;
|
||||
}
|
||||
} else {
|
||||
safeRegionCache[edge].max = Infinity;
|
||||
}
|
||||
|
||||
if (updated)
|
||||
return rect;
|
||||
else
|
||||
return false;
|
||||
|
||||
},
|
||||
snap: function Trenches_snap(rect,assumeConstantSize,keepProportional) {
|
||||
var aT = this.activeTrenches;
|
||||
|
||||
@ -298,39 +215,38 @@ var Trenches = {
|
||||
var updatedX = false;
|
||||
var updatedY = false;
|
||||
|
||||
var newRect;
|
||||
newRect = this.snapEdge(rect,(this.preferLeft?'left':'right'),assumeConstantSize,keepProportional);
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
updatedX = true;
|
||||
}
|
||||
|
||||
if (!assumeConstantSize || !updatedX) {
|
||||
newRect = this.snapEdge(rect,(this.preferLeft?'right':'left'),assumeConstantSize,keepProportional);
|
||||
for (let i in this.trenches) {
|
||||
var t = this.trenches[i];
|
||||
if (!t.active)
|
||||
continue;
|
||||
// newRect will be a new rect, or false
|
||||
var newRect = t.rectOverlaps(rect,assumeConstantSize,keepProportional);
|
||||
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
updatedX = true;
|
||||
if (assumeConstantSize && updatedX && updatedY)
|
||||
break;
|
||||
if (assumeConstantSize && updatedX && (newRect.adjustedEdge == "left"||newRect.adjustedEdge == "right"))
|
||||
continue;
|
||||
if (assumeConstantSize && updatedY && (newRect.adjustedEdge == "top"||newRect.adjustedEdge == "bottom"))
|
||||
continue;
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
|
||||
// if updatedX, we don't need to update x any more.
|
||||
if (newRect.adjustedEdge == "left" && this.preferLeft)
|
||||
updatedX = true;
|
||||
if (newRect.adjustedEdge == "right" && !this.preferLeft)
|
||||
updatedX = true;
|
||||
|
||||
// if updatedY, we don't need to update x any more.
|
||||
if (newRect.adjustedEdge == "top" && this.preferTop)
|
||||
updatedY = true;
|
||||
if (newRect.adjustedEdge == "bottom" && !this.preferTop)
|
||||
updatedY = true;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
newRect = this.snapEdge(rect,(this.preferTop?'top':'bottom'),assumeConstantSize,keepProportional);
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
updatedY = true;
|
||||
}
|
||||
|
||||
if (!assumeConstantSize || !updatedY) {
|
||||
newRect = this.snapEdge(rect,(this.preferTop?'bottom':'top'),assumeConstantSize,keepProportional);
|
||||
if (newRect) {
|
||||
rect = newRect;
|
||||
updated = true;
|
||||
updatedY = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (updated)
|
||||
return rect;
|
||||
else
|
||||
|
Loading…
Reference in New Issue
Block a user