mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 22:55:00 +00:00
Various improvements
This commit is contained in:
@@ -310,104 +310,6 @@ final class NeonTool: DrawingElement {
|
||||
}
|
||||
}
|
||||
|
||||
final class PencilTool: DrawingElement {
|
||||
let uuid = UUID()
|
||||
|
||||
let drawingSize: CGSize
|
||||
let color: DrawingColor
|
||||
let lineWidth: CGFloat
|
||||
let arrow: Bool
|
||||
|
||||
var translation = CGPoint()
|
||||
|
||||
let renderLineWidth: CGFloat
|
||||
var renderPath = UIBezierPath()
|
||||
var renderAngle: CGFloat = 0.0
|
||||
|
||||
var bounds: CGRect {
|
||||
return self.renderPath.bounds.offsetBy(dx: self.translation.x, dy: self.translation.y)
|
||||
}
|
||||
|
||||
var _points: [Polyline.Point] = []
|
||||
var points: [Polyline.Point] {
|
||||
return self._points.map { $0.offsetBy(self.translation) }
|
||||
}
|
||||
|
||||
weak var metalView: DrawingMetalView?
|
||||
|
||||
func containsPoint(_ point: CGPoint) -> Bool {
|
||||
return self.renderPath.contains(point.offsetBy(dx: -self.translation.x, dy: -self.translation.y))
|
||||
}
|
||||
|
||||
func hasPointsInsidePath(_ path: UIBezierPath) -> Bool {
|
||||
let pathBoundingBox = path.bounds
|
||||
if self.bounds.intersects(pathBoundingBox) {
|
||||
for point in self._points {
|
||||
if path.contains(point.location.offsetBy(self.translation)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
required init(drawingSize: CGSize, color: DrawingColor, lineWidth: CGFloat, arrow: Bool) {
|
||||
self.drawingSize = drawingSize
|
||||
self.color = color
|
||||
self.lineWidth = lineWidth
|
||||
self.arrow = arrow
|
||||
|
||||
let minLineWidth = max(10.0, max(drawingSize.width, drawingSize.height) * 0.01)
|
||||
let maxLineWidth = max(20.0, max(drawingSize.width, drawingSize.height) * 0.09)
|
||||
let lineWidth = minLineWidth + (maxLineWidth - minLineWidth) * lineWidth
|
||||
|
||||
self.renderLineWidth = lineWidth
|
||||
}
|
||||
|
||||
func setupRenderLayer() -> DrawingRenderLayer? {
|
||||
return nil
|
||||
}
|
||||
|
||||
private var hot = false
|
||||
func updatePath(_ path: DrawingGesturePipeline.DrawingResult, state: DrawingGesturePipeline.DrawingGestureState) {
|
||||
guard case let .location(point) = path else {
|
||||
return
|
||||
}
|
||||
|
||||
if self._points.isEmpty {
|
||||
self.renderPath.move(to: point.location)
|
||||
} else {
|
||||
self.renderPath.addLine(to: point.location)
|
||||
}
|
||||
self._points.append(point)
|
||||
|
||||
self.hot = true
|
||||
self.metalView?.updated(point, state: state, brush: .pencil, color: self.color, size: self.renderLineWidth)
|
||||
}
|
||||
|
||||
func draw(in context: CGContext, size: CGSize) {
|
||||
guard !self._points.isEmpty else {
|
||||
return
|
||||
}
|
||||
context.saveGState()
|
||||
|
||||
context.translateBy(x: self.translation.x, y: self.translation.y)
|
||||
|
||||
let hot = self.hot
|
||||
if hot {
|
||||
self.hot = false
|
||||
} else {
|
||||
self.metalView?.setup(self._points.map { $0.location }, brush: .pencil, color: self.color, size: self.renderLineWidth)
|
||||
}
|
||||
self.metalView?.drawInContext(context)
|
||||
if !hot {
|
||||
self.metalView?.clear()
|
||||
}
|
||||
|
||||
context.restoreGState()
|
||||
}
|
||||
}
|
||||
|
||||
final class FillTool: DrawingElement {
|
||||
let uuid = UUID()
|
||||
|
||||
@@ -784,3 +686,106 @@ final class EraserTool: DrawingElement {
|
||||
renderLayer?.render(in: context)
|
||||
}
|
||||
}
|
||||
|
||||
//enum CodableDrawingElement {
|
||||
// case pen(PenTool)
|
||||
// case marker(MarkerTool)
|
||||
// case neon(NeonTool)
|
||||
// case eraser(EraserTool)
|
||||
// case blur(BlurTool)
|
||||
// case fill(FillTool)
|
||||
//
|
||||
// init?(element: DrawingElement) {
|
||||
// if let element = element as? PenTool {
|
||||
// self = .pen(element)
|
||||
// } else if let element = element as? MarkerTool {
|
||||
// self = .marker(element)
|
||||
// } else if let element = element as? NeonTool {
|
||||
// self = .neon(element)
|
||||
// } else if let element = element as? EraserTool {
|
||||
// self = .eraser(element)
|
||||
// } else if let element = element as? BlurTool {
|
||||
// self = .blur(element)
|
||||
// } else if let element = element as? FillTool {
|
||||
// self = .fill(element)
|
||||
// } else {
|
||||
// return nil
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// var entity: DrawingElement {
|
||||
// switch self {
|
||||
// case let .pen(element):
|
||||
// return element
|
||||
// case let .marker(element):
|
||||
// return element
|
||||
// case let .neon(element):
|
||||
// return element
|
||||
// case let .eraser(element):
|
||||
// return element
|
||||
// case let .blur(element):
|
||||
// return element
|
||||
// case let .fill(element):
|
||||
// return element
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
//
|
||||
//extension CodableDrawingElement: Codable {
|
||||
// private enum CodingKeys: String, CodingKey {
|
||||
// case type
|
||||
// case element
|
||||
// }
|
||||
//
|
||||
// private enum ElementType: Int, Codable {
|
||||
// case pen
|
||||
// case marker
|
||||
// case neon
|
||||
// case eraser
|
||||
// case blur
|
||||
// case fill
|
||||
// }
|
||||
//
|
||||
// init(from decoder: Decoder) throws {
|
||||
// let container = try decoder.container(keyedBy: CodingKeys.self)
|
||||
// let type = try container.decode(ElementType.self, forKey: .type)
|
||||
// switch type {
|
||||
// case .pen:
|
||||
// self = .pen(try container.decode(PenTool.self, forKey: .element))
|
||||
// case .marker:
|
||||
// self = .marker(try container.decode(MarkerTool.self, forKey: .element))
|
||||
// case .neon:
|
||||
// self = .neon(try container.decode(NeonTool.self, forKey: .element))
|
||||
// case .eraser:
|
||||
// self = .eraser(try container.decode(EraserTool.self, forKey: .element))
|
||||
// case .blur:
|
||||
// self = .blur(try container.decode(BlurTool.self, forKey: .element))
|
||||
// case .fill:
|
||||
// self = .fill(try container.decode(FillTool.self, forKey: .element))
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func encode(to encoder: Encoder) throws {
|
||||
// var container = encoder.container(keyedBy: CodingKeys.self)
|
||||
// switch self {
|
||||
// case let .pen(payload):
|
||||
// try container.encode(ElementType.pen, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// case let .marker(payload):
|
||||
// try container.encode(ElementType.marker, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// case let .neon(payload):
|
||||
// try container.encode(ElementType.neon, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// case let .eraser(payload):
|
||||
// try container.encode(ElementType.eraser, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// case let .blur(payload):
|
||||
// try container.encode(ElementType.blur, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// case let .fill(payload):
|
||||
// try container.encode(ElementType.fill, forKey: .type)
|
||||
// try container.encode(payload, forKey: .element)
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
Reference in New Issue
Block a user