42#include "user_colors.h"
58 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
67 wxColour hi_colour = pen->GetColour();
68 unsigned char transparency = 100;
71 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
72 hilitebox.height, radius, hi_colour, transparency);
75void TrackGui::Finalize() {
76 if (m_track.SubTracks.size())
81 int n = m_track.TrackPoints.size() - 1;
84 std::vector<SubTrack> new_level;
87 for (
int i = 0; i < n; i++) {
88 new_level[i].m_box.SetFromSegment(m_track.TrackPoints[i]->m_lat,
89 m_track.TrackPoints[i]->m_lon,
90 m_track.TrackPoints[i + 1]->m_lat,
91 m_track.TrackPoints[i + 1]->m_lon);
92 new_level[i].m_scale = 0;
95 for (
int i = 0; i < n; i++) {
97 new_level[i].m_box = m_track.SubTracks[level - 1][p].m_box;
98 if (p + 1 < (
int)m_track.SubTracks[level - 1].size())
99 new_level[i].m_box.Expand(m_track.SubTracks[level - 1][p + 1].m_box);
101 int left = i << level;
102 int right = wxMin(left + (1 << level), m_track.TrackPoints.size() - 1);
103 new_level[i].m_scale = m_track.ComputeScale(left, right);
106 m_track.SubTracks.push_back(new_level);
108 if (n > 1 && n & 1) n++;
118 std::list<std::list<wxPoint> > &pointlists,
120 if (!m_track.IsVisible() || m_track.GetnPoints() == 0)
return;
125 if(GetnPoints() > 40000) {
126 double t = sw.GetTime();
128 for(std::list< std::list<wxPoint> >::iterator lines = pointlists.begin();
129 lines != pointlists.end(); lines++) {
130 if(lines->size() > 1)
134 printf(
"assemble time %f %f segments %f seg/ms\n", sw.GetTime(), c, c/t);
140 if (m_track.IsRunning()) {
141 std::list<wxPoint> new_list;
142 pointlists.push_back(new_list);
143 AddPointToList(cc, pointlists, m_track.TrackPoints.size() - 1);
146 pointlists.back().push_back(r);
152 std::list<std::list<wxPoint> > pointlists;
153 GetPointLists(cc, pointlists, VP, box);
155 if (!pointlists.size())
return;
158 wxColour basic_colour;
159 if (m_track.IsRunning())
160 basic_colour = GetGlobalColor(
"URED");
162 basic_colour = user_colors::GetDimColor(g_colourTrackLineColour);
164 wxPenStyle style = wxPENSTYLE_SOLID;
165 int width =
g_pRouteMan->GetTrackPen()->GetWidth();
167 if (m_track.m_style != wxPENSTYLE_INVALID) style = m_track.m_style;
168 if (m_track.m_width != WIDTH_UNDEFINED) width = m_track.m_width;
169 if (m_track.m_Colour ==
"") {
173 if (m_track.GetName().StartsWith(
"AIS")) col = GetGlobalColor(
"TEAL1");
175 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
177 if (m_track.m_Colour == ::GpxxColorNames[i]) {
178 col = ::GpxxColors[i];
185 if (g_bHighliteTracks) {
186 double radius_meters = 20;
188 radius = wxMax((radius_meters * wxMin(
scale, 1.1)), 6.0);
189 if (
scale < 0.004) radius = 0;
193 wxPen p = *wxThePenList->FindOrCreatePen(col, width, style);
195 if (glChartCanvas::dash_map.find(style) != glChartCanvas::dash_map.end()) {
196 p.SetDashes(2, &glChartCanvas::dash_map[style][0]);
200 dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(col, wxBRUSHSTYLE_SOLID));
201 for (std::list<std::list<wxPoint> >::iterator lines = pointlists.begin();
202 lines != pointlists.end(); lines++) {
204 wxPoint *points =
new wxPoint[lines->size()];
206 for (std::list<wxPoint>::iterator line = lines->begin();
207 line != lines->end(); line++) {
212 int hilite_width = radius;
213 if (hilite_width >= 1.0) {
215 wxPen psave = dc.GetPen();
217 wxColor trackLine_dim_colour =
218 user_colors::GetDimColor(g_colourTrackLineColour);
219 wxColour hilt(trackLine_dim_colour.Red(), trackLine_dim_colour.Green(),
220 trackLine_dim_colour.Blue(), 128);
221 wxPen HiPen(hilt, hilite_width, wxPENSTYLE_SOLID);
224 dc.StrokeLines(i, points);
228 dc.StrokeLines(i, points);
230 dc.StrokeLines(i, points);
236 if (m_track.m_HighlightedTrackPoint >= 0)
237 TrackPointGui(m_track.TrackPoints[m_track.m_HighlightedTrackPoint])
243 std::list<std::list<wxPoint> > &pointlists,
244 const LLBBox &box,
double scale) {
245 if (!m_track.SubTracks.size())
return;
247 int level = m_track.SubTracks.size() - 1, last = -2;
248 Assemble(cc, pointlists, box, 1 /
scale /
scale, last, level, 0);
254 std::list<std::list<wxPoint> > &pointlists,
255 const LLBBox &box,
double scale,
int &last,
int level,
257 if (pos == (
int)m_track.SubTracks[level].size())
return;
259 SubTrack &s = m_track.SubTracks[level][pos];
260 if (box.IntersectOut(s.m_box))
return;
262 if (s.m_scale <
scale) {
265 if (last < pos - 1) {
266 std::list<wxPoint> new_list;
267 pointlists.push_back(new_list);
270 if (last < pos) AddPointToList(cc, pointlists, pos);
271 last = wxMin(pos + (1 << level), m_track.TrackPoints.size() - 1);
272 AddPointToList(cc, pointlists, last);
274 Assemble(cc, pointlists, box,
scale, last, level - 1, pos << 1);
275 Assemble(cc, pointlists, box,
scale, last, level - 1, (pos << 1) + 1);
280 std::list<std::list<wxPoint> > &pointlists,
282 wxPoint r(INVALID_COORD, INVALID_COORD);
283 if ((
size_t)n < m_track.TrackPoints.size())
285 m_track.TrackPoints[n]->m_lon, &r);
287 std::list<wxPoint> &pointlist = pointlists.back();
288 if (r.x == INVALID_COORD) {
289 if (pointlist.size()) {
290 std::list<wxPoint> new_list;
291 pointlists.push_back(new_list);
296 if (pointlist.size() == 0)
297 pointlist.push_back(r);
299 wxPoint l = pointlist.back();
301 if ((abs(r.x - l.x) > 1) || (abs(r.y - l.y) > 1)) pointlist.push_back(r);
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.
ViewPort - Core geographic projection and coordinate transformation engine.
double view_scale_ppm
Requested view scale in physical pixels per meter (ppm), before applying projections.
Device context class that can use either wxDC or OpenGL for drawing.
Global color handling by name.
Global variables stored in configuration file.
OpenGL chart rendering canvas.
Miscellaneous globals primarely used by gui layer, not persisted in configuration file.
double gLat
Vessel's current latitude in decimal degrees.
double gLon
Vessel's current longitude in decimal degrees.
Position, course, speed, etc.
Routeman * g_pRouteMan
Global instance.
Track and Trackpoint drawing stuff.