File: qd_contour.h

package info (click to toggle)
scummvm 2.9.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 450,268 kB
  • sloc: cpp: 4,297,604; asm: 28,322; python: 12,901; sh: 11,219; java: 8,477; xml: 7,843; perl: 2,633; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (165 lines) | stat: -rw-r--r-- 5,104 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef QDENGINE_QDCORE_QD_CONTOUR_H
#define QDENGINE_QDCORE_QD_CONTOUR_H

#include "qdengine/parser/xml_fwd.h"
#include "qdengine/xmath.h"

namespace Common {
class WriteStream;
}

namespace QDEngine {

//! Контур.
/**
Используется для задания масок на статических объектах,
зон на сетке и формы элементов GUI.
*/
class qdContour {
public:
	enum qdContourType {
		//! Прямоугольник
		CONTOUR_RECTANGLE,
		//! Окружность
		CONTOUR_CIRCLE,
		//! Произвольный многоугольник
		CONTOUR_POLYGON
	};

	qdContour(qdContourType tp = CONTOUR_POLYGON);
	qdContour(const qdContour &ct);
	virtual ~qdContour();

	qdContour &operator = (const qdContour &ct);

	//! Возвращает тип контура.
	qdContourType contour_type() const {
		return _contour_type;
	}
	//! Устанавливает тип контура.
	void set_contour_type(qdContourType tp) {
		_contour_type = tp;
	}

	//! Возвращает горизонтальный размер контура.
	int size_x() const {
		return _size.x;
	}
	//! Возвращает вертикальный размер контура.
	int size_y() const {
		return _size.y;
	}

	//! Возвращает true, если точка с координатами pos лежит внутри контура.
	bool is_inside(const Vect2s &pos) const;

	//! Запись данных в скрипт.
	virtual bool save_script(Common::WriteStream &fh, int indent = 0) const;
	//! Чтение данных из скрипта.
	virtual bool load_script(const xml::tag *p);

	//! Добавляет точку в контур.
	/**
	pt - координаты точки
	*/
	void add_contour_point(const Vect2s &pt);
	//! Вставляет точку в контур.
	/**
	pt - координаты точки, insert_pos - номер точки, перед которой добавится новая.
	*/
	void insert_contour_point(const Vect2s &pt, int insert_pos = 0);
	//! Удаляет точку номер pos из контура.
	bool remove_contour_point(int pos);
	//! Присваивает точке номер pos контура координаты pt.
	bool update_contour_point(const Vect2s &pt, int pos);

	//! Удаляет все точки из контура.
	void clear_contour() {
		_contour.clear();
	}

	//! Делит координаты контура на 2 в степени shift.
	void divide_contour(int shift = 1);
	//! Умножает координаты контура на 2 в степени shift.
	void mult_contour(int shift = 1);
	//! Добавляет к соответствующим координатам dx, dy.
	void shift_contour(int dx, int dy);

	//! Возвращает координаты точки контура номер pos.
	const Vect2s &get_point(int pos) const {
		return _contour[pos];
	}

	//! Возвращает размеры маски.
	const Vect2s &mask_size() const {
		return _size;
	}

	//! Возвращает координаты центра маски.
	const Vect2s &mask_pos() const {
		return _mask_pos;
	}

	//! Возвращает количество точек в контуре.
	int contour_size() const {
		return _contour.size();
	}
	//! Возвращает массив точек контура.
	const Std::vector<Vect2s> &get_contour() const {
		return _contour;
	}

	bool is_mask_empty() const {
		return _contour.empty();
	}

	bool update_contour();

	// можно ли замкнуть текущий контур.
	// для типов контура CONTOUR_CIRCLE и CONTOUR_RECTANGLE
	// всегда возвращается false
	bool can_be_closed() const;

	//! Возвращает true, если контур пустой.
	bool is_contour_empty() const;

private:
	//! Тип контура.
	qdContourType _contour_type;

	//! Размеры контура.
	Vect2s _size;

	Vect2s _mask_pos;

	//! Контур.
	/**
	Произвольный замкнутый контур. Задается для CONTOUR_POLYGON.
	*/
	Std::vector<Vect2s> _contour;
};

} // namespace QDEngine

#endif // QDENGINE_QDCORE_QD_CONTOUR_H