25 #include <fvutils/color/yuv.h>
26 #include <fvutils/draw/mono_drawer.h>
32 #define PUT_POINT(x, y) \
35 buffer_[y * width_ + x] = std::min(255, buffer_[y * width_ + x] + brightness_); \
37 buffer_[y * width_ + x] = brightness_; \
40 namespace firevision {
69 this->buffer_ = buffer;
71 this->height_ = height;
104 unsigned int x = 0, y = radius, r2 = radius * radius;
106 unsigned int x_tmp, y_tmp;
109 x_tmp = center_x + x;
110 y_tmp = center_y + y;
111 if ((x_tmp < width_) && (y_tmp < height_))
112 PUT_POINT(x_tmp, y_tmp);
114 x_tmp = center_x - x;
115 y_tmp = center_y + y;
116 if ((x_tmp < width_) && (y_tmp < height_))
117 PUT_POINT(x_tmp, y_tmp);
119 x_tmp = center_x + y;
120 y_tmp = center_y + x;
121 if ((x_tmp < width_) && (y_tmp < height_))
122 PUT_POINT(x_tmp, y_tmp);
124 x_tmp = center_x - y;
125 y_tmp = center_y + x;
126 if ((x_tmp < width_) && (y_tmp < height_))
127 PUT_POINT(x_tmp, y_tmp);
129 x_tmp = center_x + x;
130 y_tmp = center_y - y;
131 if ((x_tmp < width_) && (y_tmp < height_))
132 PUT_POINT(x_tmp, y_tmp);
134 x_tmp = center_x - x;
135 y_tmp = center_y - y;
136 if ((x_tmp < width_) && (y_tmp < height_))
137 PUT_POINT(x_tmp, y_tmp);
139 x_tmp = center_x + y;
140 y_tmp = center_y - x;
141 if ((x_tmp < width_) && (y_tmp < height_))
142 PUT_POINT(x_tmp, y_tmp);
144 x_tmp = center_x - y;
145 y_tmp = center_y - x;
146 if ((x_tmp < width_) && (y_tmp < height_))
147 PUT_POINT(x_tmp, y_tmp);
150 y = (int)(sqrt((
float)(r2 - x * x)) + 0.5);
164 for (
unsigned int i = x; i < x + w; ++i) {
173 for (
unsigned int i = y; i < y + h; ++i) {
177 if ((x + w) < width_) {
184 for (
unsigned int i = x; i < x + w; ++i) {
204 unsigned int ind = 0;
207 for (
unsigned int i = x; i < x + w; ++i) {
209 ind = y * width_ + i;
210 buffer_[ind] = 255 - buffer_[ind];
217 for (
unsigned int i = y; i < y + h; ++i) {
219 ind = i * width_ + x;
220 buffer_[ind] = 255 - buffer_[ind];
222 if ((x + w) < width_) {
225 buffer_[ind] = 255 - buffer_[ind];
230 for (
unsigned int i = x; i < x + w; ++i) {
232 buffer_[ind] = 255 - buffer_[ind];
264 unsigned int y_start,
273 int x, y, dist, xerr, yerr, dx, dy, incx, incy;
274 bool was_inside_image =
false;
277 dx = x_end - x_start;
278 dy = y_end - y_start;
296 dist = (dx > dy) ? dx : dy;
305 for (
int t = 0; t < dist; ++t) {
306 if (((
unsigned int)x < width_) && ((
unsigned int)y < height_)) {
307 if ((x >= 0) && (y >= 0)) {
308 was_inside_image =
true;
312 if (was_inside_image) {
331 if ((x_end < width_) && (y_end < height_)) {
332 PUT_POINT(x_end, y_end);
344 x_center = std::min(x_center, width_);
345 y_center = std::min(y_center, height_);
348 unsigned int a = std::max(0, (
int)x_center - r);
349 unsigned int b = std::min(x_center + r, width_);
352 a = std::max(0, (
int)y_center - r);
353 b = std::min(y_center + r, height_);