Implement growing logic for TextAtlas
The `TextAtlas` will have an initial size of `256` (we could make this configurable) and `try_allocate` will keep track of the glyphs in use in the current frame, returning `None` when the LRU glyph is in use. In that case, `TextRenderer::prepare` will return `PrepareError::AtlasFull` with the `ContentType` of the atlas that is full. The user of the library can then call `TextAtlas::grow` with the provided `ContentType` to obtain a bigger atlas (by `256`). A `TextAtlas::grow` call clears the whole atlas and, as a result, all of the `prepare` calls need to be repeated in a frame until they all succeed. Overall, the atlas will rarely need to grow and so the calls will not need to be repated often. Finally, the user needs to call `TextAtlas::trim` at the end of the frame. This allows us to clear the glyphs in use collection in the atlas. Maybe there is a better way to model this in an API that forces the user to trim the atlas (e.g. make `trim` return a new type and changing `prepare` and `render` to take that type instead).
This commit is contained in:
parent
d20643702f
commit
a74ce29c1a
5 changed files with 159 additions and 59 deletions
|
@ -1,3 +1,4 @@
|
|||
use crate::ContentType;
|
||||
use std::{
|
||||
error::Error,
|
||||
fmt::{self, Display, Formatter},
|
||||
|
@ -6,7 +7,7 @@ use std::{
|
|||
/// An error that occurred while preparing text for rendering.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||
pub enum PrepareError {
|
||||
AtlasFull,
|
||||
AtlasFull(ContentType),
|
||||
}
|
||||
|
||||
impl Display for PrepareError {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue