diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_0deg.png new file mode 100644 index 00000000..e40e1f4d Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_15deg.png new file mode 100644 index 00000000..40a1a14e Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_180deg.png new file mode 100644 index 00000000..b213faa6 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_45deg.png new file mode 100644 index 00000000..eb692760 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_90deg.png new file mode 100644 index 00000000..df0df50c Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[28]_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_0deg.png new file mode 100644 index 00000000..67626bff Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_15deg.png new file mode 100644 index 00000000..41d46acc Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_180deg.png new file mode 100644 index 00000000..3453239c Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_45deg.png new file mode 100644 index 00000000..0b7ae40b Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_90deg.png new file mode 100644 index 00000000..2d0240cb Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation[32]_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_0deg.png new file mode 100644 index 00000000..4cadada0 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_15deg.png new file mode 100644 index 00000000..75beea37 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_180deg.png new file mode 100644 index 00000000..671e14d5 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_45deg.png new file mode 100644 index 00000000..5e0d5bb0 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_90deg.png new file mode 100644 index 00000000..3a05e73e Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_0deg.png new file mode 100644 index 00000000..e40e1f4d Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_15deg.png new file mode 100644 index 00000000..40a1a14e Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_180deg.png new file mode 100644 index 00000000..b213faa6 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_45deg.png new file mode 100644 index 00000000..eb692760 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_90deg.png new file mode 100644 index 00000000..df0df50c Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[28]_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_0deg.png new file mode 100644 index 00000000..67626bff Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_15deg.png new file mode 100644 index 00000000..41d46acc Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_180deg.png new file mode 100644 index 00000000..3453239c Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_45deg.png new file mode 100644 index 00000000..0b7ae40b Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_90deg.png new file mode 100644 index 00000000..2d0240cb Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy[32]_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png new file mode 100644 index 00000000..4cadada0 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png new file mode 100644 index 00000000..75beea37 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png new file mode 100644 index 00000000..671e14d5 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png new file mode 100644 index 00000000..5e0d5bb0 Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png new file mode 100644 index 00000000..3a05e73e Binary files /dev/null and b/haze-screenshot-tests/screenshots/android/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_0deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_0deg.png new file mode 100644 index 00000000..f7d4294e Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_15deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_15deg.png new file mode 100644 index 00000000..afb65c8e Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_180deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_180deg.png new file mode 100644 index 00000000..f0d5e69a Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_45deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_45deg.png new file mode 100644 index 00000000..1e738332 Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_90deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_90deg.png new file mode 100644 index 00000000..713601e5 Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_90deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png new file mode 100644 index 00000000..f7d4294e Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_0deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png new file mode 100644 index 00000000..afb65c8e Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_15deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png new file mode 100644 index 00000000..f0d5e69a Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_180deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png new file mode 100644 index 00000000..1e738332 Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_45deg.png differ diff --git a/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png new file mode 100644 index 00000000..713601e5 Binary files /dev/null and b/haze-screenshot-tests/screenshots/desktop/HazeScreenshotTest.parentRotation_screenStrategy_90deg.png differ diff --git a/haze-screenshot-tests/src/commonMain/kotlin/dev/chrisbanes/haze/ScreenshotTestContent.kt b/haze-screenshot-tests/src/commonMain/kotlin/dev/chrisbanes/haze/ScreenshotTestContent.kt index 77b9d603..c0986753 100644 --- a/haze-screenshot-tests/src/commonMain/kotlin/dev/chrisbanes/haze/ScreenshotTestContent.kt +++ b/haze-screenshot-tests/src/commonMain/kotlin/dev/chrisbanes/haze/ScreenshotTestContent.kt @@ -10,6 +10,7 @@ import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding @@ -285,6 +286,73 @@ fun ContentAtEdges(visualEffect: BlurVisualEffect) { } } +/** + * Test content for issue #717: verifies that haze effect follows a parent's graphicsLayer rotation. + * Both the hazeSource and hazeEffect are inside the same rotated parent. + */ +@Composable +fun ParentRotatedContent( + visualEffect: BlurVisualEffect, + rotationZ: Float = 0f, + positionStrategy: HazePositionStrategy = HazePositionStrategy.Auto, +) { + val hazeState = rememberHazeState(positionStrategy = positionStrategy) + + Box(modifier = Modifier.fillMaxSize()) { + // Background gradient as a haze source (not rotated) + Spacer( + modifier = Modifier + .hazeSource(hazeState) + .fillMaxSize() + .background( + brush = Brush.verticalGradient( + colors = listOf(Color.Red, Color.Cyan, Color.Blue, Color.Magenta, Color.Red), + ), + ), + ) + + // A card-like container with graphicsLayer transforms applied to the PARENT, + // wrapping both an image (hazeSource) and a text overlay (hazeEffect). + Box( + modifier = Modifier + .align(Alignment.Center) + .graphicsLayer { + this.rotationZ = rotationZ + scaleX = 1.25f + scaleY = 1.25f + } + .size(width = 250.dp, height = 350.dp) + .clip(RoundedCornerShape(16.dp)), + ) { + Image( + painter = painterResource(Res.drawable.photo), + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .hazeSource(hazeState) + .fillMaxSize(), + ) + + Box( + modifier = Modifier + .align(Alignment.BottomCenter) + .fillMaxWidth() + .height(80.dp) + .hazeEffect(state = hazeState) { + this.visualEffect = visualEffect + }, + ) { + Text( + text = "Haze", + color = Color.White, + style = MaterialTheme.typography.headlineSmall, + modifier = Modifier.align(Alignment.Center), + ) + } + } + } +} + internal val LoremIpsum by lazy { """ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras sit amet congue mauris, iaculis accumsan eros. Aliquam pulvinar est ac elit vulputate egestas. Vestibulum consequat libero at sem varius, vitae semper urna rhoncus. Aliquam mollis, ipsum a convallis scelerisque, sem dui consequat leo, in tempor risus est ac mi. Nam vel tellus dolor. Nunc lobortis bibendum fermentum. Mauris sed mollis justo, eu tristique elit. Cras semper augue a tortor tempor, vitae vestibulum eros convallis. Curabitur id justo eget tortor iaculis lobortis. Integer pharetra augue ac elit porta iaculis non vitae libero. Nam eros turpis, suscipit at iaculis vitae, malesuada vel arcu. Donec tincidunt porttitor iaculis. Pellentesque non augue magna. Mauris mattis purus vitae mi maximus, id molestie ipsum facilisis. Donec bibendum gravida dolor nec suscipit. Pellentesque tempus felis iaculis, porta diam sed, tristique tortor. diff --git a/haze-screenshot-tests/src/commonTest/kotlin/dev/chrisbanes/haze/HazeScreenshotTest.kt b/haze-screenshot-tests/src/commonTest/kotlin/dev/chrisbanes/haze/HazeScreenshotTest.kt index 76b423d7..546dd2ed 100644 --- a/haze-screenshot-tests/src/commonTest/kotlin/dev/chrisbanes/haze/HazeScreenshotTest.kt +++ b/haze-screenshot-tests/src/commonTest/kotlin/dev/chrisbanes/haze/HazeScreenshotTest.kt @@ -689,6 +689,59 @@ class HazeScreenshotTest : ScreenshotTest() { captureRoot("bottom") } + /** + * Test for issue #717: verifies haze effect follows a parent's graphicsLayer rotation + * using [HazePositionStrategy.Local]. + */ + @Test + fun parentRotation() { + parentRotationTest(HazePositionStrategy.Local) + } + + /** + * Same as [parentRotation] but using [HazePositionStrategy.Screen] to compare behavior. + */ + @Test + fun parentRotation_screenStrategy() { + parentRotationTest(HazePositionStrategy.Screen) + } + + private fun parentRotationTest(positionStrategy: HazePositionStrategy) = runScreenshotTest { + var rotationZ by mutableStateOf(0f) + val blurVisualEffect = BlurVisualEffect().apply { + colorEffects = listOf(DefaultTint) + blurRadius = 8.dp + } + + setContent { + ScreenshotTheme { + ParentRotatedContent( + visualEffect = blurVisualEffect, + rotationZ = rotationZ, + positionStrategy = positionStrategy, + ) + } + } + + captureRoot("0deg") + + rotationZ = 15f + waitForIdle() + captureRoot("15deg") + + rotationZ = 45f + waitForIdle() + captureRoot("45deg") + + rotationZ = 90f + waitForIdle() + captureRoot("90deg") + + rotationZ = 180f + waitForIdle() + captureRoot("180deg") + } + @Test fun edges() = runScreenshotTest { val blurVisualEffect = BlurVisualEffect().apply {