25 #include <fvutils/draw/mono_drawer.h> 26 #include <fvutils/color/yuv.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; \ 72 unsigned int width,
unsigned int height)
74 this->__buffer = buffer;
75 this->__width = width;
76 this->__height = height;
109 if (__buffer == NULL)
return;
113 r2 = radius * radius;
115 unsigned int x_tmp, y_tmp;
119 x_tmp = center_x + x;
120 y_tmp = center_y + y;
121 if ( (x_tmp < __width) && (y_tmp < __height) )
122 PUT_POINT( x_tmp, y_tmp );
124 x_tmp = center_x - x;
125 y_tmp = center_y + y;
126 if ( (x_tmp < __width) && (y_tmp < __height) )
127 PUT_POINT( x_tmp, y_tmp );
129 x_tmp = center_x + y;
130 y_tmp = center_y + x;
131 if ( (x_tmp < __width) && (y_tmp < __height) )
132 PUT_POINT( x_tmp, y_tmp );
134 x_tmp = center_x - y;
135 y_tmp = center_y + x;
136 if ( (x_tmp < __width) && (y_tmp < __height) )
137 PUT_POINT( x_tmp, y_tmp );
139 x_tmp = center_x + x;
140 y_tmp = center_y - y;
141 if ( (x_tmp < __width) && (y_tmp < __height) )
142 PUT_POINT( x_tmp, y_tmp );
144 x_tmp = center_x - x;
145 y_tmp = center_y - y;
146 if ( (x_tmp < __width) && (y_tmp < __height) )
147 PUT_POINT( x_tmp, y_tmp );
149 x_tmp = center_x + y;
150 y_tmp = center_y - x;
151 if ( (x_tmp < __width) && (y_tmp < __height) )
152 PUT_POINT( x_tmp, y_tmp );
154 x_tmp = center_x - y;
155 y_tmp = center_y - x;
156 if ( (x_tmp < __width) && (y_tmp < __height) )
157 PUT_POINT( x_tmp, y_tmp );
160 y=(int)(sqrt((
float)(r2 - x * x))+0.5);
174 unsigned int w,
unsigned int h)
178 for (
unsigned int i = x; i < x + w; ++i) {
187 for (
unsigned int i = y; i < y + h; ++i) {
191 if ( (x + w) < __width ) {
198 for (
unsigned int i = x; i < x + w; ++i) {
219 unsigned int w,
unsigned int h)
222 unsigned int ind = 0;
225 for (
unsigned int i = x; i < x + w; ++i) {
227 ind = y * __width + i;
228 __buffer[ind] = 255 - __buffer[ind];
235 for (
unsigned int i = y; i < y + h; ++i) {
237 ind = i * __width + x;
238 __buffer[ind] = 255 - __buffer[ind];
240 if ( (x + w) < __width ) {
243 __buffer[ind] = 255 - __buffer[ind];
248 for (
unsigned int i = x; i < x + w; ++i) {
250 __buffer[ind] = 255 - __buffer[ind];
266 if ( x > __width)
return;
267 if ( y > __height)
return;
283 unsigned int x_end,
unsigned int y_end)
291 int x, y, dist, xerr, yerr, dx, dy, incx, incy;
292 bool was_inside_image =
false;
295 dx = x_end - x_start;
296 dy = y_end - y_start;
314 dist = (dx > dy) ? dx : dy;
323 for(
int t = 0; t < dist; ++t) {
324 if ( ((
unsigned int)x < __width) && ((
unsigned int)y < __height) ) {
325 if ( (x >= 0) && (y >= 0) ) {
326 was_inside_image =
true;
330 if ( was_inside_image ) {
349 if ( (x_end < __width) && (y_end < __height) ) {
350 PUT_POINT( x_end, y_end );
363 x_center = std::min(x_center, __width);
364 y_center = std::min(y_center, __height);
367 unsigned int a = std::max(0, (
int)x_center - r);
368 unsigned int b = std::min(x_center + r, __width);
371 a = std::max(0, (
int)y_center - r);
372 b = std::min(y_center + r, __height);
void set_buffer(unsigned char *buffer, unsigned int width, unsigned int height)
Set the buffer to draw to.
void draw_circle(int center_x, int center_y, unsigned int radius)
Draw circle.
void set_overlap(bool o)
Enable/Disable transparency (overlapping pixels increase brightness).
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_cross(unsigned int x_center, unsigned int y_center, unsigned int width)
Draws a cross.
void set_brightness(unsigned char b)
Set drawing brightness.
void draw_line(unsigned int x_start, unsigned int y_start, unsigned int x_end, unsigned int y_end)
Draw line.
void draw_rectangle(unsigned int x, unsigned int y, unsigned int w, unsigned int h)
Draw rectangle.