mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-02 00:17:02 +00:00
Merge wallpaper background
This commit is contained in:
parent
c63b57a062
commit
b661a01474
@ -18,7 +18,7 @@ import HierarchyTrackingLayer
|
|||||||
|
|
||||||
private let motionAmount: CGFloat = 32.0
|
private let motionAmount: CGFloat = 32.0
|
||||||
|
|
||||||
private func generateBlurredContents(image: UIImage) -> UIImage? {
|
private func generateBlurredContents(image: UIImage, dimColor: UIColor?) -> UIImage? {
|
||||||
let size = image.size.aspectFitted(CGSize(width: 64.0, height: 64.0))
|
let size = image.size.aspectFitted(CGSize(width: 64.0, height: 64.0))
|
||||||
guard let context = DrawingContext(size: size, scale: 1.0, opaque: true, clear: false) else {
|
guard let context = DrawingContext(size: size, scale: 1.0, opaque: true, clear: false) else {
|
||||||
return nil
|
return nil
|
||||||
@ -31,6 +31,13 @@ private func generateBlurredContents(image: UIImage) -> UIImage? {
|
|||||||
telegramFastBlurMore(Int32(context.size.width), Int32(context.size.height), Int32(context.bytesPerRow), context.bytes)
|
telegramFastBlurMore(Int32(context.size.width), Int32(context.size.height), Int32(context.bytesPerRow), context.bytes)
|
||||||
|
|
||||||
adjustSaturationInContext(context: context, saturation: 1.7)
|
adjustSaturationInContext(context: context, saturation: 1.7)
|
||||||
|
|
||||||
|
if let dimColor {
|
||||||
|
context.withFlippedContext { c in
|
||||||
|
c.setFillColor(dimColor.cgColor)
|
||||||
|
c.fill(CGRect(origin: CGPoint(), size: size))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return context.generateImage()
|
return context.generateImage()
|
||||||
}
|
}
|
||||||
@ -323,6 +330,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
|
|
||||||
private var cleanWallpaperNode: ASDisplayNode?
|
private var cleanWallpaperNode: ASDisplayNode?
|
||||||
private var gradientWallpaperNode: GradientBackgroundNode.CloneNode?
|
private var gradientWallpaperNode: GradientBackgroundNode.CloneNode?
|
||||||
|
private var overlayNode: ASDisplayNode?
|
||||||
private weak var backgroundNode: WallpaperBackgroundNodeImpl?
|
private weak var backgroundNode: WallpaperBackgroundNodeImpl?
|
||||||
private var index: SparseBag<BubbleBackgroundNodeImpl>.Index?
|
private var index: SparseBag<BubbleBackgroundNodeImpl>.Index?
|
||||||
|
|
||||||
@ -369,11 +377,14 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
guard let backgroundNode = self.backgroundNode else {
|
guard let backgroundNode = self.backgroundNode else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var overlayColor: UIColor?
|
||||||
|
|
||||||
if let bubbleTheme = backgroundNode.bubbleTheme, let bubbleCorners = backgroundNode.bubbleCorners {
|
if let bubbleTheme = backgroundNode.bubbleTheme, let bubbleCorners = backgroundNode.bubbleCorners {
|
||||||
let wallpaper = backgroundNode.wallpaper ?? bubbleTheme.chat.defaultWallpaper
|
let wallpaper = backgroundNode.wallpaper ?? bubbleTheme.chat.defaultWallpaper
|
||||||
|
|
||||||
let graphics = PresentationResourcesChat.principalGraphics(theme: bubbleTheme, wallpaper: wallpaper, bubbleCorners: bubbleCorners)
|
let graphics = PresentationResourcesChat.principalGraphics(theme: bubbleTheme, wallpaper: wallpaper, bubbleCorners: bubbleCorners)
|
||||||
|
|
||||||
var needsCleanBackground = false
|
var needsCleanBackground = false
|
||||||
switch self.bubbleType {
|
switch self.bubbleType {
|
||||||
case .incoming:
|
case .incoming:
|
||||||
@ -401,6 +412,10 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
self.contentNode.image = nil
|
self.contentNode.image = nil
|
||||||
self.contentNode.backgroundColor = nil
|
self.contentNode.backgroundColor = nil
|
||||||
needsCleanBackground = true
|
needsCleanBackground = true
|
||||||
|
|
||||||
|
if wallpaper.isBuiltin {
|
||||||
|
overlayColor = selectDateFillStaticColor(theme: bubbleTheme, wallpaper: wallpaper)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var isInvertedGradient = false
|
var isInvertedGradient = false
|
||||||
@ -490,6 +505,21 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
cleanWallpaperNode.removeFromSupernode()
|
cleanWallpaperNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let overlayColor {
|
||||||
|
let overlayNode: ASDisplayNode
|
||||||
|
if let current = self.overlayNode {
|
||||||
|
overlayNode = current
|
||||||
|
} else {
|
||||||
|
overlayNode = ASDisplayNode()
|
||||||
|
self.overlayNode = overlayNode
|
||||||
|
self.addSubnode(overlayNode)
|
||||||
|
}
|
||||||
|
overlayNode.backgroundColor = overlayColor
|
||||||
|
} else if let overlayNode = self.overlayNode {
|
||||||
|
self.overlayNode = nil
|
||||||
|
overlayNode.removeFromSupernode()
|
||||||
|
}
|
||||||
|
|
||||||
if let (rect, containerSize) = self.currentLayout {
|
if let (rect, containerSize) = self.currentLayout {
|
||||||
self.update(rect: rect, within: containerSize)
|
self.update(rect: rect, within: containerSize)
|
||||||
@ -521,6 +551,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
|
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let overlayNode = self.overlayNode {
|
||||||
|
transition.updateFrame(layer: overlayNode.layer, frame: self.bounds, delay: delay)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func update(rect: CGRect, within containerSize: CGSize, animator: ControlledTransitionAnimator) {
|
func update(rect: CGRect, within containerSize: CGSize, animator: ControlledTransitionAnimator) {
|
||||||
@ -538,6 +571,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
animator.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds, completion: nil)
|
animator.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds, completion: nil)
|
||||||
animator.updateContentsRect(layer: gradientWallpaperNode.layer, contentsRect: shiftedContentsRect, completion: nil)
|
animator.updateContentsRect(layer: gradientWallpaperNode.layer, contentsRect: shiftedContentsRect, completion: nil)
|
||||||
}
|
}
|
||||||
|
if let overlayNode = self.overlayNode {
|
||||||
|
animator.updateFrame(layer: overlayNode.layer, frame: self.bounds, completion: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func update(rect: CGRect, within containerSize: CGSize, transition: CombinedTransition) {
|
func update(rect: CGRect, within containerSize: CGSize, transition: CombinedTransition) {
|
||||||
@ -555,6 +591,9 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
transition.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds)
|
transition.updateFrame(layer: gradientWallpaperNode.layer, frame: self.bounds)
|
||||||
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
|
gradientWallpaperNode.layer.contentsRect = shiftedContentsRect
|
||||||
}
|
}
|
||||||
|
if let overlayNode = self.overlayNode {
|
||||||
|
transition.updateFrame(layer: overlayNode.layer, frame: self.bounds)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) {
|
func offset(value: CGPoint, animationCurve: ContainedViewLayoutTransitionCurve, duration: Double) {
|
||||||
@ -856,6 +895,8 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
|
|
||||||
var gradientColors: [UInt32] = []
|
var gradientColors: [UInt32] = []
|
||||||
var gradientAngle: Int32 = 0
|
var gradientAngle: Int32 = 0
|
||||||
|
|
||||||
|
let wallpaperDimColor: UIColor? = nil
|
||||||
|
|
||||||
if case let .color(color) = wallpaper {
|
if case let .color(color) = wallpaper {
|
||||||
gradientColors = [color]
|
gradientColors = [color]
|
||||||
@ -955,7 +996,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
self.contentNode.backgroundColor = .white
|
self.contentNode.backgroundColor = .white
|
||||||
if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, knockoutMode: false) {
|
if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.sharedContext.accountManager.mediaBox, knockoutMode: false) {
|
||||||
self.contentNode.contents = image.cgImage
|
self.contentNode.contents = image.cgImage
|
||||||
self.blurredBackgroundContents = generateBlurredContents(image: image)
|
self.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: nil)
|
||||||
self.blurredBackgroundContentView?.image = self.blurredBackgroundContents
|
self.blurredBackgroundContentView?.image = self.blurredBackgroundContents
|
||||||
self.wallpaperDisposable.set(nil)
|
self.wallpaperDisposable.set(nil)
|
||||||
Queue.mainQueue().justDispatch {
|
Queue.mainQueue().justDispatch {
|
||||||
@ -963,7 +1004,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
}
|
}
|
||||||
} else if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.account.postbox.mediaBox, knockoutMode: false) {
|
} else if let image = chatControllerBackgroundImage(theme: nil, wallpaper: wallpaper, mediaBox: self.context.account.postbox.mediaBox, knockoutMode: false) {
|
||||||
self.contentNode.contents = image.cgImage
|
self.contentNode.contents = image.cgImage
|
||||||
self.blurredBackgroundContents = generateBlurredContents(image: image)
|
self.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: nil)
|
||||||
self.blurredBackgroundContentView?.image = self.blurredBackgroundContents
|
self.blurredBackgroundContentView?.image = self.blurredBackgroundContents
|
||||||
self.wallpaperDisposable.set(nil)
|
self.wallpaperDisposable.set(nil)
|
||||||
Queue.mainQueue().justDispatch {
|
Queue.mainQueue().justDispatch {
|
||||||
@ -977,7 +1018,7 @@ final class WallpaperBackgroundNodeImpl: ASDisplayNode, WallpaperBackgroundNode
|
|||||||
}
|
}
|
||||||
strongSelf.contentNode.contents = image?.0?.cgImage
|
strongSelf.contentNode.contents = image?.0?.cgImage
|
||||||
if let image = image?.0 {
|
if let image = image?.0 {
|
||||||
strongSelf.blurredBackgroundContents = generateBlurredContents(image: image)
|
strongSelf.blurredBackgroundContents = generateBlurredContents(image: image, dimColor: wallpaperDimColor)
|
||||||
} else {
|
} else {
|
||||||
strongSelf.blurredBackgroundContents = nil
|
strongSelf.blurredBackgroundContents = nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user