mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Emoji UI improvements
This commit is contained in:
parent
52c60a3f0d
commit
b92d21f9d7
33 changed files with 318 additions and 123 deletions
|
|
@ -252,6 +252,15 @@ public final class DefaultAnimatedStickerNodeImpl: ASDisplayNode, AnimatedSticke
|
|||
private var overlayColor: (UIColor?, Bool)? = nil
|
||||
private var size: CGSize?
|
||||
|
||||
public var dynamicColor: UIColor? {
|
||||
didSet {
|
||||
if let renderer = self.renderer?.renderer as? SoftwareAnimationRenderer {
|
||||
renderer.renderAsTemplateImage = self.dynamicColor != nil
|
||||
}
|
||||
self.renderer?.renderer.view.tintColor = self.dynamicColor
|
||||
}
|
||||
}
|
||||
|
||||
public init(useMetalCache: Bool = false) {
|
||||
self.queue = sharedQueue
|
||||
self.eventsNode = AnimatedStickerNodeDisplayEvents()
|
||||
|
|
@ -279,12 +288,12 @@ public final class DefaultAnimatedStickerNodeImpl: ASDisplayNode, AnimatedSticke
|
|||
if #available(iOS 10.0, *) {
|
||||
return CompressedAnimationRenderer()
|
||||
} else {
|
||||
return SoftwareAnimationRenderer()
|
||||
return SoftwareAnimationRenderer(templateImageSupport: true)
|
||||
}
|
||||
})
|
||||
|
||||
private static let softwareRendererPool = AnimationRendererPool(generate: {
|
||||
return SoftwareAnimationRenderer()
|
||||
return SoftwareAnimationRenderer(templateImageSupport: true)
|
||||
})
|
||||
|
||||
private weak var nodeToCopyFrameFrom: DefaultAnimatedStickerNodeImpl?
|
||||
|
|
@ -295,6 +304,12 @@ public final class DefaultAnimatedStickerNodeImpl: ASDisplayNode, AnimatedSticke
|
|||
self.renderer = DefaultAnimatedStickerNodeImpl.hardwareRendererPool.take()
|
||||
} else {
|
||||
self.renderer = DefaultAnimatedStickerNodeImpl.softwareRendererPool.take()
|
||||
|
||||
if let renderer = self.renderer?.renderer as? SoftwareAnimationRenderer {
|
||||
renderer.renderAsTemplateImage = self.dynamicColor != nil
|
||||
}
|
||||
self.renderer?.renderer.view.tintColor = self.dynamicColor
|
||||
|
||||
if let contents = self.nodeToCopyFrameFrom?.renderer?.renderer.contents {
|
||||
self.renderer?.renderer.contents = contents
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,20 +7,30 @@ import YuvConversion
|
|||
import Accelerate
|
||||
|
||||
final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
||||
private let templateImageSupport: Bool
|
||||
|
||||
private var highlightedContentNode: ASDisplayNode?
|
||||
private var highlightedColor: UIColor?
|
||||
private var highlightReplacesContent = false
|
||||
public var renderAsTemplateImage: Bool = false
|
||||
|
||||
public var currentFrameImage: UIImage? {
|
||||
if let contents = self.contents {
|
||||
return UIImage(cgImage: contents as! CGImage)
|
||||
} else {
|
||||
return nil
|
||||
public private(set) var currentFrameImage: UIImage?
|
||||
|
||||
init(templateImageSupport: Bool) {
|
||||
self.templateImageSupport = templateImageSupport
|
||||
|
||||
super.init()
|
||||
|
||||
if templateImageSupport {
|
||||
self.setViewBlock({
|
||||
return UIImageView()
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func render(queue: Queue, width: Int, height: Int, bytesPerRow: Int, data: Data, type: AnimationRendererFrameType, mulAlpha: Bool, completion: @escaping () -> Void) {
|
||||
assert(bytesPerRow > 0)
|
||||
let renderAsTemplateImage = self.renderAsTemplateImage
|
||||
queue.async { [weak self] in
|
||||
switch type {
|
||||
case .argb:
|
||||
|
|
@ -70,13 +80,21 @@ final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||
break
|
||||
}
|
||||
})
|
||||
if renderAsTemplateImage {
|
||||
image = image?.withRenderingMode(.alwaysTemplate)
|
||||
}
|
||||
}
|
||||
|
||||
Queue.mainQueue().async {
|
||||
guard let strongSelf = self else {
|
||||
return
|
||||
}
|
||||
strongSelf.contents = image?.cgImage
|
||||
strongSelf.currentFrameImage = image
|
||||
if strongSelf.templateImageSupport {
|
||||
(strongSelf.view as? UIImageView)?.image = image
|
||||
} else {
|
||||
strongSelf.contents = image?.cgImage
|
||||
}
|
||||
strongSelf.updateHighlightedContentNode()
|
||||
if strongSelf.highlightedContentNode?.frame != strongSelf.bounds {
|
||||
strongSelf.highlightedContentNode?.frame = strongSelf.bounds
|
||||
|
|
@ -90,12 +108,14 @@ final class SoftwareAnimationRenderer: ASDisplayNode, AnimationRenderer {
|
|||
guard let highlightedContentNode = self.highlightedContentNode, let highlightedColor = self.highlightedColor else {
|
||||
return
|
||||
}
|
||||
if let contents = self.contents, CFGetTypeID(contents as CFTypeRef) == CGImage.typeID {
|
||||
(highlightedContentNode.view as! UIImageView).image = UIImage(cgImage: contents as! CGImage).withRenderingMode(.alwaysTemplate)
|
||||
}
|
||||
(highlightedContentNode.view as! UIImageView).image = self.currentFrameImage?.withRenderingMode(.alwaysTemplate)
|
||||
highlightedContentNode.tintColor = highlightedColor
|
||||
if self.highlightReplacesContent {
|
||||
self.contents = nil
|
||||
if self.templateImageSupport {
|
||||
(self.view as? UIImageView)?.image = nil
|
||||
} else {
|
||||
self.contents = nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue