Notcurses-Native.git | lib/Notcurses/Native/ | Cell.rakumod edit


use NativeCall;
use Notcurses::Native::Types;
use Notcurses::Native;
use Notcurses::Native::Str;

unit module Notcurses::Native::Cell;

# 47 bindings — all nccell_*, nccells_*, nccellcmp functions
# Signatures verified against notcurses.h

# === Cell getters ===

sub nccell_channels(Nccell $c --> uint64)
	is native(&ffi-lib) is export { * }

sub nccell_bchannel(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fchannel(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fg_rgb(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_bg_rgb(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fg_rgb8(Nccell $c, uint32 $r is rw, uint32 $g is rw, uint32 $b is rw --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_bg_rgb8(Nccell $c, uint32 $r is rw, uint32 $g is rw, uint32 $b is rw --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fg_alpha(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_bg_alpha(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fg_palindex(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_bg_palindex(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_fg_default_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_bg_default_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_fg_palindex_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_bg_palindex_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_double_wide_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_wide_left_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_wide_right_p(Nccell $c --> bool)
	is native(&ffi-lib) is export { * }

sub nccell_cols(Nccell $c --> uint32)
	is native(&ffi-lib) is export { * }

sub nccell_styles(Nccell $c --> uint16)
	is native(&ffi-lib) is export { * }

# === Cell setters ===

sub nccell_init(Nccell $c)
	is native(&ffi-lib) is export { * }

sub nccell_set_channels(Nccell $c, uint64 $channels --> uint64)
	is native(&ffi-lib) is export { * }

sub nccell_set_bchannel(Nccell $c, uint32 $channel --> uint64)
	is native(&ffi-lib) is export { * }

sub nccell_set_fchannel(Nccell $c, uint32 $channel --> uint64)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_rgb(Nccell $c, uint32 $channel --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_rgb(Nccell $c, uint32 $channel --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_rgb8(Nccell $c, uint32 $r, uint32 $g, uint32 $b --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_rgb8(Nccell $c, uint32 $r, uint32 $g, uint32 $b --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_rgb8_clipped(Nccell $c, int32 $r, int32 $g, int32 $b)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_rgb8_clipped(Nccell $c, int32 $r, int32 $g, int32 $b)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_alpha(Nccell $c, uint32 $alpha --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_alpha(Nccell $c, uint32 $alpha --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_default(Nccell $c)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_default(Nccell $c)
	is native(&ffi-lib) is export { * }

sub nccell_set_fg_palindex(Nccell $c, uint32 $idx --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_bg_palindex(Nccell $c, uint32 $idx --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_set_styles(Nccell $c, uint32 $stylebits)
	is native(&ffi-lib) is export { * }

sub nccell_on_styles(Nccell $c, uint32 $stylebits)
	is native(&ffi-lib) is export { * }

sub nccell_off_styles(Nccell $c, uint32 $stylebits)
	is native(&ffi-lib) is export { * }

# === Cell load/release/dup ===

sub nccell_load(NcplaneHandle $n, Nccell $c, Str $gcluster --> int32)
	is native(&core-lib) is export { * }

sub nccell_release(NcplaneHandle $n, Nccell $c)
	is native(&core-lib) is export { * }

sub nccell_duplicate(NcplaneHandle $n, Nccell $targ, Nccell $c --> int32)
	is native(&core-lib) is export { * }

sub nccell_prime(NcplaneHandle $n, Nccell $c, Str $gcluster, uint16 $stylemask, uint64 $channels --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_load_char(NcplaneHandle $n, Nccell $c, uint8 $ch --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_load_egc32(NcplaneHandle $n, Nccell $c, uint32 $egc --> int32)
	is native(&ffi-lib) is export { * }

sub nccell_load_ucs32(NcplaneHandle $n, Nccell $c, uint32 $u --> int32)
	is native(&ffi-lib) is export { * }

# === Cell extract/strdup ===

# nccell_extract and nccell_strdup return heap-allocated EGC strings
# that the caller must free.
sub _nccell_extract_raw(NcplaneHandle $n, Nccell $c, uint16 $stylemask is rw, uint64 $channels is rw --> Pointer)
	is native(&ffi-lib) is symbol('nccell_extract') { * }

sub nccell_extract(NcplaneHandle $n, Nccell $c, uint16 $stylemask is rw, uint64 $channels is rw --> Str) is export {
	strdup-copy-and-free(_nccell_extract_raw($n, $c, $stylemask, $channels))
}

sub _nccell_strdup_raw(NcplaneHandle $n, Nccell $c --> Pointer)
	is native(&ffi-lib) is symbol('nccell_strdup') { * }

sub nccell_strdup(NcplaneHandle $n, Nccell $c --> Str) is export {
	strdup-copy-and-free(_nccell_strdup_raw($n, $c))
}

#| OWNED-BY-LIBRARY: returns a pointer into the cell's egcpool inside the
#| owning plane. Caller MUST NOT free. `--> Str` is safe — Raku copies.
sub nccell_extended_gcluster(NcplaneHandle $n, Nccell $c --> Str)
	is native(&core-lib) is export { * }

# === Cell comparison ===

sub nccellcmp(NcplaneHandle $n1, Nccell $c1, NcplaneHandle $n2, Nccell $c2 --> bool)
	is native(&ffi-lib) is export { * }

# === Box cell helpers ===

sub nccells_ascii_box(NcplaneHandle $n, uint16 $attr, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl --> int32)
	is native(&ffi-lib) is export { * }

sub nccells_double_box(NcplaneHandle $n, uint16 $attr, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl --> int32)
	is native(&ffi-lib) is export { * }

sub nccells_rounded_box(NcplaneHandle $n, uint16 $attr, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl --> int32)
	is native(&ffi-lib) is export { * }

sub nccells_light_box(NcplaneHandle $n, uint16 $attr, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl --> int32)
	is native(&ffi-lib) is export { * }

sub nccells_heavy_box(NcplaneHandle $n, uint16 $attr, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl --> int32)
	is native(&ffi-lib) is export { * }

sub nccells_load_box(NcplaneHandle $n, uint16 $styles, uint64 $channels,
	Nccell $ul, Nccell $ur, Nccell $ll, Nccell $lr, Nccell $hl, Nccell $vl,
	Str $gclusters --> int32)
	is native(&ffi-lib) is export { * }