Assigned
Status Update
Comments
ch...@google.com <ch...@google.com> #2
Not able to repro this yet, at least not in our standard integration tests (view-based and Compose). That is, simply drawing with the rounded shape, or morph, Path object with a STROKE style works fine. There's something more subtle going on here.
ch...@google.com <ch...@google.com> #3
Able to repro it with the composable above, both in the preview view and on the emulator. Just create a new Compose activity, add the composable, and call that composable in the main content area of the app.
The problem seems related to the way that the shape is being sized absolutely, instead of using the canonical bounds which are used by default. There is some conflict in the sizes being used, specifically the rounding sizes. Still investigating.
The problem seems related to the way that the shape is being sized absolutely, instead of using the canonical bounds which are used by default. There is some conflict in the sizes being used, specifically the rounding sizes. Still investigating.
ch...@google.com <ch...@google.com> #4
I confirmed that the problem seems to come from the absolute sizing of the shape (vs our default canonical size calculations).
I recreated the shape using the canonical size (not providing a radius and center) and then transformed it into position and it appeared correctly.
Here is the code that creates both shapes (the one causing the problem, shape, and the canonical version without the problem, shape1):
fun Shape() {
Canvas(modifier = Modifier.fillMaxSize(1f)) {
val halfWidth = size.width * 0.5f
var radius = halfWidth * 0.75f * 2f;
val center = size.width / 2
val roundingFactor = .32f
val rounding = CornerRounding(radius * roundingFactor, .0f)
val innerRounding = CornerRounding(radius * roundingFactor, .0f)
val innerRadius = radius * 0.352f
val shape = RoundedPolygon.star(
numVerticesPerRadius = 4,
rounding = rounding,
innerRounding = innerRounding,
innerRadius = innerRadius,
radius = radius,
center = PointF(center, center)
)
val cubics = shape.toCubicShape().cubics
for (cubic in cubics) {
println("Cubic: " + cubic)
}
val shape1 = RoundedPolygon.star(4,
rounding = CornerRounding(roundingFactor),
innerRadius = .352f)
val matrix = Matrix()
matrix.setTranslate(center, center)
matrix.preScale(radius, radius)
shape1.transform(matrix)
val cubics1 = shape1.toCubicShape().cubics
for (cubic in cubics1) {
println("Cubic1: " + cubic)
}
This code produces the following set of data. You can see that the control points for the first shape are not the same as those for the second shape, and that there are extra points in the first shape.
Cubic: p0: PointF(828.4127, 367.15466), p1: PointF(851.5461, 374.82065), p2: PointF(863.1127, 378.65363), p3: PointF(828.4127, 367.15463)
Cubic: p0: PointF(828.4127, 367.15463), p1: PointF(994.8269, 422.3015), p2: PointF(994.8269, 657.6984), p3: PointF(828.4127, 712.84534)
Cubic: p0: PointF(828.4127, 712.84534), p1: PointF(1754.1299, 406.07806), p2: PointF(1445.5575, 508.33383), p3: PointF(828.4127, 712.8454)
Cubic: p0: PointF(828.4127, 712.8454), p1: PointF(828.41266, 712.84534), p2: PointF(828.4127, 712.8454), p3: PointF(828.41266, 712.8454)
Cubic: p0: PointF(828.41266, 712.8454), p1: PointF(713.2715, 751.0013), p2: PointF(655.70087, 770.0793), p3: PointF(828.41266, 712.8454)
Cubic: p0: PointF(828.41266, 712.8454), p1: PointF(773.7947, 730.9449), p2: PointF(730.9449, 773.7947), p3: PointF(712.8454, 828.41266)
Cubic: p0: PointF(712.8454, 828.41266), p1: PointF(754.74066, 701.9874), p2: PointF(740.7756, 744.12915), p3: PointF(712.8454, 828.41266)
Cubic: p0: PointF(712.8454, 828.41266), p1: PointF(712.84534, 828.41266), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic: p0: PointF(712.8454, 828.4127), p1: PointF(636.1556, 1059.8358), p2: PointF(597.8107, 1175.5472), p3: PointF(712.84534, 828.4127)
Cubic: p0: PointF(712.84534, 828.4127), p1: PointF(657.6985, 994.82684), p2: PointF(422.3015, 994.82684), p3: PointF(367.15463, 828.4127)
Cubic: p0: PointF(367.15463, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.15463, 828.4128), p3: PointF(367.1546, 828.4127)
Cubic: p0: PointF(367.1546, 828.4127), p1: PointF(367.15457, 828.41266), p2: PointF(367.15457, 828.4127), p3: PointF(367.15457, 828.41266)
Cubic: p0: PointF(367.15457, 828.41266), p1: PointF(388.4358, 892.6321), p2: PointF(399.07642, 924.74176), p3: PointF(367.15454, 828.41266)
Cubic: p0: PointF(367.15454, 828.41266), p1: PointF(349.05505, 773.7947), p2: PointF(306.20526, 730.94495), p3: PointF(251.58731, 712.84546)
Cubic: p0: PointF(251.58731, 712.84546), p1: PointF(-513.0047, 459.47217), p2: PointF(-258.1407, 543.92993), p3: PointF(251.58733, 712.8454)
Cubic: p0: PointF(251.58733, 712.8454), p1: PointF(251.5873, 712.84534), p2: PointF(251.58728, 712.8454), p3: PointF(251.58728, 712.8454)
Cubic: p0: PointF(251.58728, 712.8454), p1: PointF(451.20828, 778.9965), p2: PointF(551.0188, 812.0721), p3: PointF(251.58728, 712.84534)
Cubic: p0: PointF(251.58728, 712.84534), p1: PointF(85.17317, 657.6984), p2: PointF(85.17317, 422.30154), p3: PointF(251.58728, 367.15463)
Cubic: p0: PointF(251.58728, 367.15463), p1: PointF(324.09537, 343.12665), p2: PointF(299.926, 351.136), p3: PointF(251.58728, 367.1546)
Cubic: p0: PointF(251.58728, 367.1546), p1: PointF(251.5873, 367.15457), p2: PointF(251.58734, 367.15457), p3: PointF(251.58737, 367.15457)
Cubic: p0: PointF(251.58737, 367.15457), p1: PointF(-420.1438, 589.75507), p2: PointF(-756.0094, 701.05536), p3: PointF(251.58737, 367.15454)
Cubic: p0: PointF(251.58737, 367.15454), p1: PointF(306.20532, 349.05505), p2: PointF(349.05518, 306.20526), p3: PointF(367.15466, 251.58731)
Cubic: p0: PointF(367.15466, 251.58731), p1: PointF(378.94458, 216.00943), p2: PointF(375.01462, 227.86873), p3: PointF(367.15463, 251.58731)
Cubic: p0: PointF(367.15463, 251.58731), p1: PointF(367.15463, 251.5873), p2: PointF(367.15466, 251.58728), p3: PointF(367.15466, 251.58728)
Cubic: p0: PointF(367.15466, 251.58728), p1: PointF(411.13705, 118.863625), p2: PointF(433.12827, 52.5018), p3: PointF(367.15472, 251.5873)
Cubic: p0: PointF(367.15472, 251.5873), p1: PointF(422.30157, 85.17308), p2: PointF(657.69855, 85.17308), p3: PointF(712.8454, 251.5873)
Cubic: p0: PointF(712.8454, 251.5873), p1: PointF(686.2475, 171.32404), p2: PointF(695.11346, 198.07845), p3: PointF(712.84546, 251.58728)
Cubic: p0: PointF(712.84546, 251.58728), p1: PointF(712.84546, 251.5873), p2: PointF(712.84546, 251.58734), p3: PointF(712.84546, 251.58737)
Cubic: p0: PointF(712.84546, 251.58737), p1: PointF(740.77563, 335.87085), p2: PointF(754.7407, 378.01257), p3: PointF(712.84546, 251.58737)
Cubic: p0: PointF(712.84546, 251.58737), p1: PointF(730.94495, 306.20535), p2: PointF(773.79474, 349.0551), p3: PointF(828.4127, 367.1546)
Cubic: p0: PointF(828.4127, 367.1546), p1: PointF(828.4127, 367.15463), p2: PointF(828.4128, 367.15463), p3: PointF(828.4127, 367.15463)
Cubic: p0: PointF(828.4127, 367.15463), p1: PointF(828.41266, 367.15463), p2: PointF(828.4127, 367.15466), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4128, 367.15466), p1: PointF(828.4128, 367.15466), p2: PointF(828.4128, 367.15466), p3: PointF(828.4128, 367.15466)
Cubic1: p0: PointF(828.4128, 367.15466), p1: PointF(994.8269, 422.30157), p2: PointF(994.8269, 657.6985), p3: PointF(828.4128, 712.8454)
Cubic1: p0: PointF(828.4128, 712.8454), p1: PointF(828.4128, 712.84534), p2: PointF(828.4128, 712.84534), p3: PointF(828.4128, 712.84534)
Cubic1: p0: PointF(828.4128, 712.84534), p1: PointF(828.4127, 712.8454), p2: PointF(828.4127, 712.8454), p3: PointF(828.4127, 712.8454)
Cubic1: p0: PointF(828.4127, 712.8454), p1: PointF(828.4127, 712.8454), p2: PointF(828.4127, 712.8454), p3: PointF(828.4127, 712.8454)
Cubic1: p0: PointF(828.4127, 712.8454), p1: PointF(773.7947, 730.9449), p2: PointF(730.9449, 773.7947), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(712.8454, 828.4127), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(712.8454, 828.4127), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(657.6985, 994.827), p2: PointF(422.3015, 994.827), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.1546, 828.4127), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.1546, 828.4127), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(349.0551, 773.7947), p2: PointF(306.20532, 730.9449), p3: PointF(251.58731, 712.8454)
Cubic1: p0: PointF(251.58731, 712.8454), p1: PointF(251.58731, 712.8454), p2: PointF(251.58731, 712.8454), p3: PointF(251.58731, 712.8454)
Cubic1: p0: PointF(251.58731, 712.8454), p1: PointF(251.58731, 712.8454), p2: PointF(251.58731, 712.8454), p3: PointF(251.58728, 712.8454)
Cubic1: p0: PointF(251.58728, 712.8454), p1: PointF(251.58725, 712.8454), p2: PointF(251.58728, 712.8454), p3: PointF(251.58728, 712.84534)
Cubic1: p0: PointF(251.58728, 712.84534), p1: PointF(85.173065, 657.6984), p2: PointF(85.17313, 422.30145), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15457), p2: PointF(251.58731, 367.15454), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15457), p2: PointF(251.58731, 367.15457), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15454), p2: PointF(251.58731, 367.15457), p3: PointF(251.58731, 367.15454)
Cubic1: p0: PointF(251.58731, 367.15454), p1: PointF(306.20532, 349.05505), p2: PointF(349.0551, 306.20526), p3: PointF(367.1546, 251.58728)
Cubic1: p0: PointF(367.1546, 251.58728), p1: PointF(367.15463, 251.58728), p2: PointF(367.15463, 251.58725), p3: PointF(367.15463, 251.58728)
Cubic1: p0: PointF(367.15463, 251.58728), p1: PointF(367.15463, 251.58728), p2: PointF(367.15463, 251.58728), p3: PointF(367.15463, 251.58728)
Cubic1: p0: PointF(367.15463, 251.58728), p1: PointF(367.15463, 251.58725), p2: PointF(367.15463, 251.58728), p3: PointF(367.1546, 251.58728)
Cubic1: p0: PointF(367.1546, 251.58728), p1: PointF(422.3015, 85.173004), p2: PointF(657.69855, 85.173004), p3: PointF(712.8454, 251.58728)
Cubic1: p0: PointF(712.8454, 251.58728), p1: PointF(712.84546, 251.58728), p2: PointF(712.84546, 251.58725), p3: PointF(712.84546, 251.58728)
Cubic1: p0: PointF(712.84546, 251.58728), p1: PointF(712.84546, 251.58731), p2: PointF(712.84546, 251.58731), p3: PointF(712.84546, 251.58737)
Cubic1: p0: PointF(712.84546, 251.58737), p1: PointF(712.84546, 251.5874), p2: PointF(712.84546, 251.58737), p3: PointF(712.84546, 251.58737)
Cubic1: p0: PointF(712.84546, 251.58737), p1: PointF(730.94495, 306.20535), p2: PointF(773.7948, 349.05518), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4127, 367.15466), p1: PointF(828.4127, 367.15466), p2: PointF(828.4127, 367.15466), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4127, 367.15466), p1: PointF(828.4127, 367.15466), p2: PointF(828.4128, 367.15466), p3: PointF(828.4128, 367.15466)
I recreated the shape using the canonical size (not providing a radius and center) and then transformed it into position and it appeared correctly.
Here is the code that creates both shapes (the one causing the problem, shape, and the canonical version without the problem, shape1):
fun Shape() {
Canvas(modifier = Modifier.fillMaxSize(1f)) {
val halfWidth = size.width * 0.5f
var radius = halfWidth * 0.75f * 2f;
val center = size.width / 2
val roundingFactor = .32f
val rounding = CornerRounding(radius * roundingFactor, .0f)
val innerRounding = CornerRounding(radius * roundingFactor, .0f)
val innerRadius = radius * 0.352f
val shape = RoundedPolygon.star(
numVerticesPerRadius = 4,
rounding = rounding,
innerRounding = innerRounding,
innerRadius = innerRadius,
radius = radius,
center = PointF(center, center)
)
val cubics = shape.toCubicShape().cubics
for (cubic in cubics) {
println("Cubic: " + cubic)
}
val shape1 = RoundedPolygon.star(4,
rounding = CornerRounding(roundingFactor),
innerRadius = .352f)
val matrix = Matrix()
matrix.setTranslate(center, center)
matrix.preScale(radius, radius)
shape1.transform(matrix)
val cubics1 = shape1.toCubicShape().cubics
for (cubic in cubics1) {
println("Cubic1: " + cubic)
}
This code produces the following set of data. You can see that the control points for the first shape are not the same as those for the second shape, and that there are extra points in the first shape.
Cubic: p0: PointF(828.4127, 367.15466), p1: PointF(851.5461, 374.82065), p2: PointF(863.1127, 378.65363), p3: PointF(828.4127, 367.15463)
Cubic: p0: PointF(828.4127, 367.15463), p1: PointF(994.8269, 422.3015), p2: PointF(994.8269, 657.6984), p3: PointF(828.4127, 712.84534)
Cubic: p0: PointF(828.4127, 712.84534), p1: PointF(1754.1299, 406.07806), p2: PointF(1445.5575, 508.33383), p3: PointF(828.4127, 712.8454)
Cubic: p0: PointF(828.4127, 712.8454), p1: PointF(828.41266, 712.84534), p2: PointF(828.4127, 712.8454), p3: PointF(828.41266, 712.8454)
Cubic: p0: PointF(828.41266, 712.8454), p1: PointF(713.2715, 751.0013), p2: PointF(655.70087, 770.0793), p3: PointF(828.41266, 712.8454)
Cubic: p0: PointF(828.41266, 712.8454), p1: PointF(773.7947, 730.9449), p2: PointF(730.9449, 773.7947), p3: PointF(712.8454, 828.41266)
Cubic: p0: PointF(712.8454, 828.41266), p1: PointF(754.74066, 701.9874), p2: PointF(740.7756, 744.12915), p3: PointF(712.8454, 828.41266)
Cubic: p0: PointF(712.8454, 828.41266), p1: PointF(712.84534, 828.41266), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic: p0: PointF(712.8454, 828.4127), p1: PointF(636.1556, 1059.8358), p2: PointF(597.8107, 1175.5472), p3: PointF(712.84534, 828.4127)
Cubic: p0: PointF(712.84534, 828.4127), p1: PointF(657.6985, 994.82684), p2: PointF(422.3015, 994.82684), p3: PointF(367.15463, 828.4127)
Cubic: p0: PointF(367.15463, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.15463, 828.4128), p3: PointF(367.1546, 828.4127)
Cubic: p0: PointF(367.1546, 828.4127), p1: PointF(367.15457, 828.41266), p2: PointF(367.15457, 828.4127), p3: PointF(367.15457, 828.41266)
Cubic: p0: PointF(367.15457, 828.41266), p1: PointF(388.4358, 892.6321), p2: PointF(399.07642, 924.74176), p3: PointF(367.15454, 828.41266)
Cubic: p0: PointF(367.15454, 828.41266), p1: PointF(349.05505, 773.7947), p2: PointF(306.20526, 730.94495), p3: PointF(251.58731, 712.84546)
Cubic: p0: PointF(251.58731, 712.84546), p1: PointF(-513.0047, 459.47217), p2: PointF(-258.1407, 543.92993), p3: PointF(251.58733, 712.8454)
Cubic: p0: PointF(251.58733, 712.8454), p1: PointF(251.5873, 712.84534), p2: PointF(251.58728, 712.8454), p3: PointF(251.58728, 712.8454)
Cubic: p0: PointF(251.58728, 712.8454), p1: PointF(451.20828, 778.9965), p2: PointF(551.0188, 812.0721), p3: PointF(251.58728, 712.84534)
Cubic: p0: PointF(251.58728, 712.84534), p1: PointF(85.17317, 657.6984), p2: PointF(85.17317, 422.30154), p3: PointF(251.58728, 367.15463)
Cubic: p0: PointF(251.58728, 367.15463), p1: PointF(324.09537, 343.12665), p2: PointF(299.926, 351.136), p3: PointF(251.58728, 367.1546)
Cubic: p0: PointF(251.58728, 367.1546), p1: PointF(251.5873, 367.15457), p2: PointF(251.58734, 367.15457), p3: PointF(251.58737, 367.15457)
Cubic: p0: PointF(251.58737, 367.15457), p1: PointF(-420.1438, 589.75507), p2: PointF(-756.0094, 701.05536), p3: PointF(251.58737, 367.15454)
Cubic: p0: PointF(251.58737, 367.15454), p1: PointF(306.20532, 349.05505), p2: PointF(349.05518, 306.20526), p3: PointF(367.15466, 251.58731)
Cubic: p0: PointF(367.15466, 251.58731), p1: PointF(378.94458, 216.00943), p2: PointF(375.01462, 227.86873), p3: PointF(367.15463, 251.58731)
Cubic: p0: PointF(367.15463, 251.58731), p1: PointF(367.15463, 251.5873), p2: PointF(367.15466, 251.58728), p3: PointF(367.15466, 251.58728)
Cubic: p0: PointF(367.15466, 251.58728), p1: PointF(411.13705, 118.863625), p2: PointF(433.12827, 52.5018), p3: PointF(367.15472, 251.5873)
Cubic: p0: PointF(367.15472, 251.5873), p1: PointF(422.30157, 85.17308), p2: PointF(657.69855, 85.17308), p3: PointF(712.8454, 251.5873)
Cubic: p0: PointF(712.8454, 251.5873), p1: PointF(686.2475, 171.32404), p2: PointF(695.11346, 198.07845), p3: PointF(712.84546, 251.58728)
Cubic: p0: PointF(712.84546, 251.58728), p1: PointF(712.84546, 251.5873), p2: PointF(712.84546, 251.58734), p3: PointF(712.84546, 251.58737)
Cubic: p0: PointF(712.84546, 251.58737), p1: PointF(740.77563, 335.87085), p2: PointF(754.7407, 378.01257), p3: PointF(712.84546, 251.58737)
Cubic: p0: PointF(712.84546, 251.58737), p1: PointF(730.94495, 306.20535), p2: PointF(773.79474, 349.0551), p3: PointF(828.4127, 367.1546)
Cubic: p0: PointF(828.4127, 367.1546), p1: PointF(828.4127, 367.15463), p2: PointF(828.4128, 367.15463), p3: PointF(828.4127, 367.15463)
Cubic: p0: PointF(828.4127, 367.15463), p1: PointF(828.41266, 367.15463), p2: PointF(828.4127, 367.15466), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4128, 367.15466), p1: PointF(828.4128, 367.15466), p2: PointF(828.4128, 367.15466), p3: PointF(828.4128, 367.15466)
Cubic1: p0: PointF(828.4128, 367.15466), p1: PointF(994.8269, 422.30157), p2: PointF(994.8269, 657.6985), p3: PointF(828.4128, 712.8454)
Cubic1: p0: PointF(828.4128, 712.8454), p1: PointF(828.4128, 712.84534), p2: PointF(828.4128, 712.84534), p3: PointF(828.4128, 712.84534)
Cubic1: p0: PointF(828.4128, 712.84534), p1: PointF(828.4127, 712.8454), p2: PointF(828.4127, 712.8454), p3: PointF(828.4127, 712.8454)
Cubic1: p0: PointF(828.4127, 712.8454), p1: PointF(828.4127, 712.8454), p2: PointF(828.4127, 712.8454), p3: PointF(828.4127, 712.8454)
Cubic1: p0: PointF(828.4127, 712.8454), p1: PointF(773.7947, 730.9449), p2: PointF(730.9449, 773.7947), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(712.8454, 828.4127), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(712.8454, 828.4127), p2: PointF(712.8454, 828.4127), p3: PointF(712.8454, 828.4127)
Cubic1: p0: PointF(712.8454, 828.4127), p1: PointF(657.6985, 994.827), p2: PointF(422.3015, 994.827), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.1546, 828.4127), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(367.1546, 828.4127), p2: PointF(367.1546, 828.4127), p3: PointF(367.1546, 828.4127)
Cubic1: p0: PointF(367.1546, 828.4127), p1: PointF(349.0551, 773.7947), p2: PointF(306.20532, 730.9449), p3: PointF(251.58731, 712.8454)
Cubic1: p0: PointF(251.58731, 712.8454), p1: PointF(251.58731, 712.8454), p2: PointF(251.58731, 712.8454), p3: PointF(251.58731, 712.8454)
Cubic1: p0: PointF(251.58731, 712.8454), p1: PointF(251.58731, 712.8454), p2: PointF(251.58731, 712.8454), p3: PointF(251.58728, 712.8454)
Cubic1: p0: PointF(251.58728, 712.8454), p1: PointF(251.58725, 712.8454), p2: PointF(251.58728, 712.8454), p3: PointF(251.58728, 712.84534)
Cubic1: p0: PointF(251.58728, 712.84534), p1: PointF(85.173065, 657.6984), p2: PointF(85.17313, 422.30145), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15457), p2: PointF(251.58731, 367.15454), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15457), p2: PointF(251.58731, 367.15457), p3: PointF(251.58731, 367.15457)
Cubic1: p0: PointF(251.58731, 367.15457), p1: PointF(251.58731, 367.15454), p2: PointF(251.58731, 367.15457), p3: PointF(251.58731, 367.15454)
Cubic1: p0: PointF(251.58731, 367.15454), p1: PointF(306.20532, 349.05505), p2: PointF(349.0551, 306.20526), p3: PointF(367.1546, 251.58728)
Cubic1: p0: PointF(367.1546, 251.58728), p1: PointF(367.15463, 251.58728), p2: PointF(367.15463, 251.58725), p3: PointF(367.15463, 251.58728)
Cubic1: p0: PointF(367.15463, 251.58728), p1: PointF(367.15463, 251.58728), p2: PointF(367.15463, 251.58728), p3: PointF(367.15463, 251.58728)
Cubic1: p0: PointF(367.15463, 251.58728), p1: PointF(367.15463, 251.58725), p2: PointF(367.15463, 251.58728), p3: PointF(367.1546, 251.58728)
Cubic1: p0: PointF(367.1546, 251.58728), p1: PointF(422.3015, 85.173004), p2: PointF(657.69855, 85.173004), p3: PointF(712.8454, 251.58728)
Cubic1: p0: PointF(712.8454, 251.58728), p1: PointF(712.84546, 251.58728), p2: PointF(712.84546, 251.58725), p3: PointF(712.84546, 251.58728)
Cubic1: p0: PointF(712.84546, 251.58728), p1: PointF(712.84546, 251.58731), p2: PointF(712.84546, 251.58731), p3: PointF(712.84546, 251.58737)
Cubic1: p0: PointF(712.84546, 251.58737), p1: PointF(712.84546, 251.5874), p2: PointF(712.84546, 251.58737), p3: PointF(712.84546, 251.58737)
Cubic1: p0: PointF(712.84546, 251.58737), p1: PointF(730.94495, 306.20535), p2: PointF(773.7948, 349.05518), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4127, 367.15466), p1: PointF(828.4127, 367.15466), p2: PointF(828.4127, 367.15466), p3: PointF(828.4127, 367.15466)
Cubic1: p0: PointF(828.4127, 367.15466), p1: PointF(828.4127, 367.15466), p2: PointF(828.4128, 367.15466), p3: PointF(828.4128, 367.15466)
ch...@google.com <ch...@google.com> #5
Over to Sergio, since you have more working familiarity with the corner-shaping/cutting code where the problem (I believe) lies.
I would look specifically for code that assumes either the canonical size or a default center of (0,0)
I would look specifically for code that assumes either the canonical size or a default center of (0,0)
ap...@google.com <ap...@google.com> #6
Project: platform/frameworks/support
Branch: androidx-main
commit b2312d641b7cbdc3c3e9028fce6dcbc5d7bf9052
Author: Sergio Sancho <ssancho@google.com>
Date: Mon Dec 04 18:08:16 2023
Ensure creating shapes at different sizes is equivalent.
Since we had an absolute epsilon for checking when something is close to
0, when the values where bigger there was fewer of them meeting the
threshold than they should be. Now we check the relative value.
Relnote: "Fixed bug when creating big shapes."
Bug:http://b/313497325
Test: Added
Change-Id: I4fd6696643cc3725425cf7b55536a1242fa896c6
M graphics/graphics-shapes/src/androidInstrumentedTest/kotlin/androidx/graphics/shapes/RoundedPolygonTest.kt
M graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt
https://android-review.googlesource.com/2856631
Branch: androidx-main
commit b2312d641b7cbdc3c3e9028fce6dcbc5d7bf9052
Author: Sergio Sancho <ssancho@google.com>
Date: Mon Dec 04 18:08:16 2023
Ensure creating shapes at different sizes is equivalent.
Since we had an absolute epsilon for checking when something is close to
0, when the values where bigger there was fewer of them meeting the
threshold than they should be. Now we check the relative value.
Relnote: "Fixed bug when creating big shapes."
Bug:
Test: Added
Change-Id: I4fd6696643cc3725425cf7b55536a1242fa896c6
M graphics/graphics-shapes/src/androidInstrumentedTest/kotlin/androidx/graphics/shapes/RoundedPolygonTest.kt
M graphics/graphics-shapes/src/commonMain/kotlin/androidx/graphics/shapes/RoundedPolygon.kt
Description
Sample code which reproduces the problem in a Compose app:
Canvas(modifier = modifier) {
val halfWidth = size.width * 0.5f
var radius = halfWidth * 0.75f
val center = size.width / 2
radius = radius * 2f;
val pentagonal2Star = RoundedPolygon.star(
numVerticesPerRadius = 4,
rounding = CornerRounding(radius * 0.32f, .0f),
innerRounding = CornerRounding(radius * 0.32f, .0f),
innerRadius = radius*0.352f,
radius = radius,
center = PointF(center, center)
)
drawPath(
pentagonal2Star.toPath().asComposePath(),
Color(0xFF838FE4),style = Stroke(),
)