41extern wxColor GetDimColor(wxColor c);
57 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
66 wxColour hi_colour = pen->GetColour();
67 unsigned char transparency = 100;
70 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
71 hilitebox.height, radius, hi_colour, transparency);
74void TrackGui::Finalize() {
75 if (m_track.SubTracks.size())
80 int n = m_track.TrackPoints.size() - 1;
83 std::vector<SubTrack> new_level;
86 for (
int i = 0; i < n; i++) {
87 new_level[i].m_box.SetFromSegment(m_track.TrackPoints[i]->m_lat,
88 m_track.TrackPoints[i]->m_lon,
89 m_track.TrackPoints[i + 1]->m_lat,
90 m_track.TrackPoints[i + 1]->m_lon);
91 new_level[i].m_scale = 0;
94 for (
int i = 0; i < n; i++) {
96 new_level[i].m_box = m_track.SubTracks[level - 1][p].m_box;
97 if (p + 1 < (
int)m_track.SubTracks[level - 1].size())
98 new_level[i].m_box.Expand(m_track.SubTracks[level - 1][p + 1].m_box);
100 int left = i << level;
101 int right = wxMin(left + (1 << level), m_track.TrackPoints.size() - 1);
102 new_level[i].m_scale = m_track.ComputeScale(left, right);
105 m_track.SubTracks.push_back(new_level);
107 if (n > 1 && n & 1) n++;
117 std::list<std::list<wxPoint> > &pointlists,
119 if (!m_track.IsVisible() || m_track.GetnPoints() == 0)
return;
124 if(GetnPoints() > 40000) {
125 double t = sw.GetTime();
127 for(std::list< std::list<wxPoint> >::iterator lines = pointlists.begin();
128 lines != pointlists.end(); lines++) {
129 if(lines->size() > 1)
133 printf(
"assemble time %f %f segments %f seg/ms\n", sw.GetTime(), c, c/t);
139 if (m_track.IsRunning()) {
140 std::list<wxPoint> new_list;
141 pointlists.push_back(new_list);
142 AddPointToList(cc, pointlists, m_track.TrackPoints.size() - 1);
145 pointlists.back().push_back(r);
151 std::list<std::list<wxPoint> > pointlists;
152 GetPointLists(cc, pointlists, VP, box);
154 if (!pointlists.size())
return;
157 wxColour basic_colour;
158 if (m_track.IsRunning())
159 basic_colour = GetGlobalColor(
"URED");
161 basic_colour = GetDimColor(g_colourTrackLineColour);
163 wxPenStyle style = wxPENSTYLE_SOLID;
164 int width =
g_pRouteMan->GetTrackPen()->GetWidth();
166 if (m_track.m_style != wxPENSTYLE_INVALID) style = m_track.m_style;
167 if (m_track.m_width != WIDTH_UNDEFINED) width = m_track.m_width;
168 if (m_track.m_Colour ==
"") {
172 if (m_track.GetName().StartsWith(
"AIS")) col = GetGlobalColor(
"TEAL1");
174 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
176 if (m_track.m_Colour == ::GpxxColorNames[i]) {
177 col = ::GpxxColors[i];
184 if (g_bHighliteTracks) {
185 double radius_meters = 20;
187 radius = wxMax((radius_meters * wxMin(
scale, 1.1)), 6.0);
188 if (
scale < 0.004) radius = 0;
192 wxPen p = *wxThePenList->FindOrCreatePen(col, width, style);
194 if (glChartCanvas::dash_map.find(style) != glChartCanvas::dash_map.end()) {
195 p.SetDashes(2, &glChartCanvas::dash_map[style][0]);
199 dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(col, wxBRUSHSTYLE_SOLID));
200 for (std::list<std::list<wxPoint> >::iterator lines = pointlists.begin();
201 lines != pointlists.end(); lines++) {
203 wxPoint *points =
new wxPoint[lines->size()];
205 for (std::list<wxPoint>::iterator line = lines->begin();
206 line != lines->end(); line++) {
211 int hilite_width = radius;
212 if (hilite_width >= 1.0) {
214 wxPen psave = dc.GetPen();
216 wxColor trackLine_dim_colour = GetDimColor(g_colourTrackLineColour);
217 wxColour hilt(trackLine_dim_colour.Red(), trackLine_dim_colour.Green(),
218 trackLine_dim_colour.Blue(), 128);
219 wxPen HiPen(hilt, hilite_width, wxPENSTYLE_SOLID);
222 dc.StrokeLines(i, points);
226 dc.StrokeLines(i, points);
228 dc.StrokeLines(i, points);
234 if (m_track.m_HighlightedTrackPoint >= 0)
235 TrackPointGui(m_track.TrackPoints[m_track.m_HighlightedTrackPoint])
241 std::list<std::list<wxPoint> > &pointlists,
242 const LLBBox &box,
double scale) {
243 if (!m_track.SubTracks.size())
return;
245 int level = m_track.SubTracks.size() - 1, last = -2;
246 Assemble(cc, pointlists, box, 1 /
scale /
scale, last, level, 0);
252 std::list<std::list<wxPoint> > &pointlists,
253 const LLBBox &box,
double scale,
int &last,
int level,
255 if (pos == (
int)m_track.SubTracks[level].size())
return;
257 SubTrack &s = m_track.SubTracks[level][pos];
258 if (box.IntersectOut(s.m_box))
return;
260 if (s.m_scale <
scale) {
263 if (last < pos - 1) {
264 std::list<wxPoint> new_list;
265 pointlists.push_back(new_list);
268 if (last < pos) AddPointToList(cc, pointlists, pos);
269 last = wxMin(pos + (1 << level), m_track.TrackPoints.size() - 1);
270 AddPointToList(cc, pointlists, last);
272 Assemble(cc, pointlists, box,
scale, last, level - 1, pos << 1);
273 Assemble(cc, pointlists, box,
scale, last, level - 1, (pos << 1) + 1);
278 std::list<std::list<wxPoint> > &pointlists,
280 wxPoint r(INVALID_COORD, INVALID_COORD);
281 if ((
size_t)n < m_track.TrackPoints.size())
283 m_track.TrackPoints[n]->m_lon, &r);
285 std::list<wxPoint> &pointlist = pointlists.back();
286 if (r.x == INVALID_COORD) {
287 if (pointlist.size()) {
288 std::list<wxPoint> new_list;
289 pointlists.push_back(new_list);
294 if (pointlist.size() == 0)
295 pointlist.push_back(r);
297 wxPoint l = pointlist.back();
299 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.