module ParasitemiaUI.Types open System open System.Windows open System.Windows.Media open Emgu.CV open Emgu.CV.Structure open Newtonsoft.Json open ParasitemiaCore.UnitsOfMeasure let healthyRBColor = Color.FromRgb (255uy, 255uy, 0uy) // Yellow-green. let infectedRBColor = Color.FromRgb (255uy, 0uy, 40uy) // Red with a bit of blue. type RBC = { num : int [] mutable infected : bool [] mutable setManually : bool center : Point size : Size infectedArea : int } type SourceImage = { mutable num : int mutable name : string mutable config : ParasitemiaCore.Config.Config mutable dateLastAnalysis : DateTime // UTC. img : Image mutable rbcs : RBC list mutable healthyRBCBrightness : float32 mutable infectedRBCBrightness : float32 } with member this.HealthyRBCColor : SolidColorBrush = let mutable color = healthyRBColor * this.healthyRBCBrightness color.A <- 255uy SolidColorBrush (color) member this.InfectedRBCColor : SolidColorBrush = let mutable color = infectedRBColor * this.infectedRBCBrightness color.A <- 255uy SolidColorBrush (color) type PredefinedPPI = { ppi : int label : string } with override this.ToString () = sprintf "%s: %d" this.label this.ppi type SensorSize = { w : float h : float label : string } with override this.ToString () = sprintf "%g mm × %g mm%s" this.w this.h (if this.label = "" then "" else " (" + this.label + ")") let defaultPredefinedPPI = [ { ppi = 230000; label = "50×" } { ppi = 460000; label = "100×" } ] let defaultSensorSizes = [ { w = 3.2; h = 2.4; label = "1/4″" } { w = 4.8; h = 3.6; label = "1/3″" } { w = 5.76; h = 4.29; label = "1/2.5″" } { w = 6.4; h = 4.8; label = "1/2″" } { w = 7.18; h = 5.32; label = "1/1.8″" } { w = 7.6; h = 5.7; label = "1/1.7″" } { w = 8.8; h = 6.6; label = "2/3″" } { w = 13.2; h = 8.8; label = "1″" } ]