@swiftbrowser/swift 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// The views that show a player: `_AVPlayerVideo` draws one as the page's
|
|
2
|
+
// `video` element (AVKit's `VideoPlayer` and `AVPlayerViewController` use it,
|
|
3
|
+
// with the native controls), and `AVPlayerLayer` is a UIKit layer whose
|
|
4
|
+
// drawing is that view without controls, so a UIView whose layer (or a
|
|
5
|
+
// sublayer of it) is a player layer shows the video (ViewTranslation.swift).
|
|
6
|
+
|
|
7
|
+
import Foundation
|
|
8
|
+
import SwiftUI
|
|
9
|
+
import struct SwiftUI.CGSize
|
|
10
|
+
import struct SwiftUI.CGRect
|
|
11
|
+
import UIKit
|
|
12
|
+
|
|
13
|
+
/// How a video fits its layer: letterboxed, cropped to fill, or stretched.
|
|
14
|
+
public struct AVLayerVideoGravity: RawRepresentable, Hashable, Sendable {
|
|
15
|
+
public let rawValue: String
|
|
16
|
+
public init(rawValue: String) { self.rawValue = rawValue }
|
|
17
|
+
public init(_ rawValue: String) { self.rawValue = rawValue }
|
|
18
|
+
public static let resizeAspect = AVLayerVideoGravity("AVLayerVideoGravityResizeAspect")
|
|
19
|
+
public static let resizeAspectFill = AVLayerVideoGravity("AVLayerVideoGravityResizeAspectFill")
|
|
20
|
+
public static let resize = AVLayerVideoGravity("AVLayerVideoGravityResize")
|
|
21
|
+
|
|
22
|
+
/// The `video` element's `gravity` (CSS `object-fit` contain, cover, fill).
|
|
23
|
+
var _pageName: String {
|
|
24
|
+
switch self {
|
|
25
|
+
case .resizeAspectFill: "resizeAspectFill"
|
|
26
|
+
case .resize: "resize"
|
|
27
|
+
default: "resizeAspect"
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/// A player drawn as a `video` element: black while there is no player. Each
|
|
33
|
+
/// player gets its own surface (keyed by identity), so a view that is handed
|
|
34
|
+
/// another player attaches to it afresh.
|
|
35
|
+
public struct _AVPlayerVideo: View {
|
|
36
|
+
let player: AVPlayer?
|
|
37
|
+
let gravity: AVLayerVideoGravity
|
|
38
|
+
let controls: Bool
|
|
39
|
+
|
|
40
|
+
nonisolated public init(player: AVPlayer?, gravity: AVLayerVideoGravity, controls: Bool) {
|
|
41
|
+
self.player = player
|
|
42
|
+
self.gravity = gravity
|
|
43
|
+
self.controls = controls
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public var body: some View {
|
|
47
|
+
if let player {
|
|
48
|
+
ForEach([ObjectIdentifier(player)], id: \.self) { _ in
|
|
49
|
+
_AVPlayerSurfaceView(player: player, gravity: gravity, controls: controls)
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
Color.black
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/// The identity of one view showing a player.
|
|
58
|
+
final class _AVPlayerSurface {}
|
|
59
|
+
|
|
60
|
+
/// One view of one player: attaches while it is on screen, and draws the
|
|
61
|
+
/// element with the player's props (its body reads the player's observed
|
|
62
|
+
/// state, so a change of rate, mute, item or seek draws it again).
|
|
63
|
+
struct _AVPlayerSurfaceView: View {
|
|
64
|
+
let player: AVPlayer
|
|
65
|
+
let gravity: AVLayerVideoGravity
|
|
66
|
+
let controls: Bool
|
|
67
|
+
@State private var surface = _AVPlayerSurface()
|
|
68
|
+
|
|
69
|
+
var body: some View {
|
|
70
|
+
let id = ObjectIdentifier(surface)
|
|
71
|
+
let player = self.player
|
|
72
|
+
_VideoElement(props: player._videoProps(surface: id, gravity: gravity, controls: controls)) { [weak player] event in
|
|
73
|
+
player?._event(event, from: id)
|
|
74
|
+
}
|
|
75
|
+
.onAppear { player._attach(id) }
|
|
76
|
+
.onDisappear { player._detach(id) }
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// A layer that shows a player's video. In a UIView (as its `layerClass` or
|
|
81
|
+
/// a sublayer), the view draws the player filling its bounds, with
|
|
82
|
+
/// `videoGravity`, and no controls.
|
|
83
|
+
open class AVPlayerLayer: CALayer, @unchecked Sendable {
|
|
84
|
+
open var player: AVPlayer? { didSet { if player !== oldValue { _changed() } } }
|
|
85
|
+
open var videoGravity: AVLayerVideoGravity = .resizeAspect { didSet { if videoGravity != oldValue { _changed() } } }
|
|
86
|
+
/// Whether the native controls show (AVKit's player view controller sets it).
|
|
87
|
+
public var _showsControls = false { didSet { if _showsControls != oldValue { _changed() } } }
|
|
88
|
+
open var pixelBufferAttributes: [String: Any]?
|
|
89
|
+
|
|
90
|
+
public convenience init(player: AVPlayer?) {
|
|
91
|
+
self.init()
|
|
92
|
+
self.player = player
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// True once the current item's first frame can show (the page read its metadata).
|
|
96
|
+
open var isReadyForDisplay: Bool { player?.currentItem?.status == .readyToPlay }
|
|
97
|
+
|
|
98
|
+
/// Where the video is drawn in the layer's bounds, for its gravity.
|
|
99
|
+
open var videoRect: CGRect {
|
|
100
|
+
guard let size = player?.currentItem?.presentationSize, size.width > 0, size.height > 0 else { return .zero }
|
|
101
|
+
let box = bounds
|
|
102
|
+
switch videoGravity {
|
|
103
|
+
case .resize:
|
|
104
|
+
return box
|
|
105
|
+
default:
|
|
106
|
+
let fit = videoGravity == .resizeAspectFill
|
|
107
|
+
? max(box.width / size.width, box.height / size.height)
|
|
108
|
+
: min(box.width / size.width, box.height / size.height)
|
|
109
|
+
let width = size.width * fit, height = size.height * fit
|
|
110
|
+
return CGRect(x: box.midX - width / 2, y: box.midY - height / 2, width: width, height: height)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
open override var _drawing: AnyView? {
|
|
115
|
+
AnyView(_AVPlayerVideo(player: player, gravity: videoGravity, controls: _showsControls))
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// `import AVKit` for the browser: SwiftUI's `VideoPlayer` and UIKit's
|
|
2
|
+
// `AVPlayerViewController`, both drawn as the page's `video` element with its
|
|
3
|
+
// native controls (docs/ops-protocol.md, "Video and audio"). The player is
|
|
4
|
+
// AVFoundation's `AVPlayer`, which AVKit re-exports as on iOS.
|
|
5
|
+
//
|
|
6
|
+
// Picture in Picture, AirPlay routes and the system's now-playing info are
|
|
7
|
+
// not available: their types answer that they are unsupported.
|
|
8
|
+
@_exported import AVFoundation
|
|
9
|
+
import SwiftUI
|
|
10
|
+
import UIKit
|
|
11
|
+
|
|
12
|
+
/// A view that plays `player`'s current item with the browser's playback
|
|
13
|
+
/// controls, letterboxed on black, filling the space it is offered.
|
|
14
|
+
/// `videoOverlay` is drawn over the video (and over the controls where it
|
|
15
|
+
/// has content, so a full-size overlay takes the taps).
|
|
16
|
+
public struct VideoPlayer<VideoOverlay: View>: View {
|
|
17
|
+
let player: AVPlayer?
|
|
18
|
+
let overlay: VideoOverlay
|
|
19
|
+
|
|
20
|
+
public init(player: AVPlayer?, @ViewBuilder videoOverlay: () -> VideoOverlay) {
|
|
21
|
+
self.player = player
|
|
22
|
+
overlay = videoOverlay()
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
public var body: some View {
|
|
26
|
+
ZStack {
|
|
27
|
+
_AVPlayerVideo(player: player, gravity: .resizeAspect, controls: true)
|
|
28
|
+
overlay
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
extension VideoPlayer where VideoOverlay == EmptyView {
|
|
34
|
+
public init(player: AVPlayer?) {
|
|
35
|
+
self.init(player: player) { EmptyView() }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// MARK: - AVPlayerViewController
|
|
40
|
+
|
|
41
|
+
/// What an `AVPlayerViewController` tells its owner. Every method is optional;
|
|
42
|
+
/// full screen and Picture in Picture never start in the browser build.
|
|
43
|
+
@MainActor
|
|
44
|
+
public protocol AVPlayerViewControllerDelegate: AnyObject {
|
|
45
|
+
func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_ playerViewController: AVPlayerViewController) -> Bool
|
|
46
|
+
func playerViewControllerWillStartPictureInPicture(_ playerViewController: AVPlayerViewController)
|
|
47
|
+
func playerViewControllerDidStopPictureInPicture(_ playerViewController: AVPlayerViewController)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
extension AVPlayerViewControllerDelegate {
|
|
51
|
+
public func playerViewControllerShouldAutomaticallyDismissAtPictureInPictureStart(_ playerViewController: AVPlayerViewController) -> Bool { true }
|
|
52
|
+
public func playerViewControllerWillStartPictureInPicture(_ playerViewController: AVPlayerViewController) {}
|
|
53
|
+
public func playerViewControllerDidStopPictureInPicture(_ playerViewController: AVPlayerViewController) {}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/// The view of an `AVPlayerViewController`: its layer is the player layer.
|
|
57
|
+
final class _AVPlayerControllerView: UIView {
|
|
58
|
+
override class var layerClass: AnyClass { AVPlayerLayer.self }
|
|
59
|
+
var playerLayer: AVPlayerLayer { layer as! AVPlayerLayer }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/// A controller whose view plays `player` (with the native controls unless
|
|
63
|
+
/// `showsPlaybackControls` is off). Shown by a `UIViewControllerRepresentable`
|
|
64
|
+
/// or as a child controller's view, it draws like `VideoPlayer`; the
|
|
65
|
+
/// `contentOverlayView` is drawn over the video.
|
|
66
|
+
@MainActor
|
|
67
|
+
open class AVPlayerViewController: UIViewController {
|
|
68
|
+
open var player: AVPlayer? { didSet { playerLayer?.player = player } }
|
|
69
|
+
open var showsPlaybackControls = true { didSet { playerLayer?._showsControls = showsPlaybackControls } }
|
|
70
|
+
open var videoGravity: AVLayerVideoGravity = .resizeAspect { didSet { playerLayer?.videoGravity = videoGravity } }
|
|
71
|
+
open weak var delegate: (any AVPlayerViewControllerDelegate)?
|
|
72
|
+
open var allowsPictureInPicturePlayback = true
|
|
73
|
+
open var canStartPictureInPictureAutomaticallyFromInline = false
|
|
74
|
+
open var entersFullScreenWhenPlaybackBegins = false
|
|
75
|
+
open var exitsFullScreenWhenPlaybackEnds = false
|
|
76
|
+
open var updatesNowPlayingInfoCenter = true
|
|
77
|
+
open var requiresLinearPlayback = false
|
|
78
|
+
open var showsTimecodes = false
|
|
79
|
+
open var allowsVideoFrameAnalysis = false
|
|
80
|
+
open var speeds: [AVPlaybackSpeed] = AVPlaybackSpeed.systemDefaultSpeeds
|
|
81
|
+
open var isReadyForDisplay: Bool { playerLayer?.isReadyForDisplay ?? false }
|
|
82
|
+
open var videoBounds: CGRect { playerLayer?.videoRect ?? .zero }
|
|
83
|
+
/// A view over the video, below the controls.
|
|
84
|
+
public private(set) lazy var contentOverlayView: UIView? = {
|
|
85
|
+
let overlay = UIView(frame: view.bounds)
|
|
86
|
+
overlay.autoresizingMask = [.flexibleWidth, .flexibleHeight]
|
|
87
|
+
view.addSubview(overlay)
|
|
88
|
+
return overlay
|
|
89
|
+
}()
|
|
90
|
+
|
|
91
|
+
private var playerLayer: AVPlayerLayer? { (viewIfLoaded as? _AVPlayerControllerView)?.playerLayer }
|
|
92
|
+
|
|
93
|
+
open override func loadView() {
|
|
94
|
+
let playerView = _AVPlayerControllerView()
|
|
95
|
+
playerView.playerLayer.player = player
|
|
96
|
+
playerView.playerLayer._showsControls = showsPlaybackControls
|
|
97
|
+
playerView.playerLayer.videoGravity = videoGravity
|
|
98
|
+
playerView.backgroundColor = .black
|
|
99
|
+
view = playerView
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/// A playback speed the controls offer (the browser's own menu applies).
|
|
104
|
+
public struct AVPlaybackSpeed: Hashable, Sendable {
|
|
105
|
+
public let rate: Float
|
|
106
|
+
public let localizedName: String
|
|
107
|
+
public init(rate: Float, localizedName: String) {
|
|
108
|
+
self.rate = rate
|
|
109
|
+
self.localizedName = localizedName
|
|
110
|
+
}
|
|
111
|
+
public static let systemDefaultSpeeds = [0.5, 1, 1.25, 1.5, 2].map { AVPlaybackSpeed(rate: Float($0), localizedName: "\($0)×") }
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// MARK: - Picture in Picture and routes
|
|
115
|
+
|
|
116
|
+
/// Picture in Picture is not available in the browser build.
|
|
117
|
+
@MainActor
|
|
118
|
+
open class AVPictureInPictureController {
|
|
119
|
+
public static func isPictureInPictureSupported() -> Bool { false }
|
|
120
|
+
public let playerLayer: AVPlayerLayer
|
|
121
|
+
open var isPictureInPictureActive: Bool { false }
|
|
122
|
+
open var isPictureInPicturePossible: Bool { false }
|
|
123
|
+
open var canStartPictureInPictureAutomaticallyFromInline = false
|
|
124
|
+
|
|
125
|
+
/// Nil: Picture in Picture is not supported.
|
|
126
|
+
public init?(playerLayer: AVPlayerLayer) {
|
|
127
|
+
return nil
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
open func startPictureInPicture() {}
|
|
131
|
+
open func stopPictureInPicture() {}
|
|
132
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// `import Accelerate` for the browser: vImage's buffers and box convolutions,
|
|
2
|
+
// as image code calls them (Nuke's Gaussian blur runs three box passes over
|
|
3
|
+
// a Core Graphics context's memory). A buffer over a `CGContext`'s `data` has
|
|
4
|
+
// no pixels here (the page draws them), so a convolution between two contexts
|
|
5
|
+
// becomes a recipe step on the destination (`CGContext._boxConvolve`), and
|
|
6
|
+
// the page blurs. A buffer of real memory is convolved on the spot.
|
|
7
|
+
|
|
8
|
+
import CoreGraphics
|
|
9
|
+
import SwiftUI
|
|
10
|
+
|
|
11
|
+
public typealias vImagePixelCount = UInt
|
|
12
|
+
public typealias vImage_Flags = UInt32
|
|
13
|
+
public typealias vImage_Error = Int
|
|
14
|
+
|
|
15
|
+
public let kvImageNoFlags: Int = 0
|
|
16
|
+
public let kvImageLeaveAlphaUnchanged: Int = 1
|
|
17
|
+
public let kvImageCopyInPlace: Int = 2
|
|
18
|
+
public let kvImageBackgroundColorFill: Int = 4
|
|
19
|
+
public let kvImageEdgeExtend: Int = 8
|
|
20
|
+
public let kvImageDoNotTile: Int = 16
|
|
21
|
+
public let kvImageHighQualityResampling: Int = 32
|
|
22
|
+
public let kvImageTruncateKernel: Int = 64
|
|
23
|
+
public let kvImageGetTempBufferSize: Int = 128
|
|
24
|
+
|
|
25
|
+
public let kvImageNoError: Int = 0
|
|
26
|
+
public let kvImageRoiLargerThanInputBuffer: Int = -21766
|
|
27
|
+
public let kvImageInvalidKernelSize: Int = -21767
|
|
28
|
+
public let kvImageNullPointerArgument: Int = -21772
|
|
29
|
+
|
|
30
|
+
/// A bitmap in memory: `height` rows of `rowBytes` bytes at `data`.
|
|
31
|
+
public struct vImage_Buffer {
|
|
32
|
+
public var data: UnsafeMutableRawPointer!
|
|
33
|
+
public var height: vImagePixelCount
|
|
34
|
+
public var width: vImagePixelCount
|
|
35
|
+
public var rowBytes: Int
|
|
36
|
+
|
|
37
|
+
public init() {
|
|
38
|
+
data = nil
|
|
39
|
+
height = 0
|
|
40
|
+
width = 0
|
|
41
|
+
rowBytes = 0
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public init(data: UnsafeMutableRawPointer!, height: vImagePixelCount, width: vImagePixelCount, rowBytes: Int) {
|
|
45
|
+
self.data = data
|
|
46
|
+
self.height = height
|
|
47
|
+
self.width = width
|
|
48
|
+
self.rowBytes = rowBytes
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/// A box blur of a four-channel, eight-bit image: each pixel becomes the mean
|
|
53
|
+
/// of the `kernel_width` × `kernel_height` box around it.
|
|
54
|
+
public func vImageBoxConvolve_ARGB8888(_ src: UnsafePointer<vImage_Buffer>, _ dest: UnsafePointer<vImage_Buffer>, _ tempBuffer: UnsafeMutableRawPointer?,
|
|
55
|
+
_ srcOffsetToROI_X: vImagePixelCount, _ srcOffsetToROI_Y: vImagePixelCount,
|
|
56
|
+
_ kernel_height: UInt32, _ kernel_width: UInt32, _ backgroundColor: UnsafePointer<UInt8>?, _ flags: vImage_Flags) -> vImage_Error {
|
|
57
|
+
_boxConvolve(src.pointee, dest.pointee, channels: 4, offset: (Int(srcOffsetToROI_X), Int(srcOffsetToROI_Y)),
|
|
58
|
+
kernel: (Int(kernel_width), Int(kernel_height)), background: backgroundColor, flags: flags)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// The same for one eight-bit channel.
|
|
62
|
+
public func vImageBoxConvolve_Planar8(_ src: UnsafePointer<vImage_Buffer>, _ dest: UnsafePointer<vImage_Buffer>, _ tempBuffer: UnsafeMutableRawPointer?,
|
|
63
|
+
_ srcOffsetToROI_X: vImagePixelCount, _ srcOffsetToROI_Y: vImagePixelCount,
|
|
64
|
+
_ kernel_height: UInt32, _ kernel_width: UInt32, _ backgroundColor: UInt8, _ flags: vImage_Flags) -> vImage_Error {
|
|
65
|
+
var background = backgroundColor
|
|
66
|
+
return _boxConvolve(src.pointee, dest.pointee, channels: 1, offset: (Int(srcOffsetToROI_X), Int(srcOffsetToROI_Y)),
|
|
67
|
+
kernel: (Int(kernel_width), Int(kernel_height)), background: &background, flags: flags)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
func _boxConvolve(_ src: vImage_Buffer, _ dest: vImage_Buffer, channels: Int, offset: (Int, Int), kernel: (Int, Int),
|
|
71
|
+
background: UnsafePointer<UInt8>?, flags: vImage_Flags) -> vImage_Error {
|
|
72
|
+
guard kernel.0 > 0, kernel.1 > 0, kernel.0 % 2 == 1, kernel.1 % 2 == 1 else { return kvImageInvalidKernelSize }
|
|
73
|
+
if Int(flags) & kvImageGetTempBufferSize != 0 { return 0 }
|
|
74
|
+
guard let srcData = src.data, let destData = dest.data else { return kvImageNullPointerArgument }
|
|
75
|
+
let extend = Int(flags) & kvImageEdgeExtend != 0
|
|
76
|
+
// Contexts: the page has the pixels; record the blur.
|
|
77
|
+
if let from = CGContext._context(withData: srcData), let to = CGContext._context(withData: destData) {
|
|
78
|
+
to._boxConvolve(from: from, kernelWidth: kernel.0, kernelHeight: kernel.1, extendEdges: extend)
|
|
79
|
+
return kvImageNoError
|
|
80
|
+
}
|
|
81
|
+
let width = Int(dest.width), height = Int(dest.height)
|
|
82
|
+
guard offset.0 + width <= Int(src.width), offset.1 + height <= Int(src.height) else { return kvImageRoiLargerThanInputBuffer }
|
|
83
|
+
let input = srcData.assumingMemoryBound(to: UInt8.self)
|
|
84
|
+
let output = destData.assumingMemoryBound(to: UInt8.self)
|
|
85
|
+
let rx = kernel.0 / 2, ry = kernel.1 / 2
|
|
86
|
+
let area = kernel.0 * kernel.1
|
|
87
|
+
let copyAlpha = Int(flags) & kvImageLeaveAlphaUnchanged != 0 && channels == 4
|
|
88
|
+
// Into a separate buffer first, so the source and destination may be the same memory.
|
|
89
|
+
var result = [UInt8](repeating: 0, count: width * height * channels)
|
|
90
|
+
for y in 0..<height {
|
|
91
|
+
for x in 0..<width {
|
|
92
|
+
for c in 0..<channels {
|
|
93
|
+
var sum = 0
|
|
94
|
+
for ky in -ry...ry {
|
|
95
|
+
for kx in -rx...rx {
|
|
96
|
+
var sx = offset.0 + x + kx, sy = offset.1 + y + ky
|
|
97
|
+
if sx < 0 || sy < 0 || sx >= Int(src.width) || sy >= Int(src.height) {
|
|
98
|
+
if extend {
|
|
99
|
+
sx = min(max(sx, 0), Int(src.width) - 1)
|
|
100
|
+
sy = min(max(sy, 0), Int(src.height) - 1)
|
|
101
|
+
} else {
|
|
102
|
+
sum += Int(background?[c] ?? 0)
|
|
103
|
+
continue
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
sum += Int(input[sy * src.rowBytes + sx * channels + c])
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
result[(y * width + x) * channels + c] = UInt8((sum + area / 2) / area)
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
for y in 0..<height {
|
|
114
|
+
for x in 0..<width {
|
|
115
|
+
for c in 0..<channels {
|
|
116
|
+
if copyAlpha && c == 0 { continue }
|
|
117
|
+
output[y * dest.rowBytes + x * channels + c] = result[(y * width + x) * channels + c]
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return kvImageNoError
|
|
122
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
// `import AppIntents` for the browser: the types apps declare their intents,
|
|
2
|
+
// entities, enums and App Shortcuts with, and SwiftUI's `Button(intent:)`.
|
|
3
|
+
//
|
|
4
|
+
// Nothing outside the app runs an intent here: the browser has no Shortcuts,
|
|
5
|
+
// Siri, Spotlight, widgets or Action button, so an `AppShortcutsProvider`'s
|
|
6
|
+
// shortcuts, an intent's title, description and phrases, and an entity's
|
|
7
|
+
// queries are declarations nobody reads. What the app does with its own
|
|
8
|
+
// intents still happens: a `Button(intent:)` (and ButtonKit's
|
|
9
|
+
// `AsyncButton(intent:)`) runs the intent's `perform()` when tapped, as on
|
|
10
|
+
// iOS, with the parameters the app set on it. A parameter the app left unset
|
|
11
|
+
// has no Shortcuts to ask for it: an optional one reads nil, any other one
|
|
12
|
+
// stops the app with a message naming it.
|
|
13
|
+
|
|
14
|
+
import Foundation
|
|
15
|
+
import FoundationBridge
|
|
16
|
+
import SwiftUI
|
|
17
|
+
import UIKit
|
|
18
|
+
import UniformTypeIdentifiers
|
|
19
|
+
|
|
20
|
+
// MARK: - Intents
|
|
21
|
+
|
|
22
|
+
/// An action of the app's. In the browser only the app itself performs one
|
|
23
|
+
/// (through `Button(intent:)`); `title`, `openAppWhenRun` and the rest are kept
|
|
24
|
+
/// for the declarations to compile.
|
|
25
|
+
public protocol AppIntent: Sendable {
|
|
26
|
+
associatedtype PerformResult: IntentResult
|
|
27
|
+
static var title: LocalizedStringResource { get }
|
|
28
|
+
/// Whether Shortcuts opens the app first: the app is always open in the browser.
|
|
29
|
+
static var openAppWhenRun: Bool { get }
|
|
30
|
+
static var isDiscoverable: Bool { get }
|
|
31
|
+
static var authenticationPolicy: IntentAuthenticationPolicy { get }
|
|
32
|
+
init()
|
|
33
|
+
func perform() async throws -> PerformResult
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
extension AppIntent {
|
|
37
|
+
public static var openAppWhenRun: Bool { false }
|
|
38
|
+
public static var isDiscoverable: Bool { true }
|
|
39
|
+
public static var authenticationPolicy: IntentAuthenticationPolicy { .alwaysAllowed }
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/// Intents that continue in the app, play audio, drive a Live Activity or
|
|
43
|
+
/// configure a widget: markers here, as nothing outside the app runs them.
|
|
44
|
+
public protocol ForegroundContinuableIntent: AppIntent {}
|
|
45
|
+
public protocol AudioPlaybackIntent: AppIntent {}
|
|
46
|
+
public protocol LiveActivityIntent: AppIntent {}
|
|
47
|
+
public protocol WidgetConfigurationIntent: AppIntent {}
|
|
48
|
+
public protocol SystemIntent: AppIntent {}
|
|
49
|
+
|
|
50
|
+
public enum IntentAuthenticationPolicy: Sendable {
|
|
51
|
+
case alwaysAllowed, requiresAuthentication, requiresLocalDeviceAuthentication
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/// How an intent describes itself to Shortcuts (kept, not shown).
|
|
55
|
+
public struct IntentDescription: Sendable, ExpressibleByStringInterpolation {
|
|
56
|
+
public var descriptionText: LocalizedStringResource
|
|
57
|
+
public var categoryName: LocalizedStringResource?
|
|
58
|
+
public var searchKeywords: [LocalizedStringResource]
|
|
59
|
+
public var resultValueName: LocalizedStringResource?
|
|
60
|
+
|
|
61
|
+
public init(_ descriptionText: LocalizedStringResource, categoryName: LocalizedStringResource? = nil,
|
|
62
|
+
searchKeywords: [LocalizedStringResource] = [], resultValueName: LocalizedStringResource? = nil) {
|
|
63
|
+
self.descriptionText = descriptionText
|
|
64
|
+
self.categoryName = categoryName
|
|
65
|
+
self.searchKeywords = searchKeywords
|
|
66
|
+
self.resultValueName = resultValueName
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public init(stringLiteral value: String) { self.init(LocalizedStringResource(stringLiteral: value)) }
|
|
70
|
+
public init(stringInterpolation: LocalizedStringResource.StringInterpolation) {
|
|
71
|
+
self.init(LocalizedStringResource(stringInterpolation: stringInterpolation))
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// What Siri would say. `perform()` results keep it; nothing speaks it.
|
|
76
|
+
public struct IntentDialog: Sendable, ExpressibleByStringInterpolation {
|
|
77
|
+
public var full: LocalizedStringResource
|
|
78
|
+
public var supporting: LocalizedStringResource
|
|
79
|
+
public var systemImageName: String?
|
|
80
|
+
|
|
81
|
+
public init(_ resource: LocalizedStringResource) {
|
|
82
|
+
full = resource
|
|
83
|
+
supporting = resource
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public init(full: LocalizedStringResource, supporting: LocalizedStringResource, systemImageName: String? = nil) {
|
|
87
|
+
self.full = full
|
|
88
|
+
self.supporting = supporting
|
|
89
|
+
self.systemImageName = systemImageName
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public init(stringLiteral value: String) { self.init(LocalizedStringResource(stringLiteral: value)) }
|
|
93
|
+
public init(stringInterpolation: LocalizedStringResource.StringInterpolation) {
|
|
94
|
+
self.init(LocalizedStringResource(stringInterpolation: stringInterpolation))
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// MARK: - Results
|
|
99
|
+
|
|
100
|
+
/// What `perform()` returns. Results are made with `.result(…)`.
|
|
101
|
+
public protocol IntentResult: Sendable {}
|
|
102
|
+
public protocol ProvidesDialog: IntentResult {}
|
|
103
|
+
public protocol ShowsSnippetView: IntentResult {}
|
|
104
|
+
public protocol OpensIntent: IntentResult {}
|
|
105
|
+
public protocol ReturnsValue<Value>: IntentResult {
|
|
106
|
+
associatedtype Value
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/// Every result: its value, dialog, snippet view and the intent it opens, as given.
|
|
110
|
+
public struct IntentResultContainer<Value>: IntentResult, ProvidesDialog, ShowsSnippetView, OpensIntent, ReturnsValue, @unchecked Sendable {
|
|
111
|
+
public let value: Value?
|
|
112
|
+
public let dialog: IntentDialog?
|
|
113
|
+
/// The snippet view, which nothing shows.
|
|
114
|
+
public let view: (any View)?
|
|
115
|
+
/// The intent to run next, which nothing runs.
|
|
116
|
+
public let opensIntent: (any AppIntent)?
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
extension IntentResult where Self == IntentResultContainer<Never> {
|
|
120
|
+
public static func result() -> Self { .init(value: nil, dialog: nil, view: nil, opensIntent: nil) }
|
|
121
|
+
public static func result(dialog: IntentDialog) -> Self { .init(value: nil, dialog: dialog, view: nil, opensIntent: nil) }
|
|
122
|
+
public static func result(view: some View) -> Self { .init(value: nil, dialog: nil, view: view, opensIntent: nil) }
|
|
123
|
+
public static func result(dialog: IntentDialog, view: some View) -> Self { .init(value: nil, dialog: dialog, view: view, opensIntent: nil) }
|
|
124
|
+
public static func result(dialog: IntentDialog, @ViewBuilder content: () -> some View) -> Self {
|
|
125
|
+
.init(value: nil, dialog: dialog, view: content(), opensIntent: nil)
|
|
126
|
+
}
|
|
127
|
+
public static func result(opensIntent: some AppIntent, dialog: IntentDialog? = nil) -> Self {
|
|
128
|
+
.init(value: nil, dialog: dialog, view: nil, opensIntent: opensIntent)
|
|
129
|
+
}
|
|
130
|
+
public static func result<Value>(value: Value, dialog: IntentDialog? = nil) -> IntentResultContainer<Value> {
|
|
131
|
+
.init(value: value, dialog: dialog, view: nil, opensIntent: nil)
|
|
132
|
+
}
|
|
133
|
+
public static func result<Value>(value: Value, dialog: IntentDialog? = nil, view: some View) -> IntentResultContainer<Value> {
|
|
134
|
+
.init(value: value, dialog: dialog, view: view, opensIntent: nil)
|
|
135
|
+
}
|
|
136
|
+
public static func result<Value>(value: Value, opensIntent: some AppIntent, dialog: IntentDialog? = nil) -> IntentResultContainer<Value> {
|
|
137
|
+
.init(value: value, dialog: dialog, view: nil, opensIntent: opensIntent)
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/// An intent's error that carries a message for Siri (kept in `localizedStringResource`).
|
|
142
|
+
public protocol CustomLocalizedStringResourceConvertible {
|
|
143
|
+
var localizedStringResource: LocalizedStringResource { get }
|
|
144
|
+
}
|