1#if defined(__ANDROID__)
3#include <GL/gl_private.h>
6#elif defined(ocpnUSE_GL)
12#elif defined(__WXOSX__)
14#include <OpenGL/glu.h>
15typedef void (*_GLUfuncptr)();
16#define GL_COMPRESSED_RGB_FXT1_3DFX 0x86B0
18#elif defined(__WXQT__) || defined(__WXGTK__)
29#include "model/comm_n0183_output.h"
30#include "model/georef.h"
31#include "model/multiplexer.h"
32#include "model/own_ship.h"
33#include "model/route.h"
34#include "model/routeman.h"
36#include "color_handler.h"
38#include "glChartCanvas.h"
39#include "n0183_ctx_factory.h"
41#include "ocpn_frame.h"
42#include "OCPNPlatform.h"
44#include "route_point_gui.h"
48#include "waypointman_gui.h"
52extern float g_MarkScaleFactorExp;
67 if (NULL != rpn) *rpn = r;
69 if (!
RoutePointGui(m_point).IsVisibleSelectable(canvas, boverride_viz))
73 if ((abs(r.x) > canvas->GetCanvasWidth() * 4) ||
74 (abs(r.y) > canvas->GetCanvasHeight() * 4))
78 if ((abs(r.x) == INVALID_COORD) || (abs(r.y) == INVALID_COORD))
return;
81 if (m_point.m_IconName == _T(
"empty") && !m_point.m_bShowName &&
82 !m_point.m_bPtIsSelected) {
88 pen = g_pRouteMan->GetActiveRoutePointPen();
90 pen = g_pRouteMan->GetRoutePointPen();
93 if (m_point.m_IconIsDirty) ReLoadIcon();
95 if ((m_point.m_bIsActive) && (m_point.m_IconName != _T(
"mob")))
96 pbm = pWayPointMan->GetIconBitmap(_T (
"activepoint" ));
98 pbm = m_point.m_pbmIcon;
100 wxBitmap *pbms = NULL;
101 if ((g_MarkScaleFactorExp > 1.0) && !m_point.m_bPreScaled) {
102 if (m_point.m_IconScaleFactor != g_MarkScaleFactorExp) {
103 wxImage scaled_image = pbm->ConvertToImage();
104 int new_width = pbm->GetWidth() * g_MarkScaleFactorExp;
105 int new_height = pbm->GetHeight() * g_MarkScaleFactorExp;
106 m_point.m_ScaledBMP = wxBitmap(
107 scaled_image.Scale(new_width, new_height, wxIMAGE_QUALITY_HIGH));
109 m_point.m_IconScaleFactor = g_MarkScaleFactorExp;
111 if (m_point.m_ScaledBMP.IsOk()) pbm = &m_point.m_ScaledBMP;
114 int sx2 = pbm->GetWidth() / 2;
115 int sy2 = pbm->GetHeight() / 2;
118 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
120 if (m_point.m_bShowName) {
121 if (0 == m_point.m_pMarkFont) {
122 wxFont *dFont = FontMgr::Get().
GetFont(_(
"Marks"));
123 int font_size = wxMax(8, dFont->GetPointSize());
124 font_size /= OCPN_GetWinDIPScaleFactor();
127 font_size, dFont->GetFamily(), dFont->GetStyle(), dFont->GetWeight(),
128 false, dFont->GetFaceName());
130 m_point.m_FontColor = FontMgr::Get().
GetFontColor(_(
"Marks"));
131 m_point.CalculateNameExtents();
134 if (m_point.m_pMarkFont) {
135 wxRect r2(r.x + m_point.m_NameLocationOffsetX,
136 r.y + m_point.m_NameLocationOffsetY, m_point.m_NameExtents.x,
137 m_point.m_NameExtents.y);
147 hilitebox.Inflate(20);
150 hilitebox.Inflate(4);
154 wxColour hi_colour = pen->GetColour();
155 unsigned char transparency = 100;
156 if (m_point.m_bRPIsBeingEdited) {
157 hi_colour = GetGlobalColor(_T (
"YELO1" ));
162 if (m_point.m_bPtIsSelected || m_point.m_bRPIsBeingEdited) {
163 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
164 hilitebox.height, radius, hi_colour, transparency);
167 bool bDrawHL =
false;
169 if (m_point.m_bBlink && (gFrame->nBlinkerTick & 1)) bDrawHL =
true;
171 if ((!bDrawHL) && (NULL != m_point.m_pbmIcon)) {
172 dc.DrawBitmap(*pbm, r.x - sx2, r.y - sy2,
true);
175 dc.CalcBoundingBox(r.x - sx2, r.y - sy2);
176 dc.CalcBoundingBox(r.x + sx2, r.y + sy2);
179 if (m_point.m_bShowName && m_point.m_MarkName.Length()) {
180 if (m_point.m_pMarkFont) {
181 dc.SetFont(*m_point.m_pMarkFont);
182 dc.SetTextForeground(m_point.m_FontColor);
184 dc.DrawText(m_point.m_MarkName, r.x + m_point.m_NameLocationOffsetX,
185 r.y + m_point.m_NameLocationOffsetY);
190 if (m_point.m_iWaypointRangeRingsNumber &&
191 m_point.m_bShowWaypointRangeRings) {
192 double factor = 1.00;
193 if (m_point.m_iWaypointRangeRingsStepUnits == 1)
196 factor *= m_point.m_fWaypointRangeRingsStep;
200 ll_gc_ll(m_point.m_lat, m_point.m_lon, 0, factor, &tlat, &tlon);
204 sqrt(pow((
double)(r.x - r1.x), 2) + pow((
double)(r.y - r1.y), 2));
205 int pix_radius = (int)lpp;
207 wxPen ppPen1(m_point.m_wxcWaypointRangeRingsColour, 2);
208 wxBrush saveBrush = dc.GetBrush();
209 wxPen savePen = dc.GetPen();
211 dc.SetBrush(wxBrush(m_point.m_wxcWaypointRangeRingsColour,
212 wxBRUSHSTYLE_TRANSPARENT));
214 for (
int i = 1; i <= m_point.m_iWaypointRangeRingsNumber; i++)
215 dc.StrokeCircle(r.x, r.y, i * pix_radius);
217 dc.SetBrush(saveBrush);
222 m_point.CurrentRect_in_DC.x = r.x + hilitebox.x;
223 m_point.CurrentRect_in_DC.y = r.y + hilitebox.y;
224 m_point.CurrentRect_in_DC.width = hilitebox.width;
225 m_point.CurrentRect_in_DC.height = hilitebox.height;
227 if (m_point.m_bBlink)
228 g_blink_rect = m_point.CurrentRect_in_DC;
235 bool use_cached_screen_coords,
bool bVizOverride) {
236 if (!
RoutePointGui(m_point).IsVisibleSelectable(canvas, bVizOverride))
return;
239 if (m_point.m_IconName == _T(
"empty") && !m_point.m_bShowName &&
240 !m_point.m_bPtIsSelected)
243 if (m_point.m_wpBBox.GetValid() &&
245 vp.
rotation == m_point.m_wpBBox_rotation) {
247 LLBBox vpBBox = vp.GetBBox();
248 if (vpBBox.IntersectOut(m_point.m_wpBBox)) {
250 if (m_point.m_bShowWaypointRangeRings &&
251 (m_point.m_iWaypointRangeRingsNumber > 0)) {
252 double factor = 1.00;
253 if (m_point.m_iWaypointRangeRingsStepUnits ==
257 double radius = factor * m_point.m_iWaypointRangeRingsNumber *
258 m_point.m_fWaypointRangeRingsStep / 60.;
260 LLBBox radar_box = m_point.m_wpBBox;
261 radar_box.EnLarge(radius * 2);
262 if (vpBBox.IntersectOut(radar_box)) {
272 unsigned char transparency = 150;
274 if (use_cached_screen_coords && m_point.m_pos_on_screen)
275 r.x = m_point.m_screen_pos.m_x, r.y = m_point.m_screen_pos.m_y;
279 if (r.x == INVALID_COORD)
return;
282 if (m_point.m_IconIsDirty) ReLoadIcon();
284 if ((m_point.m_bIsActive) && (m_point.m_IconName != _T(
"mob")))
285 pbm = pWayPointMan->GetIconBitmap(_T (
"activepoint" ));
287 pbm = m_point.m_pbmIcon;
290 if (!pbm || !pbm->IsOk())
return;
292 int sx2 = pbm->GetWidth() / 2;
293 int sy2 = pbm->GetHeight() / 2;
296 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
299 if (m_point.m_bShowName) {
300 if (!m_point.m_pMarkFont) {
301 wxFont *dFont = FontMgr::Get().
GetFont(_(
"Marks"));
302 int font_size = wxMax(8, dFont->GetPointSize());
303 font_size /= OCPN_GetWinDIPScaleFactor();
306 font_size, dFont->GetFamily(), dFont->GetStyle(), dFont->GetWeight(),
307 false, dFont->GetFaceName());
309 m_point.m_FontColor = FontMgr::Get().
GetFontColor(_(
"Marks"));
310 if (m_point.m_iTextTexture) {
311 glDeleteTextures(1, &m_point.m_iTextTexture);
312 m_point.m_iTextTexture = 0;
315 m_point.CalculateNameExtents();
318 if (m_point.m_pMarkFont) {
319 wxRect r2(r.x + m_point.m_NameLocationOffsetX,
320 r.y + m_point.m_NameLocationOffsetY, m_point.m_NameExtents.x,
321 m_point.m_NameExtents.y);
330 if (!m_point.m_bPreScaled) {
331 hilitebox.x *= g_MarkScaleFactorExp;
332 hilitebox.y *= g_MarkScaleFactorExp;
333 hilitebox.width *= g_MarkScaleFactorExp;
334 hilitebox.height *= g_MarkScaleFactorExp;
339 hilitebox.Inflate(20);
342 hilitebox.Inflate(4);
347 if (!m_point.m_wpBBox.GetValid() ||
349 vp.
rotation != m_point.m_wpBBox_rotation) {
350 double lat1, lon1, lat2, lon2;
352 r.y + hilitebox.y + hilitebox.height, lat1, lon1);
354 r.y + hilitebox.y, lat2, lon2);
357 m_point.m_wpBBox.Set(lat1, lon1, lat2, lon2 + 360);
359 m_point.m_wpBBox.Set(lat1, lon1, lat2, lon2);
362 m_point.m_wpBBox_rotation = vp.
rotation;
371 if (m_point.m_bPtIsSelected) {
373 if (m_point.m_bBlink) {
374 wxPen *pen = g_pRouteMan->GetActiveRoutePointPen();
375 hi_colour = pen->GetColour();
377 hi_colour = GetGlobalColor(_T (
"YELO1" ));
380 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
381 hilitebox.height, radius, hi_colour, transparency);
384 bool bDrawHL =
false;
386 if (m_point.m_bBlink && (gFrame->nBlinkerTick & 1)) bDrawHL =
true;
388 if ((!bDrawHL) && (NULL != m_point.m_pbmIcon)) {
390 unsigned int IconTexture =
393 glBindTexture(GL_TEXTURE_2D, IconTexture);
395 glEnable(GL_TEXTURE_2D);
398 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
399 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
401 int w = r1.width, h = r1.height;
404 if (!m_point.m_bPreScaled) {
405 scale = g_MarkScaleFactorExp;
409 scale *= GetOCPNCanvasWindow()->GetContentScaleFactor();
411 float ws = r1.width *
scale;
412 float hs = r1.height *
scale;
413 float xs = r.x - ws / 2.;
414 float ys = r.y - hs / 2.;
415 float u = (float)w / glw, v = (
float)h / glh;
436 coords[6] = xs, coords[7] = ys + hs;
438 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
441 glDisable(GL_TEXTURE_2D);
444 if (m_point.m_bShowName && m_point.m_pMarkFont) {
445 int w = m_point.m_NameExtents.x, h = m_point.m_NameExtents.y;
446 if (!m_point.m_iTextTexture && w && h) {
450 dc.SelectObject(tbm);
451 dc.SetBackground(wxBrush(*wxBLACK));
453 dc.SetFont(*m_pMarkFont);
454 dc.SetTextForeground(*wxWHITE);
455 dc.DrawText(m_MarkName, 0, 0);
456 dc.SelectObject(wxNullBitmap);
459 wxImage image = tbm.ConvertToImage();
460 unsigned char *d = image.GetData();
461 unsigned char *e =
new unsigned char[w * h];
463 for (
int p = 0; p < w * h; p++) e[p] = d[3 * p + 0];
467 glGenTextures(1, &m_iTextTexture);
468 glBindTexture(GL_TEXTURE_2D, m_iTextTexture);
470 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
471 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
473 m_iTextTextureWidth = NextPow2(w);
474 m_iTextTextureHeight = NextPow2(h);
475 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, m_iTextTextureWidth,
476 m_iTextTextureHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, NULL);
477 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_ALPHA, GL_UNSIGNED_BYTE,
482 sdc.SetFont(*m_point.m_pMarkFont);
487 temp_dc.SelectObject(bmp);
490 temp_dc.SetBackground(wxBrush(wxColour(0, 0, 0)));
494 temp_dc.SetFont(*m_point.m_pMarkFont);
495 temp_dc.SetTextForeground(wxColour(255, 255, 255));
496 temp_dc.DrawText(m_point.m_MarkName, 0, 0);
497 temp_dc.SelectObject(wxNullBitmap);
501 wxImage image = bmp.ConvertToImage();
503 unsigned char *data =
new unsigned char[w * h * 4];
504 unsigned char *im = image.GetData();
507 unsigned int r = m_point.m_FontColor.Red();
508 unsigned int g = m_point.m_FontColor.Green();
509 unsigned int b = m_point.m_FontColor.Blue();
510 for (
int i = 0; i < h; i++) {
511 for (
int j = 0; j < w; j++) {
512 unsigned int index = ((i * w) + j) * 4;
516 data[index + 3] = im[((i * w) + j) * 3];
521 glGenTextures(1, &m_point.m_iTextTexture);
523 glBindTexture(GL_TEXTURE_2D, m_point.m_iTextTexture);
525 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
526 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
528 m_point.m_iTextTextureWidth = NextPow2(w);
529 m_point.m_iTextTextureHeight = NextPow2(h);
530 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_point.m_iTextTextureWidth,
531 m_point.m_iTextTextureHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE,
533 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE,
538 glEnable(GL_TEXTURE_2D);
540 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
545 if (m_point.m_iTextTexture) {
547 glBindTexture(GL_TEXTURE_2D, m_point.m_iTextTexture);
549 glEnable(GL_TEXTURE_2D);
552 int x = r.x + m_point.m_NameLocationOffsetX,
553 y = r.y + m_point.m_NameLocationOffsetY;
554 float u = (float)w / m_point.m_iTextTextureWidth,
555 v = (
float)h / m_point.m_iTextTextureHeight;
575 coords[6] = x, coords[7] = y + h;
577 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
580 glDisable(GL_TEXTURE_2D);
585 if (m_point.m_iWaypointRangeRingsNumber &&
586 m_point.m_bShowWaypointRangeRings) {
587 double factor = 1.00;
588 if (m_point.m_iWaypointRangeRingsStepUnits == 1)
591 factor *= m_point.m_fWaypointRangeRingsStep;
595 ll_gc_ll(m_point.m_lat, m_point.m_lon, 0, factor, &tlat, &tlon);
599 sqrt(pow((
double)(r.x - r1.x), 2) + pow((
double)(r.y - r1.y), 2));
600 int pix_radius = (int)lpp;
602 extern wxColor GetDimColor(wxColor c);
603 wxColor ring_dim_color = GetDimColor(m_point.m_wxcWaypointRangeRingsColour);
606 double platform_pen_width =
607 wxRound(wxMax(1.0, g_Platform->GetDisplayDPmm() / 2));
608 wxPen ppPen1(ring_dim_color, platform_pen_width);
609 wxBrush saveBrush = dc.GetBrush();
610 wxPen savePen = dc.GetPen();
612 dc.SetBrush(wxBrush(ring_dim_color, wxBRUSHSTYLE_TRANSPARENT));
614 for (
int i = 1; i <= m_point.m_iWaypointRangeRingsNumber; i++)
615 dc.StrokeCircle(r.x, r.y, i * pix_radius);
617 dc.SetBrush(saveBrush);
621 if (m_point.m_bDrawDragHandle) {
623 double platform_pen_width = wxRound(
624 wxMax(1.0, g_Platform->GetDisplayDPmm() /
627 wxColor dh_color = GetGlobalColor(_T (
"YELO1" ));
628 wxPen ppPen1(dh_color, 3 * 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);
634 dh_color = wxColor(0, 0, 0);
635 wxPen ppPen2(dh_color, platform_pen_width);
637 dc.DrawLine(r.x + hilitebox.width / 4, r.y + hilitebox.height / 4,
638 r.x + m_point.m_drag_line_length_man,
639 r.y + m_point.m_drag_line_length_man);
642 glBindTexture(GL_TEXTURE_2D, m_point.m_dragIconTexture);
644 glEnable(GL_TEXTURE_2D);
647 int x = r.x + m_point.m_drag_icon_offset,
648 y = r.y + m_point.m_drag_icon_offset, w = m_point.m_dragIcon.GetWidth(),
649 h = m_point.m_dragIcon.GetHeight();
653 float ws = w *
scale;
654 float hs = h *
scale;
655 float xs = x - ws / 2.;
656 float ys = y - hs / 2.;
657 float u = (float)w / m_point.m_dragIconTextureWidth,
658 v = (
float)h / m_point.m_dragIconTextureWidth;
679 coords[6] = xs, coords[7] = ys + hs;
681 glChartCanvas::RenderSingleTexture(dc, coords, uv, &vp, 0, 0, 0);
684 glDisable(GL_TEXTURE_2D);
687 if (m_point.m_bBlink)
688 g_blink_rect = m_point.CurrentRect_in_DC;
691 m_point.CurrentRect_in_DC.x = r.x + hilitebox.x;
692 m_point.CurrentRect_in_DC.y = r.y + hilitebox.y;
693 m_point.CurrentRect_in_DC.width = hilitebox.width;
694 m_point.CurrentRect_in_DC.height = hilitebox.height;
696 if (m_point.m_bBlink)
697 g_blink_rect = m_point.CurrentRect_in_DC;
701void RoutePointGui::CalculateDCRect(wxDC &dc,
ChartCanvas *canvas,
704 dc.ResetBoundingBox();
705 dc.DestroyClippingRegion();
709 odc.SetVP(canvas->GetVP());
711 Draw(odc, canvas, NULL);
714 prect->x = dc.MinX() - 1;
715 prect->y = dc.MinY() - 1;
716 prect->width = dc.MaxX() - dc.MinX() + 2;
717 prect->height = dc.MaxY() - dc.MinY() + 2;
721bool RoutePointGui::IsVisibleSelectable(
ChartCanvas *cc,
bool boverrideViz) {
722 return m_point.IsVisibleSelectable(cc->GetScaleValue(), boverrideViz);
725wxPoint2DDouble RoutePointGui::GetDragHandlePoint(
ChartCanvas *canvas) {
726 if (!m_point.m_bDrawDragHandle)
727 return wxPoint2DDouble(m_point.m_lon, m_point.m_lat);
729 return computeDragHandlePoint(canvas);
732void RoutePointGui::SetPointFromDraghandlePoint(
ChartCanvas *canvas,
double lat,
738 r.y - m_point.m_drag_icon_offset, tlat, tlon);
739 m_point.m_lat = tlat;
740 m_point.m_lon = tlon;
743void RoutePointGui::SetPointFromDraghandlePoint(
ChartCanvas *canvas,
int x,
747 x - m_point.m_drag_icon_offset - m_point.m_draggingOffsetx,
748 y - m_point.m_drag_icon_offset - m_point.m_draggingOffsety, tlat, tlon);
749 m_point.m_lat = tlat;
750 m_point.m_lon = tlon;
753void RoutePointGui::PresetDragOffset(
ChartCanvas *canvas,
int x,
int y) {
757 m_point.m_draggingOffsetx = x - (r.x + m_point.m_drag_icon_offset);
758 m_point.m_draggingOffsety = y - (r.y + m_point.m_drag_icon_offset);
761wxPoint2DDouble RoutePointGui::computeDragHandlePoint(
ChartCanvas *canvas) {
766 r.y + m_point.m_drag_icon_offset, lat, lon);
769 m_point.m_dragHandleLat = lat;
770 m_point.m_dragHandleLon = lon;
772 return wxPoint2DDouble(lon, lat);
775void RoutePointGui::ShowScaleWarningMessage(
ChartCanvas *canvas) {
776 wxString strA = _(
"The ScaMin value for new waypoints is set to");
777 wxString strB = _(
"but current chartscale is");
779 _(
"Therefore the new waypoint will not be visible at this zoom level.");
781 wxString::Format(_T(
"%s %li,\n %s %.0f.\n%s"), strA, m_point.GetScaMin(),
782 strB, canvas->GetScaleValue(), strC);
783 OCPNMessageBox(canvas, MessStr);
786void RoutePointGui::EnableDragHandle(
bool bEnable) {
787 m_point.m_bDrawDragHandle = bEnable;
789 if (!m_point.m_dragIcon.IsOk()) {
792 int bm_size = g_Platform->GetDisplayDPmm() * 9;
795 wxString UserIconPath = g_Platform->GetSharedDataDir() + _T(
"uidata") +
796 wxFileName::GetPathSeparator();
798 m_point.m_dragIcon = LoadSVG(UserIconPath + _T(
"DragHandle.svg"), bm_size,
799 bm_size, m_point.m_pbmIcon);
804 if (m_point.m_dragIconTexture == 0) {
805 glGenTextures(1, &m_point.m_dragIconTexture);
806 glBindTexture(GL_TEXTURE_2D, m_point.m_dragIconTexture);
808 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
809 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
810 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
812 wxImage image = m_point.m_dragIcon.ConvertToImage();
813 int w = image.GetWidth(), h = image.GetHeight();
815 m_point.m_dragIconTextureWidth = NextPow2(w);
816 m_point.m_dragIconTextureHeight = NextPow2(h);
818 unsigned char *d = image.GetData();
819 unsigned char *a = image.GetAlpha();
821 unsigned char mr, mg, mb;
822 image.GetOrFindMaskColour(&mr, &mg, &mb);
824 unsigned char *e =
new unsigned char[4 * w * h];
826 for (
int y = 0; y < h; y++)
827 for (
int x = 0; x < w; x++) {
828 unsigned char r, g, b;
829 int off = (y * image.GetWidth() + x);
838 a ? a[off] : ((r == mr) && (g == mg) && (b == mb) ? 0 : 255);
842 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_point.m_dragIconTextureWidth,
843 m_point.m_dragIconTextureHeight, 0, GL_RGBA,
844 GL_UNSIGNED_BYTE, NULL);
845 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE,
853 if (m_point.m_dragIcon.IsOk()) {
854 m_point.m_drag_line_length_man = bm_size;
855 m_point.m_drag_icon_offset = bm_size;
857 m_point.m_drag_line_length_man = 64;
858 m_point.m_drag_icon_offset = 64;
864void RoutePointGui::ReLoadIcon(
void) {
865 if (!pWayPointMan)
return;
866 bool icon_exists = pWayPointMan->DoesIconExist(m_point.m_IconName);
868 wxString iconUse = m_point.m_IconName;
872 wxString tentative_icon = m_point.m_IconName.Lower();
873 if (pWayPointMan->DoesIconExist(tentative_icon)) {
875 m_point.m_IconName = tentative_icon;
876 iconUse = m_point.m_IconName;
881 if (!pWayPointMan->DoesIconExist(_T(
"tempsub"))) {
884 wxBitmap bmp = style->GetIcon(_T(
"circle"));
886 wxImage image = bmp.ConvertToImage();
888 .ProcessIcon(image,
"tempsub",
"tempsub");
892 iconUse = _T(
"tempsub");
896 m_point.m_pbmIcon = pWayPointMan->GetIconBitmap(iconUse);
897 m_point.m_bPreScaled = pWayPointMan->GetIconPrescaled(iconUse);
900 m_point.m_wpBBox_view_scale_ppm = -1;
902 m_point.m_iTextTexture = 0;
905 m_point.m_IconScaleFactor = -1;
906 m_point.m_pMarkFont = 0;
907 m_point.m_IconIsDirty =
false;
910bool RoutePointGui::SendToGPS(
const wxString &com_name,
SendToGpsDlg *dialog) {
912 ::wxBeginBusyCursor();
913 int result = SendWaypointToGPS_N0183(&m_point, com_name, *g_pMUX, dlg_ctx);
918 msg = _(
"Waypoint(s) Transmitted.");
920 if (result == ERR_GARMIN_INITIALIZE)
921 msg = _(
"Error on Waypoint Upload. Garmin GPS not connected");
923 msg = _(
"Error on Waypoint Upload. Please check logfiles...");
926 OCPNMessageBox(NULL, msg, _(
"OpenCPN Info"), wxOK | wxICON_INFORMATION);
928 return (result == 0);
931int RoutePointGui::GetIconImageIndex() {
932 if (m_point.IsShared()) {
934 wxArrayPtrVoid *proute_array =
935 g_pRouteMan->GetRouteArrayContaining(&m_point);
938 bool brp_viz =
false;
940 for (
unsigned int ir = 0; ir < proute_array->GetCount(); ir++) {
942 if (pr->IsVisible()) {
952 if (m_point.IsVisible())
953 return (pWayPointMan->GetIconImageListIndex(GetIconBitmap()));
960 if (m_point.IsVisible())
961 return (pWayPointMan->GetIconImageListIndex(GetIconBitmap()));
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)
Gets a font object for a UI element.
Dialog for sending routes/waypoints to a GPS device.
Represents the view port for chart display in OpenCPN.
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.
PlugIn Object Definition/API.