gr 0.3.4

Rust wrapper for the GR framework
Documentation
use super::util::{impl_each, query_state, GksState};
use super::{ActiveGks, Gks, SegmentGks};
use core::ffi::c_int;
use gr_sys::gks::{
    gks_assoc_seg_with_ws, gks_close_seg, gks_copy_seg_to_ws, gks_create_seg, gks_delete_seg,
    gks_redraw_seg_on_ws, gks_set_seg_xform,
};

impl ActiveGks {
    pub fn create_segment(self, segn: impl Into<c_int>) -> Result<SegmentGks, ActiveGks> {
        let segn = segn.into();
        unsafe { gks_create_seg(segn) }
        match query_state() {
            GksState::SegmentOpen => Ok(SegmentGks(self)),
            GksState::Active => Err(self),
            _ => unreachable!(),
        }
    }
}

impl SegmentGks {
    pub fn close_segment(self) -> ActiveGks {
        unsafe { gks_close_seg() }
        self.0
    }
}

impl_each! {(ActiveGks, SegmentGks) {
    pub fn delete_segment(&mut self, segn: impl Into<c_int>) {
        let segn = segn.into();
        unsafe { gks_delete_seg(segn) }
    }

    pub fn assoc_seg_with_ws(
        &mut self,
        wkid: impl Into<c_int>,
        segn: impl Into<c_int>
    ) {
        let wkid = wkid.into();
        let segn = segn.into();
        unsafe { gks_assoc_seg_with_ws(wkid, segn) }
    }

    pub fn copy_seg_to_ws(
        &mut self,
        wkid: impl Into<c_int>,
        segn: impl Into<c_int>
    ) {
        let wkid = wkid.into();
        let segn = segn.into();
        unsafe { gks_copy_seg_to_ws(wkid, segn) }
    }
}}

impl_each! {(ActiveGks, Gks, SegmentGks) {
    pub fn set_seg_xform(&mut self, segn: impl Into<c_int>, mat: &[f64]) {
        if mat.len() >= 6 {
            let segn = segn.into();
            let mat = mat.as_ptr().cast_mut().cast();
            unsafe { gks_set_seg_xform(segn, mat) }
        }
    }

    pub fn redraw_seg_on_ws(&mut self, wkid: impl Into<c_int>) {
        let wkid = wkid.into();
        unsafe { gks_redraw_seg_on_ws(wkid) }
    }
}}