rvlib/
drawme.rs

1use crate::{tools_data::InstanceLabelDisplay, types::ViewImage, world::DataRaw, GeoFig};
2use rvimage_domain::{BbF, Canvas, Circle, TPtF};
3use std::default::Default;
4
5#[derive(Clone, Debug)]
6pub struct Stroke {
7    pub thickness: TPtF,
8    pub color: [u8; 3],
9}
10
11impl Stroke {
12    pub fn from_color(color: [u8; 3]) -> Self {
13        Stroke {
14            thickness: 2.0,
15            color,
16        }
17    }
18}
19
20#[derive(Clone, Debug)]
21pub struct BboxAnnotation {
22    pub geofig: GeoFig,
23    pub fill_color: Option<[u8; 3]>,
24    pub fill_alpha: u8,
25    pub outline: Stroke,
26    pub outline_alpha: u8,
27    pub label: Option<String>,
28    pub is_selected: Option<bool>,
29    pub highlight_circles: Vec<Circle>,
30    pub instance_label_display: InstanceLabelDisplay,
31}
32
33#[derive(Clone, Debug)]
34pub struct BrushAnnotation {
35    pub canvas: Canvas,
36    pub color: [u8; 3],
37    pub label: Option<String>,
38    pub is_selected: Option<bool>,
39    pub fill_alpha: u8,
40    pub instance_display_label: InstanceLabelDisplay,
41}
42
43#[derive(Clone, Debug)]
44pub enum Annotation {
45    Bbox(BboxAnnotation),
46    Brush(BrushAnnotation),
47}
48
49#[derive(Clone, Debug, Default)]
50pub enum Update<T> {
51    Yes(T),
52    #[default]
53    No,
54}
55
56pub type UpdateImage = Update<ViewImage>;
57// permament annotations
58pub type UpdatePermAnnos = Update<Vec<Annotation>>;
59// temporary annotation
60pub type UpdateTmpAnno = Update<Annotation>;
61pub type UpdateZoomBox = Update<Option<BbF>>;
62
63impl UpdatePermAnnos {
64    pub fn clear() -> Self {
65        Self::Yes(vec![])
66    }
67}
68
69#[derive(Clone, Debug, Default)]
70pub struct ImageInfo {
71    pub filename: String,
72    pub shape_info: String,
73    pub pixel_value: String,
74    pub tool_info: String,
75    pub zoom_box_coords: String,
76}
77
78#[derive(Clone, Debug, Default)]
79pub struct UpdateView {
80    pub image: UpdateImage,
81    pub perm_annos: UpdatePermAnnos,
82    pub tmp_annos: UpdateTmpAnno,
83    pub zoom_box: UpdateZoomBox,
84    pub image_info: Option<ImageInfo>,
85
86    // to enable memory re-use.
87    pub tmp_anno_buffer: Option<Annotation>,
88}
89
90impl UpdateView {
91    pub fn new(image: &DataRaw, zoom_box: Option<BbF>) -> Self {
92        let im_uncropped_view = image.bg_to_uncropped_view();
93        UpdateView {
94            image: UpdateImage::Yes(im_uncropped_view),
95            perm_annos: UpdatePermAnnos::No,
96            tmp_annos: UpdateTmpAnno::No,
97            zoom_box: UpdateZoomBox::Yes(zoom_box),
98            image_info: None,
99            tmp_anno_buffer: None,
100        }
101    }
102    pub fn from_zoombox(zoom_box: Option<BbF>) -> Self {
103        UpdateView {
104            image: UpdateImage::No,
105            perm_annos: UpdatePermAnnos::No,
106            tmp_annos: UpdateTmpAnno::No,
107            zoom_box: UpdateZoomBox::Yes(zoom_box),
108            image_info: None,
109            tmp_anno_buffer: None,
110        }
111    }
112}