mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-10-09 03:20:48 +00:00
Support PixelDimensions
This commit is contained in:
parent
730b8c17c4
commit
a66f13d969
@ -157,7 +157,7 @@ class BotCheckoutHeaderItemNode: ListViewItemNode {
|
||||
var imageApply: (() -> Void)?
|
||||
var updatedImageSignal: Signal<(TransformImageArguments) -> DrawingContext?, NoError>?
|
||||
if let photo = item.invoice.photo, let dimensions = photo.dimensions {
|
||||
let arguments = TransformImageArguments(corners: ImageCorners(), imageSize: dimensions.aspectFilled(imageSize), boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
let arguments = TransformImageArguments(corners: ImageCorners(), imageSize: dimensions.cgSize.aspectFilled(imageSize), boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
imageApply = makeImageLayout(arguments)
|
||||
maxTextWidth = max(1.0, maxTextWidth - imageSize.width - imageTextSpacing)
|
||||
if imageUpdated {
|
||||
|
@ -1206,9 +1206,9 @@ class ChatListItemNode: ItemListRevealOptionsItemNode {
|
||||
|
||||
var dimensions: CGSize?
|
||||
if let contentImageMedia = contentImageMedia as? TelegramMediaImage {
|
||||
dimensions = largestRepresentationForPhoto(contentImageMedia)?.dimensions
|
||||
dimensions = largestRepresentationForPhoto(contentImageMedia)?.dimensions.cgSize
|
||||
} else if let contentImageMedia = contentImageMedia as? TelegramMediaFile {
|
||||
dimensions = contentImageMedia.dimensions
|
||||
dimensions = contentImageMedia.dimensions?.cgSize
|
||||
}
|
||||
|
||||
var contentImageNodeAppeared = false
|
||||
|
@ -204,7 +204,7 @@ public func galleryItemForEntry(context: AccountContext, presentationData: Prese
|
||||
if let file = webpageContent.file, file.isVideo {
|
||||
content = NativeVideoContent(id: .message(message.stableId, file.fileId), fileReference: .message(message: MessageReference(message), media: file), imageReference: mediaImage.flatMap({ ImageMediaReference.message(message: MessageReference(message), media: $0) }), streamVideo: .conservative, loopVideo: loopVideos, tempFilePath: tempFilePath)
|
||||
} else if URL(string: embedUrl)?.pathExtension == "mp4" {
|
||||
content = SystemVideoContent(url: embedUrl, imageReference: .webPage(webPage: WebpageReference(webpage), media: image), dimensions: webpageContent.embedSize ?? CGSize(width: 640.0, height: 640.0), duration: Int32(webpageContent.duration ?? 0))
|
||||
content = SystemVideoContent(url: embedUrl, imageReference: .webPage(webPage: WebpageReference(webpage), media: image), dimensions: webpageContent.embedSize?.cgSize ?? CGSize(width: 640.0, height: 640.0), duration: Int32(webpageContent.duration ?? 0))
|
||||
}
|
||||
}
|
||||
if content == nil, let webEmbedContent = WebEmbedVideoContent(webPage: webpage, webpageContent: webpageContent, forcedTimestamp: timecode.flatMap(Int.init)) {
|
||||
|
@ -60,13 +60,13 @@ final class ChatMediaGalleryThumbnailItem: GalleryThumbnailItem {
|
||||
switch self.thumbnail {
|
||||
case let .image(imageReference):
|
||||
if let representation = largestImageRepresentation(imageReference.media.representations) {
|
||||
return (mediaGridMessagePhoto(account: self.account, photoReference: imageReference), representation.dimensions)
|
||||
return (mediaGridMessagePhoto(account: self.account, photoReference: imageReference), representation.dimensions.cgSize)
|
||||
} else {
|
||||
return (.single({ _ in return nil }), CGSize(width: 128.0, height: 128.0))
|
||||
}
|
||||
case let .video(fileReference):
|
||||
if let representation = largestImageRepresentation(fileReference.media.previewRepresentations) {
|
||||
return (mediaGridMessageVideo(postbox: self.account.postbox, videoReference: fileReference), representation.dimensions)
|
||||
return (mediaGridMessageVideo(postbox: self.account.postbox, videoReference: fileReference), representation.dimensions.cgSize)
|
||||
} else {
|
||||
return (.single({ _ in return nil }), CGSize(width: 128.0, height: 128.0))
|
||||
}
|
||||
@ -220,10 +220,10 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
fileprivate func setImage(imageReference: ImageMediaReference) {
|
||||
if self.contextAndMedia == nil || !self.contextAndMedia!.1.media.isEqual(to: imageReference.media) {
|
||||
if let largestSize = largestRepresentationForPhoto(imageReference.media) {
|
||||
let displaySize = largestSize.dimensions.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
let displaySize = largestSize.dimensions.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))()
|
||||
self.imageNode.setSignal(chatMessagePhoto(postbox: context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false)
|
||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
||||
self.zoomableContent = (largestSize.dimensions.cgSize, self.imageNode)
|
||||
|
||||
self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start())
|
||||
self.setupStatus(resource: largestSize.resource)
|
||||
@ -237,18 +237,18 @@ final class ChatImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
func setFile(context: AccountContext, fileReference: FileMediaReference) {
|
||||
if self.contextAndMedia == nil || !self.contextAndMedia!.1.media.isEqual(to: fileReference.media) {
|
||||
if var largestSize = fileReference.media.dimensions {
|
||||
var displaySize = largestSize.dividedByScreenScale()
|
||||
var displaySize = largestSize.cgSize.dividedByScreenScale()
|
||||
if let previewDimensions = largestImageRepresentation(fileReference.media.previewRepresentations)?.dimensions {
|
||||
let previewAspect = previewDimensions.width / previewDimensions.height
|
||||
let previewAspect = CGFloat(previewDimensions.width) / CGFloat(previewDimensions.height)
|
||||
let aspect = displaySize.width / displaySize.height
|
||||
if abs(previewAspect - 1.0 / aspect) < 0.1 {
|
||||
displaySize = CGSize(width: displaySize.height, height: displaySize.width)
|
||||
largestSize = CGSize(width: largestSize.height, height: largestSize.width)
|
||||
largestSize = PixelDimensions(width: largestSize.height, height: largestSize.width)
|
||||
}
|
||||
}
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))()
|
||||
self.imageNode.setSignal(chatMessageImageFile(account: context.account, fileReference: fileReference, thumbnail: false), dispatchOnDisplayLink: false)
|
||||
self.zoomableContent = (largestSize, self.imageNode)
|
||||
self.zoomableContent = (largestSize.cgSize, self.imageNode)
|
||||
self.setupStatus(resource: fileReference.media.resource)
|
||||
} else {
|
||||
self._ready.set(.single(Void()))
|
||||
|
@ -17,9 +17,9 @@ private struct InstantImageGalleryThumbnailItem: GalleryThumbnailItem {
|
||||
|
||||
var image: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize) {
|
||||
if let imageReferene = mediaReference.concrete(TelegramMediaImage.self), let representation = largestImageRepresentation(imageReferene.media.representations) {
|
||||
return (mediaGridMessagePhoto(account: self.account, photoReference: imageReferene), representation.dimensions)
|
||||
return (mediaGridMessagePhoto(account: self.account, photoReference: imageReferene), representation.dimensions.cgSize)
|
||||
} else if let fileReference = mediaReference.concrete(TelegramMediaFile.self), let dimensions = fileReference.media.dimensions {
|
||||
return (mediaGridMessageVideo(postbox: account.postbox, videoReference: fileReference), dimensions)
|
||||
return (mediaGridMessageVideo(postbox: account.postbox, videoReference: fileReference), dimensions.cgSize)
|
||||
} else {
|
||||
return (.single({ _ in return nil }), CGSize(width: 128.0, height: 128.0))
|
||||
}
|
||||
@ -133,10 +133,10 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
fileprivate func setImage(imageReference: ImageMediaReference) {
|
||||
if self.contextAndMedia == nil || !self.contextAndMedia!.1.media.isEqual(to: imageReference.media) {
|
||||
if let largestSize = largestRepresentationForPhoto(imageReference.media) {
|
||||
let displaySize = largestSize.dimensions.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
let displaySize = largestSize.dimensions.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets(), emptyColor: .black))()
|
||||
self.imageNode.setSignal(chatMessagePhoto(postbox: self.context.account.postbox, photoReference: imageReference), dispatchOnDisplayLink: false)
|
||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
||||
self.zoomableContent = (largestSize.dimensions.cgSize, self.imageNode)
|
||||
self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: imageReference.resourceReference(largestSize.resource)).start())
|
||||
} else {
|
||||
self._ready.set(.single(Void()))
|
||||
@ -149,10 +149,10 @@ final class InstantImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
func setFile(context: AccountContext, fileReference: FileMediaReference) {
|
||||
if self.contextAndMedia == nil || !self.contextAndMedia!.1.media.isEqual(to: fileReference.media) {
|
||||
if let largestSize = fileReference.media.dimensions {
|
||||
let displaySize = largestSize.dividedByScreenScale()
|
||||
let displaySize = largestSize.cgSize.dividedByScreenScale()
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))()
|
||||
self.imageNode.setSignal(chatMessageImageFile(account: context.account, fileReference: fileReference, thumbnail: false), dispatchOnDisplayLink: false)
|
||||
self.zoomableContent = (largestSize, self.imageNode)
|
||||
self.zoomableContent = (largestSize.cgSize, self.imageNode)
|
||||
} else {
|
||||
self._ready.set(.single(Void()))
|
||||
}
|
||||
|
@ -102,7 +102,7 @@ final class InstantPageArticleNode: ASDisplayNode, InstantPageNode {
|
||||
self.contentTileNode.frame = self.bounds
|
||||
|
||||
if let imageNode = self.imageNode, let image = self.cover, let largest = largestImageRepresentation(image.representations) {
|
||||
let size = largest.dimensions.aspectFilled(imageSize)
|
||||
let size = largest.dimensions.cgSize.aspectFilled(imageSize)
|
||||
let boundingSize = imageSize
|
||||
|
||||
let makeLayout = imageNode.asyncLayout()
|
||||
|
@ -199,7 +199,7 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode {
|
||||
self.statusNode.frame = CGRect(x: floorToScreenPixels((size.width - radialStatusSize) / 2.0), y: floorToScreenPixels((size.height - radialStatusSize) / 2.0), width: radialStatusSize, height: radialStatusSize)
|
||||
|
||||
if let image = self.media.media as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) {
|
||||
let imageSize = largest.dimensions.aspectFilled(size)
|
||||
let imageSize = largest.dimensions.cgSize.aspectFilled(size)
|
||||
let boundingSize = size
|
||||
let radius: CGFloat = self.roundCorners ? floor(min(imageSize.width, imageSize.height) / 2.0) : 0.0
|
||||
let makeLayout = self.imageNode.asyncLayout()
|
||||
@ -210,7 +210,7 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode {
|
||||
} else if let file = self.media.media as? TelegramMediaFile, let dimensions = file.dimensions {
|
||||
let emptyColor = file.mimeType.hasPrefix("image/") ? self.theme.imageTintColor : nil
|
||||
|
||||
let imageSize = dimensions.aspectFilled(size)
|
||||
let imageSize = dimensions.cgSize.aspectFilled(size)
|
||||
let boundingSize = size
|
||||
let makeLayout = self.imageNode.asyncLayout()
|
||||
let apply = makeLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: boundingSize, intrinsicInsets: UIEdgeInsets(), emptyColor: emptyColor))
|
||||
@ -234,7 +234,7 @@ final class InstantPageImageNode: ASDisplayNode, InstantPageNode {
|
||||
self.pinNode.frame = CGRect(origin: CGPoint(x: floor((size.width - pinSize.width) / 2.0), y: floor(size.height * 0.5 - 10.0 - pinSize.height / 2.0)), size: pinSize)
|
||||
pinApply()
|
||||
} else if let webPage = media.media as? TelegramMediaWebpage, case let .Loaded(content) = webPage.content, let image = content.image, let largest = largestImageRepresentation(image.representations) {
|
||||
let imageSize = largest.dimensions.aspectFilled(size)
|
||||
let imageSize = largest.dimensions.cgSize.aspectFilled(size)
|
||||
let boundingSize = size
|
||||
let radius: CGFloat = self.roundCorners ? floor(min(imageSize.width, imageSize.height) / 2.0) : 0.0
|
||||
let makeLayout = self.imageNode.asyncLayout()
|
||||
|
@ -376,12 +376,12 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
case let .image(id, caption, url, webpageId):
|
||||
if let image = media[id] as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) {
|
||||
let imageSize = largest.dimensions
|
||||
var filledSize = imageSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
var filledSize = imageSize.cgSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
|
||||
if let size = fillToSize {
|
||||
filledSize = size
|
||||
} else if isCover {
|
||||
filledSize = imageSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
filledSize = imageSize.cgSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
if !filledSize.height.isZero {
|
||||
filledSize = filledSize.cropped(CGSize(width: boundingWidth - safeInset * 2.0, height: floor((boundingWidth - safeInset * 2.0) * 3.0 / 5.0)))
|
||||
}
|
||||
@ -416,12 +416,12 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
case let .video(id, caption, autoplay, loop):
|
||||
if let file = media[id] as? TelegramMediaFile, let dimensions = file.dimensions {
|
||||
let imageSize = dimensions
|
||||
var filledSize = imageSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
var filledSize = imageSize.cgSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
|
||||
if let size = fillToSize {
|
||||
filledSize = size
|
||||
} else if isCover {
|
||||
filledSize = imageSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
filledSize = imageSize.cgSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
if !filledSize.height.isZero {
|
||||
filledSize = filledSize.cropped(CGSize(width: boundingWidth - safeInset * 2.0, height: floor((boundingWidth - safeInset * 2.0) * 3.0 / 5.0)))
|
||||
}
|
||||
@ -462,11 +462,11 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
switch subItem {
|
||||
case let .image(id, _, _, _):
|
||||
if let image = media[id] as? TelegramMediaImage, let largest = largestImageRepresentation(image.representations) {
|
||||
size = largest.dimensions
|
||||
size = largest.dimensions.cgSize
|
||||
}
|
||||
case let .video(id, _, _, _):
|
||||
if let file = media[id] as? TelegramMediaFile, let dimensions = file.dimensions {
|
||||
size = dimensions
|
||||
size = dimensions.cgSize
|
||||
}
|
||||
default:
|
||||
break
|
||||
@ -577,7 +577,7 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
let mediaIndex = mediaIndexCounter
|
||||
mediaIndexCounter += 1
|
||||
|
||||
let filledSize = imageSize.fitted(CGSize(width: boundingWidth, height: 1200.0))
|
||||
let filledSize = imageSize.cgSize.fitted(CGSize(width: boundingWidth, height: 1200.0))
|
||||
contentSize.height = max(contentSize.height, filledSize.height)
|
||||
|
||||
var mediaUrl: InstantPageUrlItem?
|
||||
@ -610,10 +610,10 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
|
||||
let size: CGSize
|
||||
if let dimensions = dimensions {
|
||||
if dimensions.width.isLessThanOrEqualTo(0.0) {
|
||||
size = CGSize(width: embedBoundingWidth, height: dimensions.height)
|
||||
if dimensions.width <= 0 {
|
||||
size = CGSize(width: embedBoundingWidth, height: dimensions.cgSize.height)
|
||||
} else {
|
||||
size = dimensions.aspectFitted(CGSize(width: embedBoundingWidth, height: embedBoundingWidth))
|
||||
size = dimensions.cgSize.aspectFitted(CGSize(width: embedBoundingWidth, height: embedBoundingWidth))
|
||||
}
|
||||
} else {
|
||||
if let height = webEmbedHeights[embedIndex] {
|
||||
@ -628,7 +628,7 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
let frame = CGRect(origin: CGPoint(x: floor((boundingWidth - size.width) / 2.0), y: 0.0), size: size)
|
||||
let item: InstantPageItem
|
||||
if let url = url, let coverId = coverId, let image = media[coverId] as? TelegramMediaImage {
|
||||
let loadedContent = TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: "video", websiteName: nil, title: nil, text: nil, embedUrl: url, embedType: "video", embedSize: size, duration: nil, author: nil, image: image, file: nil, files: nil, instantPage: nil)
|
||||
let loadedContent = TelegramMediaWebpageLoadedContent(url: url, displayUrl: url, hash: 0, type: "video", websiteName: nil, title: nil, text: nil, embedUrl: url, embedType: "video", embedSize: PixelDimensions(size), duration: nil, author: nil, image: image, file: nil, files: nil, instantPage: nil)
|
||||
let content = TelegramMediaWebpageContent.Loaded(loadedContent)
|
||||
|
||||
item = InstantPageImageItem(frame: frame, webPage: webpage, media: InstantPageMedia(index: embedIndex, media: TelegramMediaWebpage(webpageId: MediaId(namespace: Namespaces.Media.LocalWebpage, id: -1), content: content), url: nil, caption: nil, credit: nil), attributes: [], interactive: true, roundCorners: false, fit: false)
|
||||
@ -805,19 +805,19 @@ func layoutInstantPageBlock(webpage: TelegramMediaWebpage, rtl: Bool, block: Ins
|
||||
return InstantPageLayout(origin: CGPoint(), contentSize: contentSize, items: items)
|
||||
case let .map(latitude, longitude, zoom, dimensions, caption):
|
||||
let imageSize = dimensions
|
||||
var filledSize = imageSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
var filledSize = imageSize.cgSize.aspectFitted(CGSize(width: boundingWidth - safeInset * 2.0, height: 1200.0))
|
||||
|
||||
if let size = fillToSize {
|
||||
filledSize = size
|
||||
} else if isCover {
|
||||
filledSize = imageSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
filledSize = imageSize.cgSize.aspectFilled(CGSize(width: boundingWidth - safeInset * 2.0, height: 1.0))
|
||||
if !filledSize.height.isZero {
|
||||
filledSize = filledSize.cropped(CGSize(width: boundingWidth - safeInset * 2.0, height: floor((boundingWidth - safeInset * 2.0) * 3.0 / 5.0)))
|
||||
}
|
||||
}
|
||||
|
||||
let map = TelegramMediaMap(latitude: latitude, longitude: longitude, geoPlace: nil, venue: nil, liveBroadcastingTimeout: nil)
|
||||
let attributes: [InstantPageImageAttribute] = [InstantPageMapAttribute(zoom: zoom, dimensions: dimensions)]
|
||||
let attributes: [InstantPageImageAttribute] = [InstantPageMapAttribute(zoom: zoom, dimensions: dimensions.cgSize)]
|
||||
|
||||
var contentSize = CGSize(width: boundingWidth - safeInset * 2.0, height: 0.0)
|
||||
var items: [InstantPageItem] = []
|
||||
|
@ -520,10 +520,10 @@ func attributedStringForRichText(_ text: RichText, styleStack: InstantPageTextSt
|
||||
}
|
||||
var dimensions = dimensions
|
||||
if let boundingWidth = boundingWidth {
|
||||
dimensions = dimensions.fittedToWidthOrSmaller(boundingWidth)
|
||||
dimensions = PixelDimensions(dimensions.cgSize.fittedToWidthOrSmaller(boundingWidth))
|
||||
}
|
||||
let extentBuffer = UnsafeMutablePointer<RunStruct>.allocate(capacity: 1)
|
||||
extentBuffer.initialize(to: RunStruct(ascent: 0.0, descent: 0.0, width: dimensions.width))
|
||||
extentBuffer.initialize(to: RunStruct(ascent: 0.0, descent: 0.0, width: dimensions.cgSize.width))
|
||||
var callbacks = CTRunDelegateCallbacks(version: kCTRunDelegateVersion1, dealloc: { (pointer) in
|
||||
}, getAscent: { (pointer) -> CGFloat in
|
||||
let d = pointer.assumingMemoryBound(to: RunStruct.self)
|
||||
|
@ -388,7 +388,7 @@ class ItemListStickerPackItemNode: ItemListRevealOptionsItemNode {
|
||||
if let thumbnailItem = thumbnailItem {
|
||||
switch thumbnailItem {
|
||||
case let .still(representation):
|
||||
let stillImageSize = representation.dimensions.aspectFitted(imageBoundingSize)
|
||||
let stillImageSize = representation.dimensions.cgSize.aspectFitted(imageBoundingSize)
|
||||
imageSize = stillImageSize
|
||||
|
||||
if fileUpdated {
|
||||
|
@ -405,7 +405,7 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
if let resourcePath = resourcePath, let image = UIImage(contentsOfFile: resourcePath) {
|
||||
dimensions = image.size
|
||||
}
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: dimensions, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(dimensions), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
@ -414,7 +414,7 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
if let image = UIImage(contentsOfFile: fullSizePath) {
|
||||
let resource: TelegramMediaResource = LocalFileMediaResource(fileId: arc4random64())
|
||||
copyLocalFiles.append((resource, fullSizePath))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: image.size, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(image.size), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
@ -431,14 +431,14 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
} else if imageUrl.hasPrefix("file://"), let path = URL(string: imageUrl)?.path {
|
||||
copyLocalFiles.append((resource, path))
|
||||
}
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: sizeValue.cgSizeValue, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(sizeValue.cgSizeValue), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
var resource: TelegramMediaResource = LocalFileMediaResource(fileId: arc4random64())
|
||||
|
||||
var attributes: [TelegramMediaFileAttribute] = []
|
||||
attributes.append(.Video(duration: Int(item.duration), size: item.dimensions, flags: item.roundMessage ? .instantRoundVideo : []))
|
||||
attributes.append(.Video(duration: Int(item.duration), size: PixelDimensions(item.dimensions), flags: item.roundMessage ? .instantRoundVideo : []))
|
||||
|
||||
var size: Int32 = 0
|
||||
if let videoUrl = item.videoInfo?.url(withQuality: 1, actualQuality: nil, actualSize: &size) {
|
||||
@ -488,7 +488,7 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
resource = updatedResource
|
||||
copyLocalFiles.append((resource, pathFromLegacyImageUrl(basePath: basePath, url: imageUrl)))
|
||||
}
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: sizeValue.cgSizeValue, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(sizeValue.cgSizeValue), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
@ -512,7 +512,7 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
} else if let _ = attribute as? TGDocumentAttributeAnimated {
|
||||
attributes.append(.Animated)
|
||||
} else if let attribute = attribute as? TGDocumentAttributeVideo {
|
||||
attributes.append(.Video(duration: Int(attribute.duration), size: attribute.size, flags: attribute.isRoundMessage ? .instantRoundVideo : []))
|
||||
attributes.append(.Video(duration: Int(attribute.duration), size: PixelDimensions(attribute.size), flags: attribute.isRoundMessage ? .instantRoundVideo : []))
|
||||
} else if let attribute = attribute as? TGDocumentAttributeSticker {
|
||||
var packReference: StickerPackReference?
|
||||
if let reference = attribute.packReference as? TGStickerPackIdReference {
|
||||
@ -522,7 +522,7 @@ private func loadLegacyMessages(account: TemporaryAccount, basePath: String, acc
|
||||
}
|
||||
attributes.append(.Sticker(displayText: attribute.alt ?? "", packReference: packReference, maskData: nil))
|
||||
} else if let attribute = attribute as? TGDocumentAttributeImageSize {
|
||||
attributes.append(.ImageSize(size: attribute.size))
|
||||
attributes.append(.ImageSize(size: PixelDimensions(attribute.size)))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -18,10 +18,10 @@ func loadLegacyUser(database: SqliteInterface, id: Int32) -> (TelegramUser, Tele
|
||||
let photoBig = cursor.getString(at: 6)
|
||||
var photo: [TelegramMediaImageRepresentation] = []
|
||||
if let resource = resourceFromLegacyImageUrl(photoSmall) {
|
||||
photo.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 80.0, height: 80.0), resource: resource))
|
||||
photo.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 80, height: 80), resource: resource))
|
||||
}
|
||||
if let resource = resourceFromLegacyImageUrl(photoBig) {
|
||||
photo.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 600.0, height: 600.0), resource: resource))
|
||||
photo.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 600, height: 600), resource: resource))
|
||||
}
|
||||
|
||||
let user = TelegramUser(id: PeerId(namespace: Namespaces.Peer.CloudUser, id: cursor.getInt32(at: 0)), accessHash: accessHash == 0 ? nil : .personal(accessHash), firstName: firstName.isEmpty ? nil : firstName, lastName: lastName.isEmpty ? nil : lastName, username: username.isEmpty ? nil : username, phone: phone.isEmpty ? nil : phone, photo: photo, botInfo: nil, restrictionInfo: nil, flags: [])
|
||||
|
@ -238,7 +238,7 @@ public func legacyEnqueueGifMessage(account: Account, data: Data) -> Signal<Enqu
|
||||
if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData)
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: thumbnailSize, resource: resource))
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource))
|
||||
}
|
||||
|
||||
var randomId: Int64 = 0
|
||||
@ -254,7 +254,7 @@ public func legacyEnqueueGifMessage(account: Account, data: Data) -> Signal<Enqu
|
||||
let finalDimensions = TGMediaVideoConverter.dimensions(for: dimensions, adjustments: nil, preset: TGMediaVideoConversionPresetAnimation)
|
||||
|
||||
var fileAttributes: [TelegramMediaFileAttribute] = []
|
||||
fileAttributes.append(.Video(duration: Int(0), size: finalDimensions, flags: [.supportsStreaming]))
|
||||
fileAttributes.append(.Video(duration: Int(0), size: PixelDimensions(finalDimensions), flags: [.supportsStreaming]))
|
||||
fileAttributes.append(.FileName(fileName: fileName))
|
||||
fileAttributes.append(.Animated)
|
||||
|
||||
@ -285,7 +285,7 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
let thumbnailImage = TGScaleImageToPixelSize(thumbnail, thumbnailSize)!
|
||||
if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) {
|
||||
account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData)
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: thumbnailSize, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource))
|
||||
}
|
||||
}
|
||||
switch data {
|
||||
@ -316,7 +316,7 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
#endif
|
||||
|
||||
let resource = LocalFileReferenceMediaResource(localFilePath: tempFilePath, randomId: randomId)
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: scaledSize, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(scaledSize), resource: resource))
|
||||
|
||||
let media = TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.LocalImage, id: randomId), representations: representations, immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
var attributes: [MessageAttribute] = []
|
||||
@ -334,7 +334,7 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
let size = CGSize(width: CGFloat(asset.pixelWidth), height: CGFloat(asset.pixelHeight))
|
||||
let scaledSize = size.aspectFittedOrSmaller(CGSize(width: 1280.0, height: 1280.0))
|
||||
let resource = PhotoLibraryMediaResource(localIdentifier: asset.localIdentifier, uniqueId: arc4random64())
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: scaledSize, resource: resource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(scaledSize), resource: resource))
|
||||
|
||||
let media = TelegramMediaImage(imageId: MediaId(namespace: Namespaces.Media.LocalImage, id: randomId), representations: representations, immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
var attributes: [MessageAttribute] = []
|
||||
@ -385,7 +385,7 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
let thumbnailImage = TGScaleImageToPixelSize(thumbnail, thumbnailSize)!
|
||||
if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) {
|
||||
account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData)
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: thumbnailSize, resource: resource))
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
@ -431,7 +431,7 @@ public func legacyAssetPickerEnqueueMessages(account: Account, signals: [Any]) -
|
||||
fileAttributes.append(.Animated)
|
||||
}
|
||||
if !asFile {
|
||||
fileAttributes.append(.Video(duration: Int(finalDuration), size: finalDimensions, flags: [.supportsStreaming]))
|
||||
fileAttributes.append(.Video(duration: Int(finalDuration), size: PixelDimensions(finalDimensions), flags: [.supportsStreaming]))
|
||||
if let adjustments = adjustments {
|
||||
if adjustments.sendAsGif {
|
||||
fileAttributes.append(.Animated)
|
||||
|
@ -66,7 +66,7 @@ func legacyComponentsStickers(postbox: Postbox, namespace: Int32) -> SSignal {
|
||||
let encoder = PostboxEncoder()
|
||||
encoder.encodeRootObject(thumbnail.resource)
|
||||
let dataString = encoder.makeData().base64EncodedString(options: [])
|
||||
imageInfo.addImage(with: thumbnail.dimensions, url: dataString)
|
||||
imageInfo.addImage(with: thumbnail.dimensions.cgSize, url: dataString)
|
||||
document.thumbnailInfo = imageInfo
|
||||
}
|
||||
var attributes: [Any] = []
|
||||
@ -77,7 +77,7 @@ func legacyComponentsStickers(postbox: Postbox, namespace: Int32) -> SSignal {
|
||||
return TGStickerMaskDescription(n: $0.n, point: CGPoint(x: CGFloat($0.x), y: CGFloat($0.y)), zoom: CGFloat($0.zoom))
|
||||
}))
|
||||
case let .ImageSize(size):
|
||||
attributes.append(TGDocumentAttributeImageSize(size: size))
|
||||
attributes.append(TGDocumentAttributeImageSize(size: size.cgSize))
|
||||
default:
|
||||
break
|
||||
}
|
||||
@ -198,7 +198,7 @@ final class LegacyStickerImageDataSource: TGImageDataSource {
|
||||
var previewRepresentations: [TelegramMediaImageRepresentation] = []
|
||||
if let legacyThumbnailUri = args["legacyThumbnailUri"] as? String, let data = Data(base64Encoded: legacyThumbnailUri, options: []) {
|
||||
if let resource = PostboxDecoder(buffer: MemoryBuffer(data: data)).decodeRootObject() as? TelegramMediaResource {
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 140.0, height: 140.0), resource: resource))
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 140, height: 140), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,7 +4,6 @@ import SwiftSignalKit
|
||||
import Postbox
|
||||
import TelegramCore
|
||||
import SyncCore
|
||||
import SyncCore
|
||||
import Display
|
||||
|
||||
public func mapResourceToAvatarSizes(postbox: Postbox, resource: MediaResource, representations: [TelegramMediaImageRepresentation]) -> Signal<[Int: Data], NoError> {
|
||||
@ -16,7 +15,7 @@ public func mapResourceToAvatarSizes(postbox: Postbox, resource: MediaResource,
|
||||
}
|
||||
var result: [Int: Data] = [:]
|
||||
for i in 0 ..< representations.count {
|
||||
if let scaledImage = generateScaledImage(image: image, size: representations[i].dimensions, scale: 1.0), let scaledData = scaledImage.jpegData(compressionQuality: 0.8) {
|
||||
if let scaledImage = generateScaledImage(image: image, size: representations[i].dimensions.cgSize, scale: 1.0), let scaledData = scaledImage.jpegData(compressionQuality: 0.8) {
|
||||
result[i] = scaledData
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Binary file not shown.
@ -26,7 +26,7 @@ private struct PeerAvatarImageGalleryThumbnailItem: GalleryThumbnailItem {
|
||||
|
||||
var image: (Signal<(TransformImageArguments) -> DrawingContext?, NoError>, CGSize) {
|
||||
if let representation = largestImageRepresentation(self.content.map({ $0.representation })) {
|
||||
return (avatarGalleryThumbnailPhoto(account: self.account, representations: self.content), representation.dimensions)
|
||||
return (avatarGalleryThumbnailPhoto(account: self.account, representations: self.content), representation.dimensions.cgSize)
|
||||
} else {
|
||||
return (.single({ _ in return nil }), CGSize(width: 128.0, height: 128.0))
|
||||
}
|
||||
@ -168,7 +168,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
self.footerContentNode.setEntry(entry)
|
||||
|
||||
if let largestSize = largestImageRepresentation(entry.representations.map({ $0.representation })) {
|
||||
let displaySize = largestSize.dimensions.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
let displaySize = largestSize.dimensions.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0)).dividedByScreenScale().integralFloor
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: displaySize, boundingSize: displaySize, intrinsicInsets: UIEdgeInsets()))()
|
||||
let representations: [ImageRepresentationWithReference]
|
||||
switch entry {
|
||||
@ -178,7 +178,7 @@ final class PeerAvatarImageGalleryItemNode: ZoomableContentGalleryItemNode {
|
||||
representations = imageRepresentations
|
||||
}
|
||||
self.imageNode.setSignal(chatAvatarGalleryPhoto(account: self.context.account, representations: representations), dispatchOnDisplayLink: false)
|
||||
self.zoomableContent = (largestSize.dimensions, self.imageNode)
|
||||
self.zoomableContent = (largestSize.dimensions.cgSize, self.imageNode)
|
||||
if let largestIndex = representations.firstIndex(where: { $0.representation == largestSize }) {
|
||||
self.fetchDisposable.set(fetchedMediaResource(mediaBox: self.context.account.postbox.mediaBox, reference: representations[largestIndex].reference).start())
|
||||
}
|
||||
|
@ -732,7 +732,7 @@ public func channelInfoController(context: AccountContext, peerId: PeerId) -> Vi
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
updateState {
|
||||
$0.withUpdatedUpdatingAvatar(.image(representation, true))
|
||||
}
|
||||
|
@ -1415,7 +1415,7 @@ public func groupInfoController(context: AccountContext, peerId originalPeerId:
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
updateState {
|
||||
$0.withUpdatedUpdatingAvatar(.image(representation, true))
|
||||
}
|
||||
|
@ -225,7 +225,7 @@ class GroupStickerPackCurrentItemNode: ItemListRevealOptionsItemNode {
|
||||
var imageSize: CGSize = CGSize(width: 34.0, height: 34.0)
|
||||
if let file = file, let dimensions = file.dimensions {
|
||||
let imageBoundingSize = CGSize(width: 34.0, height: 34.0)
|
||||
imageSize = dimensions.aspectFitted(imageBoundingSize)
|
||||
imageSize = dimensions.cgSize.aspectFitted(imageBoundingSize)
|
||||
imageApply = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,6 @@ static_library(
|
||||
"//submodules/Postbox:Postbox#shared",
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -27,11 +27,11 @@ private enum ResourceFileData {
|
||||
}
|
||||
|
||||
public func largestRepresentationForPhoto(_ photo: TelegramMediaImage) -> TelegramMediaImageRepresentation? {
|
||||
return photo.representationForDisplayAtSize(CGSize(width: 1280.0, height: 1280.0))
|
||||
return photo.representationForDisplayAtSize(PixelDimensions(width: 1280, height: 1280))
|
||||
}
|
||||
|
||||
public func chatMessagePhotoDatas(postbox: Postbox, photoReference: ImageMediaReference, fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0), autoFetchFullSize: Bool = false, tryAdditionalRepresentations: Bool = false, synchronousLoad: Bool = false) -> Signal<Tuple3<Data?, Data?, Bool>, NoError> {
|
||||
if let smallestRepresentation = smallestImageRepresentation(photoReference.media.representations), let largestRepresentation = photoReference.media.representationForDisplayAtSize(fullRepresentationSize) {
|
||||
if let smallestRepresentation = smallestImageRepresentation(photoReference.media.representations), let largestRepresentation = photoReference.media.representationForDisplayAtSize(PixelDimensions(width: Int32(fullRepresentationSize.width), height: Int32(fullRepresentationSize.height))) {
|
||||
let maybeFullSize = postbox.mediaBox.resourceData(largestRepresentation.resource, option: .complete(waitUntilFetchStatus: false), attemptSynchronously: synchronousLoad)
|
||||
|
||||
let signal = maybeFullSize
|
||||
@ -216,7 +216,7 @@ private func chatMessageImageFileThumbnailDatas(account: Account, fileReference:
|
||||
|
||||
if !thumbnailGenerationMimeTypes.contains(fileReference.media.mimeType) {
|
||||
if let decodedThumbnailData = decodedThumbnailData {
|
||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200 || thumbnailRepresentation.dimensions.height > 200) {
|
||||
return Signal { subscriber in
|
||||
let fetchedDisposable = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start()
|
||||
let thumbnailDisposable = account.postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: false).start(next: { next in
|
||||
@ -335,7 +335,7 @@ private func chatMessageVideoDatas(postbox: Postbox, fileReference: FileMediaRef
|
||||
if onlyFullSize {
|
||||
thumbnail = .single(nil)
|
||||
} else if let decodedThumbnailData = fileReference.media.immediateThumbnailData.flatMap(decodeTinyThumbnail) {
|
||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200.0 || thumbnailRepresentation.dimensions.height > 200.0) {
|
||||
if autoFetchFullSizeThumbnail, let thumbnailRepresentation = thumbnailRepresentation, (thumbnailRepresentation.dimensions.width > 200 || thumbnailRepresentation.dimensions.height > 200) {
|
||||
thumbnail = Signal { subscriber in
|
||||
let fetchedDisposable = fetchedMediaResource(mediaBox: postbox.mediaBox, reference: fileReference.resourceReference(thumbnailRepresentation.resource), statsCategory: .video).start()
|
||||
let thumbnailDisposable = postbox.mediaBox.resourceData(thumbnailRepresentation.resource, attemptSynchronously: synchronousLoad).start(next: { next in
|
||||
@ -876,7 +876,7 @@ public func chatMessagePhotoInternal(photoData: Signal<Tuple3<Data?, Data?, Bool
|
||||
|
||||
private func chatMessagePhotoThumbnailDatas(account: Account, photoReference: ImageMediaReference, onlyFullSize: Bool = false) -> Signal<Tuple3<Data?, Data?, Bool>, NoError> {
|
||||
let fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0)
|
||||
if let smallestRepresentation = smallestImageRepresentation(photoReference.media.representations), let largestRepresentation = photoReference.media.representationForDisplayAtSize(fullRepresentationSize) {
|
||||
if let smallestRepresentation = smallestImageRepresentation(photoReference.media.representations), let largestRepresentation = photoReference.media.representationForDisplayAtSize(PixelDimensions(width: Int32(fullRepresentationSize.width), height: Int32(fullRepresentationSize.height))) {
|
||||
|
||||
let maybeFullSize = account.postbox.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedScaledImageRepresentation(size: CGSize(width: 180.0, height: 180.0), mode: .aspectFit), complete: onlyFullSize, fetch: false)
|
||||
let fetchedFullSize = account.postbox.mediaBox.cachedResourceRepresentation(largestRepresentation.resource, representation: CachedScaledImageRepresentation(size: CGSize(width: 180.0, height: 180.0), mode: .aspectFit), complete: onlyFullSize, fetch: true)
|
||||
@ -1220,7 +1220,7 @@ public func chatSecretPhoto(account: Account, photoReference: ImageMediaReferenc
|
||||
}
|
||||
|
||||
private func avatarGalleryThumbnailDatas(postbox: Postbox, representations: [ImageRepresentationWithReference], fullRepresentationSize: CGSize = CGSize(width: 1280.0, height: 1280.0), autoFetchFullSize: Bool = false) -> Signal<Tuple3<Data?, Data?, Bool>, NoError> {
|
||||
if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = imageRepresentationLargerThan(representations.map({ $0.representation }), size: fullRepresentationSize), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) {
|
||||
if let smallestRepresentation = smallestImageRepresentation(representations.map({ $0.representation })), let largestRepresentation = imageRepresentationLargerThan(representations.map({ $0.representation }), size: PixelDimensions(width: Int32(fullRepresentationSize.width), height: Int32(fullRepresentationSize.height))), let smallestIndex = representations.firstIndex(where: { $0.representation == smallestRepresentation }), let largestIndex = representations.firstIndex(where: { $0.representation == largestRepresentation }) {
|
||||
let maybeFullSize = postbox.mediaBox.resourceData(largestRepresentation.resource)
|
||||
|
||||
let signal = maybeFullSize
|
||||
@ -1809,7 +1809,7 @@ public func chatWebpageSnippetFileData(account: Account, fileReference: FileMedi
|
||||
}
|
||||
|
||||
public func chatWebpageSnippetPhotoData(account: Account, photoReference: ImageMediaReference) -> Signal<Data?, NoError> {
|
||||
if let closestRepresentation = photoReference.media.representationForDisplayAtSize(CGSize(width: 120.0, height: 120.0)) {
|
||||
if let closestRepresentation = photoReference.media.representationForDisplayAtSize(PixelDimensions(width: 120, height: 120)) {
|
||||
let resourceData = account.postbox.mediaBox.resourceData(closestRepresentation.resource)
|
||||
|> map { next in
|
||||
return next.size == 0 ? nil : try? Data(contentsOf: URL(fileURLWithPath: next.path), options: .mappedIfSafe)
|
||||
|
@ -8,7 +8,6 @@ static_library(
|
||||
deps = [
|
||||
"//submodules/TelegramCore:TelegramCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
"//submodules/SyncCore:SyncCore#shared",
|
||||
],
|
||||
frameworks = [
|
||||
"$SDKROOT/System/Library/Frameworks/Foundation.framework",
|
||||
|
@ -509,7 +509,7 @@ func editSettingsController(context: AccountContext, currentName: ItemListAvatar
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
updateState {
|
||||
$0.withUpdatedUpdatingAvatar(.image(representation, true))
|
||||
}
|
||||
|
@ -1079,7 +1079,7 @@ public func settingsController(context: AccountContext, accountManager: AccountM
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
updateState { state in
|
||||
var state = state
|
||||
state.updatingAvatar = .image(representation, true)
|
||||
|
@ -92,7 +92,7 @@ func uploadCustomWallpaper(context: AccountContext, wallpaper: WallpaperGalleryE
|
||||
}
|
||||
case let .internalReference(_, _, _, _, _, image, _, _):
|
||||
if let image = image {
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 1000.0, height: 800.0)) {
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 1000, height: 800)) {
|
||||
imageResource = imageRepresentation.resource
|
||||
}
|
||||
}
|
||||
@ -162,7 +162,7 @@ func uploadCustomWallpaper(context: AccountContext, wallpaper: WallpaperGalleryE
|
||||
|
||||
let apply: () -> Void = {
|
||||
let settings = WallpaperSettings(blur: mode.contains(.blur), motion: mode.contains(.motion), color: nil, intensity: nil)
|
||||
let wallpaper: TelegramWallpaper = .image([TelegramMediaImageRepresentation(dimensions: thumbnailDimensions, resource: thumbnailResource), TelegramMediaImageRepresentation(dimensions: croppedImage.size, resource: resource)], settings)
|
||||
let wallpaper: TelegramWallpaper = .image([TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailDimensions), resource: thumbnailResource), TelegramMediaImageRepresentation(dimensions: PixelDimensions(croppedImage.size), resource: resource)], settings)
|
||||
updateWallpaper(wallpaper)
|
||||
DispatchQueue.main.async {
|
||||
completion()
|
||||
|
@ -295,7 +295,7 @@ public func editThemeController(context: AccountContext, mode: EditThemeControll
|
||||
|> mapToSignal { wallpaper -> Signal<TelegramWallpaper?, NoError> in
|
||||
if let wallpaper = wallpaper, case let .file(file) = wallpaper.wallpaper {
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 100, height: 100), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
return wallpaperDatas(account: context.account, accountManager: context.sharedContext.accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false)
|
||||
|> mapToSignal { _, fullSizeData, complete -> Signal<TelegramWallpaper?, NoError> in
|
||||
guard complete, let fullSizeData = fullSizeData else {
|
||||
|
@ -107,7 +107,7 @@ final class SettingsThemeWallpaperNode: ASDisplayNode {
|
||||
let convertedRepresentations: [ImageRepresentationWithReference] = representations.map({ ImageRepresentationWithReference(representation: $0, reference: .wallpaper(resource: $0.resource)) })
|
||||
self.imageNode.setSignal(wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, thumbnail: true, autoFetchFullSize: true, synchronousLoad: synchronousLoad))
|
||||
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: largestImageRepresentation(representations)!.dimensions.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: largestImageRepresentation(representations)!.dimensions.cgSize.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
apply()
|
||||
case let .file(file):
|
||||
self.imageNode.isHidden = false
|
||||
@ -138,8 +138,8 @@ final class SettingsThemeWallpaperNode: ASDisplayNode {
|
||||
}
|
||||
self.imageNode.setSignal(imageSignal, attemptSynchronously: synchronousLoad)
|
||||
|
||||
let dimensions = file.file.dimensions ?? CGSize(width: 100.0, height: 100.0)
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: dimensions.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets(), emptyColor: self.color))
|
||||
let dimensions = file.file.dimensions ?? PixelDimensions(width: 100, height: 100)
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: dimensions.cgSize.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets(), emptyColor: self.color))
|
||||
apply()
|
||||
}
|
||||
} else if let wallpaper = self.wallpaper {
|
||||
@ -148,11 +148,11 @@ final class SettingsThemeWallpaperNode: ASDisplayNode {
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: CGSize(), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
apply()
|
||||
case let .image(representations, _):
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: largestImageRepresentation(representations)!.dimensions.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: largestImageRepresentation(representations)!.dimensions.cgSize.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
apply()
|
||||
case let .file(file):
|
||||
let dimensions = file.file.dimensions ?? CGSize(width: 100.0, height: 100.0)
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: dimensions.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets(), emptyColor: self.color))
|
||||
let dimensions = file.file.dimensions ?? PixelDimensions(width: 100, height: 100)
|
||||
let apply = self.imageNode.asyncLayout()(TransformImageArguments(corners: corners, imageSize: dimensions.cgSize.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets(), emptyColor: self.color))
|
||||
apply()
|
||||
}
|
||||
}
|
||||
|
@ -77,31 +77,31 @@ final class ThemeGridSearchItemNode: GridItemNode {
|
||||
} else if let thumbnail = thumbnail {
|
||||
imageResource = thumbnail.resource
|
||||
}
|
||||
imageDimensions = content?.dimensions
|
||||
imageDimensions = content?.dimensions?.cgSize
|
||||
case let .internalReference(_, _, _, _, _, image, file, _):
|
||||
if let image = image {
|
||||
immediateThumbnailData = image.immediateThumbnailData
|
||||
if let representation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 321.0, height: 321.0)) {
|
||||
if let representation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 321, height: 321)) {
|
||||
imageResource = representation.resource
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
if let file = file {
|
||||
if let thumbnailRepresentation = smallestImageRepresentation(file.previewRepresentations) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
} else {
|
||||
if let thumbnailRepresentation = smallestImageRepresentation(image.representations) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
}
|
||||
} else if let file = file {
|
||||
immediateThumbnailData = file.immediateThumbnailData
|
||||
if let dimensions = file.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
} else if let largestRepresentation = largestImageRepresentation(file.previewRepresentations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
|
||||
}
|
||||
@ -109,10 +109,10 @@ final class ThemeGridSearchItemNode: GridItemNode {
|
||||
|
||||
var representations: [TelegramMediaImageRepresentation] = []
|
||||
if let thumbnailResource = thumbnailResource, let thumbnailDimensions = thumbnailDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: thumbnailDimensions, resource: thumbnailResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailDimensions), resource: thumbnailResource))
|
||||
}
|
||||
if let imageResource = imageResource, let imageDimensions = imageDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: imageDimensions, resource: imageResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(imageDimensions), resource: imageResource))
|
||||
}
|
||||
if !representations.isEmpty {
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: immediateThumbnailData, reference: nil, partialReference: nil)
|
||||
|
@ -204,8 +204,8 @@ final class ThemePreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
return
|
||||
}
|
||||
if case let .file(file) = wallpaper {
|
||||
let dimensions = file.file.dimensions ?? CGSize(width: 100.0, height: 100.0)
|
||||
let displaySize = dimensions.dividedByScreenScale().integralFloor
|
||||
let dimensions = file.file.dimensions ?? PixelDimensions(width: 100, height: 100)
|
||||
let displaySize = dimensions.cgSize.dividedByScreenScale().integralFloor
|
||||
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
for representation in file.file.previewRepresentations {
|
||||
|
@ -235,9 +235,9 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
||||
isBlurrable = false
|
||||
//self.backgroundColor = UIColor(rgb: UInt32(bitPattern: color))
|
||||
case let .file(file):
|
||||
let dimensions = file.file.dimensions ?? CGSize(width: 100.0, height: 100.0)
|
||||
contentSize = dimensions
|
||||
displaySize = dimensions.dividedByScreenScale().integralFloor
|
||||
let dimensions = file.file.dimensions ?? PixelDimensions(width: 100, height: 100)
|
||||
contentSize = dimensions.cgSize
|
||||
displaySize = dimensions.cgSize.dividedByScreenScale().integralFloor
|
||||
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
for representation in file.file.previewRepresentations {
|
||||
@ -310,8 +310,8 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
||||
actionSignal = .single(defaultAction)
|
||||
case let .image(representations, _):
|
||||
if let largestSize = largestImageRepresentation(representations) {
|
||||
contentSize = largestSize.dimensions
|
||||
displaySize = largestSize.dimensions.dividedByScreenScale().integralFloor
|
||||
contentSize = largestSize.dimensions.cgSize
|
||||
displaySize = largestSize.dimensions.cgSize.dividedByScreenScale().integralFloor
|
||||
|
||||
let convertedRepresentations: [ImageRepresentationWithReference] = representations.map({ ImageRepresentationWithReference(representation: $0, reference: .wallpaper(resource: $0.resource)) })
|
||||
signal = wallpaperImage(account: context.account, accountManager: context.sharedContext.accountManager, representations: convertedRepresentations, alwaysShowThumbnailFirst: true, autoFetchFullSize: false)
|
||||
@ -382,19 +382,19 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
||||
}
|
||||
if let thumbnail = thumbnail {
|
||||
thumbnailResource = thumbnail.resource
|
||||
thumbnailDimensions = thumbnail.dimensions
|
||||
thumbnailDimensions = thumbnail.dimensions?.cgSize
|
||||
}
|
||||
if let dimensions = content?.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
}
|
||||
case let .internalReference(_, _, _, _, _, image, _, _):
|
||||
if let image = image {
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 1000.0, height: 800.0)) {
|
||||
imageDimensions = imageRepresentation.dimensions
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 1000, height: 800)) {
|
||||
imageDimensions = imageRepresentation.dimensions.cgSize
|
||||
imageResource = imageRepresentation.resource
|
||||
}
|
||||
if let thumbnailRepresentation = smallestImageRepresentation(image.representations) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
}
|
||||
@ -406,9 +406,9 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
||||
|
||||
var representations: [TelegramMediaImageRepresentation] = []
|
||||
if let thumbnailResource = thumbnailResource, let thumbnailDimensions = thumbnailDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: thumbnailDimensions, resource: thumbnailResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailDimensions), resource: thumbnailResource))
|
||||
}
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: imageDimensions, resource: imageResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(imageDimensions), resource: imageResource))
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
|
||||
signal = chatMessagePhoto(postbox: context.account.postbox, photoReference: .standalone(media: tmpImage))
|
||||
@ -607,7 +607,7 @@ final class WallpaperGalleryItemNode: GalleryItemNode {
|
||||
|
||||
private func preparePatternEditing() {
|
||||
if let entry = self.entry, case let .wallpaper(wallpaper, _) = entry, case let .file(file) = wallpaper {
|
||||
if let size = file.file.dimensions?.fitted(CGSize(width: 1280.0, height: 1280.0)) {
|
||||
if let size = file.file.dimensions?.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0)) {
|
||||
let _ = self.context.account.postbox.mediaBox.cachedResourceRepresentation(file.file.resource, representation: CachedPatternWallpaperMaskRepresentation(size: size), complete: false, fetch: true).start()
|
||||
}
|
||||
}
|
||||
|
@ -122,7 +122,7 @@ private func collectExternalShareItems(strings: PresentationStrings, dateTimeFor
|
||||
if file.isSticker, !file.isAnimatedSticker, let dimensions = file.dimensions {
|
||||
return chatMessageSticker(postbox: postbox, file: file, small: false, fetched: true, onlyFullSize: true)
|
||||
|> map { f -> ExternalShareItemStatus in
|
||||
let context = f(TransformImageArguments(corners: ImageCorners(), imageSize: dimensions, boundingSize: dimensions, intrinsicInsets: UIEdgeInsets(), emptyColor: nil, scale: 1.0))
|
||||
let context = f(TransformImageArguments(corners: ImageCorners(), imageSize: dimensions.cgSize, boundingSize: dimensions.cgSize, intrinsicInsets: UIEdgeInsets(), emptyColor: nil, scale: 1.0))
|
||||
if let image = context?.generateImage() {
|
||||
return .done(.image(image))
|
||||
} else {
|
||||
|
@ -53,9 +53,10 @@ private func scalePhotoImage(_ image: UIImage, dimensions: CGSize) -> UIImage? {
|
||||
|
||||
private func preparedShareItem(account: Account, to peerId: PeerId, value: [String: Any]) -> Signal<PreparedShareItem, Void> {
|
||||
if let imageData = value["scaledImageData"] as? Data, let dimensions = value["scaledImageDimensions"] as? NSValue {
|
||||
let diminsionsSize = dimensions.cgSizeValue
|
||||
return .single(.preparing)
|
||||
|> then(
|
||||
standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: dimensions.cgSizeValue)
|
||||
standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: PixelDimensions(width: Int32(diminsionsSize.width), height: Int32(diminsionsSize.height)))
|
||||
|> mapError { _ -> Void in
|
||||
return Void()
|
||||
}
|
||||
@ -73,7 +74,7 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri
|
||||
let dimensions = nativeImageSize.fitted(CGSize(width: 1280.0, height: 1280.0))
|
||||
if let scaledImage = scalePhotoImage(image, dimensions: dimensions), let imageData = scaledImage.jpegData(compressionQuality: 0.52) {
|
||||
return .single(.preparing)
|
||||
|> then(standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: dimensions)
|
||||
|> then(standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: PixelDimensions(width: Int32(dimensions.width), height: Int32(dimensions.height)))
|
||||
|> mapError { _ -> Void in
|
||||
return Void()
|
||||
}
|
||||
@ -126,7 +127,7 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri
|
||||
}
|
||||
|
||||
let resource = LocalFileVideoMediaResource(randomId: arc4random64(), path: asset.url.path, adjustments: resourceAdjustments)
|
||||
return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .resource(.standalone(resource: resource)), mimeType: "video/mp4", attributes: [.Video(duration: Int(finalDuration), size: finalDimensions, flags: flags)], hintFileIsLarge: finalDuration > 3.0 * 60.0)
|
||||
return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .resource(.standalone(resource: resource)), mimeType: "video/mp4", attributes: [.Video(duration: Int(finalDuration), size: PixelDimensions(width: Int32(finalDimensions.width), height: Int32(finalDimensions.height)), flags: flags)], hintFileIsLarge: finalDuration > 3.0 * 60.0)
|
||||
|> mapError { _ -> Void in
|
||||
return Void()
|
||||
}
|
||||
@ -180,10 +181,10 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri
|
||||
let mimeType: String
|
||||
if converted {
|
||||
mimeType = "video/mp4"
|
||||
attributes = [.Video(duration: Int(duration), size: dimensions, flags: [.supportsStreaming]), .Animated, .FileName(fileName: "animation.mp4")]
|
||||
attributes = [.Video(duration: Int(duration), size: PixelDimensions(width: Int32(dimensions.width), height: Int32(dimensions.height)), flags: [.supportsStreaming]), .Animated, .FileName(fileName: "animation.mp4")]
|
||||
} else {
|
||||
mimeType = "animation/gif"
|
||||
attributes = [.ImageSize(size: dimensions), .Animated, .FileName(fileName: fileName ?? "animation.gif")]
|
||||
attributes = [.ImageSize(size: PixelDimensions(width: Int32(dimensions.width), height: Int32(dimensions.height))), .Animated, .FileName(fileName: fileName ?? "animation.gif")]
|
||||
}
|
||||
return standaloneUploadedFile(account: account, peerId: peerId, text: "", source: .data(data), mimeType: mimeType, attributes: attributes, hintFileIsLarge: data.count > 5 * 1024 * 1024)
|
||||
|> mapError { _ -> Void in return Void() }
|
||||
@ -199,7 +200,7 @@ private func preparedShareItem(account: Account, to peerId: PeerId, value: [Stri
|
||||
} else {
|
||||
let scaledImage = TGScaleImageToPixelSize(image, CGSize(width: image.size.width * image.scale, height: image.size.height * image.scale).fitted(CGSize(width: 1280.0, height: 1280.0)))!
|
||||
let imageData = scaledImage.jpegData(compressionQuality: 0.54)!
|
||||
return standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: scaledImage.size)
|
||||
return standaloneUploadedImage(account: account, peerId: peerId, text: "", data: imageData, dimensions: PixelDimensions(width: Int32(scaledImage.size.width), height: Int32(scaledImage.size.height)))
|
||||
|> mapError { _ -> Void in return Void() }
|
||||
|> mapToSignal { event -> Signal<PreparedShareItem, Void> in
|
||||
switch event {
|
||||
|
@ -171,8 +171,8 @@ public final class StickerPackPreviewController: ViewController, StandalonePrese
|
||||
let signal = Signal<Bool, NoError> { subscriber in
|
||||
let fetched = fetchedMediaResource(mediaBox: account.postbox.mediaBox, reference: FileMediaReference.standalone(media: item.file).resourceReference(item.file.resource)).start()
|
||||
let data = account.postbox.mediaBox.resourceData(item.file.resource).start()
|
||||
let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fetchedRepresentation = chatMessageAnimatedStickerDatas(postbox: account.postbox, file: item.file, small: false, size: dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)), fetched: true, onlyFullSize: false, synchronousLoad: false).start(next: { next in
|
||||
let dimensions = item.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fetchedRepresentation = chatMessageAnimatedStickerDatas(postbox: account.postbox, file: item.file, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0)), fetched: true, onlyFullSize: false, synchronousLoad: false).start(next: { next in
|
||||
let hasContent = next._0 != nil || next._1 != nil
|
||||
subscriber.putNext(hasContent)
|
||||
if hasContent {
|
||||
|
@ -98,8 +98,8 @@ final class StickerPackPreviewGridItemNode: GridItemNode {
|
||||
if self.currentState == nil || self.currentState!.0 !== account || self.currentState!.1 != stickerItem {
|
||||
if let dimensions = stickerItem.file.dimensions {
|
||||
if stickerItem.file.isAnimatedSticker {
|
||||
let dimensions = stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: account.postbox, file: stickerItem.file, small: false, size: dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))))
|
||||
let dimensions = stickerItem.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: account.postbox, file: stickerItem.file, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))))
|
||||
|
||||
if self.animationNode == nil {
|
||||
let animationNode = AnimatedStickerNode()
|
||||
@ -109,7 +109,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode {
|
||||
self?.imageNode.isHidden = true
|
||||
}
|
||||
}
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
self.animationNode?.visibility = self.isVisibleInGrid && self.interaction?.playAnimatedStickers ?? true
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start())
|
||||
@ -123,7 +123,7 @@ final class StickerPackPreviewGridItemNode: GridItemNode {
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: chatMessageStickerResource(file: stickerItem.file, small: true)).start())
|
||||
}
|
||||
|
||||
self.currentState = (account, stickerItem, dimensions)
|
||||
self.currentState = (account, stickerItem, dimensions.cgSize)
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ final class StickerPreviewControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
let textSpacing: CGFloat = 10.0
|
||||
let textSize = self.textNode.measure(CGSize(width: 100.0, height: 100.0))
|
||||
|
||||
let imageSize = dimensitons.aspectFitted(boundingSize)
|
||||
let imageSize = dimensitons.cgSize.aspectFitted(boundingSize)
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))()
|
||||
let imageFrame = CGRect(origin: CGPoint(x: floor((layout.size.width - imageSize.width) / 2.0), y: (layout.size.height - imageSize.height - textSpacing - textSize.height) / 4.0), size: imageSize)
|
||||
self.imageNode.frame = imageFrame
|
||||
|
@ -90,8 +90,8 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController
|
||||
let animationNode = AnimatedStickerNode()
|
||||
self.animationNode = animationNode
|
||||
|
||||
let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0))
|
||||
let dimensions = item.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 400.0, height: 400.0))
|
||||
|
||||
self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct)
|
||||
self.animationNode?.visibility = true
|
||||
@ -121,7 +121,7 @@ private final class StickerPreviewPeekContentNode: ASDisplayNode, PeekController
|
||||
let textSpacing: CGFloat = 10.0
|
||||
let textSize = self.textNode.measure(CGSize(width: 100.0, height: 100.0))
|
||||
|
||||
let imageSize = dimensitons.aspectFitted(boundingSize)
|
||||
let imageSize = dimensitons.cgSize.aspectFitted(boundingSize)
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))()
|
||||
let imageFrame = CGRect(origin: CGPoint(x: floor((size.width - imageSize.width) / 2.0), y: textSize.height + textSpacing), size: imageSize)
|
||||
self.imageNode.frame = imageFrame
|
||||
|
@ -1,8 +1,27 @@
|
||||
public struct PixelDimensions : Equatable {
|
||||
#if os(iOS)
|
||||
import UIKit
|
||||
#endif
|
||||
|
||||
public struct PixelDimensions: Equatable {
|
||||
public let width: Int32
|
||||
public let height: Int32
|
||||
|
||||
public init(width: Int32, height: Int32) {
|
||||
self.width = width
|
||||
self.height = height
|
||||
}
|
||||
}
|
||||
|
||||
#if os(iOS)
|
||||
|
||||
public extension PixelDimensions {
|
||||
public init(_ size: CGSize) {
|
||||
self.init(width: Int32(size.width), height: Int32(size.height))
|
||||
}
|
||||
|
||||
public var cgSize: CGSize {
|
||||
return CGSize(width: CGFloat(self.width), height: CGFloat(self.height))
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -159,7 +159,7 @@ private final class ChatContextResultPeekNode: ASDisplayNode, PeekControllerCont
|
||||
} else if let thumbnail = thumbnail {
|
||||
imageResource = thumbnail.resource
|
||||
}
|
||||
imageDimensions = content?.dimensions
|
||||
imageDimensions = content?.dimensions?.cgSize
|
||||
if let content = content, type == "gif", let thumbnailResource = imageResource
|
||||
, let dimensions = content.dimensions {
|
||||
videoFileReference = .standalone(media: TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 0), partialReference: nil, resource: content.resource, previewRepresentations: [TelegramMediaImageRepresentation(dimensions: dimensions, resource: thumbnailResource)], immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: [.Animated, .Video(duration: 0, size: dimensions, flags: [])]))
|
||||
@ -168,14 +168,14 @@ private final class ChatContextResultPeekNode: ASDisplayNode, PeekControllerCont
|
||||
case let .internalReference(_, _, _, title, _, image, file, _):
|
||||
if let image = image {
|
||||
if let largestRepresentation = largestImageRepresentation(image.representations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 100.0))?.resource
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 200, height: 100))?.resource
|
||||
} else if let file = file {
|
||||
if let dimensions = file.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
} else if let largestRepresentation = largestImageRepresentation(file.previewRepresentations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
|
||||
}
|
||||
@ -224,7 +224,7 @@ private final class ChatContextResultPeekNode: ASDisplayNode, PeekControllerCont
|
||||
|
||||
if updatedImageResource {
|
||||
if let imageResource = imageResource {
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: fittedImageDimensions.width * 2.0, height: fittedImageDimensions.height * 2.0), resource: imageResource)
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: Int32(fittedImageDimensions.width * 2.0), height: Int32(fittedImageDimensions.height * 2.0)), resource: imageResource)
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
updateImageSignal = chatMessagePhoto(postbox: self.account.postbox, photoReference: .standalone(media: tmpImage))
|
||||
} else {
|
||||
|
@ -5609,7 +5609,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
let mimeType = guessMimeTypeByFileExtension((item.fileName as NSString).pathExtension)
|
||||
var previewRepresentations: [TelegramMediaImageRepresentation] = []
|
||||
if mimeType == "application/pdf" {
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: CGSize(width: 320.0, height: 320.0), resource: ICloudFileResource(urlData: item.urlData, thumbnail: true)))
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 320, height: 320), resource: ICloudFileResource(urlData: item.urlData, thumbnail: true)))
|
||||
}
|
||||
let file = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: fileId), partialReference: nil, resource: ICloudFileResource(urlData: item.urlData, thumbnail: false), previewRepresentations: previewRepresentations, immediateThumbnailData: nil, mimeType: mimeType, size: item.fileSize, attributes: [.FileName(fileName: item.fileName)])
|
||||
let message: EnqueueMessage = .message(text: "", attributes: [], mediaReference: .standalone(media: file), replyToMessageId: replyMessageId, localGroupingKey: nil)
|
||||
@ -6078,7 +6078,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
||||
var fileAttributes: [TelegramMediaFileAttribute] = []
|
||||
fileAttributes.append(.FileName(fileName: "sticker.webp"))
|
||||
fileAttributes.append(.Sticker(displayText: "", packReference: nil, maskData: nil))
|
||||
fileAttributes.append(.ImageSize(size: size))
|
||||
fileAttributes.append(.ImageSize(size: PixelDimensions(size)))
|
||||
|
||||
let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: resource, previewRepresentations: [], immediateThumbnailData: nil, mimeType: "image/webp", size: data.count, attributes: fileAttributes)
|
||||
let message = EnqueueMessage.message(text: "", attributes: [], mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: nil)
|
||||
|
@ -229,8 +229,8 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode {
|
||||
}
|
||||
self.addSubnode(animationNode)
|
||||
}
|
||||
let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.account.postbox, file: item.stickerItem.file, small: false, size: dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))))
|
||||
let dimensions = item.stickerItem.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.account.postbox, file: item.stickerItem.file, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))))
|
||||
self.updateVisibility()
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: item.account, fileReference: stickerPackFileReference(item.stickerItem.file), resource: item.stickerItem.file.resource).start())
|
||||
} else {
|
||||
@ -245,7 +245,7 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode {
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: item.account, fileReference: stickerPackFileReference(item.stickerItem.file), resource: chatMessageStickerResource(file: item.stickerItem.file, small: true)).start())
|
||||
}
|
||||
|
||||
self.currentState = (item.account, item.stickerItem, dimensions)
|
||||
self.currentState = (item.account, item.stickerItem, dimensions.cgSize)
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
}
|
||||
@ -299,8 +299,8 @@ final class ChatMediaInputStickerGridItemNode: GridItemNode {
|
||||
self.animationNode?.visibility = isPlaying
|
||||
if let item = self.item, isPlaying, !self.didSetUpAnimationNode {
|
||||
self.didSetUpAnimationNode = true
|
||||
let dimensions = item.stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let dimensions = item.stickerItem.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
self.animationNode?.setup(source: AnimatedStickerResourceSource(account: item.account, resource: item.stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
}
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ final class ChatMediaInputStickerPackItemNode: ListViewItemNode {
|
||||
if let thumbnailItem = thumbnailItem {
|
||||
switch thumbnailItem {
|
||||
case let .still(representation):
|
||||
let imageSize = representation.dimensions.aspectFitted(boundingImageSize)
|
||||
let imageSize = representation.dimensions.cgSize.aspectFitted(boundingImageSize)
|
||||
let imageApply = self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))
|
||||
imageApply()
|
||||
self.imageNode.setSignal(chatMessageStickerPackThumbnail(postbox: account.postbox, resource: representation.resource))
|
||||
|
@ -244,8 +244,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
||||
if let telegramFile = media as? TelegramMediaFile {
|
||||
if self.telegramFile?.id != telegramFile.id {
|
||||
self.telegramFile = telegramFile
|
||||
let dimensions = telegramFile.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: telegramFile, small: false, size: dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0)), thumbnail: false))
|
||||
let dimensions = telegramFile.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: telegramFile, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 384.0, height: 384.0)), thumbnail: false))
|
||||
self.updateVisibility()
|
||||
self.disposable.set(freeMediaFileInteractiveFetched(account: item.context.account, fileReference: .message(message: MessageReference(item.message), media: telegramFile)).start())
|
||||
}
|
||||
@ -257,12 +257,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
||||
if self.telegramFile == nil, let emojiFile = item.associatedData.animatedEmojiStickers[emoji]?.file {
|
||||
if self.emojiFile?.id != emojiFile.id {
|
||||
self.emojiFile = emojiFile
|
||||
let dimensions = emojiFile.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let dimensions = emojiFile.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
var fitzModifier: EmojiFitzModifier?
|
||||
if let fitz = fitz {
|
||||
fitzModifier = EmojiFitzModifier(emoji: fitz)
|
||||
}
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: emojiFile, small: false, size: dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)), fitzModifier: fitzModifier, thumbnail: false))
|
||||
self.imageNode.setSignal(chatMessageAnimatedSticker(postbox: item.context.account.postbox, file: emojiFile, small: false, size: dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)), fitzModifier: fitzModifier, thumbnail: false))
|
||||
self.disposable.set(freeMediaFileInteractiveFetched(account: item.context.account, fileReference: .standalone(media: emojiFile)).start())
|
||||
self.updateVisibility()
|
||||
}
|
||||
@ -314,8 +314,8 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
||||
}
|
||||
|
||||
if let file = file {
|
||||
let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedSize = isEmoji ? dimensions.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0))
|
||||
let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedSize = isEmoji ? dimensions.cgSize.aspectFilled(CGSize(width: 384.0, height: 384.0)) : dimensions.cgSize.aspectFitted(CGSize(width: 384.0, height: 384.0))
|
||||
self.animationNode.setup(source: AnimatedStickerResourceSource(account: item.context.account, resource: file.resource, fitzModifier: fitzModifier), width: Int(fittedSize.width), height: Int(fittedSize.height), playbackMode: playbackMode, mode: .cached)
|
||||
}
|
||||
}
|
||||
@ -348,18 +348,18 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
||||
var isEmoji = false
|
||||
if let telegramFile = telegramFile {
|
||||
if let dimensions = telegramFile.dimensions {
|
||||
imageSize = dimensions.aspectFitted(displaySize)
|
||||
imageSize = dimensions.cgSize.aspectFitted(displaySize)
|
||||
} else if let thumbnailSize = telegramFile.previewRepresentations.first?.dimensions {
|
||||
imageSize = thumbnailSize.aspectFitted(displaySize)
|
||||
imageSize = thumbnailSize.cgSize.aspectFitted(displaySize)
|
||||
}
|
||||
} else if let emojiFile = emojiFile {
|
||||
isEmoji = true
|
||||
|
||||
let displaySize = CGSize(width: floor(displaySize.width * item.presentationData.animatedEmojiScale), height: floor(displaySize.height * item.presentationData.animatedEmojiScale))
|
||||
if let dimensions = emojiFile.dimensions {
|
||||
imageSize = CGSize(width: displaySize.width * dimensions.width / 512.0, height: displaySize.height * dimensions.height / 512.0)
|
||||
imageSize = CGSize(width: displaySize.width * CGFloat(dimensions.width) / 512.0, height: displaySize.height * CGFloat(dimensions.height) / 512.0)
|
||||
} else if let thumbnailSize = emojiFile.previewRepresentations.first?.dimensions {
|
||||
imageSize = thumbnailSize.aspectFitted(displaySize)
|
||||
imageSize = thumbnailSize.cgSize.aspectFitted(displaySize)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -468,7 +468,7 @@ final class ChatMessageAttachedContentNode: ASDisplayNode {
|
||||
initialWidth = initialImageWidth + horizontalInsets.left + horizontalInsets.right
|
||||
refineContentImageLayout = refineLayout
|
||||
} else if let dimensions = largestImageRepresentation(image.representations)?.dimensions {
|
||||
inlineImageDimensions = dimensions
|
||||
inlineImageDimensions = dimensions.cgSize
|
||||
|
||||
if image != currentImage {
|
||||
updateInlineImageSignal = chatWebpageSnippetPhoto(account: context.account, photoReference: .message(message: MessageReference(message), media: image))
|
||||
|
@ -275,16 +275,16 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
||||
|
||||
var unboundSize: CGSize
|
||||
if let image = media as? TelegramMediaImage, let dimensions = largestImageRepresentation(image.representations)?.dimensions {
|
||||
unboundSize = CGSize(width: max(10.0, floor(dimensions.width * 0.5)), height: max(10.0, floor(dimensions.height * 0.5)))
|
||||
unboundSize = CGSize(width: max(10.0, floor(dimensions.cgSize.width * 0.5)), height: max(10.0, floor(dimensions.cgSize.height * 0.5)))
|
||||
} else if let file = media as? TelegramMediaFile, var dimensions = file.dimensions {
|
||||
if let thumbnail = file.previewRepresentations.first {
|
||||
let dimensionsVertical = dimensions.width < dimensions.height
|
||||
let thumbnailVertical = thumbnail.dimensions.width < thumbnail.dimensions.height
|
||||
if dimensionsVertical != thumbnailVertical {
|
||||
dimensions = CGSize(width: dimensions.height, height: dimensions.width)
|
||||
dimensions = PixelDimensions(CGSize(width: dimensions.cgSize.height, height: dimensions.cgSize.width))
|
||||
}
|
||||
}
|
||||
unboundSize = CGSize(width: floor(dimensions.width * 0.5), height: floor(dimensions.height * 0.5))
|
||||
unboundSize = CGSize(width: floor(dimensions.cgSize.width * 0.5), height: floor(dimensions.cgSize.height * 0.5))
|
||||
if file.isAnimated {
|
||||
unboundSize = unboundSize.aspectFilled(CGSize(width: 480.0, height: 480.0))
|
||||
} else if file.isVideo && !file.isAnimated, case let .constrained(constrainedSize) = sizeCalculation {
|
||||
@ -300,7 +300,7 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
||||
}
|
||||
isInlinePlayableVideo = file.isVideo && !isSecretMedia
|
||||
} else if let image = media as? TelegramMediaWebFile, let dimensions = image.dimensions {
|
||||
unboundSize = CGSize(width: floor(dimensions.width * 0.5), height: floor(dimensions.height * 0.5))
|
||||
unboundSize = CGSize(width: floor(dimensions.cgSize.width * 0.5), height: floor(dimensions.cgSize.height * 0.5))
|
||||
} else if let wallpaper = media as? WallpaperPreviewMedia {
|
||||
switch wallpaper.content {
|
||||
case let .file(file, _, isTheme, isSupported):
|
||||
@ -308,14 +308,14 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
||||
let dimensionsVertical = dimensions.width < dimensions.height
|
||||
let thumbnailVertical = thumbnail.dimensions.width < thumbnail.dimensions.height
|
||||
if dimensionsVertical != thumbnailVertical {
|
||||
dimensions = CGSize(width: dimensions.height, height: dimensions.width)
|
||||
dimensions = PixelDimensions(CGSize(width: dimensions.cgSize.height, height: dimensions.cgSize.width))
|
||||
}
|
||||
unboundSize = CGSize(width: floor(dimensions.width * 0.5), height: floor(dimensions.height * 0.5)).fitted(CGSize(width: 240.0, height: 240.0))
|
||||
unboundSize = CGSize(width: floor(dimensions.cgSize.width * 0.5), height: floor(dimensions.cgSize.height * 0.5)).fitted(CGSize(width: 240.0, height: 240.0))
|
||||
} else if isTheme {
|
||||
if isSupported {
|
||||
unboundSize = CGSize(width: 160.0, height: 240.0).fitted(CGSize(width: 240.0, height: 240.0))
|
||||
} else if let thumbnail = file.previewRepresentations.first {
|
||||
unboundSize = CGSize(width: floor(thumbnail.dimensions.width), height: floor(thumbnail.dimensions.height)).fitted(CGSize(width: 240.0, height: 240.0))
|
||||
unboundSize = CGSize(width: floor(thumbnail.dimensions.cgSize.width), height: floor(thumbnail.dimensions.cgSize.height)).fitted(CGSize(width: 240.0, height: 240.0))
|
||||
} else {
|
||||
unboundSize = CGSize(width: 54.0, height: 54.0)
|
||||
}
|
||||
@ -499,9 +499,9 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
||||
}
|
||||
} else {
|
||||
if file.isAnimatedSticker {
|
||||
let dimensions = file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let dimensions = file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
updateImageSignal = { synchronousLoad in
|
||||
return chatMessageAnimatedSticker(postbox: context.account.postbox, file: file, small: false, size: dimensions.aspectFitted(CGSize(width: 400.0, height: 400.0)))
|
||||
return chatMessageAnimatedSticker(postbox: context.account.postbox, file: file, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 400.0, height: 400.0)))
|
||||
}
|
||||
} else if file.isSticker {
|
||||
updateImageSignal = { synchronousLoad in
|
||||
@ -731,8 +731,8 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
|
||||
strongSelf.imageNode.isHidden = true
|
||||
}
|
||||
strongSelf.animatedStickerNode = animatedStickerNode
|
||||
let dimensions = updatedAnimatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 384.0, height: 384.0))
|
||||
let dimensions = updatedAnimatedStickerFile.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 384.0, height: 384.0))
|
||||
animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: context.account, resource: updatedAnimatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
strongSelf.insertSubnode(animatedStickerNode, aboveSubnode: strongSelf.imageNode)
|
||||
animatedStickerNode.visibility = strongSelf.visibility
|
||||
|
@ -161,13 +161,13 @@ final class ChatMessageNotificationItemNode: NotificationItemNode {
|
||||
if let image = media as? TelegramMediaImage {
|
||||
updatedMedia = image
|
||||
if let representation = largestRepresentationForPhoto(image) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
updatedMedia = file
|
||||
if let representation = largestImageRepresentation(file.previewRepresentations) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
isRound = file.isInstantVideo
|
||||
break
|
||||
|
@ -91,16 +91,16 @@ class ChatMessageReplyInfoNode: ASDisplayNode {
|
||||
if let image = media as? TelegramMediaImage {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: image)
|
||||
if let representation = largestRepresentationForPhoto(image) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
} else if let file = media as? TelegramMediaFile, file.isVideo {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: file)
|
||||
|
||||
if let dimensions = file.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
} else if let representation = largestImageRepresentation(file.previewRepresentations), !file.isSticker {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
if file.isInstantVideo {
|
||||
hasRoundImage = true
|
||||
|
@ -148,9 +148,9 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
||||
var imageSize: CGSize = CGSize(width: 100.0, height: 100.0)
|
||||
if let telegramFile = telegramFile {
|
||||
if let dimensions = telegramFile.dimensions {
|
||||
imageSize = dimensions.aspectFitted(displaySize)
|
||||
imageSize = dimensions.cgSize.aspectFitted(displaySize)
|
||||
} else if let thumbnailSize = telegramFile.previewRepresentations.first?.dimensions {
|
||||
imageSize = thumbnailSize.aspectFitted(displaySize)
|
||||
imageSize = thumbnailSize.cgSize.aspectFitted(displaySize)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -273,7 +273,7 @@ final class ChatMessageWebpageBubbleContentNode: ChatMessageBubbleContentNode {
|
||||
if let type = webpage.type, ["photo", "video", "embed", "gif", "document", "telegram_album"].contains(type) {
|
||||
var flags = ChatMessageAttachedContentNodeMediaFlags()
|
||||
if webpage.instantPage != nil, let largest = largestImageRepresentation(image.representations) {
|
||||
if largest.dimensions.width >= 256.0 {
|
||||
if largest.dimensions.width >= 256 {
|
||||
flags.insert(.preferMediaBeforeText)
|
||||
}
|
||||
} else if let embedUrl = webpage.embedUrl, !embedUrl.isEmpty {
|
||||
|
@ -185,13 +185,13 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
if let image = media as? TelegramMediaImage {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: image)
|
||||
if let representation = largestRepresentationForPhoto(image) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: file)
|
||||
if !file.isInstantVideo, let representation = largestImageRepresentation(file.previewRepresentations), !file.isSticker {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
} else if let _ = media as? TelegramMediaPoll {
|
||||
@ -222,8 +222,8 @@ final class ChatPinnedMessageTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
updateImageSignal = chatMessagePhotoThumbnail(account: context.account, photoReference: imageReference)
|
||||
} else if let fileReference = updatedMediaReference.concrete(TelegramMediaFile.self) {
|
||||
if fileReference.media.isAnimatedSticker {
|
||||
let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
updateImageSignal = chatMessageAnimatedSticker(postbox: context.account.postbox, file: fileReference.media, small: false, size: dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0)))
|
||||
let dimensions = fileReference.media.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
updateImageSignal = chatMessageAnimatedSticker(postbox: context.account.postbox, file: fileReference.media, small: false, size: dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0)))
|
||||
updatedFetchMediaSignal = fetchedMediaResource(mediaBox: context.account.postbox.mediaBox, reference: fileReference.resourceReference(fileReference.media.resource))
|
||||
} else if fileReference.media.isVideo {
|
||||
updateImageSignal = chatMessageVideoThumbnail(account: context.account, fileReference: fileReference)
|
||||
|
@ -313,7 +313,7 @@ public func createChannelController(context: AccountContext) -> ViewController {
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
uploadedAvatar.set(uploadedPeerPhoto(postbox: context.account.postbox, network: context.account.network, resource: resource))
|
||||
updateState { current in
|
||||
var current = current
|
||||
|
@ -508,7 +508,7 @@ public func createGroupControllerImpl(context: AccountContext, peerIds: [PeerId]
|
||||
if let data = image.jpegData(compressionQuality: 0.6) {
|
||||
let resource = LocalFileMediaResource(fileId: arc4random64())
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: data)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 640.0, height: 640.0), resource: resource)
|
||||
let representation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 640, height: 640), resource: resource)
|
||||
uploadedAvatar.set(uploadedPeerPhoto(postbox: context.account.postbox, network: context.account.network, resource: resource))
|
||||
updateState { current in
|
||||
var current = current
|
||||
|
@ -165,12 +165,12 @@ final class EditAccessoryPanelNode: AccessoryPanelNode {
|
||||
if let imageReference = candidateMediaReference?.concrete(TelegramMediaImage.self) {
|
||||
updatedMediaReference = imageReference.abstract
|
||||
if let representation = largestRepresentationForPhoto(imageReference.media) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
} else if let fileReference = candidateMediaReference?.concrete(TelegramMediaFile.self) {
|
||||
updatedMediaReference = fileReference.abstract
|
||||
if !fileReference.media.isInstantVideo, let representation = largestImageRepresentation(fileReference.media.previewRepresentations), !fileReference.media.isSticker {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -212,7 +212,7 @@ final class GridMessageItemNode: GridItemNode {
|
||||
if self.currentState == nil || self.currentState!.0 !== context || !self.currentState!.1.isEqual(to: media) {
|
||||
var mediaDimensions: CGSize?
|
||||
if let image = media as? TelegramMediaImage, let largestSize = largestImageRepresentation(image.representations)?.dimensions {
|
||||
mediaDimensions = largestSize
|
||||
mediaDimensions = largestSize.cgSize
|
||||
|
||||
self.imageNode.setSignal(mediaGridMessagePhoto(account: context.account, photoReference: .message(message: MessageReference(item.message), media: image), synchronousLoad: synchronousLoad), attemptSynchronously: synchronousLoad, dispatchOnDisplayLink: true)
|
||||
|
||||
@ -223,7 +223,7 @@ final class GridMessageItemNode: GridItemNode {
|
||||
self.mediaBadgeNode.isHidden = true
|
||||
self.resourceStatus = nil
|
||||
} else if let file = media as? TelegramMediaFile, file.isVideo {
|
||||
mediaDimensions = file.dimensions
|
||||
mediaDimensions = file.dimensions?.cgSize
|
||||
self.imageNode.setSignal(mediaGridMessageVideo(postbox: context.account.postbox, videoReference: .message(message: MessageReference(item.message), media: file), synchronousLoad: synchronousLoad, autoFetchFullSizeThumbnail: true), attemptSynchronously: synchronousLoad)
|
||||
|
||||
self.mediaBadgeNode.isHidden = false
|
||||
|
@ -214,7 +214,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode
|
||||
} else if let thumbnail = thumbnail {
|
||||
imageResource = thumbnail.resource
|
||||
}
|
||||
imageDimensions = content?.dimensions
|
||||
imageDimensions = content?.dimensions?.cgSize
|
||||
if type == "gif", let thumbnailResource = imageResource, let content = content, let dimensions = content.dimensions {
|
||||
videoFile = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: 0), partialReference: nil, resource: content.resource, previewRepresentations: [TelegramMediaImageRepresentation(dimensions: dimensions, resource: thumbnailResource)], immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: [.Animated, .Video(duration: 0, size: dimensions, flags: [])])
|
||||
imageResource = nil
|
||||
@ -228,14 +228,14 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode
|
||||
case let .internalReference(_, _, _, _, _, image, file, _):
|
||||
if let image = image {
|
||||
if let largestRepresentation = largestImageRepresentation(image.representations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 100.0))?.resource
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 200, height: 100))?.resource
|
||||
} else if let file = file {
|
||||
if let dimensions = file.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
} else if let largestRepresentation = largestImageRepresentation(file.previewRepresentations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
if file.isAnimatedSticker {
|
||||
animatedStickerFile = file
|
||||
@ -309,7 +309,7 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode
|
||||
if let stickerFile = stickerFile {
|
||||
updateImageSignal = chatMessageSticker(account: item.account, file: stickerFile, small: false, fetched: true)
|
||||
} else {
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: fittedImageDimensions.width * 2.0, height: fittedImageDimensions.height * 2.0), resource: imageResource)
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(CGSize(width: fittedImageDimensions.width * 2.0, height: fittedImageDimensions.height * 2.0)), resource: imageResource)
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
updateImageSignal = chatMessagePhoto(postbox: item.account.postbox, photoReference: .standalone(media: tmpImage))
|
||||
}
|
||||
@ -386,8 +386,8 @@ final class HorizontalListContextResultsChatInputPanelItemNode: ListViewItemNode
|
||||
animationNode.started = { [weak self] in
|
||||
self?.imageNode.alpha = 0.0
|
||||
}
|
||||
let dimensions = animatedStickerFile.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let dimensions = animatedStickerFile.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
animationNode.setup(source: AnimatedStickerResourceSource(account: item.account, resource: animatedStickerFile.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
}
|
||||
}
|
||||
|
@ -111,8 +111,8 @@ final class HorizontalStickerGridItemNode: GridItemNode {
|
||||
animationNode.started = { [weak self] in
|
||||
self?.imageNode.alpha = 0.0
|
||||
}
|
||||
let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let dimensions = item.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
animationNode.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start())
|
||||
@ -128,7 +128,7 @@ final class HorizontalStickerGridItemNode: GridItemNode {
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: chatMessageStickerResource(file: item.file, small: true)).start())
|
||||
}
|
||||
|
||||
self.currentState = (account, item, dimensions)
|
||||
self.currentState = (account, item, dimensions.cgSize)
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
}
|
||||
|
@ -143,7 +143,7 @@ func legacyInstantVideoController(theme: PresentationTheme, panelFrame: CGRect,
|
||||
let thumbnailImage = TGScaleImageToPixelSize(previewImage, thumbnailSize)!
|
||||
if let thumbnailData = thumbnailImage.jpegData(compressionQuality: 0.4) {
|
||||
context.account.postbox.mediaBox.storeResourceData(resource.id, data: thumbnailData)
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: thumbnailSize, resource: resource))
|
||||
previewRepresentations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailSize), resource: resource))
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,7 +178,7 @@ func legacyInstantVideoController(theme: PresentationTheme, panelFrame: CGRect,
|
||||
}
|
||||
}
|
||||
|
||||
let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: [.FileName(fileName: "video.mp4"), .Video(duration: Int(finalDuration), size: finalDimensions, flags: [.instantRoundVideo])])
|
||||
let media = TelegramMediaFile(fileId: MediaId(namespace: Namespaces.Media.LocalFile, id: arc4random64()), partialReference: nil, resource: resource, previewRepresentations: previewRepresentations, immediateThumbnailData: nil, mimeType: "video/mp4", size: nil, attributes: [.FileName(fileName: "video.mp4"), .Video(duration: Int(finalDuration), size: PixelDimensions(finalDimensions), flags: [.instantRoundVideo])])
|
||||
let attributes: [MessageAttribute] = []
|
||||
send(.message(text: "", attributes: attributes, mediaReference: .standalone(media: media), replyToMessageId: nil, localGroupingKey: nil))
|
||||
}
|
||||
|
@ -465,7 +465,7 @@ final class ListMessageFileItemNode: ListMessageNode {
|
||||
case let .imageRepresentation(_, representation):
|
||||
let iconSize = CGSize(width: 42.0, height: 42.0)
|
||||
let imageCorners = ImageCorners(topLeft: .Corner(4.0), topRight: .Corner(4.0), bottomLeft: .Corner(4.0), bottomRight: .Corner(4.0))
|
||||
let arguments = TransformImageArguments(corners: imageCorners, imageSize: representation.dimensions.aspectFilled(iconSize), boundingSize: iconSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
let arguments = TransformImageArguments(corners: imageCorners, imageSize: representation.dimensions.cgSize.aspectFilled(iconSize), boundingSize: iconSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
iconImageApply = iconImageLayout(arguments)
|
||||
case .albumArt:
|
||||
let iconSize = CGSize(width: 46.0, height: 46.0)
|
||||
|
@ -204,7 +204,7 @@ final class ListMessageSnippetItemNode: ListMessageNode {
|
||||
title = NSAttributedString(string: content.title ?? content.websiteName ?? hostName, font: titleFont, textColor: item.theme.list.itemPrimaryTextColor)
|
||||
|
||||
if let image = content.image {
|
||||
if let representation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 80.0, height: 80.0)) {
|
||||
if let representation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 80, height: 80)) {
|
||||
iconImageReferenceAndRepresentation = (.message(message: MessageReference(item.message), media: image), representation)
|
||||
}
|
||||
} else if let file = content.file {
|
||||
@ -311,7 +311,7 @@ final class ListMessageSnippetItemNode: ListMessageNode {
|
||||
if let iconImageReferenceAndRepresentation = iconImageReferenceAndRepresentation {
|
||||
let iconSize = CGSize(width: 42.0, height: 42.0)
|
||||
let imageCorners = ImageCorners(topLeft: .Corner(2.0), topRight: .Corner(2.0), bottomLeft: .Corner(2.0), bottomRight: .Corner(2.0))
|
||||
let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconImageReferenceAndRepresentation.1.dimensions.aspectFilled(iconSize), boundingSize: iconSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
let arguments = TransformImageArguments(corners: imageCorners, imageSize: iconImageReferenceAndRepresentation.1.dimensions.cgSize.aspectFilled(iconSize), boundingSize: iconSize, intrinsicInsets: UIEdgeInsets(), emptyColor: item.theme.list.mediaPlaceholderColor)
|
||||
iconImageApply = iconImageLayout(arguments)
|
||||
}
|
||||
|
||||
|
@ -118,8 +118,8 @@ final class TrendingTopItemNode: ASDisplayNode {
|
||||
animationNode.started = { [weak self] in
|
||||
self?.imageNode.alpha = 0.0
|
||||
}
|
||||
let dimensions = item.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let dimensions = item.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
animationNode.setup(source: AnimatedStickerResourceSource(account: account, resource: item.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
self.loadDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(item.file), resource: item.file.resource).start())
|
||||
} else {
|
||||
@ -154,7 +154,7 @@ final class TrendingTopItemNode: ASDisplayNode {
|
||||
super.layout()
|
||||
|
||||
if let dimensions = self.file?.dimensions, let itemSize = self.itemSize {
|
||||
let imageSize = dimensions.aspectFitted(itemSize)
|
||||
let imageSize = dimensions.cgSize.aspectFitted(itemSize)
|
||||
self.imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))()
|
||||
}
|
||||
|
||||
@ -372,7 +372,7 @@ class MediaInputPaneTrendingItemNode: ListViewItemNode {
|
||||
node.setup(account: item.account, item: topItems[i], itemSize: itemSize, synchronousLoads: synchronousLoads)
|
||||
}
|
||||
if let dimensions = file.dimensions {
|
||||
let imageSize = dimensions.aspectFitted(itemSize)
|
||||
let imageSize = dimensions.cgSize.aspectFitted(itemSize)
|
||||
node.frame = CGRect(origin: CGPoint(x: offset, y: 48.0), size: imageSize)
|
||||
offset += itemSize.width + itemSpacing
|
||||
}
|
||||
|
@ -361,7 +361,7 @@ final class MultiplexedVideoNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
for item in self.files {
|
||||
let aspectRatio: CGFloat
|
||||
if let dimensions = item.media.dimensions {
|
||||
aspectRatio = dimensions.width / dimensions.height
|
||||
aspectRatio = dimensions.cgSize.width / dimensions.cgSize.height
|
||||
} else {
|
||||
aspectRatio = 1.0
|
||||
}
|
||||
@ -398,7 +398,7 @@ final class MultiplexedVideoNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
while j < n {
|
||||
let aspectRatio: CGFloat
|
||||
if let dimensions = self.files[j].media.dimensions {
|
||||
aspectRatio = dimensions.width / dimensions.height
|
||||
aspectRatio = dimensions.cgSize.width / dimensions.cgSize.height
|
||||
} else {
|
||||
aspectRatio = 1.0
|
||||
}
|
||||
@ -424,7 +424,7 @@ final class MultiplexedVideoNode: ASDisplayNode, UIScrollViewDelegate {
|
||||
while j < n {
|
||||
let aspectRatio: CGFloat
|
||||
if let dimensions = self.files[j].media.dimensions {
|
||||
aspectRatio = dimensions.width / dimensions.height
|
||||
aspectRatio = dimensions.cgSize.width / dimensions.cgSize.height
|
||||
} else {
|
||||
aspectRatio = 1.0
|
||||
}
|
||||
|
@ -193,13 +193,13 @@ public final class NotificationViewControllerImpl {
|
||||
|
||||
let messageId = MessageId(peerId: PeerId(peerIdValue), namespace: messageIdNamespace, id: messageIdId)
|
||||
|
||||
if let image = media as? TelegramMediaImage, let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 120.0, height: 120.0)), let largestRepresentation = largestImageRepresentation(image.representations) {
|
||||
if let image = media as? TelegramMediaImage, let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 120, height: 120)), let largestRepresentation = largestImageRepresentation(image.representations) {
|
||||
let dimensions = largestRepresentation.dimensions
|
||||
let fittedSize = dimensions.fitted(CGSize(width: view.bounds.width, height: 1000.0))
|
||||
let fittedSize = dimensions.cgSize.fitted(CGSize(width: view.bounds.width, height: 1000.0))
|
||||
view.frame = CGRect(origin: view.frame.origin, size: fittedSize)
|
||||
self.setPreferredContentSize(fittedSize)
|
||||
|
||||
self.imageInfo = (false, dimensions)
|
||||
self.imageInfo = (false, dimensions.cgSize)
|
||||
self.updateImageLayout(boundingSize: view.bounds.size)
|
||||
|
||||
let mediaBoxPath = accountsPath + "/" + accountRecordIdPathName(AccountRecordId(rawValue: accountIdValue)) + "/postbox/media"
|
||||
@ -263,11 +263,11 @@ public final class NotificationViewControllerImpl {
|
||||
return
|
||||
}
|
||||
|
||||
let fittedSize = dimensions.fitted(CGSize(width: min(256.0, view.bounds.width), height: 256.0))
|
||||
let fittedSize = dimensions.cgSize.fitted(CGSize(width: min(256.0, view.bounds.width), height: 256.0))
|
||||
view.frame = CGRect(origin: view.frame.origin, size: fittedSize)
|
||||
self.setPreferredContentSize(fittedSize)
|
||||
|
||||
self.imageInfo = (true, dimensions)
|
||||
self.imageInfo = (true, dimensions.cgSize)
|
||||
self.updateImageLayout(boundingSize: view.bounds.size)
|
||||
|
||||
self.applyDisposable.set((sharedAccountContext.activeAccounts
|
||||
@ -322,8 +322,8 @@ public final class NotificationViewControllerImpl {
|
||||
}
|
||||
view?.addSubnode(animatedStickerNode)
|
||||
}
|
||||
let dimensions = fileReference.media.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 512.0, height: 512.0))
|
||||
let dimensions = fileReference.media.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 512.0, height: 512.0))
|
||||
strongSelf.imageNode.setSignal(chatMessageAnimatedSticker(postbox: accountAndImage.0.postbox, file: fileReference.media, small: false, size: fittedDimensions))
|
||||
animatedStickerNode.setup(source: AnimatedStickerResourceSource(account: accountAndImage.0, resource: fileReference.media.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .direct)
|
||||
animatedStickerNode.visibility = true
|
||||
|
@ -90,14 +90,14 @@ final class ReplyAccessoryPanelNode: AccessoryPanelNode {
|
||||
if let image = media as? TelegramMediaImage {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: image)
|
||||
if let representation = largestRepresentationForPhoto(image) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
} else if let file = media as? TelegramMediaFile {
|
||||
updatedMediaReference = .message(message: MessageReference(message), media: file)
|
||||
isRoundImage = file.isInstantVideo
|
||||
if let representation = largestImageRepresentation(file.previewRepresentations), !file.isSticker && !file.isAnimatedSticker {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -32,7 +32,7 @@ final class SoftwareVideoThumbnailLayer: CALayer {
|
||||
|
||||
if let dimensions = fileReference.media.dimensions {
|
||||
self.disposable.set((mediaGridMessageVideo(postbox: account.postbox, videoReference: fileReference)).start(next: { [weak self] transform in
|
||||
var boundingSize = dimensions.aspectFilled(CGSize(width: 93.0, height: 93.0))
|
||||
var boundingSize = dimensions.cgSize.aspectFilled(CGSize(width: 93.0, height: 93.0))
|
||||
let imageSize = boundingSize
|
||||
boundingSize.width = min(200.0, boundingSize.width)
|
||||
|
||||
|
@ -284,7 +284,7 @@ class StickerPaneSearchGlobalItemNode: GridItemNode {
|
||||
node.setup(account: item.account, item: topItems[i], itemSize: itemSize, synchronousLoads: false)
|
||||
}
|
||||
if let dimensions = file.dimensions {
|
||||
let imageSize = dimensions.aspectFitted(itemSize)
|
||||
let imageSize = dimensions.cgSize.aspectFitted(itemSize)
|
||||
node.frame = CGRect(origin: CGPoint(x: offset, y: 48.0 + topOffset), size: imageSize)
|
||||
offset += itemSize.width + itemSpacing
|
||||
}
|
||||
|
@ -164,8 +164,8 @@ final class StickerPaneSearchStickerItemNode: GridItemNode {
|
||||
self.animationNode = animationNode
|
||||
self.addSubnode(animationNode)
|
||||
}
|
||||
let dimensions = stickerItem.file.dimensions ?? CGSize(width: 512.0, height: 512.0)
|
||||
let fittedDimensions = dimensions.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
let dimensions = stickerItem.file.dimensions ?? PixelDimensions(width: 512, height: 512)
|
||||
let fittedDimensions = dimensions.cgSize.aspectFitted(CGSize(width: 160.0, height: 160.0))
|
||||
self.animationNode?.setup(source: AnimatedStickerResourceSource(account: account, resource: stickerItem.file.resource), width: Int(fittedDimensions.width), height: Int(fittedDimensions.height), mode: .cached)
|
||||
self.animationNode?.visibility = self.isVisibleInGrid
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: stickerItem.file.resource).start())
|
||||
@ -179,7 +179,7 @@ final class StickerPaneSearchStickerItemNode: GridItemNode {
|
||||
self.stickerFetchedDisposable.set(freeMediaFileResourceInteractiveFetched(account: account, fileReference: stickerPackFileReference(stickerItem.file), resource: chatMessageStickerResource(file: stickerItem.file, small: true)).start())
|
||||
}
|
||||
|
||||
self.currentState = (account, stickerItem, dimensions)
|
||||
self.currentState = (account, stickerItem, dimensions.cgSize)
|
||||
self.setNeedsLayout()
|
||||
}
|
||||
}
|
||||
|
@ -224,7 +224,7 @@ final class StickersChatInputContextPanelItemNode: ListViewItemNode {
|
||||
|
||||
var imageSize = itemSize
|
||||
if let dimensions = file.dimensions {
|
||||
imageSize = dimensions.aspectFitted(CGSize(width: itemSize.width - 4.0, height: itemSize.height - 4.0))
|
||||
imageSize = dimensions.cgSize.aspectFitted(CGSize(width: itemSize.width - 4.0, height: itemSize.height - 4.0))
|
||||
imageNode.asyncLayout()(TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets()))()
|
||||
}
|
||||
|
||||
|
@ -45,5 +45,7 @@ public let telegramAccountAuxiliaryMethods = AccountAuxiliaryMethods(updatePeerC
|
||||
}
|
||||
return .single(nil)
|
||||
}, prepareSecretThumbnailData: { data in
|
||||
return prepareSecretThumbnailData(data)
|
||||
return prepareSecretThumbnailData(data).flatMap { size, data in
|
||||
return (PixelDimensions(size), data)
|
||||
}
|
||||
})
|
||||
|
@ -104,7 +104,7 @@ final class ThemeUpdateManagerImpl: ThemeUpdateManager {
|
||||
|> mapToSignal { wallpaper -> Signal<(PresentationThemeReference, PresentationTheme?), NoError> in
|
||||
if let wallpaper = wallpaper, case let .file(file) = wallpaper {
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 100, height: 100), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
return wallpaperDatas(account: account, accountManager: accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false)
|
||||
|> mapToSignal { _, fullSizeData, complete -> Signal<(PresentationThemeReference, PresentationTheme?), NoError> in
|
||||
guard complete, let fullSizeData = fullSizeData else {
|
||||
|
@ -74,8 +74,8 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me
|
||||
break
|
||||
}
|
||||
}
|
||||
attributes.append(.ImageSize(size: imageDimensions))
|
||||
let updatedFile = file.withUpdatedSize(data.size).withUpdatedPreviewRepresentations([TelegramMediaImageRepresentation(dimensions: scaledImageSize, resource: thumbnailResource)]).withUpdatedAttributes(attributes)
|
||||
attributes.append(.ImageSize(size: PixelDimensions(imageDimensions)))
|
||||
let updatedFile = file.withUpdatedSize(data.size).withUpdatedPreviewRepresentations([TelegramMediaImageRepresentation(dimensions: PixelDimensions(scaledImageSize), resource: thumbnailResource)]).withUpdatedAttributes(attributes)
|
||||
subscriber.putNext(.standalone(media: updatedFile))
|
||||
subscriber.putCompletion()
|
||||
} else {
|
||||
@ -104,7 +104,7 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me
|
||||
|
||||
let scaledImageSize = CGSize(width: scaledImage.size.width * scaledImage.scale, height: scaledImage.size.height * scaledImage.scale)
|
||||
|
||||
let updatedFile = file.withUpdatedSize(data.size).withUpdatedPreviewRepresentations([TelegramMediaImageRepresentation(dimensions: scaledImageSize, resource: thumbnailResource)])
|
||||
let updatedFile = file.withUpdatedSize(data.size).withUpdatedPreviewRepresentations([TelegramMediaImageRepresentation(dimensions: PixelDimensions(scaledImageSize), resource: thumbnailResource)])
|
||||
subscriber.putNext(.standalone(media: updatedFile))
|
||||
subscriber.putCompletion()
|
||||
} else {
|
||||
@ -153,14 +153,14 @@ public func transformOutgoingMessageMedia(postbox: Postbox, network: Network, me
|
||||
return result
|
||||
|> mapToSignal { data -> Signal<AnyMediaReference?, NoError> in
|
||||
if data.complete {
|
||||
if let smallest = smallestImageRepresentation(image.representations), smallest.dimensions.width > 100.0 || smallest.dimensions.height > 100.0 {
|
||||
let smallestSize = smallest.dimensions.fitted(CGSize(width: 320.0, height: 320.0))
|
||||
if let smallest = smallestImageRepresentation(image.representations), smallest.dimensions.width > 100 || smallest.dimensions.height > 100 {
|
||||
let smallestSize = smallest.dimensions.cgSize.fitted(CGSize(width: 320.0, height: 320.0))
|
||||
if let fullImage = UIImage(contentsOfFile: data.path), let smallestImage = generateScaledImage(image: fullImage, size: smallestSize, scale: 1.0), let smallestData = compressImageToJPEG(smallestImage, quality: 0.7) {
|
||||
var representations = image.representations
|
||||
|
||||
let thumbnailResource = LocalFileMediaResource(fileId: arc4random64())
|
||||
postbox.mediaBox.storeResourceData(thumbnailResource.id, data: smallestData)
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: smallestSize, resource: thumbnailResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(smallestSize), resource: thumbnailResource))
|
||||
let updatedImage = TelegramMediaImage(imageId: image.imageId, representations: representations, immediateThumbnailData: image.immediateThumbnailData, reference: image.reference, partialReference: image.partialReference)
|
||||
return .single(.standalone(media: updatedImage))
|
||||
}
|
||||
|
@ -202,7 +202,7 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
|
||||
}
|
||||
case let .internalReference(_, _, _, _, _, image, file, _):
|
||||
if let image = image {
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 200.0))?.resource
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 200, height: 200))?.resource
|
||||
} else if let file = file {
|
||||
if file.isSticker {
|
||||
stickerFile = file
|
||||
@ -225,7 +225,7 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
|
||||
let boundingSize = CGSize(width: 55.0, height: 55.0)
|
||||
let iconSize: CGSize
|
||||
if let stickerFile = stickerFile, let dimensions = stickerFile.dimensions {
|
||||
iconSize = dimensions.fitted(boundingSize)
|
||||
iconSize = dimensions.cgSize.fitted(boundingSize)
|
||||
} else {
|
||||
iconSize = boundingSize
|
||||
}
|
||||
@ -251,7 +251,7 @@ final class VerticalListContextResultsChatInputPanelItemNode: ListViewItemNode {
|
||||
if let stickerFile = stickerFile {
|
||||
updateIconImageSignal = chatMessageSticker(account: item.account, file: stickerFile, small: false, fetched: true)
|
||||
} else {
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: CGSize(width: 55.0, height: 55.0), resource: imageResource)
|
||||
let tmpRepresentation = TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 55, height: 55), resource: imageResource)
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: [tmpRepresentation], immediateThumbnailData: nil, reference: nil, partialReference: nil)
|
||||
updateIconImageSignal = chatWebpageSnippetPhoto(account: item.account, photoReference: .standalone(media: tmpImage))
|
||||
}
|
||||
|
@ -29,7 +29,79 @@ extension WalletConfiguration {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
final class WalletStorageInterfaceImpl: WalletStorageInterface {
|
||||
private let postbox: Postbox
|
||||
|
||||
init(postbox: Postbox) {
|
||||
self.postbox = postbox
|
||||
}
|
||||
|
||||
func watchWalletRecords() -> Signal<[WalletStateRecord], NoError> {
|
||||
return self.postbox.preferencesView(keys: [PreferencesKeys.walletCollection])
|
||||
|> map { view -> [WalletStateRecord] in
|
||||
guard let walletCollection = view.values[PreferencesKeys.walletCollection] as? WalletCollection else {
|
||||
return []
|
||||
}
|
||||
return walletCollection.wallets.flatMap { item -> WalletStateRecord? in
|
||||
do {
|
||||
return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) })
|
||||
} catch {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func getWalletRecords() -> Signal<[WalletStateRecord], NoError> {
|
||||
return self.postbox.transaction { transaction -> [WalletStateRecord] in
|
||||
guard let walletCollection = transaction.getPreferencesEntry(key: PreferencesKeys.walletCollection) as? WalletCollection else {
|
||||
return []
|
||||
}
|
||||
return walletCollection.wallets.flatMap { item -> WalletStateRecord? in
|
||||
do {
|
||||
return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) })
|
||||
} catch {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateWalletRecords(_ f: @escaping ([WalletStateRecord]) -> [WalletStateRecord]) -> Signal<[WalletStateRecord], NoError> {
|
||||
return self.postbox.transaction { transaction -> [WalletStateRecord] in
|
||||
var updatedRecords: [WalletStateRecord] = []
|
||||
transaction.updatePreferencesEntry(key: PreferencesKeys.walletCollection, { current in
|
||||
var walletCollection = (current as? WalletCollection) ?? WalletCollection(wallets: [])
|
||||
let updatedItems = f(walletCollection.wallets.flatMap { item -> WalletStateRecord? in
|
||||
do {
|
||||
return WalletStateRecord(info: try JSONDecoder().decode(WalletInfo.self, from: item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap { try? JSONDecoder().decode(CombinedWalletState.self, from: $0) })
|
||||
} catch {
|
||||
return nil
|
||||
}
|
||||
})
|
||||
walletCollection.wallets = updatedItems.flatMap { item in
|
||||
do {
|
||||
return WalletCollectionItem(info: try JSONEncoder().encode(item.info), exportCompleted: item.exportCompleted, state: item.state.flatMap {
|
||||
try? JSONEncoder().encode($0)
|
||||
})
|
||||
} catch {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return walletCollection
|
||||
})
|
||||
return updatedRecords
|
||||
}
|
||||
}
|
||||
|
||||
func localWalletConfiguration() -> Signal<LocalWalletConfiguration, NoError> {
|
||||
return .single(LocalWalletConfiguration(source: .string(""), blockchainName: ""))
|
||||
}
|
||||
|
||||
func updateLocalWalletConfiguration(_ f: @escaping (LocalWalletConfiguration) -> LocalWalletConfiguration) -> Signal<Never, NoError> {
|
||||
return .complete()
|
||||
}
|
||||
}
|
||||
|
||||
final class WalletContextImpl: WalletContext {
|
||||
private let context: AccountContext
|
||||
|
@ -44,10 +44,10 @@ public final class NativeVideoContent: UniversalVideoContent {
|
||||
let dimensionsVertical = dimensions.width < dimensions.height
|
||||
let thumbnailVertical = thumbnail.dimensions.width < thumbnail.dimensions.height
|
||||
if dimensionsVertical != thumbnailVertical {
|
||||
dimensions = CGSize(width: dimensions.height, height: dimensions.width)
|
||||
dimensions = PixelDimensions(width: dimensions.height, height: dimensions.width)
|
||||
}
|
||||
}
|
||||
self.dimensions = dimensions
|
||||
self.dimensions = dimensions.cgSize
|
||||
} else {
|
||||
self.dimensions = CGSize(width: 128.0, height: 128.0)
|
||||
}
|
||||
@ -136,7 +136,7 @@ private final class NativeVideoContentNode: ASDisplayNode, UniversalVideoContent
|
||||
self.playerNode = MediaPlayerNode(backgroundThread: false)
|
||||
self.player.attachPlayerNode(self.playerNode)
|
||||
|
||||
self.dimensions = fileReference.media.dimensions
|
||||
self.dimensions = fileReference.media.dimensions?.cgSize
|
||||
if let dimensions = self.dimensions {
|
||||
self.dimensionsPromise.set(dimensions)
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ public final class PlatformVideoContent: UniversalVideoContent {
|
||||
self.id = id
|
||||
self.nativeId = id
|
||||
self.fileReference = fileReference
|
||||
self.dimensions = fileReference.media.dimensions ?? CGSize(width: 128.0, height: 128.0)
|
||||
self.dimensions = fileReference.media.dimensions?.cgSize ?? CGSize(width: 128.0, height: 128.0)
|
||||
self.duration = fileReference.media.duration ?? 0
|
||||
self.streamVideo = streamVideo
|
||||
self.loopVideo = loopVideo
|
||||
@ -158,7 +158,7 @@ private final class PlatformVideoContentNode: ASDisplayNode, UniversalVideoConte
|
||||
return AVPlayerLayer(player: player)
|
||||
})
|
||||
|
||||
self.intrinsicDimensions = fileReference.media.dimensions ?? CGSize()
|
||||
self.intrinsicDimensions = fileReference.media.dimensions?.cgSize ?? CGSize()
|
||||
|
||||
self.playerNode.frame = CGRect(origin: CGPoint(), size: self.intrinsicDimensions)
|
||||
|
||||
|
@ -27,7 +27,7 @@ public final class WebEmbedVideoContent: UniversalVideoContent {
|
||||
self.id = AnyHashable(embedUrl)
|
||||
self.webPage = webPage
|
||||
self.webpageContent = webpageContent
|
||||
self.dimensions = webpageContent.embedSize ?? CGSize(width: 128.0, height: 128.0)
|
||||
self.dimensions = webpageContent.embedSize?.cgSize ?? CGSize(width: 128.0, height: 128.0)
|
||||
self.duration = Int32(webpageContent.duration ?? (0 as Int))
|
||||
self.forcedTimestamp = forcedTimestamp
|
||||
}
|
||||
@ -70,7 +70,7 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte
|
||||
self.webpageContent = webpageContent
|
||||
|
||||
if let embedSize = webpageContent.embedSize {
|
||||
self.intrinsicDimensions = embedSize
|
||||
self.intrinsicDimensions = embedSize.cgSize
|
||||
} else {
|
||||
self.intrinsicDimensions = CGSize(width: 480.0, height: 320.0)
|
||||
}
|
||||
@ -114,9 +114,9 @@ private final class WebEmbedVideoContentNode: ASDisplayNode, UniversalVideoConte
|
||||
|
||||
transition.updateFrame(node: self.imageNode, frame: CGRect(origin: CGPoint(), size: size))
|
||||
|
||||
if let image = webpageContent.image, let representation = image.representationForDisplayAtSize(self.intrinsicDimensions) {
|
||||
if let image = webpageContent.image, let representation = image.representationForDisplayAtSize(PixelDimensions(self.intrinsicDimensions)) {
|
||||
let makeImageLayout = self.imageNode.asyncLayout()
|
||||
let applyImageLayout = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: representation.dimensions.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
let applyImageLayout = makeImageLayout(TransformImageArguments(corners: ImageCorners(), imageSize: representation.dimensions.cgSize.aspectFilled(size), boundingSize: size, intrinsicInsets: UIEdgeInsets()))
|
||||
applyImageLayout()
|
||||
}
|
||||
}
|
||||
|
@ -301,9 +301,9 @@ private func patternWallpaperDatas(account: Account, accountManager: AccountMana
|
||||
let size: CGSize?
|
||||
switch mode {
|
||||
case .thumbnail:
|
||||
size = largestRepresentation.dimensions.fitted(CGSize(width: 640.0, height: 640.0))
|
||||
size = largestRepresentation.dimensions.cgSize.fitted(CGSize(width: 640.0, height: 640.0))
|
||||
case .fastScreen:
|
||||
size = largestRepresentation.dimensions.fitted(CGSize(width: 1280.0, height: 1280.0))
|
||||
size = largestRepresentation.dimensions.cgSize.fitted(CGSize(width: 1280.0, height: 1280.0))
|
||||
default:
|
||||
size = nil
|
||||
}
|
||||
@ -815,7 +815,7 @@ public func themeImage(account: Account, accountManager: AccountManager, fileRef
|
||||
|> mapToSignal { wallpaper -> Signal<(PresentationTheme?, UIImage?, Data?), NoError> in
|
||||
if let wallpaper = wallpaper, case let .file(file) = wallpaper.wallpaper {
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 100, height: 100), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
return wallpaperDatas(account: account, accountManager: accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false)
|
||||
|> mapToSignal { _, fullSizeData, complete -> Signal<(PresentationTheme?, UIImage?, Data?), NoError> in
|
||||
guard complete, let fullSizeData = fullSizeData else {
|
||||
@ -973,7 +973,7 @@ public func themeIconImage(account: Account, accountManager: AccountManager, the
|
||||
|> mapToSignal { wallpaper in
|
||||
if let wallpaper = wallpaper, case let .file(file) = wallpaper.wallpaper {
|
||||
var convertedRepresentations: [ImageRepresentationWithReference] = []
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: CGSize(width: 100.0, height: 100.0), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
convertedRepresentations.append(ImageRepresentationWithReference(representation: TelegramMediaImageRepresentation(dimensions: PixelDimensions(width: 100, height: 100), resource: file.file.resource), reference: .media(media: .standalone(media: file.file), resource: file.file.resource)))
|
||||
return wallpaperDatas(account: account, accountManager: accountManager, fileReference: .standalone(media: file.file), representations: convertedRepresentations, alwaysShowThumbnailFirst: false, thumbnail: false, onlyFullSize: true, autoFetchFullSize: true, synchronousLoad: false)
|
||||
|> mapToSignal { _, fullSizeData, complete -> Signal<(UIColor, UIColor, UIColor, UIImage?), NoError> in
|
||||
guard complete, let fullSizeData = fullSizeData else {
|
||||
|
@ -46,7 +46,7 @@ private func makeBridgeImage(_ image: TelegramMediaImage?) -> TGBridgeImageMedia
|
||||
if let image = image, let representation = largestImageRepresentation(image.representations) {
|
||||
let bridgeImage = TGBridgeImageMediaAttachment()
|
||||
bridgeImage.imageId = image.imageId.id
|
||||
bridgeImage.dimensions = representation.dimensions
|
||||
bridgeImage.dimensions = representation.dimensions.cgSize
|
||||
return bridgeImage
|
||||
} else {
|
||||
return nil
|
||||
@ -65,7 +65,7 @@ func makeBridgeDocument(_ file: TelegramMediaFile?) -> TGBridgeDocumentMediaAtta
|
||||
case .Animated:
|
||||
bridgeDocument.isAnimated = true
|
||||
case let .ImageSize(size):
|
||||
bridgeDocument.imageSize = NSValue(cgSize: size)
|
||||
bridgeDocument.imageSize = NSValue(cgSize: size.cgSize)
|
||||
case let .Sticker(displayText, packReference, _):
|
||||
bridgeDocument.isSticker = true
|
||||
bridgeDocument.stickerAlt = displayText
|
||||
@ -168,7 +168,7 @@ func makeBridgeMedia(message: Message, strings: PresentationStrings, chatPeer: P
|
||||
switch attribute {
|
||||
case let .Video(duration, size, flags):
|
||||
bridgeVideo.duration = Int32(clamping: duration)
|
||||
bridgeVideo.dimensions = size
|
||||
bridgeVideo.dimensions = size.cgSize
|
||||
bridgeVideo.round = flags.contains(.instantRoundVideo)
|
||||
default:
|
||||
break
|
||||
@ -290,7 +290,7 @@ func makeBridgeMedia(message: Message, strings: PresentationStrings, chatPeer: P
|
||||
bridgeWebpage.photo = makeBridgeImage(content.image)
|
||||
bridgeWebpage.embedUrl = content.embedUrl
|
||||
bridgeWebpage.embedType = content.embedType
|
||||
bridgeWebpage.embedSize = content.embedSize ?? CGSize()
|
||||
bridgeWebpage.embedSize = content.embedSize?.cgSize ?? CGSize()
|
||||
bridgeWebpage.duration = NSNumber(integerLiteral: content.duration ?? 0)
|
||||
bridgeWebpage.author = content.author
|
||||
bridgeMedia.append(bridgeWebpage)
|
||||
|
@ -478,7 +478,7 @@ final class WatchMediaHandler: WatchRequestHandler {
|
||||
|> mapToSignal { mediaAndFileReference -> Signal<(TransformImageArguments) -> DrawingContext?, NoError> in
|
||||
if let (media, fileReference) = mediaAndFileReference {
|
||||
if let dimensions = media.dimensions {
|
||||
size = dimensions
|
||||
size = dimensions.cgSize
|
||||
}
|
||||
self.disposable.add(freeMediaFileInteractiveFetched(account: context.account, fileReference: fileReference).start())
|
||||
return chatMessageSticker(account: context.account, file: media, small: false, fetched: true, onlyFullSize: true)
|
||||
@ -541,12 +541,12 @@ final class WatchMediaHandler: WatchRequestHandler {
|
||||
if let imageReference = candidateMediaReference?.concrete(TelegramMediaImage.self) {
|
||||
updatedMediaReference = imageReference.abstract
|
||||
if let representation = largestRepresentationForPhoto(imageReference.media) {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
} else if let fileReference = candidateMediaReference?.concrete(TelegramMediaFile.self) {
|
||||
updatedMediaReference = fileReference.abstract
|
||||
if let representation = largestImageRepresentation(fileReference.media.previewRepresentations), !fileReference.media.isSticker {
|
||||
imageDimensions = representation.dimensions
|
||||
imageDimensions = representation.dimensions.cgSize
|
||||
}
|
||||
}
|
||||
if let updatedMediaReference = updatedMediaReference, imageDimensions != nil {
|
||||
|
@ -227,20 +227,20 @@ func legacyWebSearchItem(account: Account, result: ChatContextResult) -> LegacyW
|
||||
}
|
||||
if let thumbnail = thumbnail {
|
||||
thumbnailResource = thumbnail.resource
|
||||
thumbnailDimensions = thumbnail.dimensions
|
||||
thumbnailDimensions = thumbnail.dimensions?.cgSize
|
||||
}
|
||||
if let dimensions = content?.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
}
|
||||
case let .internalReference(_, _, _, _, _, image, _, _):
|
||||
immediateThumbnailData = image?.immediateThumbnailData
|
||||
if let image = image {
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 1000.0, height: 800.0)) {
|
||||
imageDimensions = imageRepresentation.dimensions
|
||||
if let imageRepresentation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 1000, height: 800)) {
|
||||
imageDimensions = imageRepresentation.dimensions.cgSize
|
||||
imageResource = imageRepresentation.resource
|
||||
}
|
||||
if let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 100.0)) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
if let thumbnailRepresentation = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 200, height: 100)) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
}
|
||||
@ -261,9 +261,9 @@ func legacyWebSearchItem(account: Account, result: ChatContextResult) -> LegacyW
|
||||
|
||||
var representations: [TelegramMediaImageRepresentation] = []
|
||||
if let thumbnailResource = thumbnailResource, let thumbnailDimensions = thumbnailDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: thumbnailDimensions, resource: thumbnailResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailDimensions), resource: thumbnailResource))
|
||||
}
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: imageDimensions, resource: imageResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(imageDimensions), resource: imageResource))
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: immediateThumbnailData, reference: nil, partialReference: nil)
|
||||
thumbnailSignal = chatMessagePhotoDatas(postbox: account.postbox, photoReference: .standalone(media: tmpImage), autoFetchFullSize: false)
|
||||
|> mapToSignal { value -> Signal<UIImage, NoError> in
|
||||
|
@ -100,31 +100,31 @@ final class WebSearchItemNode: GridItemNode {
|
||||
} else if let thumbnail = thumbnail {
|
||||
imageResource = thumbnail.resource
|
||||
}
|
||||
imageDimensions = content?.dimensions
|
||||
imageDimensions = content?.dimensions?.cgSize
|
||||
case let .internalReference(_, _, _, _, _, image, file, _):
|
||||
if let image = image {
|
||||
immediateThumbnailData = image.immediateThumbnailData
|
||||
if let largestRepresentation = largestImageRepresentation(image.representations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: CGSize(width: 200.0, height: 100.0))?.resource
|
||||
imageResource = imageRepresentationLargerThan(image.representations, size: PixelDimensions(width: 200, height: 100))?.resource
|
||||
if let file = file {
|
||||
if let thumbnailRepresentation = smallestImageRepresentation(file.previewRepresentations) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
} else {
|
||||
if let thumbnailRepresentation = smallestImageRepresentation(image.representations) {
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions
|
||||
thumbnailDimensions = thumbnailRepresentation.dimensions.cgSize
|
||||
thumbnailResource = thumbnailRepresentation.resource
|
||||
}
|
||||
}
|
||||
} else if let file = file {
|
||||
immediateThumbnailData = file.immediateThumbnailData
|
||||
if let dimensions = file.dimensions {
|
||||
imageDimensions = dimensions
|
||||
imageDimensions = dimensions.cgSize
|
||||
} else if let largestRepresentation = largestImageRepresentation(file.previewRepresentations) {
|
||||
imageDimensions = largestRepresentation.dimensions
|
||||
imageDimensions = largestRepresentation.dimensions.cgSize
|
||||
}
|
||||
imageResource = smallestImageRepresentation(file.previewRepresentations)?.resource
|
||||
}
|
||||
@ -132,10 +132,10 @@ final class WebSearchItemNode: GridItemNode {
|
||||
|
||||
var representations: [TelegramMediaImageRepresentation] = []
|
||||
if let thumbnailResource = thumbnailResource, let thumbnailDimensions = thumbnailDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: thumbnailDimensions, resource: thumbnailResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(thumbnailDimensions), resource: thumbnailResource))
|
||||
}
|
||||
if let imageResource = imageResource, let imageDimensions = imageDimensions {
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: imageDimensions, resource: imageResource))
|
||||
representations.append(TelegramMediaImageRepresentation(dimensions: PixelDimensions(imageDimensions), resource: imageResource))
|
||||
}
|
||||
if !representations.isEmpty {
|
||||
let tmpImage = TelegramMediaImage(imageId: MediaId(namespace: 0, id: 0), representations: representations, immediateThumbnailData: immediateThumbnailData, reference: nil, partialReference: nil)
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 699d822fc547e6d9b997667f8d5aecf75182d0a3
|
||||
Subproject commit a09896b3e72e76681c12e80572a7d570108cf885
|
Loading…
x
Reference in New Issue
Block a user