-
Notifications
You must be signed in to change notification settings - Fork 141
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
Add cosmic text example #739
base: main
Are you sure you want to change the base?
Add cosmic text example #739
Conversation
Thanks, it's really good to see this. Would you consider making this a test scene (i.e. in the I think that would be useful because this new example has a lot of interleaving of logic between cosmic text and Vello and winit. If not, I think we can still land this nearly as-is, although it being another usage of winit is likely to cause us pain in future when we need to perform updates. |
Sure, I will do that. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is looking good and runs as expected. Thanks for pulling this together
The exact integration with scenes could be cleaner, given that there's only one scene; if my guidance isn't clear enough, let me know and I can apply it myself.
|
||
for (font_id, index) in font_faces { | ||
if let Some(font) = font_system.get_font(font_id) { | ||
let resource = Arc::new(font.data().to_vec()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There are two allocations here, one to put the data in the vec, and one to allocate the Arc
. The first could be avoided by creating an adapter which implements AsRef<[u8]>
by containing an Arc<Font>
and using the data parameter. The second would use https://docs.rs/bytemuck/latest/bytemuck/allocation/trait.TransparentWrapperAlloc.html#method.wrap_arc, and is definitely out-of-scope.
The best resolution to this would probably be to have a comment: "These allocations are avoidable, but used for simplicity.", maybe with a link to this comment?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Not in time for this patch, but improving this is also a design goal for splitting these resource handles out of Peniko. (linebender/peniko#68)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have used an adapter and added a link to this comment.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
A wrapper/adapter is fine, but we should probably just submit a PR to cosmic-text to make Font
implement AsRef<[u8]>
. Alternatively, the correct type can be obtained using unsafe { font_system.db().make_shared_face_data(font_id).unwrap() }
.
Thanks for the feedback. I will work on this tomorrow. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What needs to happen to get this out of draft? It's looking quite good
} | ||
} | ||
|
||
let text = "おはよう (ja) (ohayō) 🌅✨ (morning), こんにちは (ja) (konnichi wa) ☀️😊 (daytime), こんばんは (ja) (konban wa) 🌙🌟 (evening)"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For future reviewers:
These translations do also appear to be correct.
@@ -20,3 +20,6 @@ pollster = { workspace = true } | |||
env_logger = "0.11.5" | |||
png = "0.17.14" | |||
futures-intrusive = { workspace = true } | |||
|
|||
[features] | |||
cosmic_text = ["scenes/cosmic_text"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Our style is to have a final newline at the end of all files.
(This also applies to the other files where you've chosen to omit this.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This appears to have re-regressed in the same place.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Would you be able to also document that this exists at the top level of the repository, in https://github.com/linebender/vello?tab=readme-ov-file#integrations
} | ||
|
||
// Copied directly from https://github.com/pop-os/cosmic-text/blob/58c2ccd1fb3daf0abc792f9dd52b5766b7125ccd/src/edit/editor.rs#L66 | ||
fn cursor_position(cursor: &Cursor, run: &LayoutRun) -> Option<(i32, i32)> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is exposed via https://docs.rs/cosmic-text/latest/cosmic_text/struct.Editor.html#method.cursor_position; I'd much prefer we used that if at all feasible.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
That function only returns the first cursor. I think the drawing assumes that there may be multi-line cursors. Although, the editor currently only has one cursor.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reason I want that is for licensing. In the form you've currently included it, we would need to include the full System76 MIT license somewhere (or use this section of code only under the Apache 2.0 license, probably moving it into its own file).
Is there anything left here other than what I just commented on? Or is this basically ready to go? It would be nice to land it soon! |
I will rebase this hopefully in the next day or two |
14b9023
to
0a1ebba
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is still blocked on the licensing question for the newly imported code - I'd still prefer us to just avoid importing that code entirely, but I might be missing something.
@@ -146,6 +146,15 @@ A separate Linebender integration for playing Lottie animations is available thr | |||
|
|||
A separate Linebender integration for rendering raw scenes or Lottie and SVG files in [Bevy] through [`bevy_vello`](https://github.com/linebender/bevy_vello). | |||
|
|||
### Cosmic Text | |||
|
|||
An example scene demonstrating the integration of COSMIC text for font loading and text layout through [COSMIC Text Scene](https://github.com/linebender/vello/blob/main/examples/scenes/src/cosmic_text_scene.rs). |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This should probably use a relative path (so that e.g. people viewing this in their editor get the right path). It also lets us double check the link before merging.
See e.g. the links to the license files at the bottom of this file.
I do see that there are other cases in this file where that isn't done - it's fine not to fix that.
@@ -20,3 +20,6 @@ pollster = { workspace = true } | |||
env_logger = "0.11.5" | |||
png = "0.17.14" | |||
futures-intrusive = { workspace = true } | |||
|
|||
[features] | |||
cosmic_text = ["scenes/cosmic_text"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This appears to have re-regressed in the same place.
} | ||
|
||
// Copied directly from https://github.com/pop-os/cosmic-text/blob/58c2ccd1fb3daf0abc792f9dd52b5766b7125ccd/src/edit/editor.rs#L66 | ||
fn cursor_position(cursor: &Cursor, run: &LayoutRun) -> Option<(i32, i32)> { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The reason I want that is for licensing. In the form you've currently included it, we would need to include the full System76 MIT license somewhere (or use this section of code only under the Apache 2.0 license, probably moving it into its own file).
@@ -22,3 +22,6 @@ nv-flip = "0.1.2" | |||
image = { workspace = true, features = ["png"] } | |||
|
|||
scenes = { workspace = true } | |||
|
|||
[features] | |||
cosmic_text = ["scenes/cosmic_text"] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
And here
Add an example for cosmic text.
Related:
306