Various improvements

This commit is contained in:
Ilya Laktyushin 2023-09-05 19:39:15 +04:00
parent 266f9e5ad8
commit 0e68265f57
26 changed files with 1135 additions and 120 deletions

View File

@ -2771,6 +2771,11 @@ final class UniversalVideoGalleryItemNode: ZoomableContentGalleryItemNode {
self.playbackRatePromise.set(self.playbackRate ?? 1.0)
}
public func seekToStart() {
self.videoNode?.seek(0.0)
self.videoNode?.play()
}
override var keyShortcuts: [KeyShortcut] {
let strings = self.presentationData.strings

View File

@ -68,30 +68,10 @@ private final class SecretMediaPreviewControllerNode: GalleryControllerNode {
self.timeoutNode = timeoutNode
let icon: RadialStatusNodeState.SecretTimeoutIcon
let timeoutValue = Int32(timeout)
if timeoutValue == viewOnceTimeout || "".isEmpty {
if timeoutValue == viewOnceTimeout {
beginTime = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970
if let image = generateImage(CGSize(width: 28.0, height: 28.0), rotatedContext: { size, context in
let bounds = CGRect(origin: .zero, size: size)
context.clear(bounds)
let string = "1"
let attributedString = NSAttributedString(string: string, attributes: [NSAttributedString.Key.font: Font.with(size: 14.0, design: .round), NSAttributedString.Key.foregroundColor: UIColor.white])
let line = CTLineCreateWithAttributedString(attributedString)
let lineBounds = CTLineGetBoundsWithOptions(line, .useGlyphPathBounds)
let lineOffset = CGPoint(x: -1.0, y: 0.0)
let lineOrigin = CGPoint(x: floorToScreenPixels(-lineBounds.origin.x + (bounds.size.width - lineBounds.size.width) / 2.0) + lineOffset.x, y: floorToScreenPixels(-lineBounds.origin.y + (bounds.size.height - lineBounds.size.height) / 2.0))
context.translateBy(x: bounds.size.width / 2.0, y: bounds.size.height / 2.0)
context.scaleBy(x: 1.0, y: -1.0)
context.translateBy(x: -bounds.size.width / 2.0, y: -bounds.size.height / 2.0)
context.translateBy(x: lineOrigin.x, y: lineOrigin.y)
CTLineDraw(line, context)
context.translateBy(x: -lineOrigin.x, y: -lineOrigin.y)
}) {
if let image = generateTintedImage(image: UIImage(bundleImageName: "Media Gallery/ViewOnce"), color: .white) {
icon = .image(image)
} else {
icon = .flame
@ -104,9 +84,6 @@ private final class SecretMediaPreviewControllerNode: GalleryControllerNode {
timeoutNode.addTarget(self, action: #selector(self.statusTapGesture), forControlEvents: .touchUpInside)
// let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.statusTapGesture))
// timeoutNode.view.addGestureRecognizer(tapGesture)
if let (layout, navigationHeight) = self.validLayout {
self.layoutTimeoutNode(layout, navigationBarHeight: navigationHeight, transition: .immediate)
}
@ -181,6 +158,9 @@ public final class SecretMediaPreviewController: ViewController {
private var currentNodeMessageIsViewOnce = false
private var tempFile: TempBoxFile?
private let centralItemAttributesDisposable = DisposableSet();
private let footerContentNode = Promise<(GalleryFooterContentNode?, GalleryOverlayContentNode?)>()
private let _hiddenMedia = Promise<(MessageId, Media)?>(nil)
private var hiddenMediaManagerIndex: Int?
@ -219,6 +199,15 @@ public final class SecretMediaPreviewController: ViewController {
return nil
}
})
self.centralItemAttributesDisposable.add(self.footerContentNode.get().start(next: { [weak self] footerContentNode, _ in
guard let self else {
return
}
self.controllerNode.updatePresentationState({
$0.withUpdatedFooterContentNode(footerContentNode)
}, transition: .immediate)
}))
}
required public init(coder aDecoder: NSCoder) {
@ -235,6 +224,7 @@ public final class SecretMediaPreviewController: ViewController {
if let tempFile = self.tempFile {
TempBox.shared.dispose(tempFile)
}
self.centralItemAttributesDisposable.dispose()
}
@objc func donePressed() {
@ -314,7 +304,7 @@ public final class SecretMediaPreviewController: ViewController {
strongSelf.currentNodeMessageIsViewOnce = attribute.timeout == viewOnceTimeout
if let countdownBeginTime = attribute.countdownBeginTime {
if let videoDuration = videoDuration {
if let videoDuration = videoDuration, attribute.timeout != viewOnceTimeout {
beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, videoDuration)
} else {
beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout))
@ -324,7 +314,7 @@ public final class SecretMediaPreviewController: ViewController {
strongSelf.currentNodeMessageIsViewOnce = attribute.timeout == viewOnceTimeout
if let countdownBeginTime = attribute.countdownBeginTime {
if let videoDuration = videoDuration {
if let videoDuration = videoDuration, attribute.timeout != viewOnceTimeout {
beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, videoDuration)
} else {
beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout))
@ -354,7 +344,11 @@ public final class SecretMediaPreviewController: ViewController {
strongSelf.controllerNode.beginTimeAndTimeout = beginTimeAndTimeout
}
if !message.flags.contains(.Incoming) {
if strongSelf.currentNodeMessageIsVideo {
if let node = strongSelf.controllerNode.pager.centralItemNode() {
strongSelf.footerContentNode.set(node.footerContent())
}
} else if !message.flags.contains(.Incoming) {
if let _ = beginTimeAndTimeout {
strongSelf.controllerNode.updatePresentationState({
$0.withUpdatedFooterContentNode(nil)
@ -490,7 +484,15 @@ public final class SecretMediaPreviewController: ViewController {
}
guard let item = galleryItemForEntry(context: self.context, presentationData: self.presentationData, entry: MessageHistoryEntry(message: message, isRead: false, location: nil, monthLocation: nil, attributes: MutableMessageHistoryEntryAttributes(authorIsContact: false)), streamVideos: false, hideControls: true, isSecret: true, playbackRate: { nil }, tempFilePath: tempFilePath, playbackCompleted: { [weak self] in
self?.dismiss(forceAway: false)
if let self {
if self.currentNodeMessageIsViewOnce {
if let node = self.controllerNode.pager.centralItemNode() as? UniversalVideoGalleryItemNode {
node.seekToStart()
}
} else {
self.dismiss(forceAway: false)
}
}
}, present: { _, _ in }) else {
self._ready.set(.single(true))
return
@ -512,7 +514,7 @@ public final class SecretMediaPreviewController: ViewController {
}
if let attribute = message.autoclearAttribute {
if let countdownBeginTime = attribute.countdownBeginTime {
if let videoDuration = videoDuration {
if let videoDuration = videoDuration, attribute.timeout != viewOnceTimeout {
beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, videoDuration)
} else {
beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout))
@ -520,7 +522,7 @@ public final class SecretMediaPreviewController: ViewController {
}
} else if let attribute = message.autoremoveAttribute {
if let countdownBeginTime = attribute.countdownBeginTime {
if let videoDuration = videoDuration {
if let videoDuration = videoDuration, attribute.timeout != viewOnceTimeout {
beginTimeAndTimeout = (CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970, videoDuration)
} else {
beginTimeAndTimeout = (Double(countdownBeginTime), Double(attribute.timeout))
@ -545,6 +547,10 @@ public final class SecretMediaPreviewController: ViewController {
}
private func presentViewOnceTooltip(sourceView: UIView) {
guard self.currentNodeMessageIsViewOnce else {
return
}
if let tooltipController = self.tooltipController {
self.tooltipController = nil
tooltipController.dismiss()
@ -556,9 +562,9 @@ public final class SecretMediaPreviewController: ViewController {
let iconName = "anim_autoremove_on"
let text: String
if self.currentNodeMessageIsVideo {
text = "This video can only be viewed once"
text = "This video can only be viewed once."
} else {
text = "This photo can only be viewed once"
text = "This photo can only be viewed once."
}
let tooltipController = TooltipScreen(
@ -566,6 +572,7 @@ public final class SecretMediaPreviewController: ViewController {
sharedContext: self.context.sharedContext,
text: .plain(text: text),
balancedTextLayout: true,
constrainWidth: 210.0,
style: .customBlur(UIColor(rgb: 0x18181a), 0.0),
arrowStyle: .small,
icon: .animation(name: iconName, delay: 0.1, tintColor: nil),

View File

@ -1568,7 +1568,7 @@ static CGPoint TGCameraControllerClampPointToScreenSize(__unused id self, __unus
}
}
TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context isDark:true sendButtonFrame:strongModel.interfaceView.doneButtonFrame canSendSilently:strongSelf->_hasSilentPosting canSendWhenOnline:false canSchedule:effectiveHasSchedule reminder:strongSelf->_reminder hasTimer:strongSelf->_hasTimer];
TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context isDark:true sendButtonFrame:strongModel.interfaceView.doneButtonFrame canSendSilently:strongSelf->_hasSilentPosting canSendWhenOnline:effectiveHasSchedule canSchedule:effectiveHasSchedule reminder:strongSelf->_reminder hasTimer:strongSelf->_hasTimer];
controller.send = ^{
__strong TGCameraController *strongSelf = weakSelf;
__strong TGMediaPickerGalleryModel *strongModel = weakModel;

View File

@ -165,7 +165,7 @@
}
}
TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context isDark:true sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSendWhenOnline:true canSchedule:effectiveHasSchedule reminder:reminder hasTimer:hasTimer];
TGMediaPickerSendActionSheetController *controller = [[TGMediaPickerSendActionSheetController alloc] initWithContext:strongSelf->_context isDark:true sendButtonFrame:strongSelf.galleryModel.interfaceView.doneButtonFrame canSendSilently:hasSilentPosting canSendWhenOnline:effectiveHasSchedule canSchedule:effectiveHasSchedule reminder:reminder hasTimer:false];
controller.send = ^{
__strong TGMediaPickerModernGalleryMixin *strongSelf = weakSelf;
if (strongSelf == nil)

View File

@ -133,7 +133,11 @@ final class RadialStatusSecretTimeoutContentNode: RadialStatusContentNode {
}
let absoluteTimestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970
self.progress = min(1.0, CGFloat((absoluteTimestamp - self.beginTime) / self.timeout))
var progress = min(1.0, CGFloat((absoluteTimestamp - self.beginTime) / self.timeout))
if self.timeout == 0x7fffffff {
progress = 0.0
}
self.progress = progress
if self.sparks {
let lineWidth: CGFloat = 1.75
@ -202,6 +206,7 @@ final class RadialStatusSecretTimeoutContentNode: RadialStatusContentNode {
}
if let parameters = parameters as? RadialStatusSecretTimeoutContentNodeParameters {
var drawArc = true
if case let .image(icon) = parameters.icon, let iconImage = icon.cgImage {
let imageRect = CGRect(origin: CGPoint(x: floor((bounds.size.width - icon.size.width) / 2.0), y: floor((bounds.size.height - icon.size.height) / 2.0)), size: icon.size)
context.saveGState()
@ -210,6 +215,8 @@ final class RadialStatusSecretTimeoutContentNode: RadialStatusContentNode {
context.translateBy(x: -imageRect.midX, y: -imageRect.midY)
context.draw(iconImage, in: imageRect)
context.restoreGState()
drawArc = false
}
let lineWidth: CGFloat
@ -232,10 +239,12 @@ final class RadialStatusSecretTimeoutContentNode: RadialStatusContentNode {
let startAngle: CGFloat = -CGFloat.pi / 2.0
let endAngle: CGFloat = -CGFloat.pi / 2.0 + 2.0 * CGFloat.pi * parameters.progress
let path = CGMutablePath()
path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
context.addPath(path)
context.strokePath()
if drawArc {
let path = CGMutablePath()
path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: true)
context.addPath(path)
context.strokePath()
}
for particle in parameters.particles {
let size: CGFloat = 1.3

View File

@ -133,10 +133,7 @@ public enum PresentationResourceKey: Int32 {
case chatMediaConsumableContentIcon
case chatBubbleMediaOverlayControlSecret
case chatBubbleSecretMediaIcon
case chatBubbleSecretMediaCompactIcon
case chatInstantVideoWithWallpaperBackgroundImage
case chatInstantVideoWithoutWallpaperBackgroundImage

View File

@ -164,27 +164,7 @@ public struct PresentationResourcesChat {
return generateFilledCircleImage(diameter: 4.0, color: theme.chat.message.mediaDateAndStatusTextColor)
})
}
public static func chatBubbleSecretMediaIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatBubbleSecretMediaIcon.rawValue, { theme in
generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/SecretMediaIcon"), color: theme.chat.message.mediaOverlayControlColors.foregroundColor)
})
}
public static func chatBubbleSecretMediaCompactIcon(_ theme: PresentationTheme) -> UIImage? {
return theme.image(PresentationResourceKey.chatBubbleSecretMediaCompactIcon.rawValue, { theme in
if let image = generateTintedImage(image: UIImage(bundleImageName: "Chat/Message/SecretMediaIcon"), color: theme.chat.message.mediaOverlayControlColors.foregroundColor) {
let factor: CGFloat = 0.6
return generateImage(CGSize(width: floor(image.size.width * factor), height: floor(image.size.height * factor)), contextGenerator: { size, context in
context.clear(CGRect(origin: CGPoint(), size: size))
context.draw(image.cgImage!, in: CGRect(origin: CGPoint(), size: size))
})
} else {
return nil
}
})
}
public static func chatInstantVideoBackgroundImage(_ theme: PresentationTheme, wallpaper: Bool) -> UIImage? {
let key: PresentationResourceKey = !wallpaper ? PresentationResourceKey.chatInstantVideoWithoutWallpaperBackgroundImage : PresentationResourceKey.chatInstantVideoWithWallpaperBackgroundImage
return theme.image(key.rawValue, { theme in

View File

@ -340,9 +340,16 @@ public final class MediaEditor {
deinit {
self.textureSourceDisposable?.dispose()
self.destroyTimeObservers()
}
private func destroyTimeObservers() {
if let timeObserver = self.timeObserver {
self.player?.removeTimeObserver(timeObserver)
if self.sourceIsVideo {
self.player?.removeTimeObserver(timeObserver)
} else {
self.audioPlayer?.removeTimeObserver(timeObserver)
}
}
if let didPlayToEndTimeObserver = self.didPlayToEndTimeObserver {
NotificationCenter.default.removeObserver(didPlayToEndTimeObserver)
@ -1017,11 +1024,11 @@ public final class MediaEditor {
}
} else if let audioPlayer = self.audioPlayer {
audioPlayer.pause()
self.destroyTimeObservers()
self.audioPlayer = nil
self.audioDelayTimer?.invalidate()
self.audioDelayTimer = nil
if !self.sourceIsVideo {
self.playerPromise.set(.single(nil))
}
@ -1047,10 +1054,16 @@ public final class MediaEditor {
if apply {
let offset = offset ?? 0.0
let duration = self.duration ?? 0.0
let lowerBound = self.values.audioTrackTrimRange?.lowerBound ?? 0.0
let upperBound = self.values.audioTrackTrimRange?.upperBound ?? duration
let time = self.player?.currentTime() ?? .zero
let audioTime = self.audioTime(for: time)
let audioTime: CMTime
if self.sourceIsVideo {
let time = self.player?.currentTime() ?? .zero
audioTime = self.audioTime(for: time)
} else {
audioTime = CMTime(seconds: offset + lowerBound, preferredTimescale: CMTimeScale(1000))
}
self.audioPlayer?.currentItem?.forwardPlaybackEndTime = CMTime(seconds: offset + upperBound, preferredTimescale: CMTimeScale(1000))
self.audioPlayer?.seek(to: audioTime, toleranceBefore: .zero, toleranceAfter: .zero)
}

View File

@ -1198,6 +1198,16 @@ final class MediaEditorScreenComponent: Component {
containerSize: CGSize(width: inputPanelAvailableWidth, height: inputPanelAvailableHeight)
)
if self.inputPanelExternalState.isEditing {
if let controller = self.environment?.controller() as? MediaEditorScreen {
if controller.node.entitiesView.hasSelection {
Queue.mainQueue().justDispatch {
controller.node.entitiesView.selectEntity(nil)
}
}
}
}
if self.inputPanelExternalState.isEditing {
if self.currentInputMode == .emoji || (inputHeight.isZero && keyboardWasHidden) {
inputHeight = max(inputHeight, environment.deviceMetrics.standardInputHeight(inLandscape: false))

View File

@ -249,10 +249,12 @@ final class VideoScrubberComponent: Component {
self.transparentFramesContainer.alpha = 0.5
self.transparentFramesContainer.clipsToBounds = true
self.transparentFramesContainer.layer.cornerRadius = 9.0
self.transparentFramesContainer.isUserInteractionEnabled = false
self.opaqueFramesContainer.clipsToBounds = true
self.opaqueFramesContainer.layer.cornerRadius = 9.0
self.opaqueFramesContainer.isUserInteractionEnabled = false
self.addSubview(self.audioClippingView)
self.audioClippingView.addSubview(self.audioScrollView)
self.audioScrollView.addSubview(self.audioContainerView)
@ -383,13 +385,19 @@ final class VideoScrubberComponent: Component {
guard let component = self.component else {
return
}
var trimDuration = component.duration
if component.audioOnly, let audioData = component.audioData {
trimDuration = min(30.0, audioData.duration)
}
let location = gestureRecognizer.location(in: self)
let start = handleWidth
let end = self.frame.width - handleWidth
let length = end - start
let fraction = (location.x - start) / length
let position = max(component.startPosition, min(component.endPosition, component.duration * fraction))
let position = max(component.startPosition, min(component.endPosition, trimDuration * fraction))
let transition: Transition = .immediate
switch gestureRecognizer.state {
case .began, .changed:
@ -409,8 +417,16 @@ final class VideoScrubberComponent: Component {
let cursorPositionFraction = duration > 0.0 ? position / duration : 0.0
let cursorPosition = floorToScreenPixels(handleWidth - 1.0 + (size.width - handleWidth * 2.0 + 2.0) * cursorPositionFraction)
var cursorFrame = CGRect(origin: CGPoint(x: cursorPosition - handleWidth / 2.0, y: -5.0 - UIScreenPixel), size: CGSize(width: handleWidth, height: height))
cursorFrame.origin.x = max(self.ghostTrimView.leftHandleView.frame.maxX - cursorPadding, cursorFrame.origin.x)
cursorFrame.origin.x = min(self.ghostTrimView.rightHandleView.frame.minX - handleWidth + cursorPadding, cursorFrame.origin.x)
var leftEdge = self.ghostTrimView.leftHandleView.frame.maxX
var rightEdge = self.ghostTrimView.rightHandleView.frame.minX
if let component = self.component, component.audioOnly {
leftEdge = self.trimView.leftHandleView.frame.maxX
rightEdge = self.trimView.rightHandleView.frame.minX
}
cursorFrame.origin.x = max(leftEdge - cursorPadding, cursorFrame.origin.x)
cursorFrame.origin.x = min(rightEdge - handleWidth + cursorPadding, cursorFrame.origin.x)
return cursorFrame
}
@ -420,6 +436,11 @@ final class VideoScrubberComponent: Component {
}
let timestamp = CACurrentMediaTime()
var trimDuration = component.duration
if component.audioOnly, let audioData = component.audioData {
trimDuration = min(30.0, audioData.duration)
}
let updatedPosition: Double
if let (start, from, to, _) = self.positionAnimation {
let duration = to - from
@ -433,7 +454,7 @@ final class VideoScrubberComponent: Component {
updatedPosition = max(component.startPosition, min(component.endPosition, component.position + advance))
}
let cursorHeight: CGFloat = component.audioData != nil ? 80.0 : 50.0
self.cursorView.frame = cursorFrame(size: scrubberSize, height: cursorHeight, position: updatedPosition, duration: component.duration)
self.cursorView.frame = cursorFrame(size: scrubberSize, height: cursorHeight, position: updatedPosition, duration: trimDuration)
}
func update(component: VideoScrubberComponent, availableSize: CGSize, state: EmptyComponentState, environment: Environment<EnvironmentType>, transition: Transition) -> CGSize {
@ -735,7 +756,7 @@ final class VideoScrubberComponent: Component {
// if self.cursorView.alpha.isZero {
// cursorPosition = component.startPosition
// }
videoTransition.setFrame(view: self.cursorView, frame: cursorFrame(size: scrubberSize, height: cursorHeight, position: cursorPosition, duration: component.duration))
videoTransition.setFrame(view: self.cursorView, frame: cursorFrame(size: scrubberSize, height: cursorHeight, position: cursorPosition, duration: trimDuration))
} else {
if let (_, _, end, ended) = self.positionAnimation {
if ended, component.position >= component.startPosition && component.position < end - 1.0 {
@ -788,6 +809,11 @@ final class VideoScrubberComponent: Component {
let hitTestSlop = UIEdgeInsets(top: -8.0, left: -9.0, bottom: -8.0, right: -9.0)
return self.bounds.inset(by: hitTestSlop).contains(point)
}
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let result = super.hitTest(point, with: event)
return result
}
}
public func makeView() -> View {

View File

@ -1,22 +0,0 @@
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "SecretMediaIcon@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "SecretMediaIcon@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 753 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "viewonce_30.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,212 @@
%PDF-1.7
1 0 obj
<< /ExtGState << /E4 << /ca 0.200000 >>
/E2 << /ca 0.600000 >>
/E3 << /ca 0.400000 >>
/E1 << /ca 0.800000 >>
>> >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 5.000000 3.670105 cm
0.000000 0.000000 0.000000 scn
10.000000 0.664955 m
10.367270 0.664955 10.665000 0.962687 10.665000 1.329956 c
10.665000 1.697226 10.367270 1.994957 10.000000 1.994957 c
10.000000 0.664955 l
h
10.000000 20.664955 m
10.367270 20.664955 10.665000 20.962687 10.665000 21.329956 c
10.665000 21.697226 10.367270 21.994957 10.000000 21.994957 c
10.000000 20.664955 l
h
10.000000 1.994957 m
4.844422 1.994957 0.665000 6.174377 0.665000 11.329956 c
-0.665000 11.329956 l
-0.665000 5.439838 4.109883 0.664955 10.000000 0.664955 c
10.000000 1.994957 l
h
0.665000 11.329956 m
0.665000 16.485535 4.844422 20.664955 10.000000 20.664955 c
10.000000 21.994957 l
4.109883 21.994957 -0.665000 17.220074 -0.665000 11.329956 c
0.665000 11.329956 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 13.462646 4.335022 cm
0.000000 0.000000 0.000000 scn
0.607792 21.290033 m
0.914249 21.316515 1.224271 21.330017 1.537287 21.330017 c
1.850302 21.330017 2.160324 21.316515 2.466781 21.290033 c
2.832687 21.258417 3.103682 20.936161 3.072065 20.570255 c
3.040448 20.204350 2.718192 19.933353 2.352286 19.964972 c
2.083856 19.988165 1.812035 20.000017 1.537287 20.000017 c
1.262538 20.000017 0.990717 19.988165 0.722287 19.964972 c
0.356381 19.933353 0.034125 20.204350 0.002508 20.570255 c
-0.029109 20.936161 0.241886 21.258417 0.607792 21.290033 c
h
0.002508 0.759779 m
0.034125 1.125685 0.356381 1.396679 0.722287 1.365063 c
0.990717 1.341867 1.262538 1.330017 1.537287 1.330017 c
1.812035 1.330017 2.083856 1.341867 2.352286 1.365063 c
2.718192 1.396679 3.040448 1.125685 3.072065 0.759779 c
3.103682 0.393873 2.832687 0.071617 2.466781 0.039999 c
2.160324 0.013519 1.850302 0.000015 1.537287 0.000015 c
1.224271 0.000015 0.914249 0.013519 0.607792 0.039999 c
0.241886 0.071617 -0.029109 0.393873 0.002508 0.759779 c
h
f*
n
Q
q
1.000000 0.000000 -0.000000 1.000000 18.562012 5.086609 cm
0.000000 0.000000 0.000000 scn
2.718522 2.103071 m
2.929436 1.802403 2.856679 1.387682 2.556010 1.176766 c
2.050149 0.821909 1.511930 0.509789 0.946597 0.245714 c
0.613840 0.090281 0.218083 0.234030 0.062649 0.566786 c
-0.092785 0.899544 0.050963 1.295300 0.383720 1.450733 c
0.878228 1.681723 1.349272 1.954861 1.792216 2.265581 c
2.092885 2.476498 2.507605 2.403738 2.718522 2.103071 c
h
f*
n
Q
q
/E1 gs
1.000000 0.000000 -0.000000 1.000000 22.527100 8.415771 cm
0.000000 0.000000 0.000000 scn
1.819443 2.959568 m
2.152200 2.804134 2.295949 2.408377 2.140515 2.075620 c
1.876443 1.510287 1.564322 0.972069 1.209464 0.466206 c
0.998547 0.165539 0.583827 0.092780 0.283160 0.303696 c
-0.017509 0.514613 -0.090267 0.929333 0.120648 1.230002 c
0.431370 1.672945 0.704507 2.143989 0.935496 2.638497 c
1.090930 2.971253 1.486687 3.115002 1.819443 2.959568 c
h
f*
n
Q
q
/E2 gs
1.000000 0.000000 -0.000000 1.000000 24.297363 13.404541 cm
0.000000 0.000000 0.000000 scn
0.607792 3.130305 m
0.973697 3.161922 1.295953 2.890927 1.327572 2.525021 c
1.354051 2.218563 1.367555 1.908542 1.367555 1.595526 c
1.367555 1.282510 1.354051 0.972489 1.327572 0.666031 c
1.295953 0.300125 0.973697 0.029130 0.607792 0.060747 c
0.241886 0.092365 -0.029108 0.414621 0.002508 0.780526 c
0.025703 1.048956 0.037553 1.320777 0.037553 1.595526 c
0.037553 1.870275 0.025703 2.142096 0.002508 2.410526 c
-0.029108 2.776431 0.241886 3.098687 0.607792 3.130305 c
h
f*
n
Q
q
/E3 gs
1.000000 0.000000 -0.000000 1.000000 22.527100 18.379028 cm
0.000000 0.000000 0.000000 scn
0.283159 2.901568 m
0.583828 3.112484 0.998548 3.039725 1.209465 2.739057 c
1.564321 2.233195 1.876442 1.694978 2.140516 1.129645 c
2.295950 0.796888 2.152200 0.401131 1.819444 0.245697 c
1.486686 0.090263 1.090931 0.234012 0.935497 0.566768 c
0.704508 1.061275 0.431369 1.532320 0.120649 1.975264 c
-0.090267 2.275931 -0.017508 2.690652 0.283159 2.901568 c
h
f*
n
Q
q
/E4 gs
1.000000 0.000000 -0.000000 1.000000 18.562012 22.344177 cm
0.000000 0.000000 0.000000 scn
0.062649 2.002510 m
0.218083 2.335267 0.613840 2.479015 0.946597 2.323581 c
1.511930 2.059509 2.050148 1.747388 2.556011 1.392531 c
2.856678 1.181615 2.929437 0.766894 2.718521 0.466226 c
2.507604 0.165558 2.092884 0.092800 1.792215 0.303715 c
1.349271 0.614436 0.878228 0.887573 0.383720 1.118563 c
0.050964 1.273997 -0.092785 1.669754 0.062649 2.002510 c
h
f*
n
Q
q
1.000000 0.000000 -0.000000 1.000000 12.500000 9.737305 cm
0.000000 0.000000 0.000000 scn
2.718506 0.000000 m
2.324219 0.000000 2.075195 0.290527 2.075195 0.715942 c
2.075195 8.443481 l
1.099854 7.727539 l
0.913086 7.571899 0.809326 7.530396 0.601807 7.530396 c
0.269775 7.530396 0.000000 7.820923 0.000000 8.163330 c
0.000000 8.401978 0.114136 8.588745 0.352783 8.765137 c
1.774292 9.730103 l
2.147827 9.979126 2.355347 10.072510 2.645874 10.072510 c
3.112793 10.072510 3.372192 9.792358 3.372192 9.263184 c
3.372192 0.715942 l
3.372192 0.280151 3.123169 0.000000 2.718506 0.000000 c
h
f
n
Q
endstream
endobj
3 0 obj
4922
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 30.000000 30.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000216 00000 n
0000005194 00000 n
0000005217 00000 n
0000005390 00000 n
0000005464 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
5523
%%EOF

View File

@ -0,0 +1,163 @@
%PDF-1.7
1 0 obj
<< /Length 2 0 R
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
/Domain [ 0.000000 1.000000 ]
/FunctionType 4
>>
stream
{ 0.419608 exch 0.576471 exch 1.000000 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 0.392998 mul 0.419608 add exch dup 0.000000 sub -0.321544 mul 0.576471 add exch dup 0.000000 sub 0.000000 mul 1.000000 add exch } if dup 0.439058 gt { exch pop exch pop exch pop dup 0.439058 sub 0.538311 mul 0.592157 add exch dup 0.439058 sub -0.034955 mul 0.435294 add exch dup 0.439058 sub -0.342561 mul 1.000000 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.894118 exch 0.415686 exch 0.807843 exch } if pop }
endstream
endobj
2 0 obj
533
endobj
3 0 obj
<< /Pattern << /P1 << /Matrix [ 105.698799 22.310228 -22.310228 105.698799 -4.867018 -86.125580 ]
/Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ]
/ColorSpace /DeviceRGB
/Function 1 0 R
/Domain [ 0.000000 1.000000 ]
/ShadingType 2
/Extend [ true true ]
>>
/PatternType 2
/Type /Pattern
>> >> >>
endobj
4 0 obj
<< /Length 5 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
q
1.000000 0.000000 -0.000000 1.000000 1.659973 -1.660000 cm
0.949020 0.949020 0.968627 scn
22.340000 15.320000 m
22.340000 9.609375 17.710625 4.980000 12.000000 4.980000 c
12.000000 1.660000 l
19.544210 1.660000 25.660000 7.775789 25.660000 15.320000 c
22.340000 15.320000 l
h
12.000000 4.980000 m
6.289376 4.980000 1.660000 9.609375 1.660000 15.320000 c
-1.660000 15.320000 l
-1.660000 7.775789 4.455791 1.660000 12.000000 1.660000 c
12.000000 4.980000 l
h
1.660000 15.320000 m
1.660000 21.030624 6.289376 25.660000 12.000000 25.660000 c
12.000000 28.980000 l
4.455791 28.980000 -1.660000 22.864208 -1.660000 15.320000 c
1.660000 15.320000 l
h
12.000000 25.660000 m
17.710625 25.660000 22.340000 21.030624 22.340000 15.320000 c
25.660000 15.320000 l
25.660000 22.864208 19.544210 28.980000 12.000000 28.980000 c
12.000000 25.660000 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 1.659973 -1.660000 cm
0.850980 0.850980 0.850980 scn
24.000000 15.320000 m
24.000000 8.692583 18.627417 3.320000 12.000000 3.320000 c
5.372583 3.320000 0.000000 8.692583 0.000000 15.320000 c
0.000000 21.947416 5.372583 27.320000 12.000000 27.320000 c
18.627417 27.320000 24.000000 21.947416 24.000000 15.320000 c
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 1.659973 -1.660000 cm
/Pattern cs
/P1 scn
24.000000 15.320000 m
24.000000 8.692583 18.627417 3.320000 12.000000 3.320000 c
5.372583 3.320000 0.000000 8.692583 0.000000 15.320000 c
0.000000 21.947416 5.372583 27.320000 12.000000 27.320000 c
18.627417 27.320000 24.000000 21.947416 24.000000 15.320000 c
h
f
n
Q
Q
q
1.000000 0.000000 -0.000000 1.000000 8.793701 5.165123 cm
1.000000 1.000000 1.000000 scn
6.639333 9.995974 m
6.270643 9.995974 5.989172 10.325375 6.046674 10.689552 c
6.848394 15.767110 l
6.948168 16.399014 6.121798 16.727470 5.760551 16.199497 c
0.105843 7.934922 l
-0.166615 7.536714 0.118531 6.996113 0.601028 6.996113 c
3.087691 6.996113 l
3.456380 6.996113 3.737850 6.666713 3.680349 6.302535 c
2.878629 1.224977 l
2.778855 0.593074 3.605225 0.264616 3.966471 0.792590 c
9.621180 9.057164 l
9.893639 9.455373 9.608493 9.995974 9.125995 9.995974 c
6.639333 9.995974 l
h
f*
n
Q
endstream
endobj
5 0 obj
2168
endobj
6 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 27.319946 27.320000 ]
/Resources 3 0 R
/Contents 4 0 R
/Parent 7 0 R
>>
endobj
7 0 obj
<< /Kids [ 6 0 R ]
/Count 1
/Type /Pages
>>
endobj
8 0 obj
<< /Pages 7 0 R
/Type /Catalog
>>
endobj
xref
0 9
0000000000 65535 f
0000000010 00000 n
0000000727 00000 n
0000000749 00000 n
0000001379 00000 n
0000003603 00000 n
0000003626 00000 n
0000003799 00000 n
0000003873 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 8 0 R
/Size 9
>>
startxref
3932
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "AvatarBoost.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,79 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 1.889648 0.842155 cm
1.000000 1.000000 1.000000 scn
11.065588 16.659954 m
10.451106 16.659954 9.981988 17.208954 10.077824 17.815918 c
11.413990 26.278299 l
11.580280 27.331470 10.202996 27.878902 9.600920 26.998945 c
0.176406 13.224656 l
-0.277692 12.560975 0.197552 11.659972 1.001714 11.659972 c
5.146065 11.659972 l
5.760547 11.659972 6.229665 11.110973 6.133829 10.504009 c
4.797663 2.041628 l
4.631372 0.988457 6.008657 0.441025 6.610733 1.320982 c
16.035248 15.095271 l
16.489344 15.758952 16.014101 16.659954 15.209939 16.659954 c
11.065588 16.659954 l
h
f*
n
Q
endstream
endobj
3 0 obj
637
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 20.000000 30.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000000727 00000 n
0000000749 00000 n
0000000922 00000 n
0000000996 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1055
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Boost.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "SmallBoost.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,79 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 1.259766 0.561462 cm
1.000000 1.000000 1.000000 scn
7.377057 11.106611 m
6.967402 11.106611 6.654656 11.472610 6.718547 11.877253 c
7.609325 17.518847 l
7.720185 18.220961 6.801996 18.585918 6.400612 17.999279 c
0.117604 8.816422 l
-0.185128 8.373968 0.131700 7.773299 0.667809 7.773299 c
3.430712 7.773299 l
3.840366 7.773299 4.153112 7.407299 4.089221 7.002657 c
3.198443 1.361063 l
3.087583 0.658949 4.005772 0.293991 4.407156 0.880630 c
10.690165 10.063488 l
10.992896 10.505941 10.676067 11.106611 10.139959 11.106611 c
7.377057 11.106611 l
h
f*
n
Q
endstream
endobj
3 0 obj
622
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 13.333374 20.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000000712 00000 n
0000000734 00000 n
0000000907 00000 n
0000000981 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
1040
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Copy.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,402 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 9.000000 7.000000 cm
1.000000 1.000000 1.000000 scn
1.092019 13.782013 m
1.519843 14.000000 2.079895 14.000000 3.200000 14.000000 c
3.674516 14.000000 l
4.163698 14.000000 4.408288 14.000000 4.638463 13.944740 c
4.842536 13.895746 5.037625 13.814938 5.216570 13.705280 c
5.418403 13.581597 5.591354 13.408646 5.937256 13.062744 c
5.937259 13.062741 l
10.062741 8.937258 l
10.408645 8.591354 10.581596 8.418404 10.705280 8.216570 c
10.814938 8.037625 10.895746 7.842536 10.944740 7.638463 c
11.000000 7.408288 11.000000 7.163698 11.000000 6.674517 c
11.000000 3.200000 l
11.000000 2.079895 11.000000 1.519842 10.782013 1.092019 c
10.590266 0.715694 10.284306 0.409734 9.907981 0.217987 c
9.480158 0.000000 8.920105 0.000000 7.800001 0.000000 c
3.200000 0.000000 l
2.079895 0.000000 1.519843 0.000000 1.092019 0.217987 c
0.715695 0.409734 0.409734 0.715694 0.217987 1.092019 c
0.000000 1.519842 0.000000 2.079895 0.000000 3.200000 c
0.000000 10.800000 l
0.000000 11.920105 0.000000 12.480158 0.217987 12.907981 c
0.409734 13.284306 0.715695 13.590266 1.092019 13.782013 c
h
5.000000 11.896446 m
5.000000 9.000000 l
5.000000 8.447716 5.447715 8.000000 6.000000 8.000000 c
8.896446 8.000000 l
9.119173 8.000000 9.230715 8.269285 9.073223 8.426777 c
5.426776 12.073224 l
5.269285 12.230715 5.000000 12.119173 5.000000 11.896446 c
h
f*
n
Q
q
q
1.000000 0.000000 -0.000000 1.000000 4.000000 0.330414 cm
0.529412 0.490196 1.000000 scn
1.092019 16.451599 m
0.488212 17.636639 l
0.488212 17.636639 l
1.092019 16.451599 l
h
4.638463 16.614326 m
4.327981 15.321074 l
4.327981 15.321074 l
4.638463 16.614326 l
h
5.216570 16.374866 m
4.521646 15.240855 l
4.521647 15.240855 l
5.216570 16.374866 l
h
5.937256 15.732330 m
6.931310 16.615934 l
6.914003 16.635405 6.896128 16.654364 6.877707 16.672783 c
5.937256 15.732330 l
h
5.937259 15.732327 m
4.943204 14.848723 l
4.960511 14.829253 4.978386 14.810296 4.996807 14.791876 c
5.937259 15.732327 l
h
10.062741 11.606844 m
9.122289 10.666392 l
9.122290 10.666392 l
10.062741 11.606844 l
h
10.705280 10.886156 m
11.839292 11.581079 l
11.839291 11.581080 l
10.705280 10.886156 l
h
10.944740 10.308050 m
12.237993 10.618530 l
12.237991 10.618536 l
10.944740 10.308050 l
h
10.782013 3.761605 m
9.596974 4.365414 l
9.596973 4.365412 l
10.782013 3.761605 l
h
9.907981 2.887573 m
9.304174 4.072613 l
9.304173 4.072612 l
9.907981 2.887573 l
h
1.092019 2.887573 m
1.695827 4.072612 l
1.695826 4.072612 l
1.092019 2.887573 l
h
0.217987 3.761605 m
1.403026 4.365412 l
1.403025 4.365413 l
0.217987 3.761605 l
h
0.217987 15.577567 m
-0.967052 16.181376 l
-0.967052 16.181376 l
0.217987 15.577567 l
h
9.073223 11.096363 m
8.132771 10.155910 l
8.132772 10.155910 l
9.073223 11.096363 l
h
5.426776 14.742810 m
6.367229 15.683262 l
6.367229 15.683262 l
5.426776 14.742810 l
h
3.200000 17.999586 m
2.661894 17.999586 2.178326 18.000620 1.778100 17.967920 c
1.362347 17.933952 0.920866 17.857086 0.488212 17.636639 c
1.695826 15.266561 l
1.696496 15.266901 1.699535 15.268437 1.706597 15.270958 c
1.713946 15.273581 1.727419 15.277899 1.749235 15.283036 c
1.795082 15.293834 1.870400 15.306599 1.994708 15.316755 c
2.261491 15.338552 2.618001 15.339586 3.200000 15.339586 c
3.200000 17.999586 l
h
3.674516 17.999586 m
3.200000 17.999586 l
3.200000 15.339586 l
3.674516 15.339586 l
3.674516 17.999586 l
h
4.948946 17.907578 m
4.530101 18.008133 4.100392 17.999586 3.674516 17.999586 c
3.674516 15.339586 l
4.227004 15.339586 4.286476 15.331038 4.327981 15.321074 c
4.948946 17.907578 l
h
5.911493 17.508879 m
5.613550 17.691458 5.288726 17.826004 4.948946 17.907578 c
4.327981 15.321074 l
4.396346 15.304661 4.461700 15.277590 4.521646 15.240855 c
5.911493 17.508879 l
h
6.877707 16.672783 m
6.576569 16.973921 6.278763 17.283815 5.911493 17.508879 c
4.521647 15.240855 l
4.558042 15.218552 4.606139 15.182544 4.996805 14.791878 c
6.877707 16.672783 l
h
6.931313 16.615932 m
6.931310 16.615934 l
4.943202 14.848727 l
4.943204 14.848723 l
6.931313 16.615932 l
h
11.003194 12.547297 m
6.877711 16.672779 l
4.996807 14.791876 l
9.122289 10.666392 l
11.003194 12.547297 l
h
11.839291 11.581080 m
11.614226 11.948351 11.304334 12.246157 11.003193 12.547297 c
9.122290 10.666392 l
9.512956 10.275725 9.548966 10.227628 9.571270 10.191232 c
11.839291 11.581080 l
h
12.237991 10.618536 m
12.156417 10.958313 12.021872 11.283136 11.839292 11.581079 c
9.571269 10.191234 l
9.608004 10.131287 9.635076 10.065931 9.651489 9.997564 c
12.237991 10.618536 l
h
12.330000 9.344103 m
12.330000 9.769979 12.338548 10.199686 12.237993 10.618530 c
9.651487 9.997570 l
9.661452 9.956062 9.670000 9.896589 9.670000 9.344103 c
12.330000 9.344103 l
h
12.330000 5.869586 m
12.330000 9.344103 l
9.670000 9.344103 l
9.670000 5.869586 l
12.330000 5.869586 l
h
11.967052 3.157797 m
12.187500 3.590451 12.264366 4.031933 12.298335 4.447685 c
12.331035 4.847912 12.330000 5.331480 12.330000 5.869586 c
9.670000 5.869586 l
9.670000 5.287587 9.668965 4.931077 9.647168 4.664294 c
9.637012 4.539987 9.624248 4.464668 9.613450 4.418821 c
9.608313 4.397006 9.603994 4.383533 9.601372 4.376184 c
9.598851 4.369123 9.597316 4.366082 9.596974 4.365414 c
11.967052 3.157797 l
h
10.511787 1.702534 m
11.138369 2.021792 11.647794 2.531218 11.967052 3.157799 c
9.596973 4.365412 l
9.532739 4.239344 9.430243 4.136847 9.304174 4.072613 c
10.511787 1.702534 l
h
7.800001 1.339586 m
8.338107 1.339586 8.821674 1.338552 9.221901 1.371251 c
9.637653 1.405220 10.079135 1.482086 10.511789 1.702535 c
9.304173 4.072612 l
9.303504 4.072270 9.300464 4.070735 9.293403 4.068214 c
9.286054 4.065592 9.272580 4.061274 9.250765 4.056136 c
9.204918 4.045339 9.129600 4.032574 9.005292 4.022418 c
8.738509 4.000621 8.381999 3.999586 7.800001 3.999586 c
7.800001 1.339586 l
h
3.200000 1.339586 m
7.800001 1.339586 l
7.800001 3.999586 l
3.200000 3.999586 l
3.200000 1.339586 l
h
0.488211 1.702535 m
0.920865 1.482086 1.362347 1.405220 1.778099 1.371251 c
2.178326 1.338552 2.661894 1.339586 3.200000 1.339586 c
3.200000 3.999586 l
2.618001 3.999586 2.261491 4.000621 1.994708 4.022418 c
1.870400 4.032574 1.795082 4.045339 1.749235 4.056136 c
1.727419 4.061274 1.713946 4.065592 1.706597 4.068214 c
1.699536 4.070735 1.696496 4.072271 1.695827 4.072612 c
0.488211 1.702535 l
h
-0.967052 3.157799 m
-0.647793 2.531218 -0.138368 2.021792 0.488212 1.702535 c
1.695826 4.072612 l
1.569757 4.136847 1.467261 4.239344 1.403026 4.365412 c
-0.967052 3.157799 l
h
-1.330000 5.869586 m
-1.330000 5.331480 -1.331034 4.847912 -1.298335 4.447685 c
-1.264366 4.031933 -1.187500 3.590451 -0.967052 3.157798 c
1.403025 4.365413 l
1.402685 4.366082 1.401149 4.369122 1.398628 4.376184 c
1.396005 4.383532 1.391687 4.397006 1.386550 4.418821 c
1.375753 4.464668 1.362988 4.539987 1.352831 4.664294 c
1.331034 4.931077 1.330000 5.287587 1.330000 5.869586 c
-1.330000 5.869586 l
h
-1.330000 13.469586 m
-1.330000 5.869586 l
1.330000 5.869586 l
1.330000 13.469586 l
-1.330000 13.469586 l
h
-0.967052 16.181376 m
-1.187500 15.748720 -1.264366 15.307240 -1.298335 14.891487 c
-1.331034 14.491261 -1.330000 14.007692 -1.330000 13.469586 c
1.330000 13.469586 l
1.330000 14.051584 1.331034 14.408095 1.352831 14.674878 c
1.362988 14.799186 1.375753 14.874504 1.386550 14.920351 c
1.391687 14.942167 1.396005 14.955641 1.398629 14.962990 c
1.401149 14.970051 1.402685 14.973091 1.403026 14.973760 c
-0.967052 16.181376 l
h
0.488212 17.636639 m
-0.138368 17.317379 -0.647793 16.807955 -0.967052 16.181376 c
1.403026 14.973760 l
1.467261 15.099829 1.569758 15.202326 1.695826 15.266561 c
0.488212 17.636639 l
h
6.330000 11.669586 m
6.330000 14.566032 l
3.670000 14.566032 l
3.670000 11.669586 l
6.330000 11.669586 l
h
6.000000 11.999586 m
6.182254 11.999586 6.330000 11.851840 6.330000 11.669586 c
3.670000 11.669586 l
3.670000 10.382763 4.713177 9.339586 6.000000 9.339586 c
6.000000 11.999586 l
h
8.896446 11.999586 m
6.000000 11.999586 l
6.000000 9.339586 l
8.896446 9.339586 l
8.896446 11.999586 l
h
8.132772 10.155910 m
7.452406 10.836273 7.934273 11.999586 8.896446 11.999586 c
8.896446 9.339586 l
10.304073 9.339586 11.009024 11.041470 10.013674 12.036817 c
8.132772 10.155910 l
h
4.486324 13.802358 m
8.132771 10.155910 l
10.013675 12.036816 l
6.367229 15.683262 l
4.486324 13.802358 l
h
6.330000 14.566032 m
6.330000 13.603863 5.166691 13.121991 4.486324 13.802358 c
6.367229 15.683262 l
5.371879 16.678612 3.670000 15.973656 3.670000 14.566032 c
6.330000 14.566032 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 4.000000 0.330414 cm
1.000000 1.000000 1.000000 scn
1.092019 16.451599 m
1.519843 16.669586 2.079895 16.669586 3.200000 16.669586 c
3.674516 16.669586 l
4.163698 16.669586 4.408288 16.669586 4.638463 16.614326 c
4.842536 16.565332 5.037625 16.484524 5.216570 16.374866 c
5.418403 16.251183 5.591354 16.078232 5.937256 15.732330 c
5.937259 15.732327 l
10.062741 11.606844 l
10.408645 11.260941 10.581596 11.087990 10.705280 10.886156 c
10.814938 10.707211 10.895746 10.512122 10.944740 10.308050 c
11.000000 10.077875 11.000000 9.833284 11.000000 9.344103 c
11.000000 5.869586 l
11.000000 4.749481 11.000000 4.189428 10.782013 3.761605 c
10.590266 3.385281 10.284306 3.079320 9.907981 2.887573 c
9.480158 2.669586 8.920105 2.669586 7.800001 2.669586 c
3.200000 2.669586 l
2.079895 2.669586 1.519843 2.669586 1.092019 2.887573 c
0.715695 3.079320 0.409734 3.385281 0.217987 3.761605 c
0.000000 4.189428 0.000000 4.749481 0.000000 5.869586 c
0.000000 13.469586 l
0.000000 14.589691 0.000000 15.149744 0.217987 15.577567 c
0.409734 15.953892 0.715695 16.259853 1.092019 16.451599 c
h
5.000000 14.566032 m
5.000000 11.669586 l
5.000000 11.117302 5.447715 10.669586 6.000000 10.669586 c
8.896446 10.669586 l
9.119173 10.669586 9.230715 10.938871 9.073223 11.096363 c
5.426776 14.742810 l
5.269285 14.900301 5.000000 14.788759 5.000000 14.566032 c
h
f*
n
Q
Q
endstream
endobj
3 0 obj
9865
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 24.000000 24.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000009955 00000 n
0000009978 00000 n
0000010151 00000 n
0000010225 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
10284
%%EOF

View File

@ -80,9 +80,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
private var automaticDownload: Bool?
var media: TelegramMediaFile?
var appliedForwardInfo: (Peer?, String?)?
private var secretProgressIcon: UIImage?
private let fetchDisposable = MetaDisposable()
private var durationBackgroundNode: NavigationBackgroundNode?
@ -259,9 +257,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
let theme = item.presentationData.theme
let isSecretMedia = item.message.containsSecretMedia
var secretProgressIcon: UIImage?
if isSecretMedia {
secretProgressIcon = PresentationResourcesChat.chatBubbleSecretMediaIcon(theme.theme)
secretVideoPlaceholderBackgroundImage = PresentationResourcesChat.chatInstantVideoBackgroundImage(theme.theme, wallpaper: !theme.wallpaper.isEmpty)
}
@ -575,7 +571,6 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
strongSelf.item = item
strongSelf.videoFrame = displayVideoFrame
strongSelf.appliedForwardInfo = (forwardSource, forwardAuthorSignature)
strongSelf.secretProgressIcon = secretProgressIcon
strongSelf.automaticDownload = automaticDownload
@ -1155,7 +1150,7 @@ class ChatMessageInteractiveInstantVideoNode: ASDisplayNode {
state = .progress(color: messageTheme.mediaOverlayControlColors.foregroundColor, lineWidth: nil, value: CGFloat(adjustedProgress), cancelEnabled: true, animateRotation: true)
}
case .Local:
if isSecretMedia && self.secretProgressIcon != nil {
if isSecretMedia {
if let (beginTime, timeout) = secretBeginTimeAndTimeout {
state = .secretTimeout(color: messageTheme.mediaOverlayControlColors.foregroundColor, icon: .flame, beginTime: beginTime, timeout: timeout, sparks: true)
} else {

View File

@ -866,9 +866,6 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
} else {
maxWidth = maxDimensions.width
}
if isSecretMedia {
let _ = PresentationResourcesChat.chatBubbleSecretMediaIcon(presentationData.theme.theme)
}
return (nativeSize, maxWidth, { constrainedSize, automaticPlayback, wideLayout, corners in
var resultWidth: CGFloat
@ -1986,15 +1983,9 @@ final class ChatMessageInteractiveMediaNode: ASDisplayNode, GalleryItemTransitio
}
case .Local:
state = .none
let secretProgressIcon: UIImage?
if case .constrained = sizeCalculation {
secretProgressIcon = PresentationResourcesChat.chatBubbleSecretMediaIcon(theme)
} else {
secretProgressIcon = PresentationResourcesChat.chatBubbleSecretMediaCompactIcon(theme)
}
if isSecretMedia, let (maybeBeginTime, timeout) = secretBeginTimeAndTimeout, let beginTime = maybeBeginTime, Int32(timeout) != viewOnceTimeout {
state = .secretTimeout(color: messageTheme.mediaOverlayControlColors.foregroundColor, icon: .flame, beginTime: beginTime, timeout: timeout, sparks: true)
} else if isSecretMedia, let _ = secretProgressIcon {
} else if isSecretMedia {
state = .staticTimeout
} else if let file = media as? TelegramMediaFile, !file.isVideoSticker {
let isInlinePlayableVideo = file.isVideo && !isSecretMedia && (self.automaticPlayback ?? false)

View File

@ -111,6 +111,7 @@ private final class TooltipScreenNode: ViewControllerTracingNode {
private let text: TooltipScreen.Text
private let textAlignment: TooltipScreen.Alignment
private let balancedTextLayout: Bool
private let constrainWidth: CGFloat?
private let tooltipStyle: TooltipScreen.Style
private let arrowStyle: TooltipScreen.ArrowStyle
private let icon: TooltipScreen.Icon?
@ -159,6 +160,7 @@ private final class TooltipScreenNode: ViewControllerTracingNode {
text: TooltipScreen.Text,
textAlignment: TooltipScreen.Alignment,
balancedTextLayout: Bool,
constrainWidth: CGFloat?,
style: TooltipScreen.Style,
arrowStyle: TooltipScreen.ArrowStyle,
icon: TooltipScreen.Icon? = nil,
@ -379,6 +381,7 @@ private final class TooltipScreenNode: ViewControllerTracingNode {
self.text = text
self.textAlignment = textAlignment
self.balancedTextLayout = balancedTextLayout
self.constrainWidth = constrainWidth
self.animatedStickerNode = DefaultAnimatedStickerNodeImpl()
switch icon {
@ -491,7 +494,10 @@ private final class TooltipScreenNode: ViewControllerTracingNode {
animationSpacing = 8.0
}
let containerWidth = max(100.0, min(layout.size.width - sideInset * 2.0, 614.0))
var containerWidth = max(100.0, min(layout.size.width - sideInset * 2.0, 614.0))
if let constrainWidth = self.constrainWidth, constrainWidth > 100.0 {
containerWidth = constrainWidth
}
var actionSize: CGSize = .zero
@ -1001,6 +1007,7 @@ public final class TooltipScreen: ViewController {
public let text: TooltipScreen.Text
public let textAlignment: TooltipScreen.Alignment
private let balancedTextLayout: Bool
private let constrainWidth: CGFloat?
private let style: TooltipScreen.Style
private let arrowStyle: TooltipScreen.ArrowStyle
private let icon: TooltipScreen.Icon?
@ -1039,6 +1046,7 @@ public final class TooltipScreen: ViewController {
text: TooltipScreen.Text,
textAlignment: TooltipScreen.Alignment = .natural,
balancedTextLayout: Bool = false,
constrainWidth: CGFloat? = nil,
style: TooltipScreen.Style = .default,
arrowStyle: TooltipScreen.ArrowStyle = .default,
icon: TooltipScreen.Icon? = nil,
@ -1056,6 +1064,7 @@ public final class TooltipScreen: ViewController {
self.text = text
self.textAlignment = textAlignment
self.balancedTextLayout = balancedTextLayout
self.constrainWidth = constrainWidth
self.style = style
self.arrowStyle = arrowStyle
self.icon = icon
@ -1123,7 +1132,7 @@ public final class TooltipScreen: ViewController {
}
override public func loadDisplayNode() {
self.displayNode = TooltipScreenNode(context: self.context, account: self.account, sharedContext: self.sharedContext, text: self.text, textAlignment: self.textAlignment, balancedTextLayout: self.balancedTextLayout, style: self.style, arrowStyle: self.arrowStyle, icon: self.icon, action: self.action, location: self.location, displayDuration: self.displayDuration, inset: self.inset, cornerRadius: self.cornerRadius, shouldDismissOnTouch: self.shouldDismissOnTouch, requestDismiss: { [weak self] in
self.displayNode = TooltipScreenNode(context: self.context, account: self.account, sharedContext: self.sharedContext, text: self.text, textAlignment: self.textAlignment, balancedTextLayout: self.balancedTextLayout, constrainWidth: self.constrainWidth, style: self.style, arrowStyle: self.arrowStyle, icon: self.icon, action: self.action, location: self.location, displayDuration: self.displayDuration, inset: self.inset, cornerRadius: self.cornerRadius, shouldDismissOnTouch: self.shouldDismissOnTouch, requestDismiss: { [weak self] in
guard let strongSelf = self else {
return
}