Skip to content

Add a cross-import overlay with AppKit to allow attaching NSImages. #869

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 8 commits into from
Jul 2, 2025

Conversation

grynspan
Copy link
Contributor

@grynspan grynspan commented Dec 19, 2024

This PR adds on to the Core Graphics cross-import overlay added in #827 to allow attaching instances of NSImage to a test.

NSImage is a more complicated animal because it is not Sendable, but we don't want to make a (potentially very expensive) deep copy of its data until absolutely necessary. So we check inside the image to see if its contained representations are known to be safely copyable (i.e. copies made with NSCopying do not share any mutable state with their originals.) If it looks safe to make a copy of the image by calling copy(), we do so; otherwise, we try to make a deep copy of the image.

Due to how Swift implements polymorphism in protocol requirements, and because we don't really know what they're doing, subclasses of NSImage just get a call to copy() instead of deep introspection.

UIImage support will be implemented in a separate PR.

Note

Image attachments remain an experimental feature.

Checklist:

  • Code and documentation should follow the style of the Style Guide.
  • If public symbols are renamed or modified, DocC references should be updated.

@grynspan grynspan added enhancement New feature or request darwin 🍎 macOS, iOS, watchOS, tvOS, and visionOS support public-api Affects public API attachments/activities 🖇️ Work related to attachments and/or activities labels Dec 19, 2024
@grynspan grynspan added this to the Swift 6.x milestone Dec 19, 2024
@grynspan grynspan self-assigned this Dec 19, 2024
@grynspan
Copy link
Contributor Author

@swift-ci test

@grynspan grynspan modified the milestones: Swift 6.2, Swift 6.x Apr 6, 2025
@grynspan grynspan added the cross-import-overlays 🍰 Cross-import overlays (Foundation, Core Graphics, etc.) label May 14, 2025
This PR adds on to the Core Graphics cross-import overlay added in #827 to allow attaching
instances of `NSImage` to a test.

`NSImage` is a more complicated animal because it is not `Sendable`, but we don't want to
make a (potentially very expensive) deep copy of its data until absolutely necessary. So
we check inside the image to see if its contained representations are known to be safely
copyable (i.e. copies made with `NSCopying` do not share any mutable state with their
originals.) If it looks safe to make a copy of the image by calling `copy()`, we do so;
otherwise, we try to make a deep copy of the image.

Due to how Swift implements polymorphism in protocol requirements, and because we don't
really know what they're doing, subclasses of `NSImage` just get a call to `copy()`
instead of deep introspection.

`UIImage` support will be implemented in a separate PR.

> [!NOTE]
> Attachments remain an experimental feature.
@grynspan grynspan force-pushed the jgrynspan/nsimage-attachments branch from 5b3df04 to 122e117 Compare May 20, 2025 17:00
@grynspan
Copy link
Contributor Author

grynspan commented Jul 2, 2025

@swift-ci test

@grynspan
Copy link
Contributor Author

grynspan commented Jul 2, 2025

@swift-ci test Linux

@grynspan
Copy link
Contributor Author

grynspan commented Jul 2, 2025

@swift-ci test

1 similar comment
@grynspan
Copy link
Contributor Author

grynspan commented Jul 2, 2025

@swift-ci test

@grynspan grynspan merged commit 49099a2 into main Jul 2, 2025
3 checks passed
@grynspan grynspan deleted the jgrynspan/nsimage-attachments branch July 2, 2025 18:13
Copy link
Contributor

@stmontgomery stmontgomery left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I know it's already merged but I had just a couple small comments that are relevant now but weren't when the PR was first posted. Hopefully we can do a fix-up PR or incorporate them into some follow-up work.

grynspan added a commit that referenced this pull request Jul 2, 2025
The PR (#869) that just added the AppKit overlay for `NSImage` was a bit stale.
This PR corrects a couple of bugs that snuck in due to its age and the resulting
bit rot.
grynspan added a commit that referenced this pull request Jul 2, 2025
The PR (#869) that just added the AppKit overlay for `NSImage` was a bit
stale. This PR corrects a couple of bugs that snuck in due to its age
and the resulting bit rot.

### Checklist:

- [x] Code and documentation should follow the style of the [Style
Guide](https://github.com/apple/swift-testing/blob/main/Documentation/StyleGuide.md).
- [x] If public symbols are renamed or modified, DocC references should
be updated.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
attachments/activities 🖇️ Work related to attachments and/or activities cross-import-overlays 🍰 Cross-import overlays (Foundation, Core Graphics, etc.) darwin 🍎 macOS, iOS, watchOS, tvOS, and visionOS support enhancement New feature or request public-api Affects public API
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants