Skip to content

Commit 0f90632

Browse files
committed
Radial Gradient
1 parent 5098c2a commit 0f90632

File tree

8 files changed

+564
-538
lines changed

8 files changed

+564
-538
lines changed

Examples/Sources/ViewController.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class ViewController: UIViewController {
6565

6666
override func loadView() {
6767
let imageView = UIImageView(frame: UIScreen.main.bounds)
68-
imageView.image = Image(named: "gradient-radial.svg", in: .samples)?.rasterize()
68+
imageView.image = Image(named: "mouth-open.svg", in: .samples)?.rasterize()
6969
imageView.contentMode = .scaleAspectFit
7070
imageView.backgroundColor = .white
7171
self.view = imageView

Samples/avocado.svg

Lines changed: 1 addition & 1 deletion
Loading

Samples/mouth-open.svg

Lines changed: 1 addition & 1 deletion
Loading

SwiftDraw/LayerTree.Builder.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -262,10 +262,10 @@ extension LayerTree.Builder {
262262

263263
return LayerTree.RadialGradient(
264264
gradient: gradient,
265-
center: LayerTree.Point(element.cx ?? 0.5, element.cy ?? 0.5),
266-
radius: LayerTree.Float(element.r ?? 0.5),
267-
endCenter: LayerTree.Point(element.fx ?? 0.5, element.fy ?? 0.5),
268-
endRadius: LayerTree.Float(element.fr ?? 0.5)
265+
center: LayerTree.Point(element.fx ?? element.cx ?? 0.5, element.fy ?? element.cy ?? 0.5),
266+
radius: LayerTree.Float(element.fr ?? 0),
267+
endCenter: LayerTree.Point(element.cx ?? 0.5, element.cy ?? 0.5),
268+
endRadius: LayerTree.Float(element.r ?? 0.5)
269269
)
270270
}
271271

SwiftDraw/LayerTree.CommandGenerator.swift

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,7 @@ extension LayerTree {
216216
let end = provider.createPoint(from: pathEnd)
217217

218218
if !fillGradient.transform.isEmpty {
219-
//commands.append(contentsOf: renderCommands(forTransforms: fillGradient.transform))
219+
commands.append(contentsOf: renderCommands(forTransforms: fillGradient.transform))
220220
}
221221

222222
let apha = provider.createFloat(from: fill.opacity)
@@ -227,21 +227,47 @@ extension LayerTree {
227227
commands.append(.pushState)
228228
commands.append(.setClip(path: path))
229229

230-
let converted = apply(colorConverter: colorConverter, to: fillGradient.gradient)
231-
let gradient = provider.createGradient(from: converted)
232-
let pathBounds = provider.getBounds(from: shape)
233-
let center = provider.createPoint(from: pathBounds.center)
234-
let x = (pathBounds.center.x - pathBounds.origin.x)
235-
let y = (pathBounds.center.y - pathBounds.origin.y)
236-
let radius = provider.createFloat(from: sqrt(x*x+y*y))
230+
let startCenter: LayerTree.Point
231+
let startRadius: LayerTree.Float
232+
let endCenter: LayerTree.Point
233+
let endRadius: LayerTree.Float
234+
235+
switch fillGradient.gradient.units {
236+
case .objectBoundingBox:
237+
let pathBounds = provider.getBounds(from: shape)
238+
let h = sqrt((pathBounds.width*pathBounds.width) + (pathBounds.height*pathBounds.height))
239+
startCenter = LayerTree.Point(
240+
pathBounds.x + (fillGradient.center.x * pathBounds.width),
241+
pathBounds.y + (fillGradient.center.y * pathBounds.height)
242+
)
243+
startRadius = h * fillGradient.radius
244+
endCenter = LayerTree.Point(
245+
pathBounds.x + (fillGradient.endCenter.x * pathBounds.width),
246+
pathBounds.y + (fillGradient.endCenter.y * pathBounds.height)
247+
)
248+
endRadius = h * fillGradient.endRadius
249+
case .userSpaceOnUse:
250+
startCenter = fillGradient.center
251+
startRadius = fillGradient.radius
252+
endCenter = fillGradient.endCenter
253+
endRadius = fillGradient.endRadius
254+
}
237255

238256
if !fillGradient.gradient.transform.isEmpty {
239-
// commands.append(contentsOf: renderCommands(forTransforms: fillGradient.transform))
257+
commands.append(contentsOf: renderCommands(forTransforms: fillGradient.gradient.transform))
240258
}
241259

260+
let converted = apply(colorConverter: colorConverter, to: fillGradient.gradient)
261+
let gradient = provider.createGradient(from: converted)
242262
let apha = provider.createFloat(from: fill.opacity)
243263
commands.append(.setAlpha(apha))
244-
commands.append(.drawRadialGradient(gradient, center: center, radius: radius))
264+
commands.append(.drawRadialGradient(
265+
gradient,
266+
startCenter: provider.createPoint(from: startCenter),
267+
startRadius: provider.createFloat(from: startRadius),
268+
endCenter: provider.createPoint(from: endCenter),
269+
endRadius: provider.createFloat(from: endRadius)
270+
))
245271
commands.append(.popState)
246272
}
247273

SwiftDraw/Renderer.CGText.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -520,14 +520,14 @@ public final class CGTextRenderer: Renderer {
520520
""")
521521
}
522522

523-
func draw(radial gradient: LayerTree.Gradient, at center: String, radius: LayerTree.Float) {
523+
func draw(radial gradient: LayerTree.Gradient, startCenter: String, startRadius: LayerTree.Float, endCenter: String, endRadius: LayerTree.Float) {
524524
let identifier = createOrGetGradient(gradient)
525525
lines.append("""
526-
ctx.drawLinearGradient(\(identifier),
527-
startCenter: \(center),
528-
startRadius: 0,
529-
endCenter: \(center),
530-
endRadius: radius,
526+
ctx.drawRadialGradient(\(identifier),
527+
startCenter: \(startCenter),
528+
startRadius: \(startRadius),
529+
endCenter: \(endCenter),
530+
endRadius: \(endRadius),
531531
options: [.drawsAfterEndLocation, .drawsBeforeStartLocation])
532532
""")
533533
}

0 commit comments

Comments
 (0)