OpenCPN Partial API docs
Loading...
Searching...
No Matches
Quilt.h
1/******************************************************************************
2 *
3 * Project: OpenCPN
4 *
5 ***************************************************************************
6 * Copyright (C) 2013 by David S. Register *
7 * *
8 * This program is free software; you can redistribute it and/or modify *
9 * it under the terms of the GNU General Public License as published by *
10 * the Free Software Foundation; either version 2 of the License, or *
11 * (at your option) any later version. *
12 * *
13 * This program is distributed in the hope that it will be useful, *
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
16 * GNU General Public License for more details. *
17 * *
18 * You should have received a copy of the GNU General Public License *
19 * along with this program; if not, write to the *
20 * Free Software Foundation, Inc., *
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
22 ***************************************************************************
23 */
24
25#ifndef __QUIT_H__
26#define __QUIT_H__
27
28#include <vector>
29#include "LLRegion.h"
30#include "OCPNRegion.h"
31#include "chcanv.h"
32#include "viewport.h"
33#include "chartdb.h"
34
35extern bool g_bopengl;
36
37struct ChartTableEntry;
38
40public:
41 QuiltPatch() {
42 b_Valid = false;
43 b_eclipsed = false;
44 b_overlay = false;
45 }
46 int dbIndex;
47 LLRegion ActiveRegion;
48 int ProjType;
49 bool b_Valid;
50 bool b_eclipsed;
51 bool b_overlay;
52 LLRegion quilt_region;
53};
54
56public:
58 b_include = false;
59 b_eclipsed = false;
60 last_factor = -1;
61 }
62
63 const LLRegion &GetCandidateRegion();
64 LLRegion &GetReducedCandidateRegion(double factor);
65 void SetScale(int scale);
66 bool Scale_eq(int b) const { return abs(ChartScale - b) <= rounding; }
67 bool Scale_ge(int b) const { return Scale_eq(b) || ChartScale > b; }
68
69 int dbIndex;
70 int ChartScale;
71 int rounding;
72 bool b_include;
73 bool b_eclipsed;
74
75private:
76 double last_factor;
77 LLRegion reduced_candidate_region;
78};
79
80WX_DECLARE_LIST(QuiltPatch, PatchList);
81WX_DEFINE_SORTED_ARRAY(QuiltCandidate *, ArrayOfSortedQuiltCandidates);
82
83class Quilt {
84public:
85 Quilt(ChartCanvas *parent);
86 ~Quilt();
87
88 void SetQuiltParameters(double CanvasScaleFactor, int CanvasWidth) {
89 m_canvas_scale_factor = CanvasScaleFactor;
90 m_canvas_width = CanvasWidth;
91 }
92
93 void EnableHighDefinitionZoom(bool value) { m_b_hidef = value; }
94
95 void UnlockQuilt();
96 bool Compose(const ViewPort &vp);
97 bool IsComposed() { return m_bcomposed; }
98 ChartBase *GetFirstChart();
99 ChartBase *GetNextChart();
100 ChartBase *GetLargestScaleChart();
101 ChartBase *GetNextSmallerScaleChart();
102
103 std::vector<int> GetQuiltIndexArray(void);
104 bool IsQuiltDelta(ViewPort &vp);
105 bool IsChartQuiltableRef(int db_index);
106 ViewPort &GetQuiltVP() { return m_vp_quilt; }
107 wxString GetQuiltDepthUnit() { return m_quilt_depth_unit; }
108 void SetRenderedVP(ViewPort &vp) { m_vp_rendered = vp; }
109 bool HasOverlays(void) { return m_bquilt_has_overlays; }
110
111 int GetExtendedStackCount(void) { return m_extended_stack_array.size(); }
112 int GetFullScreenIndexCount(void) { return m_fullscreen_index_array.size(); }
113
114 int GetnCharts() { return m_PatchList.GetCount(); }
115 double GetBestStartScale(int dbi_ref_hint, const ViewPort &vp_in);
116
117 void ComputeRenderRegion(ViewPort &vp, OCPNRegion &chart_region);
118 bool RenderQuiltRegionViewOnDCNoText(wxMemoryDC &dc, ViewPort &vp,
119 OCPNRegion &chart_region);
120 bool RenderQuiltRegionViewOnDCTextOnly(wxMemoryDC &dc, ViewPort &vp,
121 OCPNRegion &chart_region);
122
123 bool IsVPBlittable(ViewPort &VPoint, int dx, int dy,
124 bool b_allow_vector = false);
125 ChartBase *GetChartAtPix(ViewPort &VPoint, wxPoint p);
126 ChartBase *GetOverlayChartAtPix(ViewPort &VPoint, wxPoint p);
127 int GetChartdbIndexAtPix(ViewPort &VPoint, wxPoint p);
128 void InvalidateAllQuiltPatchs(void);
129 void Invalidate(void) {
130 m_bcomposed = false;
131 m_vp_quilt.Invalidate();
132 m_zout_dbindex = -1;
133
134 // Quilting of skewed raster charts is allowed for OpenGL only
135 m_bquiltskew = g_bopengl;
136 // Quilting of different projections is allowed for OpenGL only
137 m_bquiltanyproj = g_bopengl;
138 }
139 void AdjustQuiltVP(ViewPort &vp_last, ViewPort &vp_proposed);
140
141 LLRegion &GetFullQuiltRegion(void) { return m_covered_region; }
142 OCPNRegion &GetFullQuiltRenderedRegion(void) { return m_rendered_region; }
143 bool IsChartSmallestScale(int dbIndex);
144
145 int AdjustRefOnZoomOut(double proposed_scale_onscreen);
146 int AdjustRefOnZoomIn(double proposed_scale_onscreen);
147 // int AdjustRefOnZoom( bool b_zin, ChartFamilyEnum family, ChartTypeEnum
148 // type, double proposed_scale_onscreen );
149 int AdjustRefSelection(const ViewPort &vp_in);
150
151 void SetHiliteIndex(int index) { m_nHiLiteIndex = index; }
152 void SetHiliteIndexArray(const std::vector<int> &index_array) {
153 m_HiLiteIndexArray = index_array;
154 }
155 void ClearHiliteIndexArray() { m_HiLiteIndexArray.clear(); }
156
157 void SetReferenceChart(int dbIndex) {
158 m_refchart_dbIndex = dbIndex;
159 if (dbIndex >= 0) {
160 m_zout_family = -1;
161 }
162 }
163 int GetRefChartdbIndex(void) { return m_refchart_dbIndex; }
164
165 ChartBase *GetRefChart();
166
167 int GetQuiltProj(void) { return m_quilt_proj; }
168 double GetMaxErrorFactor() { return m_max_error_factor; }
169 double GetRefScale() { return m_reference_scale; }
170
171 ChartFamilyEnum GetRefFamily() { return (ChartFamilyEnum)m_reference_family; }
172
173 void SetPreferrefFamily(ChartFamilyEnum family) {
174 m_preferred_family = family;
175 }
176
177 double GetRefNativeScale();
178
179 std::vector<int> GetCandidatedbIndexArray(bool from_ref_chart,
180 bool exclude_user_hidden);
181 std::vector<int> &GetExtendedStackIndexArray() {
182 return m_extended_stack_array;
183 }
184 std::vector<int> GetEclipsedStackIndexArray() {
185 return m_eclipsed_stack_array;
186 }
187 std::vector<int> &GetFullscreenIndexArray() {
188 return m_fullscreen_index_array;
189 }
190
191 unsigned long GetXStackHash() { return m_xa_hash; }
192
193 bool IsBusy() { return m_bbusy; }
194 QuiltPatch *GetCurrentPatch();
195 bool IsChartInQuilt(ChartBase *pc);
196 bool IsChartInQuilt(wxString &full_path);
197
198 bool IsQuiltVector(void);
199 bool DoesQuiltContainPlugins(void);
200
201 LLRegion GetHiliteRegion();
202 std::vector<int> &GetHiLiteIndexArray() { return m_HiLiteIndexArray; }
203
204 static LLRegion GetChartQuiltRegion(const ChartTableEntry &cte, ViewPort &vp);
205
206 int GetNomScaleMin(int scale, ChartTypeEnum type, ChartFamilyEnum family);
207 int GetNomScaleMax(int scale, ChartTypeEnum type, ChartFamilyEnum family);
208 ChartFamilyEnum GetPreferredFamily(void) { return m_preferred_family; }
209
210private:
211 bool BuildExtendedChartStackAndCandidateArray(int ref_db_index,
212 ViewPort &vp_in);
213 int AdjustRefOnZoom(bool b_zin, ChartFamilyEnum family, ChartTypeEnum type,
214 double proposed_scale_onscreen);
215
216 bool DoRenderQuiltRegionViewOnDC(wxMemoryDC &dc, ViewPort &vp,
217 OCPNRegion &chart_region);
218 bool DoRenderQuiltRegionViewOnDCTextOnly(wxMemoryDC &dc, ViewPort &vp,
219 OCPNRegion &chart_region);
220
221 void EmptyCandidateArray(void);
222 void SubstituteClearDC(wxMemoryDC &dc, ViewPort &vp);
223 int GetNewRefChart(void);
224 const LLRegion &GetTilesetRegion(int dbIndex);
225
226 bool IsChartS57Overlay(int db_index);
227
228 LLRegion m_covered_region;
229 OCPNRegion m_rendered_region; // used only in dc mode
230
231 PatchList m_PatchList;
232 wxBitmap *m_pBM;
233
234 bool m_bcomposed;
235 wxPatchListNode *cnode;
236 bool m_bbusy;
237 int m_quilt_proj;
238
239 ArrayOfSortedQuiltCandidates *m_pcandidate_array;
240 std::vector<int> m_last_index_array;
241 std::vector<int> m_index_array;
242 std::vector<int> m_extended_stack_array;
243 std::vector<int> m_eclipsed_stack_array;
244 std::vector<int> m_fullscreen_index_array;
245
246 ViewPort m_vp_quilt;
247 ViewPort m_vp_rendered; // last VP rendered
248
249 int m_nHiLiteIndex;
250 std::vector<int> m_HiLiteIndexArray;
251 int m_refchart_dbIndex;
252 int m_reference_scale;
253 int m_reference_type;
254 int m_reference_family;
255 bool m_bneed_clear;
256 LLRegion m_back_region;
257 wxString m_quilt_depth_unit;
258 double m_max_error_factor;
259 double m_canvas_scale_factor;
260 int m_canvas_width;
261 bool m_bquilt_has_overlays;
262 unsigned long m_xa_hash;
263 int m_zout_dbindex;
264 int m_zout_family;
265 int m_zout_type;
266
267 int m_lost_refchart_dbIndex;
268 bool m_b_hidef;
269
270 bool m_bquiltskew;
271 bool m_bquiltanyproj;
272 ChartFamilyEnum m_preferred_family;
273 ChartCanvas *m_parent;
274};
275
276#endif
Base class for all chart types.
Definition chartbase.h:119
Chart display canvas.
Definition chcanv.h:135
A wrapper class for wxRegion with additional functionality.
Definition OCPNRegion.h:56
Definition Quilt.h:83
bool Compose(const ViewPort &vp)
Definition Quilt.cpp:1695
Represents the view port for chart display in OpenCPN.
Definition viewport.h:84
Represents an entry in the chart table, containing information about a single chart.
Definition chartdbs.h:181