1- use crate :: sampler3d;
1+ use crate :: { sampler3d, app :: ColorMode } ;
22
33pub struct MetaDataWidget < ' a > {
44 pub image_sampler : & ' a sampler3d:: Sampler3D ,
@@ -138,6 +138,8 @@ pub struct SliceWidget<'a> {
138138 pub image_sampler : & ' a sampler3d:: Sampler3D ,
139139 pub image_cache : & ' a mut sampler3d:: ImageCache ,
140140 pub block : Option < tui:: widgets:: Block < ' a > > ,
141+ pub color_mode : ColorMode ,
142+ pub color_map : colorous:: Gradient ,
141143}
142144
143145impl < ' a > SliceWidget < ' a > {
@@ -147,6 +149,8 @@ impl<'a> SliceWidget<'a> {
147149 intensity_range : ( f32 , f32 ) ,
148150 slice_position : Vec < usize > ,
149151 axis : usize ,
152+ color_mode : ColorMode ,
153+ color_map : colorous:: Gradient ,
150154 ) -> SliceWidget < ' a > {
151155 Self {
152156 intensity_range,
@@ -155,6 +159,8 @@ impl<'a> SliceWidget<'a> {
155159 image_sampler,
156160 image_cache,
157161 block : None ,
162+ color_mode,
163+ color_map
158164 }
159165 }
160166
@@ -197,6 +203,64 @@ lazy_static! {
197203 static ref RAS_LABELS : Vec <& ' static str > = vec![ "IS" , "PA" , "LR" ] ;
198204}
199205
206+ struct HjColor ( colorous:: Color ) ;
207+
208+ impl ansi_colours:: AsRGB for HjColor {
209+ fn as_u32 ( & self ) -> u32 {
210+ ( ( self . 0 . r as u32 ) << 16 ) + ( ( self . 0 . g as u32 ) << 8 ) + self . 0 . b as u32
211+ }
212+ }
213+
214+ impl Into < tui:: style:: Color > for HjColor {
215+ fn into ( self ) -> tui:: style:: Color {
216+ tui:: style:: Color :: Rgb ( self . 0 . r , self . 0 . g , self . 0 . b )
217+ }
218+ }
219+
220+ impl HjColor {
221+ pub fn invert ( & self ) -> Self {
222+ Self {
223+ 0 : colorous:: Color {
224+ r : 255 - self . 0 . r ,
225+ g : 255 - self . 0 . g ,
226+ b : 255 - self . 0 . b ,
227+ }
228+ }
229+ }
230+ }
231+
232+ fn calc_termcolor ( mode : ColorMode , map : colorous:: Gradient , val : usize , val_max : usize ) -> tui:: style:: Color {
233+ let rgb = HjColor ( map. eval_rational ( val, val_max) ) ;
234+
235+ match mode {
236+ ColorMode :: TrueColor => {
237+ rgb. into ( )
238+ } ,
239+ ColorMode :: Ansi256 => {
240+ tui:: style:: Color :: Indexed ( ansi_colours:: ansi256_from_rgb ( rgb) )
241+ } ,
242+ ColorMode :: Bw => {
243+ if val > ( val_max/2 ) { tui:: style:: Color :: White } else { tui:: style:: Color :: Black }
244+ } ,
245+ }
246+ }
247+
248+ fn calc_termcolor_inverted ( mode : ColorMode , map : colorous:: Gradient , val : usize , val_max : usize ) -> tui:: style:: Color {
249+ let rgb = HjColor ( map. eval_rational ( val, val_max) ) . invert ( ) ;
250+
251+ match mode {
252+ ColorMode :: TrueColor => {
253+ rgb. into ( )
254+ } ,
255+ ColorMode :: Ansi256 => {
256+ tui:: style:: Color :: Indexed ( ansi_colours:: ansi256_from_rgb ( rgb) )
257+ } ,
258+ ColorMode :: Bw => {
259+ if val <= ( val_max/2 ) { tui:: style:: Color :: White } else { tui:: style:: Color :: Black }
260+ } ,
261+ }
262+ }
263+
200264impl tui:: widgets:: Widget for SliceWidget < ' _ > {
201265 fn render ( mut self , area : tui:: layout:: Rect , buf : & mut tui:: buffer:: Buffer ) {
202266 let text_area = match self . block . take ( ) {
@@ -243,9 +307,8 @@ impl tui::widgets::Widget for SliceWidget<'_> {
243307 let val_upper = img_sized. get_pixel ( x, y + 1 ) [ 0 ] as usize ;
244308 let val_lower = img_sized. get_pixel ( x, y) [ 0 ] as usize ;
245309
246- let gradient = colorous:: INFERNO ;
247- let col_upper = gradient. eval_rational ( val_upper, u16:: MAX as usize + 1 ) ;
248- let col_lower = gradient. eval_rational ( val_lower, u16:: MAX as usize + 1 ) ;
310+ let col_upper = calc_termcolor ( self . color_mode , self . color_map , val_upper, u16:: MAX as usize + 1 ) ;
311+ let col_lower = calc_termcolor ( self . color_mode , self . color_map , val_lower, u16:: MAX as usize + 1 ) ;
249312
250313 let c = buf. get_mut ( text_area. left ( ) + ix, text_area. bottom ( ) - iy - 1 ) ;
251314
@@ -256,10 +319,9 @@ impl tui::widgets::Widget for SliceWidget<'_> {
256319 let crossair_x = x == x_index_scaled;
257320
258321 if crossair_x || crossair_y {
259- let col_average =
260- gradient. eval_rational ( ( val_lower + val_upper) / 2 , u16:: MAX as usize + 1 ) ;
261- let col_inv = colorous2tui ( invert_color ( col_average) ) ;
262- c. set_bg ( colorous2tui ( col_average) ) ;
322+ let col_average = calc_termcolor ( self . color_mode , self . color_map , ( val_lower + val_upper) / 2 , u16:: MAX as usize + 1 ) ;
323+ let col_inv = calc_termcolor_inverted ( self . color_mode , self . color_map , ( val_lower + val_upper) / 2 , u16:: MAX as usize + 1 ) ;
324+ c. set_bg ( col_average) ;
263325
264326 match ( crossair_x, crossair_y) {
265327 ( true , true ) => c
@@ -308,9 +370,9 @@ impl tui::widgets::Widget for SliceWidget<'_> {
308370 ) ;
309371 }
310372 } else {
311- c. set_bg ( colorous2tui ( col_upper) )
373+ c. set_bg ( col_upper)
312374 . set_char ( '▄' )
313- . set_fg ( colorous2tui ( col_lower) ) ;
375+ . set_fg ( col_lower) ;
314376 } ;
315377 }
316378 }
0 commit comments