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_; \
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_);
void set_brightness(unsigned char b)
Set drawing brightness.
void draw_rectangle(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
Draw rectangle.
void draw_cross(unsigned int x_center, unsigned int y_center, unsigned int width)
Draws a cross.
void set_overlap(bool o)
Enable/Disable transparency (overlapping pixels increase brightness).
void draw_circle(int center_x, int center_y, unsigned int radius)
Draw circle.
void draw_rectangle_inverted(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
Draw inverted rectangle.
void draw_point(unsigned int x, unsigned int y)
Draw point.
void draw_line(unsigned int x_start, unsigned int y_start, unsigned int x_end, unsigned int y_end)
Draw line.
void set_buffer(unsigned char *buffer, unsigned int width, unsigned int height)
Set the buffer to draw to.