- first commit

This commit is contained in:
Wim Pomp
2025-08-10 17:34:35 +02:00
commit 3e98e7e86f
11 changed files with 2813 additions and 0 deletions

110
src/handle.rs Normal file
View File

@@ -0,0 +1,110 @@
use crate::misc::Ptr;
use crate::sys::*;
use std::mem::MaybeUninit;
use std::ops::Deref;
/// CZI-reader object.
#[derive(Clone, Debug)]
pub struct CziReader(pub (crate) CziReaderObjectHandle);
/// sub-block object.
#[derive(Clone, Debug)]
pub struct SubBlock(pub (crate) SubBlockObjectHandle);
/// input stream object.
#[derive(Clone, Debug)]
pub struct InputStream(pub (crate) InputStreamObjectHandle);
/// output stream object.
#[derive(Clone, Debug)]
pub struct OutputStream(pub (crate) OutputStreamObjectHandle);
/// memory allocation object - which is a pointer to a memory block, which must be
/// freed with 'libCZI_Free'.
/// TODO(JBL): this is not really used so far, should be removed I guess.
#[derive(Clone, Debug)]
pub struct MemoryAllocation(pub (crate) MemoryAllocationObjectHandle);
/// bitmap object.
#[derive(Clone, Debug)]
pub struct Bitmap(pub (crate) BitmapObjectHandle);
/// metadata segment object.
#[derive(Clone, Debug)]
pub struct MetadataSegment(pub (crate) MetadataSegmentObjectHandle);
/// attachment object.
#[derive(Clone, Debug)]
pub struct Attachment(pub (crate) AttachmentObjectHandle);
/// writer object.
#[derive(Clone, Debug)]
pub struct CziWriter(pub (crate) CziWriterObjectHandle);
/// single-channel-scaling-tile-accessor.
#[derive(Clone, Debug)]
pub struct SingleChannelScalingTileAccessor(pub (crate) SingleChannelScalingTileAccessorObjectHandle);
/// document info object.
#[derive(Clone, Debug)]
pub struct CziDocumentInfo(pub (crate) CziDocumentInfoHandle);
/// display settings object.
#[derive(Clone, Debug)]
pub struct DisplaySettings(pub (crate) DisplaySettingsHandle);
/// channel display settings object.
#[derive(Clone, Debug)]
pub struct ChannelDisplaySettings(pub (crate) ChannelDisplaySettingsHandle);
macro_rules! impl_struct {
($($n:ident: $t:ty: $s:ty $(,)?)*) => {
$(
impl $t {
#[allow(dead_code)]
pub (crate) fn handle(&self) -> ObjectHandle { self.0 }
}
impl Ptr for $t {
type Pointer = $s;
unsafe fn assume_init(ptr: MaybeUninit<Self::Pointer>) -> Self {
Self(unsafe { ptr.assume_init() })
}
fn as_mut_ptr(&self) -> *mut Self::Pointer {
&self.0 as *const _ as *mut _
}
fn as_ptr(&self) -> *const Self::Pointer {
&self.0 as *const _ as *const _
}
}
impl Deref for $t {
type Target = ObjectHandle;
fn deref(&self) -> &Self::Target {
&self.0
}
}
)*
};
}
impl_struct! {
CziReader: CziReader: CziReaderObjectHandle,
SubBlock: SubBlock: SubBlockObjectHandle,
InputStream: InputStream: InputStreamObjectHandle,
OutputStream: OutputStream: OutputStreamObjectHandle,
MemoryAllocation: MemoryAllocation: MemoryAllocationObjectHandle,
Bitmap: Bitmap: BitmapObjectHandle,
MetadataSegment: MetadataSegment: MetadataSegmentObjectHandle,
Attachment: Attachment: AttachmentObjectHandle,
CziWriter: CziWriter: CziWriterObjectHandle,
SingleChannelScalingTileAccessor: SingleChannelScalingTileAccessor: SingleChannelScalingTileAccessorObjectHandle,
CziDocumentInfo: CziDocumentInfo: CziDocumentInfoHandle,
DisplaySettings: DisplaySettings: DisplaySettingsHandle,
ChannelDisplaySettings: ChannelDisplaySettings: ChannelDisplaySettingsHandle,
}