mirror of
https://github.com/HaishinKit/HaishinKit.swift.git
synced 2026-06-06 20:17:36 +00:00
Add MultiCamCaptureSetting#cornerRadius option.
This commit is contained in:
@@ -102,7 +102,7 @@ extension CMSampleBuffer {
|
||||
return self
|
||||
}
|
||||
|
||||
func over(_ sampleBuffer: CMSampleBuffer?, regionOfInterest roi: CGRect = .zero) -> CMSampleBuffer {
|
||||
func over(_ sampleBuffer: CMSampleBuffer?, regionOfInterest roi: CGRect = .zero, radius: CGFloat = 0.0) -> CMSampleBuffer {
|
||||
guard var inputImageBuffer = vImage_Buffer(cvPixelBuffer: sampleBuffer?.imageBuffer, format: &CMSampleBuffer.format) else {
|
||||
return self
|
||||
}
|
||||
@@ -118,12 +118,13 @@ extension CMSampleBuffer {
|
||||
let xScale = Float(roi.width) / Float(inputImageBuffer.width)
|
||||
let yScale = Float(roi.height) / Float(inputImageBuffer.height)
|
||||
let scaleFactor = (xScale < yScale) ? xScale : yScale
|
||||
var scaledInputImageBuffer = inputImageBuffer.scale(scaleFactor )
|
||||
var scaledInputImageBuffer = inputImageBuffer.scale(scaleFactor)
|
||||
scaledInputImageBuffer.cornerRadius(radius)
|
||||
defer {
|
||||
scaledInputImageBuffer.free()
|
||||
}
|
||||
_ = srcImageBuffer.over(&scaledInputImageBuffer, origin: roi.origin)
|
||||
_ = srcImageBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
|
||||
srcImageBuffer.over(&scaledInputImageBuffer, origin: roi.origin)
|
||||
srcImageBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
|
||||
return self
|
||||
}
|
||||
|
||||
@@ -179,7 +180,7 @@ extension CMSampleBuffer {
|
||||
vImage_Flags(kvImageLeaveAlphaUnchanged)) == kvImageNoError else {
|
||||
return
|
||||
}
|
||||
_ = destinationBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
|
||||
destinationBuffer.copy(to: imageBuffer, format: &CMSampleBuffer.format)
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ extension vImage_Buffer {
|
||||
}
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
mutating func copy(to cvPixelBuffer: CVPixelBuffer, format: inout vImage_CGImageFormat) -> vImage_Error {
|
||||
let cvImageFormat = vImageCVImageFormat_CreateWithCVPixelBuffer(cvPixelBuffer).takeRetainedValue()
|
||||
vImageCVImageFormat_SetColorSpace(cvImageFormat, CGColorSpaceCreateDeviceRGB())
|
||||
@@ -45,6 +46,7 @@ extension vImage_Buffer {
|
||||
vImage_Flags(kvImageNoFlags))
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
mutating func scale(_ factor: Float) -> Self {
|
||||
var imageBuffer = vImage_Buffer()
|
||||
guard vImageBuffer_Init(
|
||||
@@ -65,6 +67,35 @@ extension vImage_Buffer {
|
||||
return imageBuffer
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
mutating func cornerRadius(_ radius: CGFloat) -> Self {
|
||||
guard 0 < radius else {
|
||||
return self
|
||||
}
|
||||
let buffer = data.assumingMemoryBound(to: Pixel_8.self)
|
||||
for x in 0 ..< Int(width) {
|
||||
for y in 0 ..< Int(height) {
|
||||
let index = y * rowBytes + x * 4
|
||||
var dx = CGFloat(min(x, Int(width) - x))
|
||||
var dy = CGFloat(min(y, Int(height) - y))
|
||||
if dx == 0 && dy == 0 {
|
||||
buffer[index] = 0
|
||||
continue
|
||||
}
|
||||
if radius < dx || radius < dy {
|
||||
continue
|
||||
}
|
||||
dx = radius - dx
|
||||
dy = radius - dy
|
||||
if radius < round(sqrt(dx * dx + dy * dy)) {
|
||||
buffer[index] = 0
|
||||
}
|
||||
}
|
||||
}
|
||||
return self
|
||||
}
|
||||
|
||||
@discardableResult
|
||||
mutating func over(_ src: inout vImage_Buffer, origin: CGPoint = .zero) -> Self {
|
||||
let start = Int(origin.y) * rowBytes + Int(origin.x) * 4
|
||||
var destination = vImage_Buffer(
|
||||
|
||||
Reference in New Issue
Block a user