From 0570dbb774d079f57ebf99d221ccde51eb3acb48 Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Tue, 30 Sep 2025 15:26:59 +0800 Subject: [PATCH] Update --- .../Components/GlassBackgroundComponent/BUILD | 1 + .../Sources/GlassBackgroundComponent.swift | 77 +++++++++++------- .../GlassEdge40x40.imageset/Contents.json | 12 +++ .../GlassEdge40x40.imageset/iOS 28.pdf | Bin 0 -> 49799 bytes 4 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/Contents.json create mode 100644 submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/iOS 28.pdf diff --git a/submodules/TelegramUI/Components/GlassBackgroundComponent/BUILD b/submodules/TelegramUI/Components/GlassBackgroundComponent/BUILD index 54cc2f8764..216445b25f 100644 --- a/submodules/TelegramUI/Components/GlassBackgroundComponent/BUILD +++ b/submodules/TelegramUI/Components/GlassBackgroundComponent/BUILD @@ -14,6 +14,7 @@ swift_library( "//submodules/ComponentFlow", "//submodules/Components/ComponentDisplayAdapters", "//submodules/UIKitRuntimeUtils", + "//submodules/AppBundle", ], visibility = [ "//visibility:public", diff --git a/submodules/TelegramUI/Components/GlassBackgroundComponent/Sources/GlassBackgroundComponent.swift b/submodules/TelegramUI/Components/GlassBackgroundComponent/Sources/GlassBackgroundComponent.swift index 6cbdb2bd03..734f6f916a 100644 --- a/submodules/TelegramUI/Components/GlassBackgroundComponent/Sources/GlassBackgroundComponent.swift +++ b/submodules/TelegramUI/Components/GlassBackgroundComponent/Sources/GlassBackgroundComponent.swift @@ -5,6 +5,7 @@ import ComponentFlow import ComponentDisplayAdapters import UIKitRuntimeUtils import CoreImage +import AppBundle private final class ContentContainer: UIView { private let maskContentView: UIView @@ -689,39 +690,59 @@ public extension GlassBackgroundView { addShadow(context, true, CGPoint(), 10.0, 0.0, UIColor(white: 0.0, alpha: 0.06), .normal) addShadow(context, true, CGPoint(), 20.0, 0.0, UIColor(white: 0.0, alpha: 0.06), .normal) - let innerImage = UIGraphicsImageRenderer(size: size).image { ctx in - let context = ctx.cgContext - - context.setFillColor(fillColor.cgColor) - context.fill(CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset).insetBy(dx: 0.1, dy: 0.1)) - - var a: CGFloat = 0.0 - var b: CGFloat = 0.0 - var s: CGFloat = 0.0 - fillColor.getHue(nil, saturation: &s, brightness: &b, alpha: &a) - - addShadow(context, true, CGPoint(x: 0.0, y: 0.0), 20.0, 0.0, UIColor(white: 0.0, alpha: 0.04), .normal) - addShadow(context, true, CGPoint(x: 0.0, y: 0.0), 5.0, 0.0, UIColor(white: 0.0, alpha: 0.04), .normal) - - if s <= 0.3 && !isDark { - addShadow(context, false, CGPoint(x: 0.0, y: 0.0), 8.0, 0.0, UIColor(white: 0.0, alpha: 0.4), .overlay) + var a: CGFloat = 0.0 + var b: CGFloat = 0.0 + var s: CGFloat = 0.0 + fillColor.getHue(nil, saturation: &s, brightness: &b, alpha: &a) + + let innerImage: UIImage + if size == CGSize(width: 40.0 + inset * 2.0, height: 40.0 + inset * 2.0) { + innerImage = UIGraphicsImageRenderer(size: size).image { ctx in + let context = ctx.cgContext - let edgeAlpha: CGFloat = max(0.8, min(1.0, a)) + context.setFillColor(fillColor.cgColor) + context.fill(CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset).insetBy(dx: 0.1, dy: 0.1)) - for _ in 0 ..< 2 { - addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 0.8, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) - addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 0.8, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + if let image = UIImage(bundleImageName: "Item List/GlassEdge40x40") { + if s <= 0.3 && !isDark { + image.draw(in: CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset), blendMode: .normal, alpha: 0.7) + } else if b >= 0.2 { + image.draw(in: CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset), blendMode: .plusLighter, alpha: 0.7) + } else { + image.draw(in: CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset), blendMode: .normal, alpha: 0.5) + } } - } else if b >= 0.2 { - let edgeAlpha: CGFloat = max(0.2, min(isDark ? 0.7 : 0.7, a * a * a)) + } + } else { + innerImage = UIGraphicsImageRenderer(size: size).image { ctx in + let context = ctx.cgContext - addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 0.5, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .plusLighter) - addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 0.5, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .plusLighter) - } else { - let edgeAlpha: CGFloat = max(0.4, min(1.0, a * a * a)) + context.setFillColor(fillColor.cgColor) + context.fill(CGRect(origin: CGPoint(), size: size).insetBy(dx: inset, dy: inset).insetBy(dx: 0.1, dy: 0.1)) - addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 1.2, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) - addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 1.2, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + addShadow(context, true, CGPoint(x: 0.0, y: 0.0), 20.0, 0.0, UIColor(white: 0.0, alpha: 0.04), .normal) + addShadow(context, true, CGPoint(x: 0.0, y: 0.0), 5.0, 0.0, UIColor(white: 0.0, alpha: 0.04), .normal) + + if s <= 0.3 && !isDark { + addShadow(context, false, CGPoint(x: 0.0, y: 0.0), 8.0, 0.0, UIColor(white: 0.0, alpha: 0.4), .overlay) + + let edgeAlpha: CGFloat = max(0.8, min(1.0, a)) + + for _ in 0 ..< 2 { + addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 0.8, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 0.8, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + } + } else if b >= 0.2 { + let edgeAlpha: CGFloat = max(0.2, min(isDark ? 0.7 : 0.7, a * a * a)) + + addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 0.5, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .plusLighter) + addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 0.5, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .plusLighter) + } else { + let edgeAlpha: CGFloat = max(0.4, min(1.0, a * a * a)) + + addShadow(context, false, CGPoint(x: -0.64, y: -0.64), 1.2, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + addShadow(context, false, CGPoint(x: 0.64, y: 0.64), 1.2, 0.0, UIColor(white: 1.0, alpha: edgeAlpha), .normal) + } } } diff --git a/submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/Contents.json b/submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/Contents.json new file mode 100644 index 0000000000..2e0d6e19f6 --- /dev/null +++ b/submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "iOS 28.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/iOS 28.pdf b/submodules/TelegramUI/Images.xcassets/Item List/GlassEdge40x40.imageset/iOS 28.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b6d25b544a6dab48b954d1c25c7a7af800a17fdf GIT binary patch literal 49799 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 O2r5p