3838#include < wx/datetime.h>
3939#include < wx/wfstream.h>
4040#include < wx/imaglist.h>
41+ #include < wx/window.h>
4142
4243#include " model/ais_decoder.h"
4344#include " model/ais_state_vars.h"
@@ -72,6 +73,7 @@ extern ArrayOfMmsiProperties g_MMSI_Props_Array;
7273extern bool g_bopengl;
7374
7475extern float g_ShipScaleFactorExp;
76+ extern float g_MarkScaleFactorExp;
7577
7678float AISImportanceSwitchPoint = 0.0 ;
7779
@@ -430,6 +432,9 @@ static void TargetFrame(ocpnDC &dc, wxPen pen, int x, int y, int radius) {
430432
431433static void AtoN_Diamond (ocpnDC &dc, wxPen pen, int x, int y, int radius,
432434 AisTargetData *td) {
435+ // Apply any specific monitor scaling. e.g. MacOS
436+ radius *= gFrame ->GetPrimaryCanvas ()->GetContentScaleFactor ();
437+
433438 // Constants?
434439 wxPen pen_save = dc.GetPen ();
435440
@@ -683,6 +688,7 @@ static void spherical_ll_gc_ll(float lat, float lon, float brg, float dist,
683688
684689// Global static AIS target rendering metrics
685690float AIS_scale_factor;
691+ float AIS_ATON_scale_factor;
686692float AIS_nominal_target_size_mm;
687693float AIS_nominal_icon_size_pixels;
688694float AIS_pix_factor;
@@ -697,6 +703,8 @@ float AIS_width_cogpredictor_base;
697703float AIS_width_cogpredictor_line;
698704float AIS_width_target_outline;
699705float AIS_icon_diameter;
706+ float AIS_ATON_reference;
707+
700708wxFont *AIS_NameFont;
701709
702710static void AISSetMetrics () {
@@ -733,9 +741,14 @@ static void AISSetMetrics() {
733741 if (g_ShipScaleFactorExp > 1.0 )
734742 AIS_user_scale_factor = (log (g_ShipScaleFactorExp) + 1.0 ) *
735743 1.2 ; // soften the scale factor a bit
736-
737744 AIS_scale_factor *= AIS_user_scale_factor;
738745
746+ // All ATONs, including AIS virtuals, scale with chart objects.
747+ AIS_ATON_scale_factor = g_MarkScaleFactorExp;
748+ if (g_MarkScaleFactorExp > 1.0 )
749+ AIS_ATON_scale_factor = (log (g_MarkScaleFactorExp) + 1.0 ) *
750+ 1.2 ; // soften the scale factor a bit
751+
739752 // Establish some graphic element line widths dependent on the platform
740753 // display resolution
741754 AIS_nominal_line_width_pix =
@@ -751,6 +764,10 @@ static void AISSetMetrics() {
751764 AIS_width_target_outline = 1.4 * AIS_nominal_line_width_pix;
752765 AIS_icon_diameter = AIS_intercept_bar_circle_diameter * AIS_user_scale_factor;
753766
767+ // Reference dimension for AIS ATONs
768+ AIS_ATON_reference =
769+ AIS_intercept_bar_circle_diameter * AIS_ATON_scale_factor;
770+
754771 wxFont *font = FontMgr::Get ().GetFont (_ (" AIS Target Name" ), 0 );
755772 double scaler = DPIscale;
756773
@@ -1298,7 +1315,7 @@ static void AISDrawTarget(AisTargetData *td, ocpnDC &dc, ViewPort &vp,
12981315 wxPen met (UBLCK, (wxMax (target_outline_pen.GetWidth (), 2.5 )));
12991316 dc.SetPen (met);
13001317 dc.SetBrush (wxBrush (UBLCK, wxBRUSHSTYLE_TRANSPARENT));
1301- double met_radius = 1.8 * AIS_icon_diameter ;
1318+ double met_radius = 1.8 * AIS_ATON_reference ;
13021319 dc.StrokeCircle (TargetPoint.x , TargetPoint.y , met_radius);
13031320
13041321 /* Inscribed "W" in the circle. */
@@ -1320,18 +1337,18 @@ static void AISDrawTarget(AisTargetData *td, ocpnDC &dc, ViewPort &vp,
13201337
13211338 } else if (td->Class == AIS_ATON) { // Aid to Navigation
13221339 AtoN_Diamond (dc, wxPen (UBLCK, AIS_width_target_outline), TargetPoint.x ,
1323- TargetPoint.y , AIS_icon_diameter * 1.5 , td);
1340+ TargetPoint.y , AIS_ATON_reference * 1.5 , td);
13241341 } else if (td->Class == AIS_BASE) { // Base Station
13251342 Base_Square (dc, wxPen (UBLCK, AIS_width_target_outline), TargetPoint.x ,
1326- TargetPoint.y , AIS_icon_diameter );
1343+ TargetPoint.y , AIS_ATON_reference );
13271344 } else if (td->Class == AIS_SART) { // SART Target
13281345 if (td->NavStatus == 14 ) // active
13291346 SART_Render (dc, wxPen (URED, AIS_width_target_outline), TargetPoint.x ,
1330- TargetPoint.y , AIS_icon_diameter );
1347+ TargetPoint.y , AIS_ATON_reference );
13311348 else
13321349 SART_Render (
13331350 dc, wxPen (GetGlobalColor (_T ( " UGREN" )), AIS_width_target_outline),
1334- TargetPoint.x , TargetPoint.y , AIS_icon_diameter );
1351+ TargetPoint.x , TargetPoint.y , AIS_ATON_reference );
13351352
13361353 } else if (td->b_SarAircraftPosnReport ) {
13371354 int airtype = (td->MMSI % 1000 ) / 100 ; // xxxyyy5zz >> helicopter
0 commit comments