@swiftbrowser/swift 0.1.0 → 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 +200 -9
- package/README.md +7 -9
- 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 +0 -4
- 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/{_FoundationCommon → FoundationBridge}/Bundle.swift +41 -4
- 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 +24 -72
- 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/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 +6 -1
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/{_FoundationCommon → FoundationBridge}/UserDefaults.swift +17 -4
- 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 +55 -6
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +1 -1
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +37 -5
- package/Sources/SwiftUI/API/App.swift +31 -1
- 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 +104 -28
- 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 +59 -27
- package/Sources/SwiftUI/API/CustomLayout.swift +49 -10
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +1 -1
- package/Sources/SwiftUI/API/EditMode.swift +25 -82
- package/Sources/SwiftUI/API/Effects.swift +105 -7
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +93 -9
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +11 -3
- package/Sources/SwiftUI/API/Gauge.swift +3 -2
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +13 -2
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +1 -1
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +1 -1
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +13 -6
- package/Sources/SwiftUI/API/Layout.swift +67 -12
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +61 -6
- package/Sources/SwiftUI/API/Menu.swift +8 -1
- package/Sources/SwiftUI/API/Modifiers.swift +80 -10
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +24 -9
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +16 -2
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +48 -31
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +11 -2
- 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 +17 -4
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +164 -37
- package/Sources/SwiftUI/API/Publishers.swift +4 -4
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +3 -2
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +3 -3
- 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 +105 -7
- 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 +18 -1
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -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 +148 -4
- package/Sources/SwiftUI/API/Tasks.swift +2 -2
- 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/Toolbar.swift +52 -16
- 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 +10 -2
- package/Sources/SwiftUI/API/ViewModifier.swift +4 -1
- package/Sources/SwiftUI/API/VisualEffect.swift +74 -1
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +7 -1
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +17 -3
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +2 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +37 -1
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +76 -4
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +58 -12
- package/Sources/SwiftUI/Runtime/Reconciler.swift +10 -1
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +977 -198
- 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 +1 -1
- package/index.mjs +2 -2
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +5 -3
- package/sync-sources.mjs +21 -7
- package/Sources/FoundationLite/Common.swift +0 -3
- package/Sources/FoundationLite/FoundationLite.swift +0 -171
- package/Sources/FoundationLite/Interaction.swift +0 -146
- package/Sources/FoundationLite/Timer.swift +0 -48
- package/Sources/_FoundationCommon/_FoundationCommon.swift +0 -10
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
// `import CoreGraphics` for the browser. The geometry types and `CGImage`
|
|
2
|
+
// are the SwiftUI shim's (re-exported, as on Apple platforms SwiftUI uses
|
|
3
|
+
// Core Graphics' own); this module adds what image code draws with.
|
|
4
|
+
//
|
|
5
|
+
// A `CGImage` holds no pixels: it is a recipe the page runs (a decoded file,
|
|
6
|
+
// then steps; Runtime/ImageSource.swift). So a `CGContext` records too.
|
|
7
|
+
// Drawing an image into it places that image's recipe in the context's
|
|
8
|
+
// rectangle (`place`), a clip to a rounded rectangle or an ellipse masks it
|
|
9
|
+
// (`roundedClip`), and `makeImage()` renders the context's rectangle: the
|
|
10
|
+
// same recipe, cut to the canvas. That covers what image libraries draw
|
|
11
|
+
// (decompressing, resizing, cropping, rounding corners). Only the last image
|
|
12
|
+
// drawn is kept, fills and strokes are not drawn, and `data` is never
|
|
13
|
+
// written: code that reads pixels back gets zeros. See docs/ops-protocol.md,
|
|
14
|
+
// "Core Graphics and Image I/O".
|
|
15
|
+
|
|
16
|
+
@_exported import typealias SwiftUI.CGFloat
|
|
17
|
+
@_exported import struct SwiftUI.CGPoint
|
|
18
|
+
@_exported import struct SwiftUI.CGSize
|
|
19
|
+
@_exported import struct SwiftUI.CGRect
|
|
20
|
+
@_exported import class SwiftUI.CGImage
|
|
21
|
+
@_exported import enum SwiftUI.CGLineCap
|
|
22
|
+
@_exported import enum SwiftUI.CGLineJoin
|
|
23
|
+
@_exported import struct SwiftUI.CGAffineTransform
|
|
24
|
+
import SwiftUI
|
|
25
|
+
|
|
26
|
+
// MARK: - Colors
|
|
27
|
+
|
|
28
|
+
/// A color space. Every bitmap here is device RGB.
|
|
29
|
+
public final class CGColorSpace: @unchecked Sendable {
|
|
30
|
+
public let name: String?
|
|
31
|
+
public init?(name: String) { self.name = name }
|
|
32
|
+
init(_name name: String) { self.name = name }
|
|
33
|
+
|
|
34
|
+
public var numberOfComponents: Int { 3 }
|
|
35
|
+
public var model: CGColorSpaceModel { .rgb }
|
|
36
|
+
|
|
37
|
+
public static let sRGB = "kCGColorSpaceSRGB"
|
|
38
|
+
public static let displayP3 = "kCGColorSpaceDisplayP3"
|
|
39
|
+
public static let genericRGBLinear = "kCGColorSpaceGenericRGBLinear"
|
|
40
|
+
public static let linearSRGB = "kCGColorSpaceLinearSRGB"
|
|
41
|
+
public static let extendedSRGB = "kCGColorSpaceExtendedSRGB"
|
|
42
|
+
public static let genericGrayGamma2_2 = "kCGColorSpaceGenericGrayGamma2_2"
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public enum CGColorSpaceModel: Int32, Sendable {
|
|
46
|
+
case unknown = -1, monochrome, rgb, cmyk, lab, deviceN, indexed, pattern, XYZ
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public func CGColorSpaceCreateDeviceRGB() -> CGColorSpace { CGColorSpace(_name: CGColorSpace.sRGB) }
|
|
50
|
+
public func CGColorSpaceCreateDeviceGray() -> CGColorSpace { CGColorSpace(_name: CGColorSpace.genericGrayGamma2_2) }
|
|
51
|
+
|
|
52
|
+
/// A color: RGBA components in 0…1.
|
|
53
|
+
public final class CGColor: @unchecked Sendable {
|
|
54
|
+
public let components: [CGFloat]?
|
|
55
|
+
public var alpha: CGFloat { components?.last ?? 1 }
|
|
56
|
+
public var numberOfComponents: Int { components?.count ?? 0 }
|
|
57
|
+
public var colorSpace: CGColorSpace? { CGColorSpaceCreateDeviceRGB() }
|
|
58
|
+
|
|
59
|
+
public init(red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
|
|
60
|
+
components = [red, green, blue, alpha]
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public init(gray: CGFloat, alpha: CGFloat) {
|
|
64
|
+
components = [gray, gray, gray, alpha]
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public init?(colorSpace: CGColorSpace, components: UnsafePointer<CGFloat>) {
|
|
68
|
+
self.components = Array(UnsafeBufferPointer(start: components, count: 4))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public func copy(alpha: CGFloat) -> CGColor? {
|
|
72
|
+
let c = components ?? [0, 0, 0, 1]
|
|
73
|
+
return CGColor(red: c[0], green: c[1], blue: c[2], alpha: alpha)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public static let black = CGColor(gray: 0, alpha: 1)
|
|
77
|
+
public static let white = CGColor(gray: 1, alpha: 1)
|
|
78
|
+
public static let clear = CGColor(gray: 0, alpha: 0)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// MARK: - Bitmap formats
|
|
82
|
+
|
|
83
|
+
/// How a bitmap stores alpha. Recorded; the page's bitmaps are premultiplied RGBA.
|
|
84
|
+
public enum CGImageAlphaInfo: UInt32, Sendable {
|
|
85
|
+
case none = 0, premultipliedLast, premultipliedFirst, last, first, noneSkipLast, noneSkipFirst, alphaOnly
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public struct CGBitmapInfo: OptionSet, Sendable {
|
|
89
|
+
public let rawValue: UInt32
|
|
90
|
+
public init(rawValue: UInt32) { self.rawValue = rawValue }
|
|
91
|
+
public init(_ rawValue: UInt32) { self.rawValue = rawValue }
|
|
92
|
+
|
|
93
|
+
public static let alphaInfoMask = CGBitmapInfo(rawValue: 0x1F)
|
|
94
|
+
public static let floatInfoMask = CGBitmapInfo(rawValue: 0xF00)
|
|
95
|
+
public static let floatComponents = CGBitmapInfo(rawValue: 1 << 8)
|
|
96
|
+
public static let byteOrderMask = CGBitmapInfo(rawValue: 0x7000)
|
|
97
|
+
public static let byteOrderDefault = CGBitmapInfo([])
|
|
98
|
+
public static let byteOrder16Little = CGBitmapInfo(rawValue: 1 << 12)
|
|
99
|
+
public static let byteOrder32Little = CGBitmapInfo(rawValue: 2 << 12)
|
|
100
|
+
public static let byteOrder16Big = CGBitmapInfo(rawValue: 3 << 12)
|
|
101
|
+
public static let byteOrder32Big = CGBitmapInfo(rawValue: 4 << 12)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public enum CGInterpolationQuality: Int32, Sendable {
|
|
105
|
+
case `default` = 0, none, low, medium, high
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public enum CGBlendMode: Int32, Sendable {
|
|
109
|
+
case normal = 0, multiply, screen, overlay, darken, lighten, colorDodge, colorBurn, softLight, hardLight
|
|
110
|
+
case difference, exclusion, hue, saturation, color, luminosity, clear, copy, sourceIn, sourceOut
|
|
111
|
+
case sourceAtop, destinationOver, destinationIn, destinationOut, destinationAtop, xor, plusDarker, plusLighter
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public enum CGPathFillRule: Int, Sendable {
|
|
115
|
+
case winding = 0, evenOdd
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/// Where a bitmap's bytes come from. Always empty here: the page holds the pixels.
|
|
119
|
+
public final class CGDataProvider: @unchecked Sendable {
|
|
120
|
+
public init?(data: Any) { return nil }
|
|
121
|
+
public var data: Any? { nil }
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
extension CGImage {
|
|
125
|
+
public var colorSpace: CGColorSpace? { CGColorSpaceCreateDeviceRGB() }
|
|
126
|
+
public var alphaInfo: CGImageAlphaInfo { .premultipliedLast }
|
|
127
|
+
public var bitmapInfo: CGBitmapInfo { CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) }
|
|
128
|
+
public var isMask: Bool { false }
|
|
129
|
+
public var shouldInterpolate: Bool { true }
|
|
130
|
+
public var renderingIntent: CGColorRenderingIntent { .defaultIntent }
|
|
131
|
+
/// Nil: the pixels are the page's.
|
|
132
|
+
public var dataProvider: CGDataProvider? { nil }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
public enum CGColorRenderingIntent: Int32, Sendable {
|
|
136
|
+
case defaultIntent = 0, absoluteColorimetric, relativeColorimetric, perceptual, saturation
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// MARK: - Integer geometry
|
|
140
|
+
|
|
141
|
+
// Core Graphics' initializers from integers (the shim's types take CGFloat).
|
|
142
|
+
extension CGPoint {
|
|
143
|
+
public init(x: Int, y: Int) { self.init(x: CGFloat(x), y: CGFloat(y)) }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
extension CGSize {
|
|
147
|
+
public init(width: Int, height: Int) { self.init(width: CGFloat(width), height: CGFloat(height)) }
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
extension CGRect {
|
|
151
|
+
public init(x: Int, y: Int, width: Int, height: Int) {
|
|
152
|
+
self.init(x: CGFloat(x), y: CGFloat(y), width: CGFloat(width), height: CGFloat(height))
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// MARK: - Paths
|
|
157
|
+
|
|
158
|
+
/// A path. The shapes image code clips to are kept as such (a rectangle, a
|
|
159
|
+
/// rounded rectangle, an ellipse); anything else is its bounding box.
|
|
160
|
+
public class CGPath: @unchecked Sendable {
|
|
161
|
+
enum Shape: Equatable {
|
|
162
|
+
case rect(CGRect)
|
|
163
|
+
case roundedRect(CGRect, cornerWidth: CGFloat, cornerHeight: CGFloat)
|
|
164
|
+
case ellipse(CGRect)
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
var shapes: [Shape] = []
|
|
168
|
+
|
|
169
|
+
public init() {}
|
|
170
|
+
|
|
171
|
+
public convenience init(rect: CGRect, transform: UnsafePointer<CGAffineTransform>?) {
|
|
172
|
+
self.init()
|
|
173
|
+
shapes = [.rect(rect.applying(transform?.pointee ?? .identity))]
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
public convenience init(roundedRect rect: CGRect, cornerWidth: CGFloat, cornerHeight: CGFloat, transform: UnsafePointer<CGAffineTransform>?) {
|
|
177
|
+
self.init()
|
|
178
|
+
shapes = [.roundedRect(rect.applying(transform?.pointee ?? .identity), cornerWidth: cornerWidth, cornerHeight: cornerHeight)]
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
public convenience init(ellipseIn rect: CGRect, transform: UnsafePointer<CGAffineTransform>?) {
|
|
182
|
+
self.init()
|
|
183
|
+
shapes = [.ellipse(rect.applying(transform?.pointee ?? .identity))]
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
public var boundingBox: CGRect {
|
|
187
|
+
shapes.reduce(CGRect.null) { box, shape in
|
|
188
|
+
switch shape {
|
|
189
|
+
case .rect(let r), .ellipse(let r), .roundedRect(let r, _, _): box.union(r)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public var isEmpty: Bool { shapes.isEmpty }
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public final class CGMutablePath: CGPath, @unchecked Sendable {
|
|
198
|
+
public override init() { super.init() }
|
|
199
|
+
|
|
200
|
+
public func addRect(_ rect: CGRect, transform: CGAffineTransform = .identity) { shapes.append(.rect(rect.applying(transform))) }
|
|
201
|
+
public func addEllipse(in rect: CGRect, transform: CGAffineTransform = .identity) { shapes.append(.ellipse(rect.applying(transform))) }
|
|
202
|
+
public func addRoundedRect(in rect: CGRect, cornerWidth: CGFloat, cornerHeight: CGFloat, transform: CGAffineTransform = .identity) {
|
|
203
|
+
shapes.append(.roundedRect(rect.applying(transform), cornerWidth: cornerWidth, cornerHeight: cornerHeight))
|
|
204
|
+
}
|
|
205
|
+
public func addPath(_ path: CGPath, transform: CGAffineTransform = .identity) { shapes += path.shapes }
|
|
206
|
+
public func move(to point: CGPoint, transform: CGAffineTransform = .identity) {}
|
|
207
|
+
public func addLine(to point: CGPoint, transform: CGAffineTransform = .identity) {}
|
|
208
|
+
public func closeSubpath() {}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// MARK: - Contexts
|
|
212
|
+
|
|
213
|
+
/// A bitmap context that records what is drawn into it as recipe steps.
|
|
214
|
+
public final class CGContext: @unchecked Sendable {
|
|
215
|
+
public let width: Int
|
|
216
|
+
public let height: Int
|
|
217
|
+
public let bitsPerComponent: Int
|
|
218
|
+
public let bytesPerRow: Int
|
|
219
|
+
public let colorSpace: CGColorSpace?
|
|
220
|
+
public let bitmapInfo: UInt32
|
|
221
|
+
public var alphaInfo: CGImageAlphaInfo { CGImageAlphaInfo(rawValue: bitmapInfo & 0x1F) ?? .premultipliedLast }
|
|
222
|
+
public var interpolationQuality: CGInterpolationQuality = .default
|
|
223
|
+
/// The bitmap's memory. The pixels are the page's, so this is never drawn
|
|
224
|
+
/// into: a context made without memory gets zeroed memory of its size on
|
|
225
|
+
/// first use, which also identifies the context to Accelerate's vImage
|
|
226
|
+
/// functions (they turn a convolution of it into a recipe step).
|
|
227
|
+
public var data: UnsafeMutableRawPointer? {
|
|
228
|
+
if let providedData { return providedData }
|
|
229
|
+
if let ownedData { return ownedData }
|
|
230
|
+
let size = max(1, bytesPerRow * height)
|
|
231
|
+
let memory = UnsafeMutableRawPointer.allocate(byteCount: size, alignment: 16)
|
|
232
|
+
memory.initializeMemory(as: UInt8.self, repeating: 0, count: size)
|
|
233
|
+
ownedData = memory
|
|
234
|
+
Self.registry[memory] = _WeakContext(self)
|
|
235
|
+
return memory
|
|
236
|
+
}
|
|
237
|
+
private let providedData: UnsafeMutableRawPointer?
|
|
238
|
+
private var ownedData: UnsafeMutableRawPointer?
|
|
239
|
+
|
|
240
|
+
final class _WeakContext { weak var context: CGContext?; init(_ context: CGContext) { self.context = context } }
|
|
241
|
+
nonisolated(unsafe) static var registry: [UnsafeMutableRawPointer: _WeakContext] = [:]
|
|
242
|
+
|
|
243
|
+
/// The context whose `data` this is, if any.
|
|
244
|
+
public static func _context(withData data: UnsafeMutableRawPointer?) -> CGContext? {
|
|
245
|
+
guard let data else { return nil }
|
|
246
|
+
return registry[data]?.context
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
deinit {
|
|
250
|
+
for memory in [providedData, ownedData].compactMap({ $0 }) where Self.registry[memory]?.context == nil || Self.registry[memory]?.context === self {
|
|
251
|
+
Self.registry[memory] = nil
|
|
252
|
+
}
|
|
253
|
+
ownedData?.deallocate()
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/// The image drawn last, already placed in the canvas (y up, as Core Graphics draws).
|
|
257
|
+
private var content: _ImageRecipe?
|
|
258
|
+
/// Whether `content` is the image drawn last exactly as it was (drawn at its own size, at the origin).
|
|
259
|
+
private var contentIsUntouched = false
|
|
260
|
+
private var contentSource: CGImage?
|
|
261
|
+
private var ctm: CGAffineTransform = .identity
|
|
262
|
+
private var path: [CGPath.Shape] = []
|
|
263
|
+
private var clipShape: CGPath.Shape?
|
|
264
|
+
private var states: [(CGAffineTransform, CGPath.Shape?)] = []
|
|
265
|
+
|
|
266
|
+
public init?(data: UnsafeMutableRawPointer?, width: Int, height: Int, bitsPerComponent: Int, bytesPerRow: Int, space: CGColorSpace, bitmapInfo: UInt32) {
|
|
267
|
+
guard width > 0, height > 0 else { return nil }
|
|
268
|
+
providedData = data
|
|
269
|
+
self.width = width
|
|
270
|
+
self.height = height
|
|
271
|
+
self.bitsPerComponent = bitsPerComponent
|
|
272
|
+
self.bytesPerRow = bytesPerRow
|
|
273
|
+
self.colorSpace = space
|
|
274
|
+
self.bitmapInfo = bitmapInfo
|
|
275
|
+
if let data { Self.registry[data] = _WeakContext(self) }
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
var canvas: CGRect { CGRect(x: 0, y: 0, width: Double(width), height: Double(height)) }
|
|
279
|
+
|
|
280
|
+
/// Draws `image` scaled into `rect`, through the current transform and clip.
|
|
281
|
+
public func draw(_ image: CGImage, in rect: CGRect, byTiling: Bool = false) {
|
|
282
|
+
let target = rect.applying(ctm)
|
|
283
|
+
let source = image._recipe
|
|
284
|
+
let w = Double(image.width), h = Double(image.height)
|
|
285
|
+
guard w > 0, h > 0, target.width > 0, target.height > 0 else { return }
|
|
286
|
+
var recipe = source
|
|
287
|
+
let identity = target == CGRect(x: 0, y: 0, width: w, height: h)
|
|
288
|
+
if !identity {
|
|
289
|
+
recipe = recipe.adding(.object([
|
|
290
|
+
"op": .string("place"),
|
|
291
|
+
"sx": .number(target.width / w), "sy": .number(target.height / h),
|
|
292
|
+
"tx": .number(target.minX), "ty": .number(target.minY),
|
|
293
|
+
]), extent: target)
|
|
294
|
+
}
|
|
295
|
+
if let clipShape { recipe = Self.clipped(recipe, to: clipShape) }
|
|
296
|
+
content = recipe
|
|
297
|
+
contentIsUntouched = identity && clipShape == nil
|
|
298
|
+
contentSource = image
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
static func clipped(_ recipe: _ImageRecipe, to shape: CGPath.Shape) -> _ImageRecipe {
|
|
302
|
+
let (rect, rx, ry): (CGRect, CGFloat, CGFloat) = switch shape {
|
|
303
|
+
case .rect(let r): (r, 0, 0)
|
|
304
|
+
case .roundedRect(let r, let cw, let ch): (r, cw, ch)
|
|
305
|
+
case .ellipse(let r): (r, r.width / 2, r.height / 2)
|
|
306
|
+
}
|
|
307
|
+
let extent = recipe.extent.intersection(rect)
|
|
308
|
+
return recipe.adding(.object([
|
|
309
|
+
"op": .string("roundedClip"),
|
|
310
|
+
"x": .number(rect.minX), "y": .number(rect.minY), "width": .number(rect.width), "height": .number(rect.height),
|
|
311
|
+
"rx": .number(rx), "ry": .number(ry),
|
|
312
|
+
]), extent: extent.isNull ? .zero : extent)
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/// What vImage's box convolution makes of `source`'s pixels in this
|
|
316
|
+
/// context: `source`'s canvas, blurred. A box of k pixels has the variance
|
|
317
|
+
/// of a Gaussian with σ² = (k² − 1) / 12, so each pass is a `gaussianBlur`
|
|
318
|
+
/// step of that radius (passes compose as their variances add). Edge
|
|
319
|
+
/// extension is a `clamp` first.
|
|
320
|
+
public func _boxConvolve(from source: CGContext, kernelWidth: Int, kernelHeight: Int, extendEdges: Bool) {
|
|
321
|
+
guard let sourceContent = source.content else {
|
|
322
|
+
content = nil
|
|
323
|
+
contentIsUntouched = false
|
|
324
|
+
contentSource = nil
|
|
325
|
+
return
|
|
326
|
+
}
|
|
327
|
+
let k2 = (Double(kernelWidth * kernelWidth) + Double(kernelHeight * kernelHeight)) / 2
|
|
328
|
+
let sigma = ((k2 - 1) / 12).squareRoot()
|
|
329
|
+
let canvas = source.canvas
|
|
330
|
+
func crop(_ r: CGRect) -> _JSON {
|
|
331
|
+
.object(["op": .string("crop"), "x": .number(r.minX), "y": .number(r.minY), "width": .number(r.width), "height": .number(r.height)])
|
|
332
|
+
}
|
|
333
|
+
var recipe = sourceContent.adding(crop(canvas), extent: canvas.intersection(sourceContent.extent))
|
|
334
|
+
if extendEdges { recipe = recipe.adding(.object(["op": .string("clamp")]), extent: .infinite) }
|
|
335
|
+
if sigma > 0 { recipe = recipe.adding(.object(["op": .string("gaussianBlur"), "radius": .number(sigma)]), extent: recipe.extent) }
|
|
336
|
+
content = recipe.adding(crop(self.canvas), extent: self.canvas)
|
|
337
|
+
contentIsUntouched = false
|
|
338
|
+
contentSource = nil
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/// The canvas as an image: what was drawn, cut to the canvas.
|
|
342
|
+
public func makeImage() -> CGImage? {
|
|
343
|
+
guard let content else {
|
|
344
|
+
return CGImage(_recipe: _ImageRecipe(source: nil, extent: canvas))
|
|
345
|
+
}
|
|
346
|
+
if contentIsUntouched, let contentSource, contentSource.width == width, contentSource.height == height {
|
|
347
|
+
return contentSource
|
|
348
|
+
}
|
|
349
|
+
guard let rendered = content.rendered(in: canvas) else { return nil }
|
|
350
|
+
return CGImage(_recipe: rendered)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Paths and clipping
|
|
354
|
+
|
|
355
|
+
public func addPath(_ path: CGPath) { self.path += path.shapes.map { transformed($0) } }
|
|
356
|
+
public func addRect(_ rect: CGRect) { path.append(.rect(rect.applying(ctm))) }
|
|
357
|
+
public func addEllipse(in rect: CGRect) { path.append(.ellipse(rect.applying(ctm))) }
|
|
358
|
+
public func beginPath() { path = [] }
|
|
359
|
+
public func closePath() {}
|
|
360
|
+
public func move(to point: CGPoint) {}
|
|
361
|
+
public func addLine(to point: CGPoint) {}
|
|
362
|
+
|
|
363
|
+
private func transformed(_ shape: CGPath.Shape) -> CGPath.Shape {
|
|
364
|
+
switch shape {
|
|
365
|
+
case .rect(let r): .rect(r.applying(ctm))
|
|
366
|
+
case .ellipse(let r): .ellipse(r.applying(ctm))
|
|
367
|
+
case .roundedRect(let r, let cw, let ch): .roundedRect(r.applying(ctm), cornerWidth: cw * ctm.a, cornerHeight: ch * ctm.d)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/// Clips to the current path (its first shape) and empties the path.
|
|
372
|
+
public func clip(using rule: CGPathFillRule = .winding) {
|
|
373
|
+
if let shape = path.first { clipShape = shape }
|
|
374
|
+
path = []
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
public func clip(to rect: CGRect) { clipShape = .rect(rect.applying(ctm)) }
|
|
378
|
+
|
|
379
|
+
// State and transforms
|
|
380
|
+
|
|
381
|
+
public func saveGState() { states.append((ctm, clipShape)) }
|
|
382
|
+
public func restoreGState() { if let (t, c) = states.popLast() { ctm = t; clipShape = c } }
|
|
383
|
+
public func translateBy(x: CGFloat, y: CGFloat) { ctm = CGAffineTransform(translationX: x, y: y).concatenating(ctm) }
|
|
384
|
+
public func scaleBy(x: CGFloat, y: CGFloat) { ctm = CGAffineTransform(scaleX: x, y: y).concatenating(ctm) }
|
|
385
|
+
public func rotate(by angle: CGFloat) { ctm = CGAffineTransform(rotationAngle: angle).concatenating(ctm) }
|
|
386
|
+
public func concatenate(_ transform: CGAffineTransform) { ctm = transform.concatenating(ctm) }
|
|
387
|
+
public var ctm_: CGAffineTransform { ctm }
|
|
388
|
+
public var userSpaceToDeviceSpaceTransform: CGAffineTransform { ctm }
|
|
389
|
+
|
|
390
|
+
// Painting: accepted and not drawn (the page draws bitmaps, not vector paint).
|
|
391
|
+
|
|
392
|
+
public func setFillColor(_ color: CGColor) {}
|
|
393
|
+
public func setStrokeColor(_ color: CGColor) {}
|
|
394
|
+
public func setLineWidth(_ width: CGFloat) {}
|
|
395
|
+
public func setLineCap(_ cap: CGLineCap) {}
|
|
396
|
+
public func setLineJoin(_ join: CGLineJoin) {}
|
|
397
|
+
public func setAlpha(_ alpha: CGFloat) {}
|
|
398
|
+
public func setBlendMode(_ mode: CGBlendMode) {}
|
|
399
|
+
public func setShouldAntialias(_ value: Bool) {}
|
|
400
|
+
public func setAllowsAntialiasing(_ value: Bool) {}
|
|
401
|
+
public func fill(_ rect: CGRect) {}
|
|
402
|
+
public func fill(_ rects: [CGRect]) {}
|
|
403
|
+
public func fillPath(using rule: CGPathFillRule = .winding) { path = [] }
|
|
404
|
+
public func strokePath() { path = [] }
|
|
405
|
+
public func stroke(_ rect: CGRect) {}
|
|
406
|
+
public func stroke(_ rect: CGRect, width: CGFloat) {}
|
|
407
|
+
public func fillEllipse(in rect: CGRect) {}
|
|
408
|
+
public func strokeEllipse(in rect: CGRect) {}
|
|
409
|
+
public func clear(_ rect: CGRect) {}
|
|
410
|
+
public func flush() {}
|
|
411
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// SwiftUI's transforms that take Core Graphics' affine transform. On Apple
|
|
2
|
+
// platforms SwiftUI imports Core Graphics; here Core Graphics builds on the
|
|
3
|
+
// SwiftUI shim, so the conversions live on this side.
|
|
4
|
+
|
|
5
|
+
import SwiftUI
|
|
6
|
+
|
|
7
|
+
extension ProjectionTransform {
|
|
8
|
+
/// The affine transform as a projection: (a b 0 / c d 0 / tx ty 1).
|
|
9
|
+
public init(_ m: CGAffineTransform) {
|
|
10
|
+
self.init()
|
|
11
|
+
(m11, m12, m21, m22, m31, m32) = (m.a, m.b, m.c, m.d, m.tx, m.ty)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
extension CGAffineTransform {
|
|
16
|
+
/// The affine part of a projection.
|
|
17
|
+
public init(_ m: ProjectionTransform) {
|
|
18
|
+
self.init(a: m.m11, b: m.m12, c: m.m21, d: m.m22, tx: m.m31, ty: m.m32)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
nonisolated extension View {
|
|
23
|
+
/// Draws the view through `transform` about its top-leading corner (an
|
|
24
|
+
/// offset, a rotation and a scale; a shear draws untransformed).
|
|
25
|
+
public func transformEffect(_ transform: CGAffineTransform) -> some View {
|
|
26
|
+
projectionEffect(ProjectionTransform(transform))
|
|
27
|
+
}
|
|
28
|
+
}
|