Skip to content

Commit c10c726

Browse files
committed
simplify point operation
1 parent ee57475 commit c10c726

File tree

3 files changed

+53
-55
lines changed

3 files changed

+53
-55
lines changed

sources/BridgingFunctions.swift

+34
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,37 @@ func ?=<T>(left: inout T?, right: T?) {
6262
extension NSRange {
6363
static let empty = NSRange(location: NSNotFound, length: 0)
6464
}
65+
66+
extension NSPoint {
67+
static func + (lhs: Self, rhs: Self) -> Self {
68+
Self.init(x: lhs.x + rhs.x, y: lhs.y + rhs.y)
69+
}
70+
static func += (lhs: inout Self, rhs: Self) {
71+
lhs.x += rhs.x
72+
lhs.y += rhs.y
73+
}
74+
static func - (lhs: Self, rhs: Self) -> Self {
75+
Self.init(x: lhs.x - rhs.x, y: lhs.y - rhs.y)
76+
}
77+
static func -= (lhs: inout Self, rhs: Self) {
78+
lhs.x -= rhs.x
79+
lhs.y -= rhs.y
80+
}
81+
static func * (lhs: Self, rhs: CGFloat) -> Self {
82+
Self.init(x: lhs.x * rhs, y: lhs.y * rhs)
83+
}
84+
static func *= (lhs: inout Self, rhs: CGFloat) {
85+
lhs.x *= rhs
86+
lhs.y *= rhs
87+
}
88+
static func / (lhs: Self, rhs: CGFloat) -> Self {
89+
Self.init(x: lhs.x / rhs, y: lhs.y / rhs)
90+
}
91+
static func /= (lhs: inout Self, rhs: CGFloat) {
92+
lhs.x /= rhs
93+
lhs.y /= rhs
94+
}
95+
var length: CGFloat {
96+
sqrt(pow(self.x, 2) + pow(self.y, 2))
97+
}
98+
}

sources/SquirrelInputController.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,8 @@ private extension SquirrelInputController {
555555
if let panel = NSApp.squirrelAppDelegate.panel {
556556
panel.position = inputPos
557557
panel.inputController = self
558-
panel.update(preedit: preedit, selRange: selRange, caretPos: caretPos, candidates: candidates, comments: comments, labels: labels, highlighted: highlighted, page: page, lastPage: lastPage, update: true)
558+
panel.update(preedit: preedit, selRange: selRange, caretPos: caretPos, candidates: candidates, comments: comments, labels: labels,
559+
highlighted: highlighted, page: page, lastPage: lastPage, update: true)
559560
}
560561
}
561562
}

sources/SquirrelView.swift

+17-54
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ final class SquirrelView: NSView {
116116
}
117117

118118
// Will triger - (void)drawRect:(NSRect)dirtyRect
119+
// swiftlint:disable:next function_parameter_count
119120
func drawView(candidateRanges: [NSRange], hilightedIndex: Int, preeditRange: NSRange, highlightedPreeditRange: NSRange, canPageUp: Bool, canPageDown: Bool) {
120121
self.candidateRanges = candidateRanges
121122
self.hilightedIndex = hilightedIndex
@@ -350,23 +351,14 @@ final class SquirrelView: NSView {
350351

351352
private extension SquirrelView {
352353
// A tweaked sign function, to winddown corner radius when the size is small
353-
func sign(_ number: CGFloat) -> CGFloat {
354-
if number >= 2 {
355-
return 1
356-
} else if number <= -2 {
357-
return -1
354+
func sign(_ number: NSPoint) -> NSPoint {
355+
if number.length >= 2 {
356+
return number / number.length
358357
} else {
359358
return number / 2
360359
}
361360
}
362361

363-
func scale(_ value: CGFloat, multiplier: CGFloat, divider: CGFloat) -> CGFloat {
364-
if abs(value / divider) < 1e-3 {
365-
return multiplier / divider
366-
}
367-
return sign(value / divider) * multiplier / value
368-
}
369-
370362
// Bezier cubic curve, which has continuous roundness
371363
func drawSmoothLines(_ vertex: [NSPoint], straightCorner: Set<Int>, alpha: CGFloat, beta rawBeta: CGFloat) -> CGPath? {
372364
guard vertex.count >= 3 else {
@@ -380,17 +372,9 @@ private extension SquirrelView {
380372
var control1: NSPoint
381373
var control2: NSPoint
382374
var target = previousPoint
383-
var diff = NSPoint(x: point.x - previousPoint.x, y: point.y - previousPoint.y)
384-
var scaleFactor: CGFloat = 1
375+
var diff = point - previousPoint
385376
if straightCorner.isEmpty || !straightCorner.contains(vertex.count-1) {
386-
if vertex.count > 3 {
387-
target.x += sign(diff.x / beta) * beta
388-
target.y += sign(diff.y / beta) * beta
389-
} else { // triangle
390-
scaleFactor = min(scale(diff.x, multiplier: beta, divider: beta), scale(diff.y, multiplier: beta, divider: beta))
391-
target.x += scaleFactor * diff.x
392-
target.y += scaleFactor * diff.y
393-
}
377+
target += sign(diff / beta) * beta
394378
}
395379
path.move(to: target)
396380
for i in 0..<vertex.count {
@@ -402,40 +386,18 @@ private extension SquirrelView {
402386
path.addLine(to: target)
403387
} else {
404388
control1 = point
405-
diff = NSPoint(x: point.x - previousPoint.x, y: point.y - previousPoint.y)
406-
407-
if vertex.count > 3 {
408-
target.x -= sign(diff.x / beta) * beta
409-
target.y -= sign(diff.y / beta) * beta
410-
control1.x -= sign(diff.x / beta) * alpha
411-
control1.y -= sign(diff.y / beta) * alpha
412-
} else { // triangle
413-
scaleFactor = min(scale(diff.x, multiplier: beta, divider: beta), scale(diff.y, multiplier: beta, divider: beta))
414-
target.x -= scaleFactor * diff.x
415-
target.y -= scaleFactor * diff.y
416-
scaleFactor = min(scale(diff.x, multiplier: alpha, divider: beta), scale(diff.y, multiplier: alpha, divider: beta))
417-
control1.x -= scaleFactor * diff.x
418-
control1.y -= scaleFactor * diff.y
419-
}
389+
diff = point - previousPoint
390+
391+
target -= sign(diff / beta) * beta
392+
control1 -= sign(diff / beta) * alpha
420393

421394
path.addLine(to: target)
422395
target = point
423396
control2 = point
424-
diff = NSPoint(x: nextPoint.x - point.x, y: nextPoint.y - point.y)
425-
426-
if vertex.count > 3 {
427-
target.x += sign(diff.x / beta) * beta
428-
target.y += sign(diff.y / beta) * beta
429-
control2.x += sign(diff.x / beta) * alpha
430-
control2.y += sign(diff.y / beta) * alpha
431-
} else {
432-
scaleFactor = min(scale(diff.x, multiplier: beta, divider: beta), scale(diff.y, multiplier: beta, divider: beta))
433-
target.x += scaleFactor * diff.x
434-
target.y += scaleFactor * diff.y
435-
scaleFactor = min(scale(diff.x, multiplier: alpha, divider: beta), scale(diff.y, multiplier: beta, divider: beta))
436-
control2.x += scaleFactor * diff.x
437-
control2.y += scaleFactor * diff.y
438-
}
397+
diff = nextPoint - point
398+
399+
target += sign(diff / beta) * beta
400+
control2 += sign(diff / beta) * alpha
439401

440402
path.addCurve(to: target, control1: control1, control2: control2)
441403
}
@@ -611,10 +573,10 @@ private extension SquirrelView {
611573
point = vertex[i]
612574
nextPoint = vertex[(i+1) % vertex.count]
613575
newPoint = point
614-
displacement = direction(diff: NSPoint(x: point.x - previousPoint.x, y: point.y - previousPoint.y))
576+
displacement = direction(diff: point - previousPoint)
615577
newPoint.x += by * displacement.x
616578
newPoint.y += by * displacement.y
617-
displacement = direction(diff: NSPoint(x: nextPoint.x - point.x, y: nextPoint.y - point.y))
579+
displacement = direction(diff: nextPoint - point)
618580
newPoint.x += by * displacement.x
619581
newPoint.y += by * displacement.y
620582
results[i] = newPoint
@@ -651,6 +613,7 @@ private extension SquirrelView {
651613
}
652614
}
653615

616+
// swiftlint:disable:next large_tuple
654617
func linearMultilineFor(body: NSRect, leading: NSRect, trailing: NSRect) -> (Array<NSPoint>, Array<NSPoint>, Set<Int>, Set<Int>) {
655618
let highlightedPoints, highlightedPoints2: [NSPoint]
656619
let rightCorners, rightCorners2: Set<Int>

0 commit comments

Comments
 (0)