7#include "color_handler.h"
9#include "model/own_ship.h"
10#include "model/routeman.h"
12#include "glChartCanvas.h"
15extern wxColour g_colourTrackLineColour;
17extern wxColor GetDimColor(wxColor c);
18extern bool g_bHighliteTracks;
29 pen = g_pRouteMan->GetRoutePointPen();
34 wxRect r1(r.x - sx2, r.y - sy2, sx2 * 2, sy2 * 2);
43 wxColour hi_colour = pen->GetColour();
44 unsigned char transparency = 100;
47 AlphaBlending(dc, r.x + hilitebox.x, r.y + hilitebox.y, hilitebox.width,
48 hilitebox.height, radius, hi_colour, transparency);
51void TrackGui::Finalize() {
52 if (m_track.SubTracks.size())
57 int n = m_track.TrackPoints.size() - 1;
60 std::vector<SubTrack> new_level;
63 for (
int i = 0; i < n; i++) {
64 new_level[i].m_box.SetFromSegment(m_track.TrackPoints[i]->m_lat,
65 m_track.TrackPoints[i]->m_lon,
66 m_track.TrackPoints[i + 1]->m_lat,
67 m_track.TrackPoints[i + 1]->m_lon);
68 new_level[i].m_scale = 0;
71 for (
int i = 0; i < n; i++) {
73 new_level[i].m_box = m_track.SubTracks[level - 1][p].m_box;
74 if (p + 1 < (
int)m_track.SubTracks[level - 1].size())
75 new_level[i].m_box.Expand(m_track.SubTracks[level - 1][p + 1].m_box);
77 int left = i << level;
78 int right = wxMin(left + (1 << level), m_track.TrackPoints.size() - 1);
79 new_level[i].m_scale = m_track.ComputeScale(left, right);
82 m_track.SubTracks.push_back(new_level);
84 if (n > 1 && n & 1) n++;
94 std::list<std::list<wxPoint> > &pointlists,
96 if (!m_track.IsVisible() || m_track.GetnPoints() == 0)
return;
101 if(GetnPoints() > 40000) {
102 double t = sw.GetTime();
104 for(std::list< std::list<wxPoint> >::iterator lines = pointlists.begin();
105 lines != pointlists.end(); lines++) {
106 if(lines->size() > 1)
110 printf(
"assemble time %f %f segments %f seg/ms\n", sw.GetTime(), c, c/t);
116 if (m_track.IsRunning()) {
117 std::list<wxPoint> new_list;
118 pointlists.push_back(new_list);
119 AddPointToList(cc, pointlists, m_track.TrackPoints.size() - 1);
122 pointlists.back().push_back(r);
128 std::list<std::list<wxPoint> > pointlists;
129 GetPointLists(cc, pointlists, VP, box);
131 if (!pointlists.size())
return;
134 wxColour basic_colour;
135 if (m_track.IsRunning())
136 basic_colour = GetGlobalColor(_T (
"URED" ));
138 basic_colour = GetDimColor(g_colourTrackLineColour);
140 wxPenStyle style = wxPENSTYLE_SOLID;
141 int width = g_pRouteMan->GetTrackPen()->GetWidth();
143 if (m_track.m_style != wxPENSTYLE_INVALID) style = m_track.m_style;
144 if (m_track.m_width != WIDTH_UNDEFINED) width = m_track.m_width;
145 if (m_track.m_Colour == wxEmptyString) {
149 if (m_track.GetName().StartsWith(
"AIS"))
150 col = GetGlobalColor(_T (
"TEAL1" ));
152 for (
unsigned int i = 0; i <
sizeof(::GpxxColorNames) /
sizeof(wxString);
154 if (m_track.m_Colour == ::GpxxColorNames[i]) {
155 col = ::GpxxColors[i];
162 if (g_bHighliteTracks) {
163 double radius_meters = 20;
165 radius = wxMax((radius_meters * wxMin(
scale, 1.1)), 6.0);
166 if (
scale < 0.004) radius = 0;
170 wxPen p = *wxThePenList->FindOrCreatePen(col, width, style);
172 if (glChartCanvas::dash_map.find(style) != glChartCanvas::dash_map.end()) {
173 p.SetDashes(2, &glChartCanvas::dash_map[style][0]);
177 dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(col, wxBRUSHSTYLE_SOLID));
178 for (std::list<std::list<wxPoint> >::iterator lines = pointlists.begin();
179 lines != pointlists.end(); lines++) {
181 wxPoint *points =
new wxPoint[lines->size()];
183 for (std::list<wxPoint>::iterator line = lines->begin();
184 line != lines->end(); line++) {
189 int hilite_width = radius;
190 if (hilite_width >= 1.0) {
192 wxPen psave = dc.GetPen();
194 wxColor trackLine_dim_colour = GetDimColor(g_colourTrackLineColour);
195 wxColour hilt(trackLine_dim_colour.Red(), trackLine_dim_colour.Green(),
196 trackLine_dim_colour.Blue(), 128);
197 wxPen HiPen(hilt, hilite_width, wxPENSTYLE_SOLID);
200 dc.StrokeLines(i, points);
204 dc.StrokeLines(i, points);
206 dc.StrokeLines(i, points);
212 if (m_track.m_HighlightedTrackPoint >= 0)
213 TrackPointGui(m_track.TrackPoints[m_track.m_HighlightedTrackPoint])
219 std::list<std::list<wxPoint> > &pointlists,
220 const LLBBox &box,
double scale) {
221 if (!m_track.SubTracks.size())
return;
223 int level = m_track.SubTracks.size() - 1, last = -2;
224 Assemble(cc, pointlists, box, 1 /
scale /
scale, last, level, 0);
230 std::list<std::list<wxPoint> > &pointlists,
231 const LLBBox &box,
double scale,
int &last,
int level,
233 if (pos == (
int)m_track.SubTracks[level].size())
return;
235 SubTrack &s = m_track.SubTracks[level][pos];
236 if (box.IntersectOut(s.m_box))
return;
238 if (s.m_scale <
scale) {
241 if (last < pos - 1) {
242 std::list<wxPoint> new_list;
243 pointlists.push_back(new_list);
246 if (last < pos) AddPointToList(cc, pointlists, pos);
247 last = wxMin(pos + (1 << level), m_track.TrackPoints.size() - 1);
248 AddPointToList(cc, pointlists, last);
250 Assemble(cc, pointlists, box,
scale, last, level - 1, pos << 1);
251 Assemble(cc, pointlists, box,
scale, last, level - 1, (pos << 1) + 1);
256 std::list<std::list<wxPoint> > &pointlists,
258 wxPoint r(INVALID_COORD, INVALID_COORD);
259 if ((
size_t)n < m_track.TrackPoints.size())
261 m_track.TrackPoints[n]->m_lon, &r);
263 std::list<wxPoint> &pointlist = pointlists.back();
264 if (r.x == INVALID_COORD) {
265 if (pointlist.size()) {
266 std::list<wxPoint> new_list;
267 pointlists.push_back(new_list);
272 if (pointlist.size() == 0)
273 pointlist.push_back(r);
275 wxPoint l = pointlist.back();
277 if ((abs(r.x - l.x) > 1) || (abs(r.y - l.y) > 1)) pointlist.push_back(r);
bool GetCanvasPointPix(double rlat, double rlon, wxPoint *r)
Convert latitude/longitude to canvas pixel coordinates (physical pixels) rounded to nearest integer.
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.
Device context class that can use either wxDC or OpenGL for drawing.