Compare commits
10 commits
2b1bb980d2
...
c2b2c19ddb
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c2b2c19ddb | ||
|
|
ae0f2e3e3f | ||
|
|
a3f77e251e | ||
|
|
6e75b1ad7e | ||
|
|
0bb8598935 | ||
|
|
e435fc99bc | ||
|
|
34d52bd350 | ||
|
|
832064c012 | ||
|
|
03c6f8dca1 | ||
|
|
356eeeebf5 |
13 changed files with 145 additions and 32 deletions
7
.github/workflows/ci.yml
vendored
7
.github/workflows/ci.yml
vendored
|
|
@ -91,14 +91,17 @@ jobs:
|
||||||
shell: bash
|
shell: bash
|
||||||
run: cargo $CMD build --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES
|
run: cargo $CMD build --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES
|
||||||
|
|
||||||
|
- name: Pin versions of dev-deps
|
||||||
|
if: matrix.rust_version == '1.65.0'
|
||||||
|
run: cargo update -p half --precise 2.2.1
|
||||||
|
|
||||||
- name: Build tests
|
- name: Build tests
|
||||||
shell: bash
|
shell: bash
|
||||||
if: >
|
if: >
|
||||||
!((matrix.platform.os == 'ubuntu-latest') && contains(matrix.platform.target, 'i686')) &&
|
!((matrix.platform.os == 'ubuntu-latest') && contains(matrix.platform.target, 'i686')) &&
|
||||||
!contains(matrix.platform.target, 'redox') &&
|
!contains(matrix.platform.target, 'redox') &&
|
||||||
!contains(matrix.platform.target, 'freebsd') &&
|
!contains(matrix.platform.target, 'freebsd') &&
|
||||||
!contains(matrix.platform.target, 'netbsd') &&
|
!contains(matrix.platform.target, 'netbsd')
|
||||||
matrix.rust_version != '1.65.0'
|
|
||||||
run: cargo $CMD test --no-run --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES
|
run: cargo $CMD test --no-run --verbose --target ${{ matrix.platform.target }} $OPTIONS --features $FEATURES
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
|
|
|
||||||
24
.github/workflows/release.yml
vendored
Normal file
24
.github/workflows/release.yml
vendored
Normal file
|
|
@ -0,0 +1,24 @@
|
||||||
|
name: Release
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- v[0-9]+.*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
create-release:
|
||||||
|
if: github.repository_owner == 'rust-windowing'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: taiki-e/create-gh-release-action@v1
|
||||||
|
with:
|
||||||
|
changelog: CHANGELOG.md
|
||||||
|
branch: master
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
||||||
|
- name: Publish to crates.io
|
||||||
|
run: cargo publish --token ${{ secrets.CRATES_IO_API_TOKEN }}
|
||||||
|
|
@ -1,7 +1,12 @@
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
- On MacOS, Fix double-free of `NSWindow`.
|
- On MacOS, Fix double-free of `NSWindow`. (#180)
|
||||||
- On Web, add support for more `RawWindowHandle` variants.
|
- On Web, add support for more `RawWindowHandle` variants. (#188)
|
||||||
|
- On Wayland, fix buffer age. (#191)
|
||||||
|
- Update `drm` to 0.11 (#178)
|
||||||
|
* Fixes build on architectures where drm-rs did not have generated bindings.
|
||||||
|
- Update x11rb to v0.13 (#183)
|
||||||
|
- On Orbital, fix window resize.
|
||||||
|
|
||||||
# 0.4.0
|
# 0.4.0
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "softbuffer"
|
name = "softbuffer"
|
||||||
version = "0.4.0"
|
version = "0.4.1"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT OR Apache-2.0"
|
license = "MIT OR Apache-2.0"
|
||||||
description = "Cross-platform software buffer"
|
description = "Cross-platform software buffer"
|
||||||
|
|
@ -70,7 +70,7 @@ features = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[target.'cfg(target_os = "redox")'.dependencies]
|
[target.'cfg(target_os = "redox")'.dependencies]
|
||||||
redox_syscall = "0.4"
|
redox_syscall = "0.5"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cfg_aliases = "0.2.0"
|
cfg_aliases = "0.2.0"
|
||||||
|
|
|
||||||
10
src/cg.rs
10
src/cg.rs
|
|
@ -30,7 +30,7 @@ pub struct CGImpl<D, W> {
|
||||||
window: id,
|
window: id,
|
||||||
color_space: CGColorSpace,
|
color_space: CGColorSpace,
|
||||||
size: Option<(NonZeroU32, NonZeroU32)>,
|
size: Option<(NonZeroU32, NonZeroU32)>,
|
||||||
_window_source: W,
|
window_handle: W,
|
||||||
_display: PhantomData<D>,
|
_display: PhantomData<D>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -62,10 +62,16 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> CGImpl<D, W> {
|
||||||
color_space,
|
color_space,
|
||||||
size: None,
|
size: None,
|
||||||
_display: PhantomData,
|
_display: PhantomData,
|
||||||
_window_source: window_src,
|
window_handle: window_src,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
||||||
self.size = Some((width, height));
|
self.size = Some((width, height));
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
||||||
10
src/kms.rs
10
src/kms.rs
|
|
@ -73,7 +73,7 @@ pub(crate) struct KmsImpl<D: ?Sized, W: ?Sized> {
|
||||||
buffer: Option<Buffers>,
|
buffer: Option<Buffers>,
|
||||||
|
|
||||||
/// Window handle that we are keeping around.
|
/// Window handle that we are keeping around.
|
||||||
_window: W,
|
window_handle: W,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
|
|
@ -200,10 +200,16 @@ impl<D: ?Sized, W: HasWindowHandle> KmsImpl<D, W> {
|
||||||
connectors,
|
connectors,
|
||||||
display,
|
display,
|
||||||
buffer: None,
|
buffer: None,
|
||||||
_window: window,
|
window_handle: window,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
/// Resize the internal buffer to the given size.
|
/// Resize the internal buffer to the given size.
|
||||||
pub(crate) fn resize(
|
pub(crate) fn resize(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
|
||||||
30
src/lib.rs
30
src/lib.rs
|
|
@ -86,6 +86,15 @@ macro_rules! make_dispatch {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D: HasDisplayHandle, W: HasWindowHandle> SurfaceDispatch<D, W> {
|
impl<D: HasDisplayHandle, W: HasWindowHandle> SurfaceDispatch<D, W> {
|
||||||
|
fn window(&self) -> &W {
|
||||||
|
match self {
|
||||||
|
$(
|
||||||
|
$(#[$attr])*
|
||||||
|
Self::$name(inner) => inner.window(),
|
||||||
|
)*
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
||||||
match self {
|
match self {
|
||||||
$(
|
$(
|
||||||
|
|
@ -311,6 +320,11 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> Surface<D, W> {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get a reference to the underlying window handle.
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
self.surface_impl.window()
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the size of the buffer that will be returned by [`Surface::buffer_mut`].
|
/// Set the size of the buffer that will be returned by [`Surface::buffer_mut`].
|
||||||
///
|
///
|
||||||
/// If the size of the buffer does not match the size of the window, the buffer is drawn
|
/// If the size of the buffer does not match the size of the window, the buffer is drawn
|
||||||
|
|
@ -350,6 +364,22 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> Surface<D, W> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<D: HasDisplayHandle, W: HasWindowHandle> AsRef<W> for Surface<D, W> {
|
||||||
|
#[inline]
|
||||||
|
fn as_ref(&self) -> &W {
|
||||||
|
self.window()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<D: HasDisplayHandle, W: HasWindowHandle> HasWindowHandle for Surface<D, W> {
|
||||||
|
#[inline]
|
||||||
|
fn window_handle(
|
||||||
|
&self,
|
||||||
|
) -> Result<raw_window_handle::WindowHandle<'_>, raw_window_handle::HandleError> {
|
||||||
|
self.window().window_handle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A buffer that can be written to by the CPU and presented to the window.
|
/// A buffer that can be written to by the CPU and presented to the window.
|
||||||
///
|
///
|
||||||
/// This derefs to a `[u32]`, which depending on the backend may be a mapping into shared memory
|
/// This derefs to a `[u32]`, which depending on the backend may be a mapping into shared memory
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,7 @@ pub struct OrbitalImpl<D, W> {
|
||||||
width: u32,
|
width: u32,
|
||||||
height: u32,
|
height: u32,
|
||||||
presented: bool,
|
presented: bool,
|
||||||
_window_source: W,
|
window_handle: W,
|
||||||
_display: PhantomData<D>,
|
_display: PhantomData<D>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,15 +76,21 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> OrbitalImpl<D, W> {
|
||||||
width: 0,
|
width: 0,
|
||||||
height: 0,
|
height: 0,
|
||||||
presented: false,
|
presented: false,
|
||||||
_window_source: window,
|
window_handle: window,
|
||||||
_display: PhantomData,
|
_display: PhantomData,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
||||||
let width = width.get();
|
let width = width.get();
|
||||||
let height = height.get();
|
let height = height.get();
|
||||||
if width != self.width && height != self.height {
|
if width != self.width || height != self.height {
|
||||||
self.presented = false;
|
self.presented = false;
|
||||||
self.width = width;
|
self.width = width;
|
||||||
self.height = height;
|
self.height = height;
|
||||||
|
|
@ -157,9 +163,6 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> OrbitalImpl<D, W> {
|
||||||
|
|
||||||
// Window buffer map is dropped here
|
// Window buffer map is dropped here
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tell orbital to show the latest window data
|
|
||||||
syscall::fsync(self.window_fd()).expect("failed to sync orbital window");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch the buffer from the window.
|
/// Fetch the buffer from the window.
|
||||||
|
|
@ -203,10 +206,13 @@ impl<'a, D: HasDisplayHandle, W: HasWindowHandle> BufferImpl<'a, D, W> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn present(self) -> Result<(), SoftBufferError> {
|
pub fn present(self) -> Result<(), SoftBufferError> {
|
||||||
|
self.present_with_damage(&[])
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn present_with_damage(self, damage: &[Rect]) -> Result<(), SoftBufferError> {
|
||||||
match self.pixels {
|
match self.pixels {
|
||||||
Pixels::Mapping(mapping) => {
|
Pixels::Mapping(mapping) => {
|
||||||
drop(mapping);
|
drop(mapping);
|
||||||
syscall::fsync(self.imp.window_fd()).expect("failed to sync orbital window");
|
|
||||||
self.imp.presented = true;
|
self.imp.presented = true;
|
||||||
}
|
}
|
||||||
Pixels::Buffer(buffer) => {
|
Pixels::Buffer(buffer) => {
|
||||||
|
|
@ -215,10 +221,19 @@ impl<'a, D: HasDisplayHandle, W: HasWindowHandle> BufferImpl<'a, D, W> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tell orbital to show the latest window data
|
||||||
|
if damage.is_empty() {
|
||||||
|
syscall::fsync(self.imp.window_fd()).expect("failed to sync orbital window");
|
||||||
|
} else {
|
||||||
|
use std::fmt::Write;
|
||||||
|
let mut damage_buf = "Y".to_string();
|
||||||
|
for m in damage {
|
||||||
|
let _ = write!(damage_buf, ",{},{},{},{}", m.x, m.y, m.width, m.height);
|
||||||
|
}
|
||||||
|
syscall::write(self.imp.window_fd(), damage_buf.as_bytes())
|
||||||
|
.expect("failed to sync orbital window");
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn present_with_damage(self, _damage: &[Rect]) -> Result<(), SoftBufferError> {
|
|
||||||
self.present()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ impl WaylandBuffer {
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
width * 4,
|
width * 4,
|
||||||
wl_shm::Format::Xrgb8888,
|
wl_shm::Format::Argb8888,
|
||||||
qh,
|
qh,
|
||||||
released.clone(),
|
released.clone(),
|
||||||
);
|
);
|
||||||
|
|
@ -138,7 +138,7 @@ impl WaylandBuffer {
|
||||||
width,
|
width,
|
||||||
height,
|
height,
|
||||||
width * 4,
|
width * 4,
|
||||||
wl_shm::Format::Xrgb8888,
|
wl_shm::Format::Argb8888,
|
||||||
&self.qh,
|
&self.qh,
|
||||||
self.released.clone(),
|
self.released.clone(),
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ pub struct WaylandImpl<D: ?Sized, W: ?Sized> {
|
||||||
///
|
///
|
||||||
/// This has to be dropped *after* the `surface` field, because the `surface` field implicitly
|
/// This has to be dropped *after* the `surface` field, because the `surface` field implicitly
|
||||||
/// borrows this.
|
/// borrows this.
|
||||||
_window: W,
|
window_handle: W,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D: HasDisplayHandle + ?Sized, W: HasWindowHandle> WaylandImpl<D, W> {
|
impl<D: HasDisplayHandle + ?Sized, W: HasWindowHandle> WaylandImpl<D, W> {
|
||||||
|
|
@ -109,10 +109,16 @@ impl<D: HasDisplayHandle + ?Sized, W: HasWindowHandle> WaylandImpl<D, W> {
|
||||||
surface: Some(surface),
|
surface: Some(surface),
|
||||||
buffers: Default::default(),
|
buffers: Default::default(),
|
||||||
size: None,
|
size: None,
|
||||||
_window: window,
|
window_handle: window,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
||||||
self.size = Some(
|
self.size = Some(
|
||||||
(|| {
|
(|| {
|
||||||
|
|
|
||||||
12
src/web.rs
12
src/web.rs
|
|
@ -57,7 +57,7 @@ pub struct WebImpl<D, W> {
|
||||||
size: Option<(NonZeroU32, NonZeroU32)>,
|
size: Option<(NonZeroU32, NonZeroU32)>,
|
||||||
|
|
||||||
/// The underlying window handle.
|
/// The underlying window handle.
|
||||||
_window: W,
|
window_handle: W,
|
||||||
|
|
||||||
/// The underlying display handle.
|
/// The underlying display handle.
|
||||||
_display: PhantomData<D>,
|
_display: PhantomData<D>,
|
||||||
|
|
@ -114,7 +114,7 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> WebImpl<D, W> {
|
||||||
buffer: Vec::new(),
|
buffer: Vec::new(),
|
||||||
buffer_presented: false,
|
buffer_presented: false,
|
||||||
size: None,
|
size: None,
|
||||||
_window: window,
|
window_handle: window,
|
||||||
_display: PhantomData,
|
_display: PhantomData,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -130,11 +130,17 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> WebImpl<D, W> {
|
||||||
buffer: Vec::new(),
|
buffer: Vec::new(),
|
||||||
buffer_presented: false,
|
buffer_presented: false,
|
||||||
size: None,
|
size: None,
|
||||||
_window: window,
|
window_handle: window,
|
||||||
_display: PhantomData,
|
_display: PhantomData,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
/// De-duplicates the error handling between `HtmlCanvasElement` and `OffscreenCanvas`.
|
/// De-duplicates the error handling between `HtmlCanvasElement` and `OffscreenCanvas`.
|
||||||
fn resolve_ctx<T: JsCast>(
|
fn resolve_ctx<T: JsCast>(
|
||||||
result: Option<Option<Object>>,
|
result: Option<Option<Object>>,
|
||||||
|
|
|
||||||
10
src/win32.rs
10
src/win32.rs
|
|
@ -142,7 +142,7 @@ pub struct Win32Impl<D: ?Sized, W> {
|
||||||
/// The handle for the window.
|
/// The handle for the window.
|
||||||
///
|
///
|
||||||
/// This should be kept alive in order to keep `window` valid.
|
/// This should be kept alive in order to keep `window` valid.
|
||||||
_window: W,
|
handle: W,
|
||||||
|
|
||||||
/// The display handle.
|
/// The display handle.
|
||||||
///
|
///
|
||||||
|
|
@ -184,11 +184,17 @@ impl<D: HasDisplayHandle, W: HasWindowHandle> Win32Impl<D, W> {
|
||||||
dc,
|
dc,
|
||||||
window: hwnd,
|
window: hwnd,
|
||||||
buffer: None,
|
buffer: None,
|
||||||
_window: window,
|
handle: window,
|
||||||
_display: PhantomData,
|
_display: PhantomData,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.handle
|
||||||
|
}
|
||||||
|
|
||||||
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
pub fn resize(&mut self, width: NonZeroU32, height: NonZeroU32) -> Result<(), SoftBufferError> {
|
||||||
let (width, height) = (|| {
|
let (width, height) = (|| {
|
||||||
let width = NonZeroI32::new(i32::try_from(width.get()).ok()?)?;
|
let width = NonZeroI32::new(i32::try_from(width.get()).ok()?)?;
|
||||||
|
|
|
||||||
10
src/x11.rs
10
src/x11.rs
|
|
@ -150,7 +150,7 @@ pub struct X11Impl<D: ?Sized, W: ?Sized> {
|
||||||
size: Option<(NonZeroU16, NonZeroU16)>,
|
size: Option<(NonZeroU16, NonZeroU16)>,
|
||||||
|
|
||||||
/// Keep the window alive.
|
/// Keep the window alive.
|
||||||
_window_handle: W,
|
window_handle: W,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The buffer that is being drawn to.
|
/// The buffer that is being drawn to.
|
||||||
|
|
@ -292,10 +292,16 @@ impl<D: HasDisplayHandle + ?Sized, W: HasWindowHandle> X11Impl<D, W> {
|
||||||
buffer,
|
buffer,
|
||||||
buffer_presented: false,
|
buffer_presented: false,
|
||||||
size: None,
|
size: None,
|
||||||
_window_handle: window_src,
|
window_handle: window_src,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the inner window handle.
|
||||||
|
#[inline]
|
||||||
|
pub fn window(&self) -> &W {
|
||||||
|
&self.window_handle
|
||||||
|
}
|
||||||
|
|
||||||
/// Resize the internal buffer to the given width and height.
|
/// Resize the internal buffer to the given width and height.
|
||||||
pub(crate) fn resize(
|
pub(crate) fn resize(
|
||||||
&mut self,
|
&mut self,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue