mirror of
https://github.com/TelegramMessenger/Telegram-iOS.git
synced 2026-07-06 03:33:41 +02:00
Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios
This commit is contained in:
commit
058949fe4d
326 changed files with 3992 additions and 7116 deletions
|
|
@ -28,6 +28,9 @@
|
|||
<FileRef
|
||||
location = "group:submodules/libphonenumber/libphonenumber_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:submodules/rlottie/RLottieBinding_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
</Group>
|
||||
<Group
|
||||
location = "container:"
|
||||
|
|
@ -452,9 +455,6 @@
|
|||
<FileRef
|
||||
location = "group:submodules/Display/Display_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:submodules/RLottie/RLottie_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
<FileRef
|
||||
location = "group:submodules/TelegramBaseController/TelegramBaseController_Xcode.xcodeproj">
|
||||
</FileRef>
|
||||
|
|
|
|||
|
|
@ -7,12 +7,11 @@
|
|||
objects = {
|
||||
|
||||
/* Begin PBXBuildFile section */
|
||||
D03E3E4A2304B4CC0049C28B /* RLottie.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E492304B4CC0049C28B /* RLottie.framework */; };
|
||||
D03E3E4F2304B50A0049C28B /* AnimatedStickerNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E3E4D2304B50A0049C28B /* AnimatedStickerNode.swift */; };
|
||||
D03E3E502304B50A0049C28B /* AnimatedStickerUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = D03E3E4E2304B50A0049C28B /* AnimatedStickerUtils.swift */; };
|
||||
D03E3E522304B51A0049C28B /* Postbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E512304B51A0049C28B /* Postbox.framework */; };
|
||||
D03E3E542304B51E0049C28B /* TelegramCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E532304B51E0049C28B /* TelegramCore.framework */; };
|
||||
D03E3E562304B52F0049C28B /* libcompression.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E552304B52F0049C28B /* libcompression.tbd */; };
|
||||
D03E3E562304B52F0049C28B /* libcompression.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E552304B52F0049C28B /* libcompression.tbd */; settings = {ATTRIBUTES = (Weak, ); }; };
|
||||
D03E3E582304B53B0049C28B /* Display.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E572304B53B0049C28B /* Display.framework */; };
|
||||
D03E3E5A2304B5400049C28B /* GZip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E592304B5400049C28B /* GZip.framework */; };
|
||||
D03E3E5C2304B5450049C28B /* Tuples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D03E3E5B2304B5450049C28B /* Tuples.framework */; };
|
||||
|
|
@ -30,6 +29,7 @@
|
|||
D06018AB22F361FC00796784 /* AsyncDisplayKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06018AA22F361FC00796784 /* AsyncDisplayKit.framework */; };
|
||||
D06018AD22F361FF00796784 /* Lottie.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D06018AC22F361FF00796784 /* Lottie.framework */; };
|
||||
D06018AF22F3641F00796784 /* FrameworkBundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06018AE22F3641F00796784 /* FrameworkBundle.swift */; };
|
||||
D0AA5791231BE2E6000F88F3 /* RLottieBinding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AA5790231BE2E6000F88F3 /* RLottieBinding.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
|
|
@ -58,6 +58,7 @@
|
|||
D06018AA22F361FC00796784 /* AsyncDisplayKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AsyncDisplayKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D06018AC22F361FF00796784 /* Lottie.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Lottie.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D06018AE22F3641F00796784 /* FrameworkBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameworkBundle.swift; sourceTree = "<group>"; };
|
||||
D0AA5790231BE2E6000F88F3 /* RLottieBinding.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RLottieBinding.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
|
|
@ -65,6 +66,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0AA5791231BE2E6000F88F3 /* RLottieBinding.framework in Frameworks */,
|
||||
D03E3E8E2304B6EC0049C28B /* YuvConversion.framework in Frameworks */,
|
||||
D03E3E642304B5640049C28B /* MobileCoreServices.framework in Frameworks */,
|
||||
D03E3E622304B55F0049C28B /* SwiftSignalKit.framework in Frameworks */,
|
||||
|
|
@ -76,7 +78,6 @@
|
|||
D03E3E562304B52F0049C28B /* libcompression.tbd in Frameworks */,
|
||||
D03E3E542304B51E0049C28B /* TelegramCore.framework in Frameworks */,
|
||||
D03E3E522304B51A0049C28B /* Postbox.framework in Frameworks */,
|
||||
D03E3E4A2304B4CC0049C28B /* RLottie.framework in Frameworks */,
|
||||
D06018AD22F361FF00796784 /* Lottie.framework in Frameworks */,
|
||||
D06018AB22F361FC00796784 /* AsyncDisplayKit.framework in Frameworks */,
|
||||
D06018A922F361F900796784 /* UIKit.framework in Frameworks */,
|
||||
|
|
@ -122,6 +123,7 @@
|
|||
D06018A522F361F400796784 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0AA5790231BE2E6000F88F3 /* RLottieBinding.framework */,
|
||||
D03E3E8D2304B6EC0049C28B /* YuvConversion.framework */,
|
||||
D03E3E632304B5640049C28B /* MobileCoreServices.framework */,
|
||||
D03E3E612304B55F0049C28B /* SwiftSignalKit.framework */,
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import TelegramCore
|
|||
import Compression
|
||||
import Display
|
||||
import AsyncDisplayKit
|
||||
import RLottie
|
||||
import RLottieBinding
|
||||
import GZip
|
||||
import Tuples
|
||||
import MediaResources
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import Display
|
|||
import TelegramCore
|
||||
import Compression
|
||||
import GZip
|
||||
import RLottie
|
||||
import RLottieBinding
|
||||
import MediaResources
|
||||
import MobileCoreServices
|
||||
import MediaResources
|
||||
|
|
|
|||
|
|
@ -51,7 +51,7 @@ final class GlobalOverlayPresentationContext {
|
|||
private let statusBarHost: StatusBarHost?
|
||||
private weak var parentView: UIView?
|
||||
|
||||
private var controllers: [ContainableController] = []
|
||||
private(set) var controllers: [ContainableController] = []
|
||||
|
||||
private var presentationDisposables = DisposableSet()
|
||||
private var layout: ContainerViewLayout?
|
||||
|
|
|
|||
|
|
@ -1041,10 +1041,21 @@ public class Window1 {
|
|||
}
|
||||
|
||||
public func simulateKeyboardDismiss(transition: ContainedViewLayoutTransition) {
|
||||
if self.windowLayout.inputHeight != nil {
|
||||
var simulate = false
|
||||
for controller in self.overlayPresentationContext.controllers {
|
||||
if controller.isViewLoaded {
|
||||
if controller.view.window != self.hostView.containerView.window {
|
||||
simulate = true
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
if simulate {
|
||||
self.updateLayout {
|
||||
$0.update(upperKeyboardInputPositionBound: self.windowLayout.size.height, transition: transition, overrideTransition: false)
|
||||
}
|
||||
} else {
|
||||
self.hostView.containerView.endEditing(true)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@ public struct LegacyAttachmentMenuMediaEditing: OptionSet {
|
|||
public static let imageOrVideo = LegacyAttachmentMenuMediaEditing(rawValue: 1 << 0)
|
||||
}
|
||||
|
||||
public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController {
|
||||
public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaOptions: LegacyAttachmentMenuMediaEditing?, saveEditedPhotos: Bool, allowGrouping: Bool, hasSchedule: Bool, canSendPolls: Bool, theme: PresentationTheme, strings: PresentationStrings, parentController: LegacyController, recentlyUsedInlineBots: [Peer], initialCaption: String, openGallery: @escaping () -> Void, openCamera: @escaping (TGAttachmentCameraView?, TGMenuSheetController?) -> Void, openFileGallery: @escaping () -> Void, openWebSearch: @escaping () -> Void, openMap: @escaping () -> Void, openContacts: @escaping () -> Void, openPoll: @escaping () -> Void, presentSelectionLimitExceeded: @escaping () -> Void, presentCantSendMultipleFiles: @escaping () -> Void, presentSchedulePicker: @escaping (@escaping (Int32) -> Void) -> Void, sendMessagesWithSignals: @escaping ([Any]?, Bool, Int32) -> Void, selectRecentlyUsedInlineBot: @escaping (Peer) -> Void) -> TGMenuSheetController {
|
||||
let isSecretChat = peer.id.namespace == Namespaces.Peer.SecretChat
|
||||
|
||||
let controller = TGMenuSheetController(context: parentController.context, dark: false)!
|
||||
|
|
@ -139,7 +139,7 @@ public func legacyAttachmentMenu(context: AccountContext, peer: Peer, editMediaO
|
|||
})!
|
||||
itemViews.append(locationItem)
|
||||
|
||||
if (peer is TelegramGroup || peer is TelegramChannel) && canSendMessagesToPeer(peer) {
|
||||
if (peer is TelegramGroup || peer is TelegramChannel) && canSendMessagesToPeer(peer) && canSendPolls {
|
||||
let pollItem = TGMenuSheetButtonItemView(title: strings.AttachmentMenu_Poll, type: TGMenuSheetButtonTypeDefault, action: { [weak controller] in
|
||||
controller?.dismiss(animated: true)
|
||||
openPoll()
|
||||
|
|
|
|||
|
|
@ -109,19 +109,6 @@ private func addOperation(_ operation: ChatListOperation, groupId: PeerGroupId,
|
|||
operations[groupId]!.append(operation)
|
||||
}
|
||||
|
||||
/*
|
||||
dialog.unread_mark ? 1 : 0,
|
||||
dialog.peer.channel_id || dialog.peer.chat_id || dialog.peer.user_id,
|
||||
dialog.top_message.id,
|
||||
top_message.edit_date || top_message.date,
|
||||
dialog.read_inbox_max_id,
|
||||
dialog.read_outbox_max_id,
|
||||
dialog.unread_count,
|
||||
dialog.unread_mentions_count,
|
||||
draft.draft.date || 0
|
||||
|
||||
*/
|
||||
|
||||
public enum ChatListNamespaceEntry {
|
||||
case peer(index: ChatListIndex, readState: PeerReadState?, topMessageAttributes: [MessageAttribute], tagSummary: MessageHistoryTagNamespaceSummary?, interfaceState: PeerChatInterfaceState?)
|
||||
case hole(MessageIndex)
|
||||
|
|
|
|||
|
|
@ -370,10 +370,15 @@ public struct MessageFlags: OptionSet {
|
|||
if flags.contains(StoreMessageFlags.CanBeGroupedIntoFeed) {
|
||||
rawValue |= MessageFlags.CanBeGroupedIntoFeed.rawValue
|
||||
}
|
||||
|
||||
if flags.contains(StoreMessageFlags.WasScheduled) {
|
||||
rawValue |= MessageFlags.WasScheduled.rawValue
|
||||
}
|
||||
|
||||
if flags.contains(StoreMessageFlags.CountedAsIncoming) {
|
||||
rawValue |= MessageFlags.CountedAsIncoming.rawValue
|
||||
}
|
||||
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
|
|
@ -384,7 +389,9 @@ public struct MessageFlags: OptionSet {
|
|||
public static let Sending = MessageFlags(rawValue: 32)
|
||||
public static let CanBeGroupedIntoFeed = MessageFlags(rawValue: 64)
|
||||
public static let WasScheduled = MessageFlags(rawValue: 128)
|
||||
public static let CountedAsIncoming = MessageFlags(rawValue: 256)
|
||||
|
||||
public static let IsIncomingMask = MessageFlags([.Incoming, .CountedAsIncoming])
|
||||
}
|
||||
|
||||
public struct StoreMessageForwardInfo {
|
||||
|
|
@ -568,10 +575,15 @@ public struct StoreMessageFlags: OptionSet {
|
|||
if flags.contains(.CanBeGroupedIntoFeed) {
|
||||
rawValue |= StoreMessageFlags.CanBeGroupedIntoFeed.rawValue
|
||||
}
|
||||
|
||||
if flags.contains(.WasScheduled) {
|
||||
rawValue |= StoreMessageFlags.WasScheduled.rawValue
|
||||
}
|
||||
|
||||
if flags.contains(.CountedAsIncoming) {
|
||||
rawValue |= StoreMessageFlags.CountedAsIncoming.rawValue
|
||||
}
|
||||
|
||||
self.rawValue = rawValue
|
||||
}
|
||||
|
||||
|
|
@ -582,6 +594,9 @@ public struct StoreMessageFlags: OptionSet {
|
|||
public static let Sending = StoreMessageFlags(rawValue: 32)
|
||||
public static let CanBeGroupedIntoFeed = StoreMessageFlags(rawValue: 64)
|
||||
public static let WasScheduled = StoreMessageFlags(rawValue: 128)
|
||||
public static let CountedAsIncoming = StoreMessageFlags(rawValue: 256)
|
||||
|
||||
public static let IsIncomingMask = StoreMessageFlags([.Incoming, .CountedAsIncoming])
|
||||
}
|
||||
|
||||
public enum StoreMessageId {
|
||||
|
|
|
|||
|
|
@ -175,7 +175,7 @@ final class MessageHistoryIndexTable: Table {
|
|||
|
||||
let value = WriteBuffer()
|
||||
var flags: Int8 = HistoryEntryTypeMessage
|
||||
if message.flags.contains(.Incoming) {
|
||||
if !message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
flags |= HistoryEntryMessageFlagIncoming
|
||||
}
|
||||
var timestamp: Int32 = index.timestamp
|
||||
|
|
|
|||
|
|
@ -282,7 +282,7 @@ final class MessageHistoryTable: Table {
|
|||
if !message.localTags.isEmpty {
|
||||
self.localTagsTable.set(id: message.id, tags: message.localTags, previousTags: [], operations: &localTagsOperations)
|
||||
}
|
||||
if message.flags.contains(.Incoming) {
|
||||
if !message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
accumulatedAddedIncomingMessageIndices.insert(message.index)
|
||||
}
|
||||
case let .InsertExistingMessage(storeMessage):
|
||||
|
|
@ -312,7 +312,7 @@ final class MessageHistoryTable: Table {
|
|||
outputOperations.append(.UpdateGroupInfos(updatedGroupInfos))
|
||||
}
|
||||
|
||||
if message.flags.contains(.Incoming) {
|
||||
if !message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
if index != message.index {
|
||||
accumulatedRemoveIndices.append(index)
|
||||
accumulatedAddedIncomingMessageIndices.insert(message.index)
|
||||
|
|
@ -520,7 +520,7 @@ final class MessageHistoryTable: Table {
|
|||
var topMessageId: (MessageId.Id, Bool)?
|
||||
if let index = self.topIndexEntry(peerId: messageId.peerId, namespace: messageId.namespace) {
|
||||
if let message = self.getMessage(index) {
|
||||
topMessageId = (index.id.id, !message.flags.contains(.Incoming))
|
||||
topMessageId = (index.id.id, message.flags.intersection(.IsIncomingMask).isEmpty)
|
||||
} else {
|
||||
topMessageId = (index.id.id, false)
|
||||
}
|
||||
|
|
@ -584,7 +584,7 @@ final class MessageHistoryTable: Table {
|
|||
var topMessageId: (MessageId.Id, Bool)?
|
||||
if let index = self.topIndexEntry(peerId: messageIndex.id.peerId, namespace: messageIndex.id.namespace) {
|
||||
if let message = self.getMessage(index) {
|
||||
topMessageId = (index.id.id, !message.flags.contains(.Incoming))
|
||||
topMessageId = (index.id.id, message.flags.intersection(.IsIncomingMask).isEmpty)
|
||||
} else {
|
||||
topMessageId = (index.id.id, false)
|
||||
}
|
||||
|
|
@ -2390,7 +2390,7 @@ final class MessageHistoryTable: Table {
|
|||
let key = self.key(index)
|
||||
if let value = self.valueBox.get(self.table, key: key) {
|
||||
let entry = self.readIntermediateEntry(key, value: value)
|
||||
if entry.message.id.namespace == namespace && entry.message.flags.contains(.Incoming) {
|
||||
if entry.message.id.namespace == namespace && !entry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
count += 1
|
||||
}
|
||||
} else {
|
||||
|
|
@ -2412,7 +2412,7 @@ final class MessageHistoryTable: Table {
|
|||
if fromIndex <= toIndex {
|
||||
self.valueBox.range(self.table, start: self.key(fromIndex).predecessor, end: self.key(toIndex).successor, values: { key, value in
|
||||
let entry = self.readIntermediateEntry(key, value: value)
|
||||
if entry.message.id.namespace == namespace && entry.message.flags.contains(.Incoming) {
|
||||
if entry.message.id.namespace == namespace && !entry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
count += 1
|
||||
messageIds.append(entry.message.id)
|
||||
}
|
||||
|
|
@ -2431,7 +2431,7 @@ final class MessageHistoryTable: Table {
|
|||
var messageIds: [MessageId] = []
|
||||
self.valueBox.range(self.table, start: self.key(fromIndex).predecessor, end: self.key(toIndex).successor, values: { key, value in
|
||||
let entry = self.readIntermediateEntry(key, value: value)
|
||||
if !entry.message.flags.contains(.Incoming) {
|
||||
if entry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
messageIds.append(entry.message.id)
|
||||
}
|
||||
return true
|
||||
|
|
|
|||
|
|
@ -718,7 +718,7 @@ public final class MessageHistoryView {
|
|||
for entry in state.entries {
|
||||
if mutableView.namespaces.contains(entry.message.id.namespace) {
|
||||
let read: Bool
|
||||
if entry.message.flags.contains(.Incoming) {
|
||||
if !entry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
read = false
|
||||
} else if let readState = states[entry.message.id.peerId] {
|
||||
read = readState.isOutgoingMessageIndexRead(entry.message.index)
|
||||
|
|
@ -822,7 +822,7 @@ public final class MessageHistoryView {
|
|||
}
|
||||
if let _ = maxNamespaceIndex , index + 1 < entries.count {
|
||||
for i in index + 1 ..< entries.count {
|
||||
if !entries[i].message.flags.contains(.Incoming) {
|
||||
if entries[i].message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
maxNamespaceIndex = entries[i].message.index
|
||||
} else {
|
||||
break
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,35 +0,0 @@
|
|||
dist: trusty
|
||||
|
||||
sudo: false
|
||||
|
||||
language: cpp
|
||||
|
||||
addons:
|
||||
apt:
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
packages:
|
||||
- g++-5
|
||||
|
||||
matrix:
|
||||
include:
|
||||
- os: linux
|
||||
compiler: clang
|
||||
env:
|
||||
build_type=release
|
||||
options=""
|
||||
- MATRIX_EVAL="CC=clang-5.0 && CXX=clang++"
|
||||
|
||||
- os: linux
|
||||
compiler: gcc
|
||||
env:
|
||||
build_type=release
|
||||
options=""
|
||||
- MATRIX_EVAL="CC=gcc-5 && CXX=g++-5"
|
||||
|
||||
before_install:
|
||||
- eval "${MATRIX_EVAL}"
|
||||
|
||||
script:
|
||||
- cmake -DLIB_INSTALL_DIR=/usr/lib .
|
||||
- cmake --build . -- -j2
|
||||
|
|
@ -1,62 +0,0 @@
|
|||
|
||||
common_source = files('evasapp.cpp')
|
||||
common_source += files('lottieview.cpp')
|
||||
|
||||
demo_sources = files('demo.cpp')
|
||||
demo_sources += common_source
|
||||
|
||||
executable('lottie2gif',
|
||||
'lottie2gif.cpp',
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib)
|
||||
|
||||
executable('vectorTest',
|
||||
'vectortest.cpp',
|
||||
include_directories : inc,
|
||||
dependencies : [library_deps])
|
||||
|
||||
demo_dep = dependency('elementary', required : false)
|
||||
|
||||
if (demo_dep.found())
|
||||
executable('demo',
|
||||
demo_sources,
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
lottieview_test_src = files('lottieviewtest.cpp')
|
||||
lottieview_test_src += common_source
|
||||
|
||||
executable('lottieviewTest',
|
||||
lottieview_test_src,
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
uxsample_test_src = files('uxsampletest.cpp')
|
||||
uxsample_test_src += common_source
|
||||
|
||||
executable('uxsampleTest',
|
||||
uxsample_test_src,
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
lottieviewer_sources = files('lottieviewer.cpp')
|
||||
lottieviewer_sources += common_source
|
||||
|
||||
executable('lottieviewer',
|
||||
lottieviewer_sources,
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
if (meson.get_compiler('cpp').has_header('elementary-1/efl_ui_animation_view.h'))
|
||||
executable('efl_animview',
|
||||
'efl_animview.cpp',
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
endif
|
||||
|
||||
endif
|
||||
File diff suppressed because one or more lines are too long
|
|
@ -1,31 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include<iostream>
|
||||
|
||||
#include "vinterpolator.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
VInterpolator ip({0.667, 1}, {0.333 , 0});
|
||||
for (float i = 0.0 ; i < 1.0 ; i+=0.05) {
|
||||
std::cout<<ip.value(i)<<"\t";
|
||||
}
|
||||
std::cout<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
project('rlottie library',
|
||||
'cpp',
|
||||
license : 'Apache')
|
||||
|
||||
rlottie_lib_version = '0.0.1'
|
||||
|
||||
add_global_arguments('-DDEMO_DIR="@0@/example/resource/"'.format(meson.current_source_dir()), language : 'cpp')
|
||||
|
||||
compiler_flags = ['-std=c++14', '-Os', '-Wall', '-Werror', '-Wextra', '-fno-exceptions', '-fno-rtti',
|
||||
'-fno-unwind-tables' , '-fno-asynchronous-unwind-tables',
|
||||
'-Wnon-virtual-dtor', '-Woverloaded-virtual', '-Wno-unused-parameter', '-fvisibility=hidden']
|
||||
|
||||
|
||||
if (build_machine.system() == 'linux')
|
||||
compiler_flags += ['-pthread']
|
||||
add_global_link_arguments('-pthread', language: 'cpp')
|
||||
endif
|
||||
|
||||
add_global_arguments(compiler_flags, language: 'cpp')
|
||||
|
||||
inc = include_directories('inc')
|
||||
|
||||
subdir('inc')
|
||||
subdir('src')
|
||||
|
||||
if get_option('example') == true
|
||||
subdir('example')
|
||||
endif
|
||||
|
||||
if get_option('test') == true
|
||||
subdir('test')
|
||||
endif
|
||||
|
||||
pkg_mod = import('pkgconfig')
|
||||
|
||||
pkg_mod.generate( libraries : rlottie_lib,
|
||||
version : rlottie_lib_version,
|
||||
name : 'librlottie',
|
||||
filebase : 'rlottie',
|
||||
description : 'A Library for rendering lottie files.'
|
||||
)
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
option('test',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Enable building unit tests')
|
||||
|
||||
option('example',
|
||||
type: 'boolean',
|
||||
value: true,
|
||||
description: 'Enable building examples')
|
||||
|
||||
option('text',
|
||||
type: 'boolean',
|
||||
value: false,
|
||||
description: 'Enable text module')
|
||||
|
||||
|
|
@ -1,127 +0,0 @@
|
|||
/*
|
||||
* Copyright (c) 2018 Samsung Electronics Co., Ltd. All rights reserved.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
|
||||
#include "lottieloader.h"
|
||||
#include "lottieparser.h"
|
||||
|
||||
#include <cstring>
|
||||
#include <fstream>
|
||||
#include <unordered_map>
|
||||
using namespace std;
|
||||
|
||||
#ifdef LOTTIE_CACHE_SUPPORT
|
||||
|
||||
class LottieFileCache {
|
||||
public:
|
||||
static LottieFileCache &instance()
|
||||
{
|
||||
static LottieFileCache CACHE;
|
||||
return CACHE;
|
||||
}
|
||||
std::shared_ptr<LOTModel> find(const std::string &key)
|
||||
{
|
||||
auto search = mHash.find(key);
|
||||
if (search != mHash.end()) {
|
||||
return search->second;
|
||||
} else {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
void add(const std::string &key, std::shared_ptr<LOTModel> value)
|
||||
{
|
||||
mHash[key] = std::move(value);
|
||||
}
|
||||
|
||||
private:
|
||||
LottieFileCache() = default;
|
||||
|
||||
std::unordered_map<std::string, std::shared_ptr<LOTModel>> mHash;
|
||||
};
|
||||
|
||||
#else
|
||||
|
||||
class LottieFileCache {
|
||||
public:
|
||||
static LottieFileCache &instance()
|
||||
{
|
||||
static LottieFileCache CACHE;
|
||||
return CACHE;
|
||||
}
|
||||
std::shared_ptr<LOTModel> find(const std::string &) { return nullptr; }
|
||||
void add(const std::string &, std::shared_ptr<LOTModel>) {}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
static std::string dirname(const std::string &path)
|
||||
{
|
||||
const char *ptr = strrchr(path.c_str(), '/');
|
||||
int len = int(ptr + 1 - path.c_str()); // +1 to include '/'
|
||||
return std::string(path, 0, len);
|
||||
}
|
||||
|
||||
bool LottieLoader::load(const std::string &path)
|
||||
{
|
||||
mModel = LottieFileCache::instance().find(path);
|
||||
if (mModel) return true;
|
||||
|
||||
std::ifstream f;
|
||||
f.open(path);
|
||||
|
||||
if (!f.is_open()) {
|
||||
vCritical << "failed to open file = " << path.c_str();
|
||||
return false;
|
||||
} else {
|
||||
std::stringstream buf;
|
||||
buf << f.rdbuf();
|
||||
|
||||
LottieParser parser(const_cast<char *>(buf.str().data()),
|
||||
dirname(path).c_str());
|
||||
mModel = parser.model();
|
||||
|
||||
if (!mModel) return false;
|
||||
|
||||
LottieFileCache::instance().add(path, mModel);
|
||||
|
||||
f.close();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool LottieLoader::loadFromData(std::string &&jsonData, const std::string &key,
|
||||
const std::string &resourcePath)
|
||||
{
|
||||
mModel = LottieFileCache::instance().find(key);
|
||||
if (mModel) return true;
|
||||
|
||||
LottieParser parser(const_cast<char *>(jsonData.c_str()),
|
||||
resourcePath.c_str());
|
||||
mModel = parser.model();
|
||||
|
||||
if (!mModel) return false;
|
||||
|
||||
LottieFileCache::instance().add(key, mModel);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
std::shared_ptr<LOTModel> LottieLoader::model()
|
||||
{
|
||||
return mModel;
|
||||
}
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
|
||||
source_file = files('lottieparser.cpp')
|
||||
source_file += files('lottieloader.cpp')
|
||||
source_file += files('lottiemodel.cpp')
|
||||
source_file += files('lottieproxymodel.cpp')
|
||||
source_file += files('lottieanimation.cpp')
|
||||
source_file += files('lottieitem.cpp')
|
||||
source_file += files('lottiekeypath.cpp')
|
||||
|
||||
|
||||
lottie_dep = declare_dependency(
|
||||
include_directories : include_directories('.'),
|
||||
sources : source_file
|
||||
)
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
subdir('vector')
|
||||
subdir('lottie')
|
||||
subdir('binding')
|
||||
|
||||
library_deps = vector_dep
|
||||
library_deps += lottie_dep
|
||||
library_deps += binding_dep
|
||||
|
||||
rlottie_lib = shared_library('rlottie',
|
||||
include_directories : inc,
|
||||
version : rlottie_lib_version,
|
||||
dependencies : library_deps,
|
||||
install : true
|
||||
)
|
||||
|
|
@ -1,39 +0,0 @@
|
|||
|
||||
subdir('freetype')
|
||||
subdir('pixman')
|
||||
subdir('stb')
|
||||
|
||||
vector_dep = [freetype_dep]
|
||||
vector_dep += pixman_dep
|
||||
|
||||
source_file = files('vdasher.cpp')
|
||||
source_file += files('vbrush.cpp')
|
||||
source_file += files('vbitmap.cpp')
|
||||
source_file += files('vpainter.cpp')
|
||||
source_file += files('vcompositionfunctions.cpp')
|
||||
source_file += files('vdrawhelper.cpp')
|
||||
source_file += files('vdrawhelper_sse2.cpp')
|
||||
source_file += files('vdrawhelper_neon.cpp')
|
||||
source_file += files('vdrawable.cpp')
|
||||
|
||||
source_file += files('vrect.cpp')
|
||||
source_file += files('vrle.cpp')
|
||||
source_file += files('vpath.cpp')
|
||||
source_file += files('vpathmesure.cpp')
|
||||
source_file += files('vmatrix.cpp')
|
||||
source_file += files('velapsedtimer.cpp')
|
||||
source_file += files('vdebug.cpp')
|
||||
source_file += files('vinterpolator.cpp')
|
||||
source_file += files('vbezier.cpp')
|
||||
source_file += files('vraster.cpp')
|
||||
source_file += files('vimageloader.cpp')
|
||||
|
||||
# dl dependancy for dlopen, dlsym, dlclose symbol
|
||||
cc = meson.get_compiler('cpp')
|
||||
vector_dep += cc.find_library('dl', required : true)
|
||||
|
||||
vector_dep += declare_dependency( include_directories : include_directories('.'),
|
||||
sources : source_file
|
||||
)
|
||||
|
||||
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
clang: error: clang: error: no such file or directory: '2'
|
||||
no such file or directory: '2'
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,418 +0,0 @@
|
|||
/*
|
||||
* Copyright © 2009 Nokia Corporation
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the next
|
||||
* paragraph) shall be included in all copies or substantial portions of the
|
||||
* Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* Author: Siarhei Siamashka (siarhei.siamashka@nokia.com)
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains implementations of NEON optimized pixel processing
|
||||
* functions. There is no full and detailed tutorial, but some functions
|
||||
* (those which are exposing some new or interesting features) are
|
||||
* extensively commented and can be used as examples.
|
||||
*
|
||||
* You may want to have a look at the comments for following functions:
|
||||
* - pixman_composite_over_8888_0565_asm_neon
|
||||
* - pixman_composite_over_n_8_0565_asm_neon
|
||||
*/
|
||||
|
||||
/* Prevent the stack from becoming executable for no reason... */
|
||||
#if defined(__linux__) && defined(__ELF__)
|
||||
.section .note.GNU-stack,"",%progbits
|
||||
#endif
|
||||
|
||||
.text
|
||||
.arch armv8-a
|
||||
.altmacro
|
||||
.p2align 2
|
||||
|
||||
/* Supplementary macro for setting function attributes */
|
||||
.macro pixman_asm_function fname
|
||||
.func fname
|
||||
.global fname
|
||||
#ifdef __ELF__
|
||||
.hidden fname
|
||||
.type fname, %function
|
||||
#endif
|
||||
fname:
|
||||
.endm
|
||||
|
||||
#include "pixman-arma64-neon-asm.h"
|
||||
|
||||
/* Global configuration options and preferences */
|
||||
|
||||
/*
|
||||
* The code can optionally make use of unaligned memory accesses to improve
|
||||
* performance of handling leading/trailing pixels for each scanline.
|
||||
* Configuration variable RESPECT_STRICT_ALIGNMENT can be set to 0 for
|
||||
* example in linux if unaligned memory accesses are not configured to
|
||||
* generate.exceptions.
|
||||
*/
|
||||
.set RESPECT_STRICT_ALIGNMENT, 1
|
||||
|
||||
/*
|
||||
* Set default prefetch type. There is a choice between the following options:
|
||||
*
|
||||
* PREFETCH_TYPE_NONE (may be useful for the ARM cores where PLD is set to work
|
||||
* as NOP to workaround some HW bugs or for whatever other reason)
|
||||
*
|
||||
* PREFETCH_TYPE_SIMPLE (may be useful for simple single-issue ARM cores where
|
||||
* advanced prefetch intruduces heavy overhead)
|
||||
*
|
||||
* PREFETCH_TYPE_ADVANCED (useful for superscalar cores such as ARM Cortex-A8
|
||||
* which can run ARM and NEON instructions simultaneously so that extra ARM
|
||||
* instructions do not add (many) extra cycles, but improve prefetch efficiency)
|
||||
*
|
||||
* Note: some types of function can't support advanced prefetch and fallback
|
||||
* to simple one (those which handle 24bpp pixels)
|
||||
*/
|
||||
.set PREFETCH_TYPE_DEFAULT, PREFETCH_TYPE_ADVANCED
|
||||
|
||||
/* Prefetch distance in pixels for simple prefetch */
|
||||
.set PREFETCH_DISTANCE_SIMPLE, 64
|
||||
|
||||
/*
|
||||
* Implementation of pixman_composite_over_8888_0565_asm_neon
|
||||
*
|
||||
* This function takes a8r8g8b8 source buffer, r5g6b5 destination buffer and
|
||||
* performs OVER compositing operation. Function fast_composite_over_8888_0565
|
||||
* from pixman-fast-path.c does the same in C and can be used as a reference.
|
||||
*
|
||||
* First we need to have some NEON assembly code which can do the actual
|
||||
* operation on the pixels and provide it to the template macro.
|
||||
*
|
||||
* Template macro quite conveniently takes care of emitting all the necessary
|
||||
* code for memory reading and writing (including quite tricky cases of
|
||||
* handling unaligned leading/trailing pixels), so we only need to deal with
|
||||
* the data in NEON registers.
|
||||
*
|
||||
* NEON registers allocation in general is recommented to be the following:
|
||||
* v0, v1, v2, v3 - contain loaded source pixel data
|
||||
* v4, v5, v6, v7 - contain loaded destination pixels (if they are needed)
|
||||
* v24, v25, v26, v27 - contain loading mask pixel data (if mask is used)
|
||||
* v28, v29, v30, v31 - place for storing the result (destination pixels)
|
||||
*
|
||||
* As can be seen above, four 64-bit NEON registers are used for keeping
|
||||
* intermediate pixel data and up to 8 pixels can be processed in one step
|
||||
* for 32bpp formats (16 pixels for 16bpp, 32 pixels for 8bpp).
|
||||
*
|
||||
* This particular function uses the following registers allocation:
|
||||
* v0, v1, v2, v3 - contain loaded source pixel data
|
||||
* v4, v5 - contain loaded destination pixels (they are needed)
|
||||
* v28, v29 - place for storing the result (destination pixels)
|
||||
*/
|
||||
|
||||
/*
|
||||
* Step one. We need to have some code to do some arithmetics on pixel data.
|
||||
* This is implemented as a pair of macros: '*_head' and '*_tail'. When used
|
||||
* back-to-back, they take pixel data from {v0, v1, v2, v3} and {v4, v5},
|
||||
* perform all the needed calculations and write the result to {v28, v29}.
|
||||
* The rationale for having two macros and not just one will be explained
|
||||
* later. In practice, any single monolitic function which does the work can
|
||||
* be split into two parts in any arbitrary way without affecting correctness.
|
||||
*
|
||||
* There is one special trick here too. Common template macro can optionally
|
||||
* make our life a bit easier by doing R, G, B, A color components
|
||||
* deinterleaving for 32bpp pixel formats (and this feature is used in
|
||||
* 'pixman_composite_over_8888_0565_asm_neon' function). So it means that
|
||||
* instead of having 8 packed pixels in {v0, v1, v2, v3} registers, we
|
||||
* actually use v0 register for blue channel (a vector of eight 8-bit
|
||||
* values), v1 register for green, v2 for red and v3 for alpha. This
|
||||
* simple conversion can be also done with a few NEON instructions:
|
||||
*
|
||||
* Packed to planar conversion: // vuzp8 is a wrapper macro
|
||||
* vuzp8 v0, v1
|
||||
* vuzp8 v2, v3
|
||||
* vuzp8 v1, v3
|
||||
* vuzp8 v0, v2
|
||||
*
|
||||
* Planar to packed conversion: // vzip8 is a wrapper macro
|
||||
* vzip8 v0, v2
|
||||
* vzip8 v1, v3
|
||||
* vzip8 v2, v3
|
||||
* vzip8 v0, v1
|
||||
*
|
||||
* But pixel can be loaded directly in planar format using LD4 / b NEON
|
||||
* instruction. It is 1 cycle slower than LD1 / s, so this is not always
|
||||
* desirable, that's why deinterleaving is optional.
|
||||
*
|
||||
* But anyway, here is the code:
|
||||
*/
|
||||
|
||||
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_head
|
||||
mvn v24.8b, v3.8b /* get inverted alpha */
|
||||
/* do alpha blending */
|
||||
umull v8.8h, v24.8b, v4.8b
|
||||
umull v9.8h, v24.8b, v5.8b
|
||||
umull v10.8h, v24.8b, v6.8b
|
||||
umull v11.8h, v24.8b, v7.8b
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_out_reverse_8888_8888_process_pixblock_tail
|
||||
urshr v14.8h, v8.8h, #8
|
||||
urshr v15.8h, v9.8h, #8
|
||||
urshr v16.8h, v10.8h, #8
|
||||
urshr v17.8h, v11.8h, #8
|
||||
raddhn v28.8b, v14.8h, v8.8h
|
||||
raddhn v29.8b, v15.8h, v9.8h
|
||||
raddhn v30.8b, v16.8h, v10.8h
|
||||
raddhn v31.8b, v17.8h, v11.8h
|
||||
.endm
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
.macro pixman_composite_over_8888_8888_process_pixblock_head
|
||||
pixman_composite_out_reverse_8888_8888_process_pixblock_head
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_over_8888_8888_process_pixblock_tail
|
||||
pixman_composite_out_reverse_8888_8888_process_pixblock_tail
|
||||
uqadd v28.8b, v0.8b, v28.8b
|
||||
uqadd v29.8b, v1.8b, v29.8b
|
||||
uqadd v30.8b, v2.8b, v30.8b
|
||||
uqadd v31.8b, v3.8b, v31.8b
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_over_8888_8888_process_pixblock_tail_head
|
||||
ld4 {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
|
||||
urshr v14.8h, v8.8h, #8
|
||||
PF add PF_X, PF_X, #8
|
||||
PF tst PF_CTL, #0xF
|
||||
urshr v15.8h, v9.8h, #8
|
||||
urshr v16.8h, v10.8h, #8
|
||||
urshr v17.8h, v11.8h, #8
|
||||
PF beq 10f
|
||||
PF add PF_X, PF_X, #8
|
||||
PF sub PF_CTL, PF_CTL, #1
|
||||
10:
|
||||
raddhn v28.8b, v14.8h, v8.8h
|
||||
raddhn v29.8b, v15.8h, v9.8h
|
||||
PF cmp PF_X, ORIG_W
|
||||
raddhn v30.8b, v16.8h, v10.8h
|
||||
raddhn v31.8b, v17.8h, v11.8h
|
||||
uqadd v28.8b, v0.8b, v28.8b
|
||||
uqadd v29.8b, v1.8b, v29.8b
|
||||
uqadd v30.8b, v2.8b, v30.8b
|
||||
uqadd v31.8b, v3.8b, v31.8b
|
||||
fetch_src_pixblock
|
||||
PF lsl DUMMY, PF_X, #src_bpp_shift
|
||||
PF prfm PREFETCH_MODE, [PF_SRC, DUMMY]
|
||||
mvn v22.8b, v3.8b
|
||||
PF lsl DUMMY, PF_X, #dst_bpp_shift
|
||||
PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
|
||||
st4 {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
|
||||
PF ble 10f
|
||||
PF sub PF_X, PF_X, ORIG_W
|
||||
10:
|
||||
umull v8.8h, v22.8b, v4.8b
|
||||
PF ble 10f
|
||||
PF subs PF_CTL, PF_CTL, #0x10
|
||||
10:
|
||||
umull v9.8h, v22.8b, v5.8b
|
||||
PF ble 10f
|
||||
PF lsl DUMMY, SRC_STRIDE, #src_bpp_shift
|
||||
PF ldrsb DUMMY, [PF_SRC, DUMMY]
|
||||
PF add PF_SRC, PF_SRC, #1
|
||||
10:
|
||||
umull v10.8h, v22.8b, v6.8b
|
||||
PF ble 10f
|
||||
PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
|
||||
PF ldrsb DUMMY, [PF_DST, DUMMY]
|
||||
PF add PF_DST, PF_DST, #1
|
||||
10:
|
||||
umull v11.8h, v22.8b, v7.8b
|
||||
.endm
|
||||
|
||||
generate_composite_function \
|
||||
pixman_composite_over_8888_8888_asm_neon, 32, 0, 32, \
|
||||
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
|
||||
8, /* number of pixels, processed in a single block */ \
|
||||
5, /* prefetch distance */ \
|
||||
default_init, \
|
||||
default_cleanup, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_head, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_tail, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_tail_head
|
||||
|
||||
generate_composite_function_single_scanline \
|
||||
pixman_composite_scanline_over_asm_neon, 32, 0, 32, \
|
||||
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
|
||||
8, /* number of pixels, processed in a single block */ \
|
||||
default_init, \
|
||||
default_cleanup, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_head, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_tail, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_tail_head
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
.macro pixman_composite_over_n_8888_process_pixblock_head
|
||||
/* deinterleaved source pixels in {v0, v1, v2, v3} */
|
||||
/* inverted alpha in {v24} */
|
||||
/* destination pixels in {v4, v5, v6, v7} */
|
||||
umull v8.8h, v24.8b, v4.8b
|
||||
umull v9.8h, v24.8b, v5.8b
|
||||
umull v10.8h, v24.8b, v6.8b
|
||||
umull v11.8h, v24.8b, v7.8b
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_over_n_8888_process_pixblock_tail
|
||||
urshr v14.8h, v8.8h, #8
|
||||
urshr v15.8h, v9.8h, #8
|
||||
urshr v16.8h, v10.8h, #8
|
||||
urshr v17.8h, v11.8h, #8
|
||||
raddhn v28.8b, v14.8h, v8.8h
|
||||
raddhn v29.8b, v15.8h, v9.8h
|
||||
raddhn v30.8b, v16.8h, v10.8h
|
||||
raddhn v31.8b, v17.8h, v11.8h
|
||||
uqadd v28.8b, v0.8b, v28.8b
|
||||
uqadd v29.8b, v1.8b, v29.8b
|
||||
uqadd v30.8b, v2.8b, v30.8b
|
||||
uqadd v31.8b, v3.8b, v31.8b
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_over_n_8888_process_pixblock_tail_head
|
||||
urshr v14.8h, v8.8h, #8
|
||||
urshr v15.8h, v9.8h, #8
|
||||
urshr v16.8h, v10.8h, #8
|
||||
urshr v17.8h, v11.8h, #8
|
||||
raddhn v28.8b, v14.8h, v8.8h
|
||||
raddhn v29.8b, v15.8h, v9.8h
|
||||
raddhn v30.8b, v16.8h, v10.8h
|
||||
raddhn v31.8b, v17.8h, v11.8h
|
||||
ld4 {v4.8b, v5.8b, v6.8b, v7.8b}, [DST_R], #32
|
||||
uqadd v28.8b, v0.8b, v28.8b
|
||||
PF add PF_X, PF_X, #8
|
||||
PF tst PF_CTL, #0x0F
|
||||
PF beq 10f
|
||||
PF add PF_X, PF_X, #8
|
||||
PF sub PF_CTL, PF_CTL, #1
|
||||
10:
|
||||
uqadd v29.8b, v1.8b, v29.8b
|
||||
uqadd v30.8b, v2.8b, v30.8b
|
||||
uqadd v31.8b, v3.8b, v31.8b
|
||||
PF cmp PF_X, ORIG_W
|
||||
umull v8.8h, v24.8b, v4.8b
|
||||
PF lsl DUMMY, PF_X, #dst_bpp_shift
|
||||
PF prfm PREFETCH_MODE, [PF_DST, DUMMY]
|
||||
umull v9.8h, v24.8b, v5.8b
|
||||
PF ble 10f
|
||||
PF sub PF_X, PF_X, ORIG_W
|
||||
10:
|
||||
umull v10.8h, v24.8b, v6.8b
|
||||
PF subs PF_CTL, PF_CTL, #0x10
|
||||
umull v11.8h, v24.8b, v7.8b
|
||||
PF ble 10f
|
||||
PF lsl DUMMY, DST_STRIDE, #dst_bpp_shift
|
||||
PF ldrsb DUMMY, [PF_DST, DUMMY]
|
||||
PF add PF_DST, PF_DST, #1
|
||||
10:
|
||||
st4 {v28.8b, v29.8b, v30.8b, v31.8b}, [DST_W], #32
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_over_n_8888_init
|
||||
mov v3.s[0], w4
|
||||
dup v0.8b, v3.b[0]
|
||||
dup v1.8b, v3.b[1]
|
||||
dup v2.8b, v3.b[2]
|
||||
dup v3.8b, v3.b[3]
|
||||
mvn v24.8b, v3.8b /* get inverted alpha */
|
||||
.endm
|
||||
|
||||
generate_composite_function \
|
||||
pixman_composite_over_n_8888_asm_neon, 0, 0, 32, \
|
||||
FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \
|
||||
8, /* number of pixels, processed in a single block */ \
|
||||
5, /* prefetch distance */ \
|
||||
pixman_composite_over_n_8888_init, \
|
||||
default_cleanup, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_head, \
|
||||
pixman_composite_over_8888_8888_process_pixblock_tail, \
|
||||
pixman_composite_over_n_8888_process_pixblock_tail_head
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
.macro pixman_composite_src_n_8888_process_pixblock_head
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_n_8888_process_pixblock_tail
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_n_8888_process_pixblock_tail_head
|
||||
st1 {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_n_8888_init
|
||||
mov v0.s[0], w4
|
||||
dup v3.2s, v0.s[0]
|
||||
dup v2.2s, v0.s[0]
|
||||
dup v1.2s, v0.s[0]
|
||||
dup v0.2s, v0.s[0]
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_n_8888_cleanup
|
||||
.endm
|
||||
|
||||
generate_composite_function \
|
||||
pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \
|
||||
FLAG_DST_WRITEONLY, \
|
||||
8, /* number of pixels, processed in a single block */ \
|
||||
0, /* prefetch distance */ \
|
||||
pixman_composite_src_n_8888_init, \
|
||||
pixman_composite_src_n_8888_cleanup, \
|
||||
pixman_composite_src_n_8888_process_pixblock_head, \
|
||||
pixman_composite_src_n_8888_process_pixblock_tail, \
|
||||
pixman_composite_src_n_8888_process_pixblock_tail_head, \
|
||||
0, /* dst_w_basereg */ \
|
||||
0, /* dst_r_basereg */ \
|
||||
0, /* src_basereg */ \
|
||||
0 /* mask_basereg */
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
.macro pixman_composite_src_8888_8888_process_pixblock_head
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_8888_8888_process_pixblock_tail
|
||||
.endm
|
||||
|
||||
.macro pixman_composite_src_8888_8888_process_pixblock_tail_head
|
||||
st1 {v0.2s, v1.2s, v2.2s, v3.2s}, [DST_W], #32
|
||||
fetch_src_pixblock
|
||||
cache_preload 8, 8
|
||||
.endm
|
||||
|
||||
generate_composite_function \
|
||||
pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \
|
||||
FLAG_DST_WRITEONLY, \
|
||||
8, /* number of pixels, processed in a single block */ \
|
||||
10, /* prefetch distance */ \
|
||||
default_init, \
|
||||
default_cleanup, \
|
||||
pixman_composite_src_8888_8888_process_pixblock_head, \
|
||||
pixman_composite_src_8888_8888_process_pixblock_tail, \
|
||||
pixman_composite_src_8888_8888_process_pixblock_tail_head, \
|
||||
0, /* dst_w_basereg */ \
|
||||
0, /* dst_r_basereg */ \
|
||||
0, /* src_basereg */ \
|
||||
0 /* mask_basereg */
|
||||
|
||||
/******************************************************************************/
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,7 +0,0 @@
|
|||
add_library(rlottie-image-loader SHARED
|
||||
stb_image.cpp
|
||||
)
|
||||
install(TARGETS rlottie-image-loader
|
||||
LIBRARY DESTINATION ${LIB_INSTALL_DIR}
|
||||
ARCHIVE DESTINATION ${LIB_INSTALL_DIR}
|
||||
)
|
||||
|
|
@ -1,8 +0,0 @@
|
|||
|
||||
rlottie_image_loader_sources = ['stb_image.cpp']
|
||||
|
||||
rlottie_image_loader_lib = shared_library('rlottie-image-loader',
|
||||
rlottie_image_loader_sources,
|
||||
install : true
|
||||
)
|
||||
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
#include "vimageloader.h"
|
||||
#include "config.h"
|
||||
#include "vdebug.h"
|
||||
#ifndef WIN32
|
||||
#include <dlfcn.h>
|
||||
#else
|
||||
#include <Windows.h>
|
||||
#endif
|
||||
#include <cstring>
|
||||
|
||||
#include "vimageloader.h"
|
||||
|
||||
struct VImageLoader::Impl {
|
||||
};
|
||||
|
||||
VImageLoader::VImageLoader() : mImpl(std::make_unique<VImageLoader::Impl>()) {}
|
||||
|
||||
VImageLoader::~VImageLoader() {}
|
||||
|
||||
VBitmap VImageLoader::load(const char *fileName)
|
||||
{
|
||||
return VBitmap();
|
||||
}
|
||||
|
||||
VBitmap VImageLoader::load(const char *data, int len)
|
||||
{
|
||||
return VBitmap();
|
||||
}
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
|
||||
vector_test_sources = files('testsuite.cpp')
|
||||
vector_test_sources += files('test_vpath.cpp')
|
||||
|
||||
gtest_dep = dependency('gtest')
|
||||
|
||||
vector_testsuite = executable('vectorTestSuite',
|
||||
vector_test_sources,
|
||||
include_directories : inc,
|
||||
dependencies : [gtest_dep, library_deps])
|
||||
|
||||
test('Vector Testsuite', vector_testsuite)
|
||||
|
||||
|
||||
animation_test_sources = files('testsuite.cpp')
|
||||
animation_test_sources += files('test_lottieanimation.cpp')
|
||||
animation_test_sources += files('test_lottieanimation_capi.cpp')
|
||||
|
||||
animation_testsuite = executable('animationTestSuite',
|
||||
animation_test_sources,
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : gtest_dep)
|
||||
|
||||
test('Animation Testsuite', animation_testsuite)
|
||||
|
|
@ -564,7 +564,7 @@ private func selectivePrivacySettingsControllerEntries(presentationData: Present
|
|||
enableForText = presentationData.strings.Privacy_GroupsAndChannels_AlwaysAllow
|
||||
case .phoneNumber:
|
||||
settingTitle = presentationData.strings.PrivacyPhoneNumberSettings_WhoCanSeeMyPhoneNumber
|
||||
if state.setting == .nobody, state.phoneDiscoveryEnabled == false {
|
||||
if state.setting == .nobody {
|
||||
settingInfoText = nil
|
||||
} else {
|
||||
settingInfoText = presentationData.strings.PrivacyPhoneNumberSettings_CustomHelp
|
||||
|
|
@ -609,7 +609,7 @@ private func selectivePrivacySettingsControllerEntries(presentationData: Present
|
|||
entries.append(.phoneDiscoveryHeader(presentationData.theme, presentationData.strings.PrivacyPhoneNumberSettings_DiscoveryHeader))
|
||||
entries.append(.phoneDiscoveryEverybody(presentationData.theme, presentationData.strings.PrivacySettings_LastSeenEverybody, state.phoneDiscoveryEnabled != false))
|
||||
entries.append(.phoneDiscoveryMyContacts(presentationData.theme, presentationData.strings.PrivacySettings_LastSeenContacts, state.phoneDiscoveryEnabled == false))
|
||||
entries.append(.phoneDiscoveryInfo(presentationData.theme, presentationData.strings.PrivacyPhoneNumberSettings_CustomDisabledHelp))
|
||||
entries.append(.phoneDiscoveryInfo(presentationData.theme, state.phoneDiscoveryEnabled != false ? presentationData.strings.PrivacyPhoneNumberSettings_CustomHelp : presentationData.strings.PrivacyPhoneNumberSettings_CustomDisabledHelp))
|
||||
}
|
||||
|
||||
entries.append(.exceptionsHeader(presentationData.theme, presentationData.strings.GroupInfo_Permissions_Exceptions))
|
||||
|
|
|
|||
|
|
@ -1114,7 +1114,7 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
|
|||
}
|
||||
return previous.withUpdatedPinnedMessageId(id == 0 ? nil : MessageId(peerId: userPeerId, namespace: Namespaces.Message.Cloud, id: id))
|
||||
})
|
||||
case let .updateChatPinnedMessage(groupId, id, version):
|
||||
case let .updateChatPinnedMessage(groupId, id, _):
|
||||
let groupPeerId = PeerId(namespace: Namespaces.Peer.CloudGroup, id: groupId)
|
||||
updatedState.updateCachedPeerData(groupPeerId, { current in
|
||||
let previous: CachedGroupData
|
||||
|
|
@ -1372,8 +1372,8 @@ private func finalStateWithUpdatesAndServerTime(postbox: Postbox, network: Netwo
|
|||
return resolveAssociatedMessages(network: network, state: finalState)
|
||||
|> mapToSignal { resultingState -> Signal<AccountFinalState, NoError> in
|
||||
return resolveMissingPeerChatInfos(network: network, state: resultingState)
|
||||
|> map { resultingState -> AccountFinalState in
|
||||
return AccountFinalState(state: resultingState, shouldPoll: shouldPoll || hadError, incomplete: missingUpdates)
|
||||
|> map { resultingState, resolveError -> AccountFinalState in
|
||||
return AccountFinalState(state: resultingState, shouldPoll: shouldPoll || hadError || resolveError, incomplete: missingUpdates)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1445,21 +1445,23 @@ private func resolveAssociatedMessages(network: Network, state: AccountMutableSt
|
|||
}
|
||||
}
|
||||
|
||||
private func resolveMissingPeerChatInfos(network: Network, state: AccountMutableState) -> Signal<AccountMutableState, NoError> {
|
||||
private func resolveMissingPeerChatInfos(network: Network, state: AccountMutableState) -> Signal<(AccountMutableState, Bool), NoError> {
|
||||
var missingPeers: [PeerId: Api.InputPeer] = [:]
|
||||
var hadError = false
|
||||
|
||||
for peerId in state.initialState.peerIdsRequiringLocalChatState {
|
||||
if state.peerChatInfos[peerId] == nil {
|
||||
if let peer = state.peers[peerId], let inputPeer = apiInputPeer(peer) {
|
||||
missingPeers[peerId] = inputPeer
|
||||
} else {
|
||||
hadError = true
|
||||
Logger.shared.log("State", "can't fetch chat info for peer \(peerId): can't create inputPeer")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if missingPeers.isEmpty {
|
||||
return .single(state)
|
||||
return .single((state, hadError))
|
||||
} else {
|
||||
Logger.shared.log("State", "will fetch chat info for \(missingPeers.count) peers")
|
||||
let signal = network.request(Api.functions.messages.getPeerDialogs(peers: missingPeers.values.map(Api.InputDialogPeer.inputDialogPeer(peer:))))
|
||||
|
|
@ -1469,9 +1471,9 @@ private func resolveMissingPeerChatInfos(network: Network, state: AccountMutable
|
|||
|> `catch` { _ -> Signal<Api.messages.PeerDialogs?, NoError> in
|
||||
return .single(nil)
|
||||
}
|
||||
|> map { result -> AccountMutableState in
|
||||
|> map { result -> (AccountMutableState, Bool) in
|
||||
guard let result = result else {
|
||||
return state
|
||||
return (state, hadError)
|
||||
}
|
||||
|
||||
var channelStates: [PeerId: ChannelState] = [:]
|
||||
|
|
@ -1563,7 +1565,7 @@ private func resolveMissingPeerChatInfos(network: Network, state: AccountMutable
|
|||
}
|
||||
}
|
||||
}
|
||||
return updatedState
|
||||
return (updatedState, hadError)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1596,7 +1598,7 @@ func keepPollingChannel(postbox: Postbox, network: Network, peerId: PeerId, stat
|
|||
return resolveAssociatedMessages(network: network, state: finalState)
|
||||
|> mapToSignal { resultingState -> Signal<AccountFinalState, NoError> in
|
||||
return resolveMissingPeerChatInfos(network: network, state: resultingState)
|
||||
|> map { resultingState -> AccountFinalState in
|
||||
|> map { resultingState, _ -> AccountFinalState in
|
||||
return AccountFinalState(state: resultingState, shouldPoll: false, incomplete: false)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ func applySecretOutgoingMessageReadActions(transaction: Transaction, id: Message
|
|||
return
|
||||
}
|
||||
|
||||
if let message = transaction.getMessage(id), !message.flags.contains(.Incoming) {
|
||||
if let message = transaction.getMessage(id), message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
if message.flags.intersection([.Unsent, .Sending, .Failed]).isEmpty {
|
||||
for attribute in message.attributes {
|
||||
if let attribute = attribute as? AutoremoveTimeoutMessageAttribute {
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ public struct CacheStorageSettings: PreferencesEntry, Equatable {
|
|||
public let defaultCacheStorageTimeout: Int32
|
||||
|
||||
public static var defaultSettings: CacheStorageSettings {
|
||||
return CacheStorageSettings(defaultCacheStorageTimeout: 7 * 60 * 60 * 24)
|
||||
return CacheStorageSettings(defaultCacheStorageTimeout: Int32.max)
|
||||
}
|
||||
|
||||
init(defaultCacheStorageTimeout: Int32) {
|
||||
|
|
@ -19,7 +19,7 @@ public struct CacheStorageSettings: PreferencesEntry, Equatable {
|
|||
}
|
||||
|
||||
public init(decoder: PostboxDecoder) {
|
||||
self.defaultCacheStorageTimeout = decoder.decodeInt32ForKey("dt", orElse: 0)
|
||||
self.defaultCacheStorageTimeout = decoder.decodeInt32ForKey("dt", orElse: Int32.max)
|
||||
}
|
||||
|
||||
public func encode(_ encoder: PostboxEncoder) {
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public func installInteractiveReadMessagesAction(postbox: Postbox, stateManager:
|
|||
consumeMessageIds.append(id)
|
||||
}
|
||||
|
||||
if message.flags.contains(.Incoming) {
|
||||
if !message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
let index = MessageIndex(id: id, timestamp: message.timestamp)
|
||||
let current = readMessageIndexByNamespace[id.namespace]
|
||||
if current == nil || current! < index {
|
||||
|
|
|
|||
|
|
@ -561,6 +561,7 @@ extension StoreMessage {
|
|||
|
||||
if (flags & (1 << 18)) != 0 {
|
||||
storeFlags.insert(.WasScheduled)
|
||||
storeFlags.insert(.CountedAsIncoming)
|
||||
}
|
||||
|
||||
if (flags & (1 << 4)) != 0 || (flags & (1 << 13)) != 0 {
|
||||
|
|
|
|||
|
|
@ -5030,7 +5030,7 @@ public final class ChatControllerImpl: TelegramBaseController, ChatController, G
|
|||
return result
|
||||
}
|
||||
|
||||
let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: menuEditMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, hasSchedule: !strongSelf.presentationInterfaceState.isScheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: {
|
||||
let controller = legacyAttachmentMenu(context: strongSelf.context, peer: peer, editMediaOptions: menuEditMediaOptions, saveEditedPhotos: settings.storeEditedPhotos, allowGrouping: true, hasSchedule: !strongSelf.presentationInterfaceState.isScheduledMessages && peer.id.namespace != Namespaces.Peer.SecretChat, canSendPolls: canSendPolls, theme: strongSelf.presentationData.theme, strings: strongSelf.presentationData.strings, parentController: legacyController, recentlyUsedInlineBots: strongSelf.recentlyUsedInlineBotsValue, initialCaption: inputText.string, openGallery: {
|
||||
self?.presentMediaPicker(fileMode: false, editingMedia: editMediaOptions != nil, completion: { signals, silentPosting, scheduleTime in
|
||||
if !inputText.string.isEmpty {
|
||||
//strongSelf.clearInputText()
|
||||
|
|
|
|||
|
|
@ -278,7 +278,9 @@ class ChatControllerNode: ASDisplayNode, UIScrollViewDelegate {
|
|||
self.textInputPanelNode?.storedInputLanguage = chatPresentationInterfaceState.interfaceState.inputLanguage
|
||||
self.textInputPanelNode?.updateHeight = { [weak self] animated in
|
||||
if let strongSelf = self, let _ = strongSelf.inputPanelNode as? ChatTextInputPanelNode, !strongSelf.ignoreUpdateHeight {
|
||||
strongSelf.requestLayout(animated ? .animated(duration: 0.1, curve: .easeInOut) : .immediate)
|
||||
if strongSelf.scheduledLayoutTransitionRequest == nil {
|
||||
strongSelf.scheduleLayoutTransitionRequest(animated ? .animated(duration: 0.1, curve: .easeInOut) : .immediate)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -166,7 +166,7 @@ private func maxMessageIndexForEntries(_ view: ChatHistoryView, indexRange: (Int
|
|||
if overall == nil || overall! < index {
|
||||
overall = index
|
||||
}
|
||||
if messageEntry.message.flags.contains(.Incoming) {
|
||||
if !messageEntry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
if incoming == nil || incoming! < index {
|
||||
incoming = index
|
||||
}
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ func chatHistoryViewForLocation(_ location: ChatHistoryLocationInput, account: A
|
|||
if view.holeEarlier {
|
||||
var incomingCount: Int32 = 0
|
||||
inner: for entry in view.entries.reversed() {
|
||||
if entry.message.flags.contains(.Incoming) {
|
||||
if !entry.message.flags.intersection(.IsIncomingMask).isEmpty {
|
||||
incomingCount += 1
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -370,8 +370,14 @@ public final class ChatMessageItem: ListViewItem, CustomStringConvertible {
|
|||
|
||||
loop: for media in self.message.media {
|
||||
if let telegramFile = media as? TelegramMediaFile {
|
||||
if telegramFile.isAnimatedSticker, let size = telegramFile.size, size > 0 && size <= 128 * 1024 && !telegramFile.previewRepresentations.isEmpty {
|
||||
viewClassName = ChatMessageAnimatedStickerItemNode.self
|
||||
if telegramFile.isAnimatedSticker, !telegramFile.previewRepresentations.isEmpty, let size = telegramFile.size, size > 0 && size <= 128 * 1024 {
|
||||
if self.message.id.peerId.namespace == Namespaces.Peer.SecretChat {
|
||||
if telegramFile.fileId.namespace == Namespaces.Media.CloudFile {
|
||||
viewClassName = ChatMessageAnimatedStickerItemNode.self
|
||||
}
|
||||
} else {
|
||||
viewClassName = ChatMessageAnimatedStickerItemNode.self
|
||||
}
|
||||
break loop
|
||||
}
|
||||
for attribute in telegramFile.attributes {
|
||||
|
|
|
|||
|
|
@ -74,7 +74,6 @@
|
|||
D00818CD22B595CB008A895F /* LightweightAccountData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00818CC22B595CB008A895F /* LightweightAccountData.framework */; };
|
||||
D00ACA4B20222C280045D427 /* libtgvoip.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D00ACA4C20222C280045D427 /* libtgvoip.framework */; };
|
||||
D00ACA5A2022897D0045D427 /* ProcessedPeerRestrictionText.swift in Sources */ = {isa = PBXBuildFile; fileRef = D00ACA592022897D0045D427 /* ProcessedPeerRestrictionText.swift */; };
|
||||
D010E17D22C238BC009324D4 /* RLottie.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D010E17C22C238BC009324D4 /* RLottie.framework */; };
|
||||
D015E04F225D2E5900CB9E8A /* WebP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D015E04E225D2E5900CB9E8A /* WebP.framework */; };
|
||||
D017734C22049BF800DA06A7 /* UpgradedAccounts.swift in Sources */ = {isa = PBXBuildFile; fileRef = D017734B22049BF800DA06A7 /* UpgradedAccounts.swift */; };
|
||||
D01776BE1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D01776BD1F1E76920044446D /* PeerMediaCollectionSectionsNode.swift */; };
|
||||
|
|
@ -236,6 +235,7 @@
|
|||
D09E77A922FA5CEA00B9CCA7 /* TextFormat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77A822FA5CEA00B9CCA7 /* TextFormat.framework */; };
|
||||
D09E77AB22FA5CEA00B9CCA7 /* Tuples.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77AA22FA5CEA00B9CCA7 /* Tuples.framework */; };
|
||||
D09E77AD22FA5CEA00B9CCA7 /* UrlEscaping.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D09E77AC22FA5CEA00B9CCA7 /* UrlEscaping.framework */; };
|
||||
D0AA5793231BE2FD000F88F3 /* RLottieBinding.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D0AA5792231BE2FD000F88F3 /* RLottieBinding.framework */; };
|
||||
D0AA840C1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AA840B1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift */; };
|
||||
D0AB262921C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0AB262821C307D7008F6685 /* ChatMessagePollBubbleContentNode.swift */; };
|
||||
D0ACCB1C1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = D0ACCB1B1EC5FF4B0079D8BF /* ChatMessageCallBubbleContentNode.swift */; };
|
||||
|
|
@ -895,6 +895,7 @@
|
|||
D09E77A822FA5CEA00B9CCA7 /* TextFormat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = TextFormat.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D09E77AA22FA5CEA00B9CCA7 /* Tuples.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Tuples.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D09E77AC22FA5CEA00B9CCA7 /* UrlEscaping.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = UrlEscaping.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0AA5792231BE2FD000F88F3 /* RLottieBinding.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RLottieBinding.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
D0AA840B1FEB2BA3005C6E91 /* OverlayPlayerControlsNode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverlayPlayerControlsNode.swift; sourceTree = "<group>"; };
|
||||
D0AB0BB01D6718DA002C78E7 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
|
||||
D0AB0BB21D6718EB002C78E7 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
|
||||
|
|
@ -1169,6 +1170,7 @@
|
|||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
D0AA5793231BE2FD000F88F3 /* RLottieBinding.framework in Frameworks */,
|
||||
09B4A9BA231519CD005C2E08 /* VideoToolbox.framework in Frameworks */,
|
||||
D072F38423155EAF0009E66F /* MessageReactionListUI.framework in Frameworks */,
|
||||
D03E495D230868DF0049C28B /* PersistentStringHash.framework in Frameworks */,
|
||||
|
|
@ -1302,7 +1304,6 @@
|
|||
D060184222F35D2000796784 /* ActivityIndicator.framework in Frameworks */,
|
||||
D060184022F35D1C00796784 /* MergeLists.framework in Frameworks */,
|
||||
D0D3281422F31B3000D07EE2 /* TelegramUpdateUI.framework in Frameworks */,
|
||||
D010E17D22C238BC009324D4 /* RLottie.framework in Frameworks */,
|
||||
D03AE67522B945D30078411C /* BuildConfig.framework in Frameworks */,
|
||||
D03AE67322B9459C0078411C /* HockeySDK.framework in Frameworks */,
|
||||
D02D634A22B85B94006BE519 /* PushKit.framework in Frameworks */,
|
||||
|
|
@ -1774,6 +1775,7 @@
|
|||
D08D45281D5E340200A7428A /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D0AA5792231BE2FD000F88F3 /* RLottieBinding.framework */,
|
||||
09B4A9B9231519CD005C2E08 /* VideoToolbox.framework */,
|
||||
D072F38323155EAF0009E66F /* MessageReactionListUI.framework */,
|
||||
D03E495C230868DF0049C28B /* PersistentStringHash.framework */,
|
||||
|
|
|
|||
0
submodules/RLottie/Info.plist → submodules/rlottie/Info.plist
Normal file → Executable file
0
submodules/RLottie/Info.plist → submodules/rlottie/Info.plist
Normal file → Executable file
0
submodules/RLottie/Sources/LottieInstance.h → submodules/rlottie/LottieInstance.h
Normal file → Executable file
0
submodules/RLottie/Sources/LottieInstance.h → submodules/rlottie/LottieInstance.h
Normal file → Executable file
2
submodules/RLottie/Sources/LottieInstance.mm → submodules/rlottie/LottieInstance.mm
Normal file → Executable file
2
submodules/RLottie/Sources/LottieInstance.mm → submodules/rlottie/LottieInstance.mm
Normal file → Executable file
|
|
@ -1,6 +1,6 @@
|
|||
#import "LottieInstance.h"
|
||||
|
||||
#include <rlottie.h>
|
||||
#include "rlottie.h"
|
||||
|
||||
@interface LottieInstance () {
|
||||
std::unique_ptr<rlottie::Animation> _animation;
|
||||
7
submodules/RLottie/Sources/RLottie.h → submodules/rlottie/RLottieBinding.h
Normal file → Executable file
7
submodules/RLottie/Sources/RLottie.h → submodules/rlottie/RLottieBinding.h
Normal file → Executable file
|
|
@ -9,11 +9,10 @@
|
|||
#import <UIKit/UIKit.h>
|
||||
|
||||
//! Project version number for RLottie.
|
||||
FOUNDATION_EXPORT double RLottieVersionNumber;
|
||||
FOUNDATION_EXPORT double RLottieBindingVersionNumber;
|
||||
|
||||
//! Project version string for RLottie.
|
||||
FOUNDATION_EXPORT const unsigned char RLottieVersionString[];
|
||||
|
||||
#import <RLottie/LottieInstance.h>
|
||||
FOUNDATION_EXPORT const unsigned char RLottieBindingVersionString[];
|
||||
|
||||
#import <RLottieBinding/LottieInstance.h>
|
||||
|
||||
1030
submodules/rlottie/RLottieBinding_Xcode.xcodeproj/project.pbxproj
Executable file
1030
submodules/rlottie/RLottieBinding_Xcode.xcodeproj/project.pbxproj
Executable file
File diff suppressed because it is too large
Load diff
|
Before Width: | Height: | Size: 5.6 MiB After Width: | Height: | Size: 5.6 MiB |
|
Before Width: | Height: | Size: 1 MiB After Width: | Height: | Size: 1 MiB |
23
submodules/rlottie/rlottie/.appveyor.yml
Normal file
23
submodules/rlottie/rlottie/.appveyor.yml
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
os: Visual Studio 2017
|
||||
platform:
|
||||
- x86
|
||||
environment:
|
||||
matrix:
|
||||
- ARCH: x86
|
||||
PYTHON: "C:\\Python35"
|
||||
- ARCH: x64
|
||||
PYTHON: "C:\\Python35-x64"
|
||||
skip_branch_with_pr: true
|
||||
install:
|
||||
- git submodule update --init --recursive
|
||||
- set PATH=%cd%;%PYTHON%;%PYTHON%\Scripts;%PATH%
|
||||
- pip install meson==0.50.0 ninja
|
||||
- call "%VS140COMNTOOLS%\..\..\VC\vcvarsall.bat" %ARCH%
|
||||
build_script:
|
||||
- meson -Dwerror=false --backend=ninja --prefix=%cd% build
|
||||
- where link
|
||||
- ninja -C build
|
||||
test_script:
|
||||
- ninja -C build test
|
||||
after_build:
|
||||
- ninja -C build install
|
||||
|
|
@ -9,3 +9,4 @@ latex
|
|||
tmp
|
||||
.cproject
|
||||
.project
|
||||
.vs
|
||||
20
submodules/rlottie/rlottie/.travis.yml
Normal file
20
submodules/rlottie/rlottie/.travis.yml
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
sudo: false
|
||||
|
||||
os:
|
||||
- linux
|
||||
|
||||
language:
|
||||
- cpp
|
||||
|
||||
services:
|
||||
- docker
|
||||
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker pull smohantty/rlottie-ci-setup; fi
|
||||
|
||||
script:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo FROM smohantty/rlottie-ci-setup > Dockerfile; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then echo ADD . /root >> Dockerfile; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker build -t withgit .; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run withgit /bin/sh -c "cd /root && TRAVIS=true meson -Dtest=true builddir && ninja -C builddir test && ninja -C builddir install"; fi
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then docker run withgit /bin/sh -c "cd /root && TRAVIS=true cmake -DLOTTIE_TEST=ON -Bbuilddir -H. && make -C builddir -j$(nproc) all test && make -C builddir install"; fi
|
||||
|
|
@ -6,3 +6,6 @@ Bryce Harrington <bryce@bryceharrington.org>
|
|||
Junsu Choi <jsuya.choi@samsung.com>
|
||||
Yuangu <lifulinghan@aol.com>
|
||||
Mihai Serban <mihai.serban@gmail.com>
|
||||
Shinwoo Kim <cinoo.kim@samsung.com>
|
||||
Vincent Torri <vincent.torri@gmail.com>
|
||||
Nicholas Guriev <guriev-ns@ya.ru>
|
||||
|
|
@ -1,10 +1,20 @@
|
|||
cmake_minimum_required( VERSION 3.2 )
|
||||
cmake_minimum_required( VERSION 3.3 )
|
||||
|
||||
#declare project
|
||||
project( rlottie VERSION 0.0.1 LANGUAGES C CXX ASM)
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE MinSizeRel)
|
||||
endif()
|
||||
|
||||
if (NOT DEFINED BUILD_SHARED_LIBS)
|
||||
# Keep the previous behavior of the build system, consistent with Meson.
|
||||
set(BUILD_SHARED_LIBS ON)
|
||||
endif()
|
||||
|
||||
#declare target
|
||||
add_library( rlottie SHARED "" )
|
||||
add_library( rlottie )
|
||||
set_target_properties( rlottie PROPERTIES DEFINE_SYMBOL LOT_BUILD )
|
||||
|
||||
#declare version of the target
|
||||
set(player_version_major 0)
|
||||
|
|
@ -19,12 +29,23 @@ set_target_properties(rlottie PROPERTIES
|
|||
#declare alias so that library can be used inside the build tree, e.g. when testing
|
||||
add_library(rlottie::rlottie ALIAS rlottie)
|
||||
|
||||
option(LOTTIE_MODULE "Enable LOTTIE MODULE SUPPORT" ON)
|
||||
option(LOTTIE_THREAD "Enable LOTTIE THREAD SUPPORT" ON)
|
||||
option(LOTTIE_CACHE "Enable LOTTIE CACHE SUPPORT" ON)
|
||||
option(LOTTIE_TEST "Build LOTTIE AUTOTESTS" OFF)
|
||||
|
||||
CONFIGURE_FILE(${CMAKE_CURRENT_LIST_DIR}/cmake/config.h.in config.h)
|
||||
|
||||
target_include_directories(rlottie
|
||||
PRIVATE
|
||||
"${CMAKE_CURRENT_BINARY_DIR}"
|
||||
)
|
||||
|
||||
#declare target compilation options
|
||||
target_compile_options(rlottie
|
||||
PUBLIC
|
||||
PRIVATE
|
||||
-std=c++14
|
||||
-Os
|
||||
-fno-exceptions
|
||||
-fno-unwind-tables
|
||||
-fno-asynchronous-unwind-tables
|
||||
|
|
@ -47,10 +68,10 @@ target_link_libraries(rlottie
|
|||
"${CMAKE_THREAD_LIBS_INIT}"
|
||||
)
|
||||
|
||||
# for dlopen, dlsym and dlclose dependancy
|
||||
target_link_libraries(rlottie
|
||||
PRIVATE
|
||||
${CMAKE_DL_LIBS})
|
||||
if (LOTTIE_MODULE)
|
||||
# for dlopen, dlsym and dlclose dependancy
|
||||
target_link_libraries(rlottie PRIVATE ${CMAKE_DL_LIBS})
|
||||
endif()
|
||||
|
||||
if(APPLE)
|
||||
target_link_libraries(rlottie
|
||||
|
|
@ -74,6 +95,11 @@ add_subdirectory(inc)
|
|||
add_subdirectory(src)
|
||||
add_subdirectory(example)
|
||||
|
||||
if (LOTTIE_TEST)
|
||||
enable_testing()
|
||||
add_subdirectory(test)
|
||||
endif()
|
||||
|
||||
SET(PREFIX ${CMAKE_INSTALL_PREFIX})
|
||||
SET(EXEC_DIR ${PREFIX})
|
||||
SET(LIBDIR ${LIB_INSTALL_DIR})
|
||||
|
|
@ -2,6 +2,8 @@
|
|||
# rlottie
|
||||
|
||||
[](https://travis-ci.org/Samsung/rlottie)
|
||||
[](https://ci.appveyor.com/project/smohantty/rlottie-mliua)
|
||||
|
||||
|
||||
rlottie is a platform independent standalone c++ library for rendering vector based animations and art in realtime.
|
||||
|
||||
17
submodules/rlottie/rlottie/cmake/config.h.in
Normal file
17
submodules/rlottie/rlottie/cmake/config.h.in
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
#cmakedefine LOTTIE_MODULE
|
||||
|
||||
#ifdef LOTTIE_MODULE
|
||||
#define LOTTIE_IMAGE_MODULE_SUPPORT
|
||||
#endif
|
||||
|
||||
#cmakedefine LOTTIE_THREAD
|
||||
|
||||
#ifdef LOTTIE_THREAD
|
||||
#define LOTTIE_THREAD_SUPPORT
|
||||
#endif
|
||||
|
||||
#cmakedefine LOTTIE_CACHE
|
||||
|
||||
#ifdef LOTTIE_CACHE
|
||||
#define LOTTIE_CACHE_SUPPORT
|
||||
#endif
|
||||
|
|
@ -24,16 +24,14 @@
|
|||
#define WIDTH 400
|
||||
#define HEIGHT 400
|
||||
|
||||
Eo *slider = NULL;
|
||||
|
||||
void
|
||||
win_del(void *data, Eo *o, void *ev)
|
||||
win_del(void *data EINA_UNUSED, Eo *o EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
elm_exit();
|
||||
}
|
||||
|
||||
static void
|
||||
btn_clicked_cb(void *data, Eo *obj, void *event_info)
|
||||
btn_clicked_cb(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *anim_view = (Eo *) data;
|
||||
const char *text = elm_object_text_get(obj);
|
||||
|
|
@ -53,14 +51,14 @@ btn_clicked_cb(void *data, Eo *obj, void *event_info)
|
|||
}
|
||||
|
||||
static void
|
||||
check_changed_cb(void *data, Eo *obj, void *event_info)
|
||||
check_changed_cb(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *anim_view = (Eo *) data;
|
||||
elm_animation_view_auto_repeat_set(anim_view, elm_check_state_get(obj));
|
||||
}
|
||||
|
||||
static void
|
||||
speed_changed_cb(void *data, Eo *obj, void *event_info)
|
||||
speed_changed_cb(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *anim_view = (Eo *) data;
|
||||
double speed = 1;
|
||||
|
|
@ -94,40 +92,40 @@ update_anim_view_state(Eo *anim_view, Eo *label)
|
|||
}
|
||||
|
||||
static void
|
||||
_play_done(void *data, Eo *obj, void *ev)
|
||||
_play_done(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
printf("done!\n");
|
||||
}
|
||||
|
||||
static void
|
||||
_play_updated(void *data, Eo *obj, void *ev)
|
||||
_play_updated(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *slider = (Eo *) data;
|
||||
elm_slider_value_set(slider, elm_animation_view_progress_get(obj));
|
||||
}
|
||||
|
||||
static void
|
||||
_state_update(void *data, Eo *obj, void *ev)
|
||||
_state_update(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *label = (Eo *) data;
|
||||
update_anim_view_state(obj, label);
|
||||
}
|
||||
|
||||
static void
|
||||
_play_repeated(void *data, Eo *obj, void *ev)
|
||||
_play_repeated(void *data EINA_UNUSED, Eo *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
printf("repeated!\n");
|
||||
}
|
||||
|
||||
static void
|
||||
_slider_drag_cb(void *data, Eo *obj, void *ev)
|
||||
_slider_drag_cb(void *data, Eo *obj, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *anim_view = (Eo *) data;
|
||||
elm_animation_view_progress_set(anim_view, elm_slider_value_get(obj));
|
||||
}
|
||||
|
||||
static void
|
||||
_slider_reset(void *data, Eo *obj, void *ev)
|
||||
_slider_reset(void *data, Eo *obj EINA_UNUSED, void *event_info EINA_UNUSED)
|
||||
{
|
||||
Eo *slider = (Eo *) data;
|
||||
elm_slider_value_set(slider, 0);
|
||||
|
|
@ -2,9 +2,16 @@
|
|||
#include <rlottie.h>
|
||||
|
||||
#include<iostream>
|
||||
#include<string>
|
||||
#include<vector>
|
||||
#include<array>
|
||||
|
||||
#ifndef _WIN32
|
||||
#include<libgen.h>
|
||||
#else
|
||||
#include <windows.h>
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
class GifBuilder {
|
||||
public:
|
||||
|
|
@ -78,7 +85,7 @@ public:
|
|||
auto buffer = std::unique_ptr<uint32_t[]>(new uint32_t[w * h]);
|
||||
size_t frameCount = player->totalFrame();
|
||||
|
||||
GifBuilder builder(baseName.data(), w, h, bgColor);
|
||||
GifBuilder builder(gifName.data(), w, h, bgColor);
|
||||
for (size_t i = 0; i < frameCount ; i++) {
|
||||
rlottie::Surface surface(buffer.get(), w, h, w * 4);
|
||||
player->renderSync(i, surface);
|
||||
|
|
@ -89,31 +96,48 @@ public:
|
|||
|
||||
int setup(int argc, char **argv)
|
||||
{
|
||||
if (argc > 1) fileName = argv[1];
|
||||
char *path{nullptr};
|
||||
|
||||
if (argc > 1) path = argv[1];
|
||||
if (argc > 2) bgColor = strtol(argv[2], NULL, 16);
|
||||
|
||||
if (!fileName) return help();
|
||||
if (!path) return help();
|
||||
|
||||
fileName = realpath(fileName, absoloutePath.data());
|
||||
std::array<char, 5000> memory;
|
||||
|
||||
if (!fileName || !jsonFile(fileName) ) return help();
|
||||
#ifdef _WIN32
|
||||
path = _fullpath(memory.data(), path, memory.size());
|
||||
#else
|
||||
path = realpath(path, memory.data());
|
||||
#endif
|
||||
if (!path) return help();
|
||||
|
||||
baseName = absoloutePath;
|
||||
char *base = basename(baseName.data());
|
||||
snprintf(baseName.data(), baseName.size(), "%s.gif",base);
|
||||
fileName = std::string(path);
|
||||
|
||||
if (!jsonFile()) return help();
|
||||
|
||||
gifName = basename(fileName);
|
||||
gifName.append(".gif");
|
||||
return 0;
|
||||
}
|
||||
|
||||
private:
|
||||
std::string basename(const std::string &str)
|
||||
{
|
||||
return str.substr(str.find_last_of("/\\") + 1);
|
||||
}
|
||||
|
||||
bool jsonFile(const char *filename) {
|
||||
const char *dot = strrchr(filename, '.');
|
||||
if(!dot || dot == filename) return false;
|
||||
return !strcmp(dot + 1, "json");
|
||||
bool jsonFile() {
|
||||
std::string extn = ".json";
|
||||
if ( fileName.size() <= extn.size() ||
|
||||
fileName.substr(fileName.size()- extn.size()) != extn )
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int result() {
|
||||
std::cout<<"Generated GIF file : "<<baseName.data()<<std::endl;
|
||||
std::cout<<"Generated GIF file : "<<gifName<<std::endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -123,10 +147,9 @@ private:
|
|||
}
|
||||
|
||||
private:
|
||||
char *fileName{nullptr};
|
||||
int bgColor = 0xffffffff;
|
||||
std::array<char, 5000> absoloutePath;
|
||||
std::array<char, 5000> baseName;
|
||||
std::string fileName;
|
||||
std::string gifName;
|
||||
};
|
||||
|
||||
int
|
||||
|
|
@ -409,7 +409,7 @@ public:
|
|||
const float *data = node->mPath.ptPtr;
|
||||
if (!data) return;
|
||||
|
||||
for (int i = 0; i < node->mPath.elmCount; i++) {
|
||||
for (size_t i = 0; i < node->mPath.elmCount; i++) {
|
||||
switch (node->mPath.elmPtr[i]) {
|
||||
case 0:
|
||||
evas_vg_shape_append_move_to(shape, data[0], data[1]);
|
||||
63
submodules/rlottie/rlottie/example/meson.build
Normal file
63
submodules/rlottie/rlottie/example/meson.build
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
|
||||
override_default = ['warning_level=2', 'werror=false']
|
||||
|
||||
common_source = files('evasapp.cpp')
|
||||
common_source += files('lottieview.cpp')
|
||||
|
||||
demo_sources = files('demo.cpp')
|
||||
demo_sources += common_source
|
||||
|
||||
executable('lottie2gif',
|
||||
'lottie2gif.cpp',
|
||||
include_directories : inc,
|
||||
override_options : override_default,
|
||||
link_with : rlottie_lib)
|
||||
|
||||
demo_dep = dependency('elementary', required : false, disabler : true)
|
||||
|
||||
executable('demo',
|
||||
demo_sources,
|
||||
include_directories : inc,
|
||||
override_options : override_default,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
lottieview_test_src = files('lottieviewtest.cpp')
|
||||
lottieview_test_src += common_source
|
||||
|
||||
executable('lottieviewTest',
|
||||
lottieview_test_src,
|
||||
include_directories : inc,
|
||||
override_options : override_default,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
uxsample_test_src = files('uxsampletest.cpp')
|
||||
uxsample_test_src += common_source
|
||||
|
||||
executable('uxsampleTest',
|
||||
uxsample_test_src,
|
||||
include_directories : inc,
|
||||
override_options : override_default,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
lottieviewer_sources = files('lottieviewer.cpp')
|
||||
lottieviewer_sources += common_source
|
||||
|
||||
executable('lottieviewer',
|
||||
lottieviewer_sources,
|
||||
include_directories : inc,
|
||||
override_options : override_default,
|
||||
link_with : rlottie_lib,
|
||||
dependencies : demo_dep)
|
||||
|
||||
if (meson.get_compiler('cpp').has_header('elementary-1/efl_ui_animation_view.h'))
|
||||
executable('efl_animview',
|
||||
'efl_animview.cpp',
|
||||
include_directories : inc,
|
||||
link_with : rlottie_lib,
|
||||
override_options : override_default,
|
||||
dependencies : demo_dep)
|
||||
endif
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue