Skip to content

Commit 48b210a

Browse files
committed
RendererSupport Radial Gradient
1 parent ac502de commit 48b210a

File tree

6 files changed

+47
-14
lines changed

6 files changed

+47
-14
lines changed

SwiftDraw/LayerTree.CommandGenerator.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ extension LayerTree {
218218
let apha = provider.createFloat(from: fill.opacity)
219219
commands.append(.setAlpha(apha))
220220

221-
commands.append(.drawGradient(gradient, from: start, to: end))
221+
commands.append(.drawLinearGradient(gradient, from: start, to: end))
222222
commands.append(.popState)
223223
}
224224

SwiftDraw/Renderer.CGText.swift

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ public final class CGTextRenderer: Renderer {
510510
lines.append("ctx.draw(image, in: CGRect(x: 0, y: 0, width: image.width, height: image.height)")
511511
}
512512

513-
func draw(gradient: LayerTree.Gradient, from start: String, to end: String) {
513+
func draw(linear gradient: LayerTree.Gradient, from start: String, to end: String) {
514514
let identifier = createOrGetGradient(gradient)
515515
lines.append("""
516516
ctx.drawLinearGradient(\(identifier),
@@ -520,6 +520,18 @@ public final class CGTextRenderer: Renderer {
520520
""")
521521
}
522522

523+
func draw(radial gradient: LayerTree.Gradient, at center: String, radius: LayerTree.Float) {
524+
let identifier = createOrGetGradient(gradient)
525+
lines.append("""
526+
ctx.drawLinearGradient(\(identifier),
527+
startCenter: \(center),
528+
startRadius: 0,
529+
endCenter: \(center),
530+
endRadius: radius,
531+
options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
532+
""")
533+
}
534+
523535
func makeText() -> String {
524536
var template = """
525537
extension UIImage {

SwiftDraw/Renderer.CoreGraphics.swift

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,11 +416,22 @@ struct CGRenderer: Renderer {
416416
ctx.draw(image, in: rect)
417417
}
418418

419-
func draw(gradient: CGGradient, from start: CGPoint, to end: CGPoint) {
419+
func draw(linear gradient: CGGradient, from start: CGPoint, to end: CGPoint) {
420420
ctx.drawLinearGradient(gradient,
421421
start: start,
422422
end: end,
423-
options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
423+
options: [.drawsAfterEndLocation, .drawsBeforeStartLocation]
424+
)
425+
}
426+
427+
func draw(radial gradient: CGGradient, at center: CGPoint, radius: CGFloat) {
428+
ctx.drawRadialGradient(gradient,
429+
startCenter: center,
430+
startRadius: 0,
431+
endCenter: center,
432+
endRadius: radius,
433+
options: [.drawsAfterEndLocation, .drawsBeforeStartLocation]
434+
)
424435
}
425436
}
426437

SwiftDraw/Renderer.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ protocol Renderer {
102102
func stroke(path: Types.Path)
103103
func fill(path: Types.Path, rule: Types.FillRule)
104104
func draw(image: Types.Image)
105-
func draw(gradient: Types.Gradient, from start: Types.Point, to end: Types.Point)
105+
func draw(linear gradient: Types.Gradient, from start: Types.Point, to end: Types.Point)
106+
func draw(radial gradient: Types.Gradient, at center: Types.Point, radius: Types.Float)
106107
}
107108

108109
extension Renderer {
@@ -152,11 +153,13 @@ extension Renderer {
152153
fill(path: p, rule: r)
153154
case .draw(image: let i):
154155
draw(image: i)
155-
case .drawGradient(let g, let start, let end):
156-
draw(gradient: g, from: start, to: end)
156+
case .drawLinearGradient(let g, let start, let end):
157+
draw(linear: g, from: start, to: end)
158+
case .drawRadialGradient(let g, center: let center, radius: let radius):
159+
draw(radial: g, at: center, radius: radius)
157160
}
158161
}
159-
162+
160163
func perform(_ commands: [RendererCommand<Types>]) {
161164
for cmd in commands {
162165
perform(cmd)
@@ -189,8 +192,9 @@ enum RendererCommand<Types: RendererTypes> {
189192
case fill(Types.Path, rule: Types.FillRule)
190193

191194
case draw(image: Types.Image)
192-
case drawGradient(Types.Gradient, from: Types.Point, to: Types.Point)
193-
195+
case drawLinearGradient(Types.Gradient, from: Types.Point, to: Types.Point)
196+
case drawRadialGradient(Types.Gradient, center: Types.Point, radius: Types.Float)
197+
194198
case pushTransparencyLayer
195199
case popTransparencyLayer
196200
}

SwiftDrawTests/MockRenderer.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,11 @@ final class MockRenderer: Renderer {
126126
operations.append("drawImage")
127127
}
128128

129-
func draw(gradient: LayerTree.Gradient, from start: LayerTree.Point, to end: LayerTree.Point) {
130-
operations.append("drawGradient")
129+
func draw(linear gradient: LayerTree.Gradient, from start: LayerTree.Point, to end: LayerTree.Point) {
130+
operations.append("drawLinearGradient")
131+
}
132+
133+
func draw(radial gradient: LayerTree.Gradient, at center: LayerTree.Point, radius: LayerTree.Float) {
134+
operations.append("drawRadialGradient")
131135
}
132136
}

SwiftDrawTests/RendererTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ final class RendererTests: XCTestCase {
5959
.setAlpha(0.5),
6060
.setBlend(mode: .sourceIn),
6161
.draw(image: .mock),
62-
.drawGradient(.mock, from: .zero, to: .zero),
62+
.drawLinearGradient(.mock, from: .zero, to: .zero),
63+
.drawRadialGradient(.mock, center: .zero, radius: 100)
6364
])
6465

6566
XCTAssertEqual(renderer.operations, [
@@ -85,7 +86,8 @@ final class RendererTests: XCTestCase {
8586
"setAlpha",
8687
"setBlendMode",
8788
"drawImage",
88-
"drawGradient"
89+
"drawLinearGradient",
90+
"drawRadialGradient"
8991
])
9092
}
9193
}

0 commit comments

Comments
 (0)