Commit Graph

294 Commits

Author SHA1 Message Date
Emil Ernerfeldt e71d09aafd Code cleanup 2025-04-01 18:49:36 +02:00
Emil Ernerfeldt 6a5f6d3f86 cargo fmt 2025-04-01 18:41:39 +02:00
Hubert Głuchowski ff9dfdeec1 Keep track of dependencies between GalleyCaches and keep them alive 2025-04-01 18:14:39 +02:00
Hubert Głuchowski 9d61f9c927 Fix some typos 2025-04-01 16:32:42 +02:00
Hubert Głuchowski ff0e7d03f4 Don't add merged Galley to galley cache 2025-04-01 16:32:42 +02:00
Hubert Głuchowski 48e4e8ca92 Don't round row sizes again in Galley::concat 2025-04-01 16:32:42 +02:00
Emil Ernerfeldt 00ed9c1547 Be more forgiving in our comparison 2025-03-30 20:29:52 +02:00
Emil Ernerfeldt a72e10ab23 Remove outdated TODO 2025-03-30 20:18:06 +02:00
Emil Ernerfeldt 8a33a6a6ce Make the section index private so we don't need to calculate it corectly 2025-03-30 20:03:47 +02:00
Emil Ernerfeldt 22ea9e91bd Optimize concat 2025-03-30 19:48:10 +02:00
Emil Ernerfeldt d74bee536f Fix first performance performance problem 2025-03-30 18:54:15 +02:00
Emil Ernerfeldt f4fca5a117 Better handling of invisible underlines/strikethrough 2025-03-30 17:52:48 +02:00
Emil Ernerfeldt 5f01b0dc9d Round glyph to closes pixel 2025-03-30 17:52:29 +02:00
Emil Ernerfeldt 20667a0592 put PlacedRow::pos first in struct 2025-03-30 17:52:13 +02:00
Emil Ernerfeldt 1b1f0726ce Simplify Galley bounding rect calulcation 2025-03-30 17:23:21 +02:00
Emil Ernerfeldt 9e44490b31 Refactor galley size rounding 2025-03-30 17:13:39 +02:00
Emil Ernerfeldt b0d0d2f279 Test that halign & justify works the same 2025-03-30 16:58:19 +02:00
Emil Ernerfeldt 4ee4572f02 Fix bug in code transforming TextShape 2025-03-30 16:50:05 +02:00
Emil Ernerfeldt 7824e2ac18 Implement MulAssign for Pos2 2025-03-30 16:41:20 +02:00
Emil Ernerfeldt 3d70f7289a Small code cleanup 2025-03-30 16:37:43 +02:00
Emil Ernerfeldt 88340eee76 Merge branch 'master' into cache_galley_lines 2025-03-30 16:36:54 +02:00
Emil Ernerfeldt e275409eb1 Fix: transform TextShape underline width (#5865)
Minor bug fix when transforming a `TextShape` with a `underline` (used
for e.g. hyperlinks). Before the underline width would not scale
properly; now it will.
2025-03-30 16:36:03 +02:00
Emil Ernerfeldt 072c8fc8ed Merge branch 'master' into cache_galley_lines 2025-03-30 16:22:59 +02:00
Emil Ernerfeldt e3acd71090 Make text background rects pixel-sharp (#5864)
Small visual teak: make sure the background text color is pixel-aligned.
2025-03-30 16:21:00 +02:00
Hank Jordan 943e3618fc Improve drag-to-select text (add margins) (#5797)
Might want to draw from `interaction.interact_radius` style instead of
hard-coding the margin, but I didn't want to create a breaking change.
If desired, I can follow up with a separate PR to address that concern.

* Closes <https://github.com/emilk/egui/issues/5796>
* [x] I have followed the instructions in the PR template
2025-03-30 14:03:19 +02:00
Emil Ernerfeldt 83254718a3 Clean up strikethrough/underline code in epaint 2025-03-30 13:15:41 +02:00
Emil Ernerfeldt 7ea3f762b8 Make text underline and strikethrough pixel perfect crisp (#5857)
Small visual fix: pixel-align any text underline or strikethrough.
Before they could be often be blurry.
2025-03-28 20:37:38 +01:00
Emil Ernerfeldt 5ecc31885c Pre-existing bug fix: round strikethrough and underline to pixel coord 2025-03-28 20:24:33 +01:00
Emil Ernerfeldt ed847f1a55 Refactor: create Stroke::round_center_to_pixel 2025-03-28 20:22:10 +01:00
Emil Ernerfeldt 25f647322e Make test a bit more forgiving 2025-03-28 20:08:47 +01:00
Emil Ernerfeldt cbc3c33051 Don't round row positions to ui 2025-03-28 20:05:03 +01:00
Emil Ernerfeldt 1cdf525797 Remove dbg! 2025-03-28 16:10:49 +01:00
Emil Ernerfeldt 33ff4bd7da Simplify 2025-03-28 16:09:40 +01:00
Emil Ernerfeldt 2fb0764a24 Fix section_index 2025-03-28 16:08:46 +01:00
Emil Ernerfeldt b060fd25b0 Remove unwraps 2025-03-28 16:08:35 +01:00
Emil Ernerfeldt 46ef7a1159 code cleanup 2025-03-28 15:55:23 +01:00
Emil Ernerfeldt 47f916ca80 Fix wrong mesh_bounds 2025-03-28 15:34:00 +01:00
Emil Ernerfeldt 947945f0ba Remove done TODO 2025-03-28 15:13:57 +01:00
Emil Ernerfeldt 79d114dfb0 Use similar-asserts for better test output 2025-03-28 15:11:30 +01:00
Emil Ernerfeldt 2ac4c93cc3 Move Galley::concat 2025-03-28 12:54:53 +01:00
Emil Ernerfeldt 29d47c1641 Clean up code slightly 2025-03-28 12:52:07 +01:00
Emil Ernerfeldt 6f4732b068 Simplify the code slightly 2025-03-28 12:38:55 +01:00
Emil Ernerfeldt 3e89613dc1 Add messages to asserts 2025-03-28 12:29:12 +01:00
Emil Ernerfeldt 8a45db62f1 Create should_cache_each_paragraph_individually and heed max_rows 2025-03-28 11:33:56 +01:00
Hubert Głuchowski 085d9b56e9 Merge branch 'master' into cache_galley_lines 2025-03-26 19:08:40 +01:00
Nicolas 58b2ac88c0 Add assert messages and print bad argument values in asserts (#5216)
Enabled the `missing_assert_message` lint

* [x] I have followed the instructions in the PR template

---------

Co-authored-by: Lucas Meurer <lucasmeurer96@gmail.com>
2025-03-25 09:20:29 +01:00
GiGaGon 668abc2838 Add expand_bg to customize size of text background (#5365)
This removes the `expand(1.0)` on text background colors, since it makes
translucent background colors have bad looking bleeding.

There is probably a smarter solution than disabling the highlighting
entirely, but I don't see a way to do that while keeping the area
consumed consistent between translucent/solid colors, or adding a decent
step up in complexity.

Since this makes it impossible to tell if selected text is highlighted,
this also adds a blanket `0.5` gamma multiply to the text selection
background color. If that is undesirable because it's a bad arbitrary
number choice, or if it's too much of an unexpected change and just the
default values should be changed, please let me know.

These changes cause the tests that use screenshots with highlighted text
to fail, though I am not sure how to update those tests to match the
changes.

<details>
<summary>Comparison Images</summary>

Current:


![image](https://github.com/user-attachments/assets/6dc85492-4f8e-4e7a-84b4-3ee10a48b8b3)

After changes:


![image](https://github.com/user-attachments/assets/9b35bbd3-159d-42a9-b22f-80febb707cfa)
 

</details>

<details>
<summary>Code used to make comparison images</summary>

```rs
fn color_text_format(ui: &Ui, color: Color32) -> TextFormat {
    TextFormat { font_id: FontId::monospace(ui.text_style_height(&egui::TextStyle::Monospace)), background: color, ..Default::default() }
}

fn color_sequence_galley(ui: &Ui, text: &str, colors: [Color32; 3]) -> Arc<Galley> {
    let mut layout_job = LayoutJob::default();
    for color in colors {
        layout_job.append(text, 0.0, color_text_format(ui, color));
    }
    ui.fonts(|f| f.layout_job(layout_job))
}

fn color_sequence_row(ui: &mut Ui, label_text: &str, text: &str, colors: [Color32; 3]) {
    ui.label(label_text);
    ui.label(color_sequence_galley(ui, text, colors));
    ui.end_row();
}

egui::Grid::new("comparison display").show(ui, |ui| {
    ui.ctx().set_pixels_per_point(2.0);
    let transparent = Color32::TRANSPARENT;
    let solid = Color32::RED;
    let solid_2 = Color32::GREEN;
    let translucent_1 = Color32::GRAY.gamma_multiply(0.5);
    let translucent_2 = Color32::GREEN.gamma_multiply(0.5);
    color_sequence_row(ui, "Transparent to Solid:", " ", [transparent, solid, transparent]);
    color_sequence_row(ui, "Translucent to Transparent:", " ", [transparent, translucent_1, transparent]);
    color_sequence_row(ui, "Solid to Transparent:", " ", [solid, solid_2, solid]);
    color_sequence_row(ui, "Solid to Solid:", " ", [solid, transparent, solid]);
    color_sequence_row(ui, "Solid to Translucent:", " ", [solid, translucent_1, solid]);
    color_sequence_row(ui, "Translucent to Translucent:", " ", [translucent_1, translucent_2, translucent_1]);
    
    color_sequence_row(ui, "Transparent to Solid:", "a", [transparent, solid, transparent]);
    color_sequence_row(ui, "Translucent to Transparent:", "a", [transparent, translucent_1, transparent]);
    color_sequence_row(ui, "Solid to Transparent:", "a", [solid, solid_2, solid]);
    color_sequence_row(ui, "Solid to Solid:", "a", [solid, transparent, solid]);
    color_sequence_row(ui, "Solid to Translucent:", "a", [solid, translucent_1, solid]);
    color_sequence_row(ui, "Translucent to Translucent:", "a", [translucent_1, translucent_2, translucent_1]);
})
```
</details>

* [x] I have followed the instructions in the PR template

---------

Co-authored-by: Emil Ernerfeldt <emil.ernerfeldt@gmail.com>
2025-03-21 13:45:34 +01:00
Emil Ernerfeldt 2058dcb881 Improve text sharpness (#5838)
This improves the sharpness of text slightly, thanks to
<https://hikogui.org/2022/10/24/the-trouble-with-anti-aliasing.html> by
@hikogui (🙏 ).

The difference is very small, but in dark mode (bright text on dark
background) text is sometimes significantly sharper, and also slightly
brighter.

The difference in light mode (dark text on light background) is much
smaller (barely perceptable).

To compare the before/after I suggest you open both in new tabs, then
quickly change between them.

### Low-DPI
#### Before
![Code Editor
old](https://github.com/user-attachments/assets/e10a3cad-932f-48cd-b7d6-5bfe70954c5e)

#### After
![Code
Editor](https://github.com/user-attachments/assets/2e7383fe-8023-4425-91c8-93df3c22c0fe)

#### Before

![old-white](https://github.com/user-attachments/assets/51c41c59-e897-4831-857a-f3ffe17ce7d4)

#### After

![new-white](https://github.com/user-attachments/assets/4ac6f951-8c57-4bcc-a5d5-788cf52ea7d8)

### High-DPI
The difference is starkest on low-DPI screens (like the above
screenshots). On high-DPI screens, the difference is much smaller

#### Before
![widget_gallery
old](https://github.com/user-attachments/assets/f2149a30-aef8-4383-b48c-73d33a03ca02)

#### After

![widget_gallery](https://github.com/user-attachments/assets/c9ceb8be-8a32-490c-9364-2c6562b741f6)
2025-03-21 12:56:47 +01:00
StratusFearMe21 52732b23a6 impl AsRef<[u8]> for FontData (#5757)
* [x] I have followed the instructions in the PR template

This PR implements `AsRef<[u8]>` for `FontData`, allowing it to be
passed into `fontdb`'s
[`Source`](https://docs.rs/fontdb/0.16.2/fontdb/enum.Source.html) type.
This would allow `egui` and `cosmic_text` to share font data with
eachother
2025-03-20 11:03:17 +01:00
valadaptive 267485976b Simplify the text cursor API (#5785)
<!--
Please read the "Making a PR" section of
[`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md)
before opening a Pull Request!

* Keep your PR:s small and focused.
* The PR title is what ends up in the changelog, so make it descriptive!
* If applicable, add a screenshot or gif.
* If it is a non-trivial addition, consider adding a demo for it to
`egui_demo_lib`, or a new example.
* Do NOT open PR:s from your `master` branch, as that makes it hard for
maintainers to test and add commits to your PR.
* Remember to run `cargo fmt` and `cargo clippy`.
* Open the PR as a draft until you have self-reviewed it and run
`./scripts/check.sh`.
* When you have addressed a PR comment, mark it as resolved.

Please be patient! I will review your PR, but my time is limited!
-->

* Closes N/A, but this is part of
https://github.com/emilk/egui/issues/3378
* [x] I have followed the instructions in the PR template

Other text layout libraries in Rust--namely, Parley and Cosmic
Text--have one canonical text cursor type (Parley's is a byte index,
Cosmic Text's also stores the line index). To prepare for migrating egui
to one of those libraries, it should also have only one text cursor
type. I also think simplifying the API is a good idea in and of
itself--having three different cursor types that you have to convert
between (and a `Cursor` struct which contains all three at once) is
confusing.

After a bit of experimentation, I found that the best cursor type to
coalesce around is `CCursor`. In the few places where we need a
paragraph index or row/column position, we can calculate them as
necessary.

I've removed `CursorRange` and `PCursorRange` (the latter appears to
have never been used), merging the functionality with `CCursorRange`. To
preserve the cursor position when navigating row-by-row, `CCursorRange`
now stores the previous horizontal position of the cursor.

I've also removed `PCursor`, and renamed `RowCursor` to `LayoutCursor`
(since it includes not only the row but the column). I have not renamed
either `CCursorRange` or `CCursor` as those names are used in a lot of
places, and I don't want to clutter this PR with a bunch of renames.
I'll leave it for a later PR.

Finally, I've removed the deprecated methods from `TextEditState`--it
made the refactoring easier, and it should be pretty easy to migrate to
the equivalent `TextCursorState` methods.

I'm not sure how many breaking changes people will actually encounter. A
lot of these APIs were technically public, but I don't think many were
useful. The `TextBuffer` trait now takes `&CCursorRange` instead of
`&CursorRange` in a couple of methods, and I renamed
`CCursorRange::sorted` to `CCursorRange::sorted_cursors` to match
`CursorRange`.

I did encounter a couple of apparent minor bugs when testing out text
cursor behavior, but I checked them against the current version of egui
and they're all pre-existing.
2025-03-20 10:49:38 +01:00