Skip to content

Commit f77a6ca

Browse files
committed
refactor: move rules computation to SvgRootNode
fix: apply opacity when fill-opacity or stroke-opacity is not present fix: gradient not considering viewport translation when gradientUnits == "objectBoundingBox
1 parent ef908fc commit f77a6ca

File tree

18 files changed

+295
-72
lines changed

18 files changed

+295
-72
lines changed

samples/svg/css/flower.svg

Lines changed: 231 additions & 0 deletions
Loading

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgCircleNode.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,10 @@ private fun SvgCircleNode.createSimpleCircle(
8787
return ImageVectorNode.Path(
8888
params = override ?: ImageVectorNode.Path.Params(
8989
fill = fillBrush(wrapper.nodes),
90-
fillAlpha = fillOpacity,
90+
fillAlpha = fillOpacity ?: opacity,
9191
pathFillType = fillRule,
9292
stroke = strokeBrush(wrapper.nodes),
93-
strokeAlpha = strokeOpacity,
93+
strokeAlpha = strokeOpacity ?: opacity,
9494
strokeLineCap = strokeLineCap,
9595
strokeLineJoin = strokeLineJoin,
9696
strokeMiterLimit = strokeMiterLimit,
@@ -169,7 +169,7 @@ private fun SvgCircleNode.createDashedCircle(minified: Boolean): ImageVectorNode
169169
minified = minified,
170170
override = ImageVectorNode.Path.Params(
171171
fill = fillBrush(nodes),
172-
fillAlpha = fillOpacity,
172+
fillAlpha = fillOpacity ?: opacity,
173173
pathFillType = fillRule,
174174
)
175175
),

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgClipPath.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package dev.tonholo.s2c.domain.svg
33
import dev.tonholo.s2c.domain.ImageVectorNode
44
import dev.tonholo.s2c.domain.xml.XmlNode
55
import dev.tonholo.s2c.domain.xml.XmlParentNode
6-
import dev.tonholo.s2c.parser.ImageParser.SvgParser.ComputedRule
76

87
class SvgClipPath(
98
parent: XmlParentNode,

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgColor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import kotlin.jvm.JvmInline
88
@JvmInline
99
value class SvgColor private constructor(val value: String) {
1010
companion object {
11-
val Default = SvgColor("#FF000000")
11+
val Default = SvgColor("Color.Transparent")
1212
operator fun invoke(value: String): SvgColor = SvgColor(
1313
namedColors[value] ?: value
1414
)

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgElementNode.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import dev.tonholo.s2c.domain.svg.transform.SvgTransform
55
import dev.tonholo.s2c.domain.xml.XmlElementNode
66
import dev.tonholo.s2c.domain.xml.XmlNode
77
import dev.tonholo.s2c.domain.xml.XmlParentNode
8-
import dev.tonholo.s2c.parser.ImageParser.SvgParser.ComputedRule
98

109
typealias SvgElementNodeConstructorFn<T> = (
1110
parent: XmlParentNode,

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgEllipseNode.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ fun SvgEllipseNode.asNode(
4545
return ImageVectorNode.Path(
4646
params = ImageVectorNode.Path.Params(
4747
fill = fillBrush(nodes),
48-
fillAlpha = fillOpacity,
48+
fillAlpha = fillOpacity ?: opacity,
4949
pathFillType = fillRule,
5050
stroke = strokeBrush(nodes),
51-
strokeAlpha = strokeOpacity,
51+
strokeAlpha = strokeOpacity ?: opacity,
5252
strokeLineCap = strokeLineCap,
5353
strokeLineJoin = strokeLineJoin,
5454
strokeMiterLimit = strokeMiterLimit,

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgGraphicNode.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class SvgGraphicNode<out T>(
2525
where T : SvgNode, T : XmlChildNode {
2626
val fill: SvgColor? by attribute<String?, _>(inherited = true) { it?.let(SvgColor::invoke) }
2727

28-
val opacity: Float? by attribute()
28+
val opacity: Float? by attribute(inherited = true)
2929

3030
val fillOpacity: Float? by attribute(name = "fill-opacity", inherited = true)
3131

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgGroupNode.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import dev.tonholo.s2c.domain.delegate.attribute
55
import dev.tonholo.s2c.domain.xml.XmlNode
66
import dev.tonholo.s2c.domain.xml.XmlParentNode
77
import dev.tonholo.s2c.extensions.firstInstanceOfOrNull
8-
import dev.tonholo.s2c.parser.ImageParser.SvgParser.ComputedRule
98

109
class SvgGroupNode(
1110
parent: XmlParentNode,

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgNode.kt

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import dev.tonholo.s2c.domain.xml.XmlChildNode
77
import dev.tonholo.s2c.domain.xml.XmlNode
88
import dev.tonholo.s2c.domain.xml.XmlParentNode
99
import dev.tonholo.s2c.domain.xml.XmlRootNode
10-
import dev.tonholo.s2c.parser.ImageParser.SvgParser.ComputedRule
10+
import dev.tonholo.s2c.parser.ast.css.CssSpecificity
11+
import dev.tonholo.s2c.parser.ast.css.syntax.node.Declaration
1112
import dev.tonholo.s2c.parser.ast.css.syntax.node.Value
1213

1314
/**
@@ -142,6 +143,16 @@ fun SvgNode.stackedTransform(parent: XmlParentNode): SvgTransform? {
142143
return stacked?.let(::SvgTransform)
143144
}
144145

146+
data class ComputedRule(
147+
val selector: String,
148+
val specificity: CssSpecificity,
149+
val declarations: List<Declaration>,
150+
) : Comparable<ComputedRule> {
151+
override fun compareTo(other: ComputedRule): Int {
152+
return specificity.compareTo(other.specificity)
153+
}
154+
}
155+
145156
/**
146157
* Converts the SVG node to a list of [ImageVectorNode].
147158
* @param masks The list of masks defined in the SVG.

svg-to-compose/src/commonMain/kotlin/dev/tonholo/s2c/domain/svg/SvgPathNode.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import dev.tonholo.s2c.domain.compose.ComposeBrush
77
import dev.tonholo.s2c.domain.compose.toBrush
88
import dev.tonholo.s2c.domain.delegate.attribute
99
import dev.tonholo.s2c.domain.xml.XmlParentNode
10-
import dev.tonholo.s2c.parser.ImageParser.SvgParser.ComputedRule
1110

1211
class SvgPathNode(
1312
parent: XmlParentNode,
@@ -64,10 +63,10 @@ fun SvgPathNode.asNode(
6463
val path = ImageVectorNode.Path(
6564
params = ImageVectorNode.Path.Params(
6665
fill = fillBrush,
67-
fillAlpha = fillOpacity,
66+
fillAlpha = fillOpacity ?: opacity,
6867
pathFillType = fillRule,
6968
stroke = strokeBrush,
70-
strokeAlpha = strokeOpacity,
69+
strokeAlpha = strokeOpacity ?: opacity,
7170
strokeLineCap = strokeLineCap,
7271
strokeLineJoin = strokeLineJoin,
7372
strokeMiterLimit = strokeMiterLimit,

0 commit comments

Comments
 (0)