Skip to content

Commit f536edf

Browse files
committed
Tune renderer for GreedyImageView
- Make the renderer a class instead of an actor, as CIContext and CIImage are designed to be thread-safe and we don't need job serialization here, as it is handled by the main actor on the call side. - Cover the class with protocols to be able to further test GreedyImageView.
1 parent c757941 commit f536edf

File tree

5 files changed

+86
-10
lines changed

5 files changed

+86
-10
lines changed

Sources/GreedyKit/Core/Rendering/CoreGraphicsRenderer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import CoreGraphics
99
import CoreImage
1010

11-
final actor CoreGraphicsRenderer {
11+
final class CoreGraphicsRenderer: CoreGraphicsRendererProtocol {
1212
private let context: CIContext
1313

1414
init(

Sources/GreedyKit/Core/Utils/SampleBufferFactory.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import CoreGraphics
1010
import CoreImage
1111
import CoreVideo
1212

13-
final actor SampleBufferFactory {
13+
final actor SampleBufferFactory: SampleBufferFactoryProtocol {
1414

1515
// MARK: Constants
1616

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// CoreGraphicsRendererProtocol.swift
3+
// GreedyKit
4+
//
5+
// Created by Igor Belov on 13.07.2025.
6+
//
7+
8+
import CoreImage
9+
10+
protocol CoreGraphicsRendererProtocol {
11+
func cgImage(from ciImage: CIImage) async -> CGImage?
12+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//
2+
// SampleBufferFactoryProtocol.swift
3+
// GreedyKit
4+
//
5+
// Created by Igor Belov on 11.07.2025.
6+
//
7+
8+
import AVFoundation
9+
import CoreImage
10+
11+
protocol SampleBufferFactoryProtocol: Actor {
12+
func sampleBuffer(
13+
fromPixelBuffer pixelBuffer: CVPixelBuffer,
14+
presentationTimeStamp time: CMTime,
15+
duration: CMTime
16+
) -> CMSampleBuffer?
17+
18+
func sampleBuffer(
19+
fromCGImage cgImage: CGImage,
20+
presentationTimeStamp time: CMTime,
21+
duration: CMTime
22+
) -> CMSampleBuffer?
23+
}
24+
25+
extension SampleBufferFactoryProtocol {
26+
func sampleBuffer(
27+
fromPixelBuffer pixelBuffer: CVPixelBuffer,
28+
presentationTimeStamp time: CMTime = .invalid,
29+
duration: CMTime = .zero
30+
) -> CMSampleBuffer? {
31+
sampleBuffer(
32+
fromPixelBuffer: pixelBuffer,
33+
presentationTimeStamp: time,
34+
duration: duration
35+
)
36+
}
37+
38+
func sampleBuffer(
39+
fromCGImage cgImage: CGImage,
40+
presentationTimeStamp time: CMTime = .invalid,
41+
duration: CMTime = .zero
42+
) -> CMSampleBuffer? {
43+
sampleBuffer(
44+
fromCGImage: cgImage,
45+
presentationTimeStamp: time,
46+
duration: duration
47+
)
48+
}
49+
}

Sources/GreedyKit/UIKit/GreedyImageView.swift

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,18 +51,33 @@ public final class GreedyImageView: UIView {
5151

5252
// MARK: - Properties
5353

54-
private let renderView = BackedRenderView()
55-
56-
private lazy var sampleBufferFactory = SampleBufferFactory()
57-
private lazy var renderer = CoreGraphicsRenderer(
58-
debugName: "GreedyImageView",
59-
cacheIntermediates: true
60-
)
54+
private let renderView: RenderViewProtocol
55+
private let sampleBufferFactory: SampleBufferFactoryProtocol
56+
private let renderer: CoreGraphicsRendererProtocol
6157

6258
// MARK: - Lifecycle
6359

64-
public override init(frame: CGRect) {
60+
init(
61+
frame: CGRect = .zero,
62+
renderView: RenderViewProtocol,
63+
renderer: CoreGraphicsRendererProtocol,
64+
sampleBufferFactory: SampleBufferFactoryProtocol
65+
) {
66+
self.renderView = renderView
67+
self.renderer = renderer
68+
self.sampleBufferFactory = sampleBufferFactory
69+
6570
super.init(frame: frame)
71+
}
72+
73+
public override convenience init(frame: CGRect) {
74+
self.init(
75+
frame: frame,
76+
renderView: BackedRenderView(),
77+
renderer: CoreGraphicsRenderer(debugName: "GreedyImageView"),
78+
sampleBufferFactory: SampleBufferFactory()
79+
)
80+
6681
renderView.configure(in: self)
6782
}
6883

0 commit comments

Comments
 (0)