Skip to content

Commit 7c6b011

Browse files
committed
Correct AIS ATON icon rendering logic, especially for MacOS Retina OpenCPN#4740
1 parent c4f1f65 commit 7c6b011

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

gui/src/ais.cpp

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
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;
7273
extern bool g_bopengl;
7374

7475
extern float g_ShipScaleFactorExp;
76+
extern float g_MarkScaleFactorExp;
7577

7678
float AISImportanceSwitchPoint = 0.0;
7779

@@ -430,6 +432,9 @@ static void TargetFrame(ocpnDC &dc, wxPen pen, int x, int y, int radius) {
430432

431433
static 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
685690
float AIS_scale_factor;
691+
float AIS_ATON_scale_factor;
686692
float AIS_nominal_target_size_mm;
687693
float AIS_nominal_icon_size_pixels;
688694
float AIS_pix_factor;
@@ -697,6 +703,8 @@ float AIS_width_cogpredictor_base;
697703
float AIS_width_cogpredictor_line;
698704
float AIS_width_target_outline;
699705
float AIS_icon_diameter;
706+
float AIS_ATON_reference;
707+
700708
wxFont *AIS_NameFont;
701709

702710
static 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

Comments
 (0)