61 if (NULL != rpn) *rpn = r;
63 if (!
RoutePointGui(m_point).IsVisibleSelectable(canvas, boverride_viz))
67 if ((abs(r.x) > canvas->GetCanvasWidth() * 4) ||
68 (abs(r.y) > canvas->GetCanvasHeight() * 4))
72 if ((abs(r.x) == INVALID_COORD) || (abs(r.y) == INVALID_COORD))
return;
75 if (m_point.m_IconName ==
"empty" && !m_point.
m_bShowName &&
89 if ((m_point.
m_bIsActive) && (m_point.m_IconName !=
"mob"))
90 pbm = pWayPointMan->GetIconBitmap(
"activepoint");
92 pbm = m_point.m_pbmIcon;
94 wxBitmap *pbms = NULL;
95 if ((g_MarkScaleFactorExp > 1.0) && !m_point.m_bPreScaled) {
96 if (m_point.m_IconScaleFactor != g_MarkScaleFactorExp) {
97 wxImage scaled_image = pbm->ConvertToImage();
98 int new_width = pbm->GetWidth() * g_MarkScaleFactorExp;
99 int new_height = pbm->GetHeight() * g_MarkScaleFactorExp;
100 m_point.m_ScaledBMP = wxBitmap(
101 scaled_image.Scale(new_width, new_height, wxIMAGE_QUALITY_HIGH));
103 m_point.m_IconScaleFactor = g_MarkScaleFactorExp;
105 if (m_point.m_ScaledBMP.IsOk()) pbm = &m_point.m_ScaledBMP;
108 int sx2 = pbm->GetWidth() / 2;
109 int sy2 = pbm->GetHeight() / 2;
112 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
116 wxFont *dFont = FontMgr::Get().
GetFont(_(
"Marks"));
117 int font_size = wxMax(8, dFont->GetPointSize());
121 font_size, dFont->GetFamily(), dFont->GetStyle(), dFont->GetWeight(),
122 false, dFont->GetFaceName());
125 m_point.CalculateNameExtents();
141 hilitebox.Inflate(20);
144 hilitebox.Inflate(4);
148 wxColour hi_colour = pen->GetColour();
149 unsigned char transparency = 100;
151 hi_colour = GetGlobalColor(
"YELO1");
157 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
158 hilitebox.height, radius, hi_colour, transparency);
161 bool bDrawHL =
false;
163 if (m_point.
m_bBlink && (gFrame->nBlinkerTick & 1)) bDrawHL =
true;
165 if ((!bDrawHL) && (NULL != m_point.m_pbmIcon)) {
166 dc.DrawBitmap(*pbm, r.x - sx2, r.y - sy2,
true);
169 dc.CalcBoundingBox(r.x - sx2, r.y - sy2);
170 dc.CalcBoundingBox(r.x + sx2, r.y + sy2);
173 if (m_point.
m_bShowName && m_point.m_MarkName.Length()) {
186 double factor = 1.00;
194 ll_gc_ll(m_point.m_lat, m_point.m_lon, 0, factor, &tlat, &tlon);
198 sqrt(pow((
double)(r.x - r1.x), 2) + pow((
double)(r.y - r1.y), 2));
199 int pix_radius = (int)lpp;
202 wxBrush saveBrush = dc.GetBrush();
203 wxPen savePen = dc.GetPen();
206 wxBRUSHSTYLE_TRANSPARENT));
209 dc.StrokeCircle(r.x, r.y, i * pix_radius);
211 dc.SetBrush(saveBrush);
229 bool use_cached_screen_coords,
bool bVizOverride) {
230 if (!
RoutePointGui(m_point).IsVisibleSelectable(canvas, bVizOverride))
return;
233 if (m_point.m_IconName ==
"empty" && !m_point.
m_bShowName &&
239 vp.
rotation == m_point.m_wpBBox_rotation) {
241 LLBBox vpBBox = vp.GetBBox();
242 if (vpBBox.IntersectOut(m_point.
m_wpBBox)) {
246 double factor = 1.00;
253 LLBBox radar_box = m_point.
m_wpBBox;
254 radar_box.EnLarge(radius * 2);
255 if (vpBBox.IntersectOut(radar_box)) {
265 unsigned char transparency = 150;
272 if (r.x == INVALID_COORD)
return;
277 if ((m_point.
m_bIsActive) && (m_point.m_IconName !=
"mob"))
278 pbm = pWayPointMan->GetIconBitmap(
"activepoint");
280 pbm = m_point.m_pbmIcon;
283 if (!pbm || !pbm->IsOk())
return;
285 int sx2 = pbm->GetWidth() / 2;
286 int sy2 = pbm->GetHeight() / 2;
289 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
294 wxFont *dFont = FontMgr::Get().
GetFont(_(
"Marks"));
295 int font_size = wxMax(8, dFont->GetPointSize());
299 font_size, dFont->GetFamily(), dFont->GetStyle(), dFont->GetWeight(),
300 false, dFont->GetFaceName());
308 m_point.CalculateNameExtents();
323 if (!m_point.m_bPreScaled) {
324 hilitebox.x *= g_MarkScaleFactorExp;
325 hilitebox.y *= g_MarkScaleFactorExp;
326 hilitebox.width *= g_MarkScaleFactorExp;
327 hilitebox.height *= g_MarkScaleFactorExp;
332 hilitebox.Inflate(20);
335 hilitebox.Inflate(4);
342 vp.
rotation != m_point.m_wpBBox_rotation) {
343 double lat1, lon1, lat2, lon2;
345 r.y + hilitebox.y + hilitebox.height, lat1, lon1);
347 r.y + hilitebox.y, lat2, lon2);
350 m_point.
m_wpBBox.Set(lat1, lon1, lat2, lon2 + 360);
352 m_point.
m_wpBBox.Set(lat1, lon1, lat2, lon2);
355 m_point.m_wpBBox_rotation = vp.
rotation;
367 wxPen *pen =
g_pRouteMan->GetActiveRoutePointPen();
368 hi_colour = pen->GetColour();
370 hi_colour = GetGlobalColor(
"YELO1");
373 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
374 hilitebox.height, radius, hi_colour, transparency);
377 bool bDrawHL =
false;
379 if (m_point.
m_bBlink && (gFrame->nBlinkerTick & 1)) bDrawHL =
true;
381 if ((!bDrawHL) && (NULL != m_point.m_pbmIcon)) {
383 unsigned int IconTexture =
386 glBindTexture(GL_TEXTURE_2D, IconTexture);
388 glEnable(GL_TEXTURE_2D);
391 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
392 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
394 int w = r1.width, h = r1.height;
397 if (!m_point.m_bPreScaled) {
398 scale = g_MarkScaleFactorExp;
404 float ws = r1.width *
scale;
405 float hs = r1.height *
scale;
406 float xs = r.x - ws / 2.;
407 float ys = r.y - hs / 2.;
408 float u = (float)w / glw, v = (
float)h / glh;
429 coords[6] = xs, coords[7] = ys + hs;
431 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
434 glDisable(GL_TEXTURE_2D);
443 dc.SelectObject(tbm);
444 dc.SetBackground(wxBrush(*wxBLACK));
446 dc.SetFont(*m_pMarkFont);
447 dc.SetTextForeground(*wxWHITE);
448 dc.DrawText(m_MarkName, 0, 0);
449 dc.SelectObject(wxNullBitmap);
452 wxImage image = tbm.ConvertToImage();
453 unsigned char *d = image.GetData();
454 unsigned char *e =
new unsigned char[w * h];
456 for (
int p = 0; p < w * h; p++) e[p] = d[3 * p + 0];
460 glGenTextures(1, &m_iTextTexture);
461 glBindTexture(GL_TEXTURE_2D, m_iTextTexture);
463 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
464 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
466 m_iTextTextureWidth = NextPow2(w);
467 m_iTextTextureHeight = NextPow2(h);
468 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, m_iTextTextureWidth,
469 m_iTextTextureHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
470 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_ALPHA, GL_UNSIGNED_BYTE,
480 temp_dc.SelectObject(bmp);
483 temp_dc.SetBackground(wxBrush(wxColour(0, 0, 0)));
488 temp_dc.SetTextForeground(wxColour(255, 255, 255));
489 temp_dc.DrawText(m_point.m_MarkName, 0, 0);
490 temp_dc.SelectObject(wxNullBitmap);
494 wxImage image = bmp.ConvertToImage();
496 unsigned char *data =
new unsigned char[w * h * 4];
497 unsigned char *im = image.GetData();
503 for (
int i = 0; i < h; i++) {
504 for (
int j = 0; j < w; j++) {
505 unsigned int index = ((i * w) + j) * 4;
509 data[index + 3] = im[((i * w) + j) * 3];
518 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
519 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
526 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE,
531 glEnable(GL_TEXTURE_2D);
533 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
542 glEnable(GL_TEXTURE_2D);
568 coords[6] = x, coords[7] = y + h;
570 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
573 glDisable(GL_TEXTURE_2D);
580 double factor = 1.00;
588 ll_gc_ll(m_point.m_lat, m_point.m_lon, 0, factor, &tlat, &tlon);
592 sqrt(pow((
double)(r.x - r1.x), 2) + pow((
double)(r.y - r1.y), 2));
593 int pix_radius = (int)lpp;
595 extern wxColor GetDimColor(wxColor c);
599 double platform_pen_width =
600 wxRound(wxMax(1.0, g_Platform->GetDisplayDPmm() / 2));
601 wxPen ppPen1(ring_dim_color, platform_pen_width);
602 wxBrush saveBrush = dc.GetBrush();
603 wxPen savePen = dc.GetPen();
605 dc.SetBrush(wxBrush(ring_dim_color, wxBRUSHSTYLE_TRANSPARENT));
608 dc.StrokeCircle(r.x, r.y, i * pix_radius);
610 dc.SetBrush(saveBrush);
614 if (m_point.m_bDrawDragHandle) {
616 double platform_pen_width = wxRound(
617 wxMax(1.0, g_Platform->GetDisplayDPmm() /
620 wxColor dh_color = GetGlobalColor(
"YELO1");
621 wxPen ppPen1(dh_color, 3 * platform_pen_width);
623 dc.DrawLine(r.x + hilitebox.width / 4, r.y + hilitebox.height / 4,
624 r.x + m_point.m_drag_line_length_man,
625 r.y + m_point.m_drag_line_length_man);
627 dh_color = wxColor(0, 0, 0);
628 wxPen ppPen2(dh_color, platform_pen_width);
630 dc.DrawLine(r.x + hilitebox.width / 4, r.y + hilitebox.height / 4,
631 r.x + m_point.m_drag_line_length_man,
632 r.y + m_point.m_drag_line_length_man);
635 glBindTexture(GL_TEXTURE_2D, m_point.m_dragIconTexture);
637 glEnable(GL_TEXTURE_2D);
640 int x = r.x + m_point.m_drag_icon_offset,
641 y = r.y + m_point.m_drag_icon_offset, w = m_point.m_dragIcon.GetWidth(),
642 h = m_point.m_dragIcon.GetHeight();
646 float ws = w *
scale;
647 float hs = h *
scale;
648 float xs = x - ws / 2.;
649 float ys = y - hs / 2.;
650 float u = (float)w / m_point.m_dragIconTextureWidth,
651 v = (
float)h / m_point.m_dragIconTextureWidth;
672 coords[6] = xs, coords[7] = ys + hs;
674 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
677 glDisable(GL_TEXTURE_2D);
694void RoutePointGui::CalculateDCRect(wxDC &dc,
ChartCanvas *canvas,
697 dc.ResetBoundingBox();
698 dc.DestroyClippingRegion();
702 odc.SetVP(canvas->GetVP());
704 Draw(odc, canvas, NULL);
707 prect->x = dc.MinX() - 1;
708 prect->y = dc.MinY() - 1;
709 prect->width = dc.MaxX() - dc.MinX() + 2;
710 prect->height = dc.MaxY() - dc.MinY() + 2;
714bool RoutePointGui::IsVisibleSelectable(
ChartCanvas *cc,
bool boverrideViz) {
715 return m_point.IsVisibleSelectable(cc->GetScaleValue(), boverrideViz);
718wxPoint2DDouble RoutePointGui::GetDragHandlePoint(
ChartCanvas *canvas) {
719 if (!m_point.m_bDrawDragHandle)
720 return wxPoint2DDouble(m_point.m_lon, m_point.m_lat);
722 return computeDragHandlePoint(canvas);
725void RoutePointGui::SetPointFromDraghandlePoint(
ChartCanvas *canvas,
double lat,
731 r.y - m_point.m_drag_icon_offset, tlat, tlon);
732 m_point.m_lat = tlat;
733 m_point.m_lon = tlon;
736void RoutePointGui::SetPointFromDraghandlePoint(
ChartCanvas *canvas,
int x,
740 x - m_point.m_drag_icon_offset - m_point.m_draggingOffsetx,
741 y - m_point.m_drag_icon_offset - m_point.m_draggingOffsety, tlat, tlon);
742 m_point.m_lat = tlat;
743 m_point.m_lon = tlon;
746void RoutePointGui::PresetDragOffset(
ChartCanvas *canvas,
int x,
int y) {
750 m_point.m_draggingOffsetx = x - (r.x + m_point.m_drag_icon_offset);
751 m_point.m_draggingOffsety = y - (r.y + m_point.m_drag_icon_offset);
754wxPoint2DDouble RoutePointGui::computeDragHandlePoint(
ChartCanvas *canvas) {
759 r.y + m_point.m_drag_icon_offset, lat, lon);
762 m_point.m_dragHandleLat = lat;
763 m_point.m_dragHandleLon = lon;
765 return wxPoint2DDouble(lon, lat);
768void RoutePointGui::ShowScaleWarningMessage(
ChartCanvas *canvas) {
769 wxString strA = _(
"The ScaMin value for new waypoints is set to");
770 wxString strB = _(
"but current chartscale is");
772 _(
"Therefore the new waypoint will not be visible at this zoom level.");
774 wxString::Format(
"%s %li,\n %s %.0f.\n%s", strA, m_point.GetScaMin(),
775 strB, canvas->GetScaleValue(), strC);
776 OCPNMessageBox(canvas, MessStr);
779void RoutePointGui::EnableDragHandle(
bool bEnable) {
780 m_point.m_bDrawDragHandle = bEnable;
782 if (!m_point.m_dragIcon.IsOk()) {
785 int bm_size = g_Platform->GetDisplayDPmm() * 9;
788 wxString UserIconPath = g_Platform->GetSharedDataDir() +
"uidata" +
789 wxFileName::GetPathSeparator();
791 m_point.m_dragIcon =
LoadSVG(UserIconPath +
"DragHandle.svg", bm_size,
792 bm_size, m_point.m_pbmIcon);
797 if (m_point.m_dragIconTexture == 0) {
798 glGenTextures(1, &m_point.m_dragIconTexture);
799 glBindTexture(GL_TEXTURE_2D, m_point.m_dragIconTexture);
801 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
802 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
803 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
805 wxImage image = m_point.m_dragIcon.ConvertToImage();
806 int w = image.GetWidth(), h = image.GetHeight();
808 m_point.m_dragIconTextureWidth = NextPow2(w);
809 m_point.m_dragIconTextureHeight = NextPow2(h);
811 unsigned char *d = image.GetData();
812 unsigned char *a = image.GetAlpha();
814 unsigned char mr, mg, mb;
815 image.GetOrFindMaskColour(&mr, &mg, &mb);
817 unsigned char *e =
new unsigned char[4 * w * h];
819 for (
int y = 0; y < h; y++)
820 for (
int x = 0; x < w; x++) {
821 unsigned char r, g, b;
822 int off = (y * image.GetWidth() + x);
831 a ? a[off] : ((r == mr) && (g == mg) && (b == mb) ? 0 : 255);
835 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_point.m_dragIconTextureWidth,
836 m_point.m_dragIconTextureHeight, 0, GL_RGBA,
837 GL_UNSIGNED_BYTE, NULL);
838 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE,
846 if (m_point.m_dragIcon.IsOk()) {
847 m_point.m_drag_line_length_man = bm_size;
848 m_point.m_drag_icon_offset = bm_size;
850 m_point.m_drag_line_length_man = 64;
851 m_point.m_drag_icon_offset = 64;
857void RoutePointGui::ReLoadIcon() {
858 if (!pWayPointMan)
return;
859 bool icon_exists = pWayPointMan->DoesIconExist(m_point.m_IconName);
861 wxString iconUse = m_point.m_IconName;
865 wxString tentative_icon = m_point.m_IconName.Lower();
866 if (pWayPointMan->DoesIconExist(tentative_icon)) {
868 m_point.m_IconName = tentative_icon;
869 iconUse = m_point.m_IconName;
874 if (!pWayPointMan->DoesIconExist(
"tempsub")) {
877 wxBitmap bmp = style->GetIcon(
"circle");
879 wxImage image = bmp.ConvertToImage();
881 .ProcessIcon(image,
"tempsub",
"tempsub");
889 m_point.m_pbmIcon = pWayPointMan->GetIconBitmap(iconUse);
890 m_point.m_bPreScaled = pWayPointMan->GetIconPrescaled(iconUse);
893 m_point.m_wpBBox_view_scale_ppm = -1;
898 m_point.m_IconScaleFactor = -1;
903bool RoutePointGui::SendToGPS(
const wxString &com_name,
SendToGpsDlg *dialog) {
905 ::wxBeginBusyCursor();
906 int result = SendWaypointToGPS_N0183(&m_point, com_name, *g_pMUX, dlg_ctx);
911 msg = _(
"Waypoint(s) Transmitted.");
915 msg = _(
"Error on Waypoint Upload. Garmin GPS not connected");
918 msg = _(
"Error on Waypoint Upload. GPS driver not available");
922 msg = _(
"Error on Waypoint Upload. Please check logfiles...");
927 OCPNMessageBox(NULL, msg, _(
"OpenCPN Info"), wxOK | wxICON_INFORMATION);
929 return (result == 0);
932int RoutePointGui::GetIconImageIndex() {
933 if (m_point.IsShared()) {
935 wxArrayPtrVoid *proute_array =
939 bool brp_viz =
false;
941 for (
unsigned int ir = 0; ir < proute_array->GetCount(); ir++) {
943 if (pr->IsVisible()) {
954 if (m_point.IsVisible())
955 return (pWayPointMan->GetIconImageListIndex(GetIconBitmap()));
962 if (m_point.IsVisible())
963 return (pWayPointMan->GetIconImageListIndex(GetIconBitmap()));
ChartCanvas - Main chart display and interaction component.
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
void GetCanvasPixPoint(double x, double y, double &lat, double &lon)
Convert canvas pixel coordinates (physical pixels) to latitude/longitude.
wxFont * FindOrCreateFont(int point_size, wxFontFamily family, wxFontStyle style, wxFontWeight weight, bool underline=false, const wxString &facename=wxEmptyString, wxFontEncoding encoding=wxFONTENCODING_DEFAULT)
Creates or finds a matching font in the font cache.
wxColour GetFontColor(const wxString &TextElement) const
Gets the text color for a UI element.
wxFont * GetFont(const wxString &TextElement, int requested_font_size=0)
Get a font object for a UI element.
wxColour m_wxcWaypointRangeRingsColour
Color for the range rings display.
LLBBox m_wpBBox
Bounding box for the waypoint.
int m_iWaypointRangeRingsNumber
Number of range rings to display around the waypoint.
int m_NameLocationOffsetX
Horizontal offset for waypoint name placement relative to the icon.
bool m_bRPIsBeingEdited
Flag indicating if this waypoint is currently being edited.
wxRect CurrentRect_in_DC
Current rectangle occupied by the waypoint in the display.
unsigned int m_iTextTexture
Texture identifier for rendered text.
int m_NameLocationOffsetY
Vertical offset for waypoint name placement relative to the icon.
bool m_pos_on_screen
Flag indicating if the waypoint is currently visible on screen.
bool m_bIsActive
Flag indicating if this waypoint is active for navigation.
int m_iTextTextureHeight
Height of the text texture in pixels.
bool m_IconIsDirty
Flag indicating if the waypoint icon needs to be reloaded or redrawn.
wxFont * m_pMarkFont
Font used for rendering the waypoint name.
bool m_bShowName
Flag indicating if the waypoint name should be shown.
bool m_bBlink
Flag indicating if the waypoint should blink when displayed.
bool m_bPtIsSelected
Flag indicating if this waypoint is currently selected.
int m_iTextTextureWidth
Width of the text texture in pixels.
wxColour m_FontColor
Color used for rendering the waypoint name.
wxSize m_NameExtents
Size of the waypoint name text when rendered.
int m_iWaypointRangeRingsStepUnits
Units for the range rings step (0=nm, 1=km).
float m_fWaypointRangeRingsStep
Distance between consecutive range rings.
wxPoint2DDouble m_screen_pos
Cached screen position of the waypoint for drawing arrows and points.
bool m_bShowWaypointRangeRings
Flag indicating if range rings should be shown around the waypoint.
Represents a navigational route in the navigation system.
wxArrayPtrVoid * GetRouteArrayContaining(RoutePoint *pWP)
Find all routes that contain the given waypoint.
Dialog for sending routes/waypoints to a GPS device.
ViewPort - Core geographic projection and coordinate transformation engine.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
double rotation
Rotation angle of the viewport in radians.
int GetXIconImageListIndex(const wxBitmap *pbm) const
index of "X-ed out" icon in the image list
int GetFIconImageListIndex(const wxBitmap *pbm) const
index of "fixed viz" icon in the image list
Device context class that can use either wxDC or OpenGL for drawing.
Global color handling by name.
NMEA Data Multiplexer Object.
#define ERR_GPS_DRIVER_NOT_AVAILAIBLE
GPS driver not available.
#define ERR_GARMIN_SEND_MESSAGE
Failed to send message to Garmin device.
#define ERR_GARMIN_INITIALIZE
Failed to initialize Garmin device.
Extern C linked utilities.
OpenGL chart rendering canvas.
Multiplexer class and helpers.
Wrapper creating a N0183DlgCtx based on a SendToGpsDlg instance.
PlugIn Object Definition/API.
wxWindow * GetOCPNCanvasWindow()
Gets OpenCPN's main canvas window.
double OCPN_GetWinDIPScaleFactor()
Gets Windows-specific DPI scaling factor.
wxRect g_blink_rect
Global instance.
Purpose: Track and Trackpoint drawing stuff.
Routeman * g_pRouteMan
Global instance.
wxBitmap LoadSVG(const wxString filename, const unsigned int width, const unsigned int height, wxBitmap *default_bitmap, bool use_cache)
Load SVG file and return it's bitmap representation of requested size In case file can't be loaded an...
Geographic projection and coordinate transformations.
WaypointMan drawing stuff.