}
}
-void MotionCVMain::draw_pixel(VFrame *frame, int x, int y)
-{
- if( !(x >= 0 && y >= 0 && x < frame->get_w() && y < frame->get_h()) )
- return;
-#define DRAW_PIXEL(model, x, y, components, do_yuv, max, type) \
- case model: { \
- type **rows = (type**)frame->get_rows(); \
- rows[y][x * components] = max - rows[y][x * components]; \
- if( !do_yuv ) { \
- rows[y][x * components + 1] = max - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = max - rows[y][x * components + 2]; \
- } \
- else { \
- rows[y][x * components + 1] = (max / 2 + 1) - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = (max / 2 + 1) - rows[y][x * components + 2]; \
- } \
- if( components == 4 ) \
- rows[y][x * components + 3] = max; \
-} break
+MotionCvVVFrame::MotionCvVVFrame(VFrame *vfrm, int n)
+ : VFrame(vfrm->get_data(), -1, vfrm->get_y()-vfrm->get_data(),
+ vfrm->get_u()-vfrm->get_data(), vfrm->get_v()-vfrm->get_data(),
+ vfrm->get_w(), vfrm->get_h(), vfrm->get_color_model(),
+ vfrm->get_bytes_per_line())
+{
+ this->n = n;
+}
- switch( frame->get_color_model() ) {
- DRAW_PIXEL(BC_RGB888,x, y, 3, 0, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGBA8888,x, y, 4, 0, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGB_FLOAT,x, y, 3, 0, 1.0, float);
- DRAW_PIXEL(BC_RGBA_FLOAT,x, y, 4, 0, 1.0, float);
- DRAW_PIXEL(BC_YUV888,x, y, 3, 1, 0xff, unsigned char);
- DRAW_PIXEL(BC_YUVA8888,x, y, 4, 1, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGB161616,x, y, 3, 0, 0xffff, uint16_t);
- DRAW_PIXEL(BC_YUV161616,x, y, 3, 1, 0xffff, uint16_t);
- DRAW_PIXEL(BC_RGBA16161616,x, y, 4, 0, 0xffff, uint16_t);
- DRAW_PIXEL(BC_YUVA16161616,x, y, 4, 1, 0xffff, uint16_t);
+int MotionCvVVFrame::draw_pixel(int x, int y)
+{
+ VFrame::draw_pixel(x+0, y+0);
+ for( int i=1; i<n; ++i ) {
+ VFrame::draw_pixel(x-i, y-i);
+ VFrame::draw_pixel(x+i, y+i);
}
+ return 0;
}
+
void MotionCVMain::draw_line(VFrame *frame, int x1, int y1, int x2, int y2)
{
- int w = labs(x2 - x1);
- int h = labs(y2 - y1);
-//printf("MotionCVMain::draw_line 1 %d %d %d %d\n", x1, y1, x2, y2);
-
- if( !w && !h ) {
- draw_pixel(frame, x1, y1);
- }
- else if( w > h ) {
-// Flip coordinates so x1 < x2
- if( x2 < x1 ) {
- y2 ^= y1; y1 ^= y2; y2 ^= y1;
- x1 ^= x2; x2 ^= x1; x1 ^= x2;
- }
- int numerator = y2 - y1;
- int denominator = x2 - x1;
- for( int i = x1; i < x2; i++ ) {
- int y = y1 + (int64_t) (i - x1)
- * (int64_t) numerator / (int64_t) denominator;
- draw_pixel(frame, i, y);
- }
- }
- else {
-// Flip coordinates so y1 < y2
- if( y2 < y1 ) {
- y2 ^= y1; y1 ^= y2; y2 ^= y1;
- x1 ^= x2; x2 ^= x1; x1 ^= x2;
- }
- int numerator = x2 - x1;
- int denominator = y2 - y1;
- for( int i = y1; i < y2; i++ ) {
- int x = x1 + (int64_t) (i - y1)
- * (int64_t) numerator / (int64_t) denominator;
- draw_pixel(frame, x, i);
- }
- }
-//printf("MotionCVMain::draw_line 2\n");
+ int iw = frame->get_w(), ih = frame->get_h();
+ int mx = iw > ih ? iw : ih;
+ int n = mx/800 + 1;
+ MotionCvVVFrame vfrm(frame, n);
+ vfrm.set_pixel_color(WHITE);
+ int m = 2; while( m < n ) m <<= 1;
+ vfrm.set_stiple(2*m);
+ vfrm.draw_line(x1,y1, x2,y2);
}
#define ARROW_SIZE 10
+class MotionCvVVFrame : public VFrame
+{
+public:
+ MotionCvVVFrame(VFrame *vfrm, int n);
+ int draw_pixel(int x, int y);
+ int n;
+};
+
}
-
-void MotionHVMain::draw_pixel(VFrame *frame, int x, int y)
+MotionHvVVFrame::MotionHvVVFrame(VFrame *vfrm, int n)
+ : VFrame(vfrm->get_data(), -1, vfrm->get_y()-vfrm->get_data(),
+ vfrm->get_u()-vfrm->get_data(), vfrm->get_v()-vfrm->get_data(),
+ vfrm->get_w(), vfrm->get_h(), vfrm->get_color_model(),
+ vfrm->get_bytes_per_line())
{
- if(!(x >= 0 && y >= 0 && x < frame->get_w() && y < frame->get_h())) return;
-
-#define DRAW_PIXEL(x, y, components, do_yuv, max, type) \
-{ \
- type **rows = (type**)frame->get_rows(); \
- rows[y][x * components] = max - rows[y][x * components]; \
- if(!do_yuv) \
- { \
- rows[y][x * components + 1] = max - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = max - rows[y][x * components + 2]; \
- } \
- else \
- { \
- rows[y][x * components + 1] = (max / 2 + 1) - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = (max / 2 + 1) - rows[y][x * components + 2]; \
- } \
- if(components == 4) \
- rows[y][x * components + 3] = max; \
+ this->n = n;
}
-
- switch(frame->get_color_model())
- {
- case BC_RGB888:
- DRAW_PIXEL(x, y, 3, 0, 0xff, unsigned char);
- break;
- case BC_RGBA8888:
- DRAW_PIXEL(x, y, 4, 0, 0xff, unsigned char);
- break;
- case BC_RGB_FLOAT:
- DRAW_PIXEL(x, y, 3, 0, 1.0, float);
- break;
- case BC_RGBA_FLOAT:
- DRAW_PIXEL(x, y, 4, 0, 1.0, float);
- break;
- case BC_YUV888:
- DRAW_PIXEL(x, y, 3, 1, 0xff, unsigned char);
- break;
- case BC_YUVA8888:
- DRAW_PIXEL(x, y, 4, 1, 0xff, unsigned char);
- break;
- case BC_RGB161616:
- DRAW_PIXEL(x, y, 3, 0, 0xffff, uint16_t);
- break;
- case BC_YUV161616:
- DRAW_PIXEL(x, y, 3, 1, 0xffff, uint16_t);
- break;
- case BC_RGBA16161616:
- DRAW_PIXEL(x, y, 4, 0, 0xffff, uint16_t);
- break;
- case BC_YUVA16161616:
- DRAW_PIXEL(x, y, 4, 1, 0xffff, uint16_t);
- break;
+int MotionHvVVFrame::draw_pixel(int x, int y)
+{
+ VFrame::draw_pixel(x+0, y+0);
+ for( int i=1; i<n; ++i ) {
+ VFrame::draw_pixel(x-i, y-i);
+ VFrame::draw_pixel(x+i, y+i);
}
+ return 0;
}
-
void MotionHVMain::draw_line(VFrame *frame, int x1, int y1, int x2, int y2)
{
- int w = labs(x2 - x1);
- int h = labs(y2 - y1);
-//printf("MotionHVMain::draw_line 1 %d %d %d %d\n", x1, y1, x2, y2);
-
- if(!w && !h)
- {
- draw_pixel(frame, x1, y1);
- }
- else
- if(w > h)
- {
-// Flip coordinates so x1 < x2
- if(x2 < x1)
- {
- y2 ^= y1;
- y1 ^= y2;
- y2 ^= y1;
- x1 ^= x2;
- x2 ^= x1;
- x1 ^= x2;
- }
- int numerator = y2 - y1;
- int denominator = x2 - x1;
- for(int i = x1; i < x2; i++)
- {
- int y = y1 + (int64_t)(i - x1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, i, y);
- }
- }
- else
- {
-// Flip coordinates so y1 < y2
- if(y2 < y1)
- {
- y2 ^= y1;
- y1 ^= y2;
- y2 ^= y1;
- x1 ^= x2;
- x2 ^= x1;
- x1 ^= x2;
- }
- int numerator = x2 - x1;
- int denominator = y2 - y1;
- for(int i = y1; i < y2; i++)
- {
- int x = x1 + (int64_t)(i - y1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, x, i);
- }
- }
-//printf("MotionHVMain::draw_line 2\n");
+ int iw = frame->get_w(), ih = frame->get_h();
+ int mx = iw > ih ? iw : ih;
+ int n = mx/800 + 1;
+ MotionHvVVFrame vfrm(frame, n);
+ vfrm.set_pixel_color(WHITE);
+ int m = 2; while( m < n ) m <<= 1;
+ vfrm.set_stiple(2*m);
+ vfrm.draw_line(x1,y1, x2,y2);
}
#define ARROW_SIZE 10
};
+class MotionHvVVFrame : public VFrame
+{
+public:
+ MotionHvVVFrame(VFrame *vfrm, int n);
+ int draw_pixel(int x, int y);
+ int n;
+};
+
}
}
+MotionVVFrame::MotionVVFrame(VFrame *vfrm, int n)
+ : VFrame(vfrm->get_data(), -1, vfrm->get_y()-vfrm->get_data(),
+ vfrm->get_u()-vfrm->get_data(), vfrm->get_v()-vfrm->get_data(),
+ vfrm->get_w(), vfrm->get_h(), vfrm->get_color_model(),
+ vfrm->get_bytes_per_line())
+{
+ this->n = n;
+}
-void MotionMain::draw_pixel(VFrame *frame, int x, int y)
+int MotionVVFrame::draw_pixel(int x, int y)
{
- if( !(x >= 0 && y >= 0 && x < frame->get_w() && y < frame->get_h()) ) return;
-
-#define DRAW_PIXEL(model, x, y, components, do_yuv, max, type) \
- case model: { \
- type **rows = (type**)frame->get_rows(); \
- rows[y][x * components] = max - rows[y][x * components]; \
- if( !do_yuv ) { \
- rows[y][x * components + 1] = max - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = max - rows[y][x * components + 2]; \
- } \
- else { \
- rows[y][x * components + 1] = (max / 2 + 1) - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = (max / 2 + 1) - rows[y][x * components + 2]; \
- } \
- if( components == 4 ) \
- rows[y][x * components + 3] = max; \
-} break
-
- switch(frame->get_color_model()) {
- DRAW_PIXEL(BC_RGB888, x, y, 3, 0, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGBA8888, x, y, 4, 0, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGB_FLOAT, x, y, 3, 0, 1.0, float);
- DRAW_PIXEL(BC_RGBA_FLOAT, x, y, 4, 0, 1.0, float);
- DRAW_PIXEL(BC_YUV888, x, y, 3, 1, 0xff, unsigned char);
- DRAW_PIXEL(BC_YUVA8888, x, y, 4, 1, 0xff, unsigned char);
- DRAW_PIXEL(BC_RGB161616, x, y, 3, 0, 0xffff, uint16_t);
- DRAW_PIXEL(BC_YUV161616, x, y, 3, 1, 0xffff, uint16_t);
- DRAW_PIXEL(BC_RGBA16161616, x, y, 4, 0, 0xffff, uint16_t);
- DRAW_PIXEL(BC_YUVA16161616, x, y, 4, 1, 0xffff, uint16_t);
+ VFrame::draw_pixel(x+0, y+0);
+ for( int i=1; i<n; ++i ) {
+ VFrame::draw_pixel(x-i, y-i);
+ VFrame::draw_pixel(x+i, y+i);
}
+ return 0;
}
-
void MotionMain::draw_line(VFrame *frame, int x1, int y1, int x2, int y2)
{
- int w = labs(x2 - x1);
- int h = labs(y2 - y1);
-//printf("MotionMain::draw_line 1 %d %d %d %d\n", x1, y1, x2, y2);
-
- if( !w && !h ) {
- draw_pixel(frame, x1, y1);
- }
- else if( w > h ) {
-// Flip coordinates so x1 < x2
- if( x2 < x1 ) {
- y2 ^= y1; y1 ^= y2; y2 ^= y1;
- x1 ^= x2; x2 ^= x1; x1 ^= x2;
- }
- int numerator = y2 - y1;
- int denominator = x2 - x1;
- for( int i = x1; i < x2; i++ ) {
- int y = y1 + (int64_t)(i - x1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, i, y);
- }
- }
- else {
-// Flip coordinates so y1 < y2
- if( y2 < y1 ) {
- y2 ^= y1; y1 ^= y2; y2 ^= y1;
- x1 ^= x2; x2 ^= x1; x1 ^= x2;
- }
- int numerator = x2 - x1;
- int denominator = y2 - y1;
- for( int i = y1; i < y2; i++ ) {
- int x = x1 + (int64_t)(i - y1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, x, i);
- }
- }
-//printf("MotionMain::draw_line 2\n");
+ int iw = frame->get_w(), ih = frame->get_h();
+ int mx = iw > ih ? iw : ih;
+ int n = mx/800 + 1;
+ MotionVVFrame vfrm(frame, n);
+ vfrm.set_pixel_color(WHITE);
+ int m = 2; while( m < n ) m <<= 1;
+ vfrm.set_stiple(2*m);
+ vfrm.draw_line(x1,y1, x2,y2);
}
#define ARROW_SIZE 10
Mutex *cache_lock;
};
+class MotionVVFrame : public VFrame
+{
+public:
+ MotionVVFrame(VFrame *vfrm, int n);
+ int draw_pixel(int x, int y);
+ int n;
+};
+
#endif
}
-
-void MotionMain2::draw_pixel(VFrame *frame, int x, int y)
+Motion2VVFrame::Motion2VVFrame(VFrame *vfrm, int n)
+ : VFrame(vfrm->get_data(), -1, vfrm->get_y()-vfrm->get_data(),
+ vfrm->get_u()-vfrm->get_data(), vfrm->get_v()-vfrm->get_data(),
+ vfrm->get_w(), vfrm->get_h(), vfrm->get_color_model(),
+ vfrm->get_bytes_per_line())
{
- if(!(x >= 0 && y >= 0 && x < frame->get_w() && y < frame->get_h())) return;
-
-#define DRAW_PIXEL(x, y, components, do_yuv, max, type) \
-{ \
- type **rows = (type**)frame->get_rows(); \
- rows[y][x * components] = max - rows[y][x * components]; \
- if(!do_yuv) \
- { \
- rows[y][x * components + 1] = max - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = max - rows[y][x * components + 2]; \
- } \
- else \
- { \
- rows[y][x * components + 1] = (max / 2 + 1) - rows[y][x * components + 1]; \
- rows[y][x * components + 2] = (max / 2 + 1) - rows[y][x * components + 2]; \
- } \
- if(components == 4) \
- rows[y][x * components + 3] = max; \
+ this->n = n;
}
-
- switch(frame->get_color_model())
- {
- case BC_RGB888:
- DRAW_PIXEL(x, y, 3, 0, 0xff, unsigned char);
- break;
- case BC_RGBA8888:
- DRAW_PIXEL(x, y, 4, 0, 0xff, unsigned char);
- break;
- case BC_RGB_FLOAT:
- DRAW_PIXEL(x, y, 3, 0, 1.0, float);
- break;
- case BC_RGBA_FLOAT:
- DRAW_PIXEL(x, y, 4, 0, 1.0, float);
- break;
- case BC_YUV888:
- DRAW_PIXEL(x, y, 3, 1, 0xff, unsigned char);
- break;
- case BC_YUVA8888:
- DRAW_PIXEL(x, y, 4, 1, 0xff, unsigned char);
- break;
- case BC_RGB161616:
- DRAW_PIXEL(x, y, 3, 0, 0xffff, uint16_t);
- break;
- case BC_YUV161616:
- DRAW_PIXEL(x, y, 3, 1, 0xffff, uint16_t);
- break;
- case BC_RGBA16161616:
- DRAW_PIXEL(x, y, 4, 0, 0xffff, uint16_t);
- break;
- case BC_YUVA16161616:
- DRAW_PIXEL(x, y, 4, 1, 0xffff, uint16_t);
- break;
+int Motion2VVFrame::draw_pixel(int x, int y)
+{
+ VFrame::draw_pixel(x+0, y+0);
+ for( int i=1; i<n; ++i ) {
+ VFrame::draw_pixel(x-i, y-i);
+ VFrame::draw_pixel(x+i, y+i);
}
+ return 0;
}
void MotionMain2::draw_line(VFrame *frame, int x1, int y1, int x2, int y2)
{
- int w = labs(x2 - x1);
- int h = labs(y2 - y1);
-//printf("MotionMain2::draw_line 1 %d %d %d %d\n", x1, y1, x2, y2);
-
- if(!w && !h)
- {
- draw_pixel(frame, x1, y1);
- }
- else
- if(w > h)
- {
-// Flip coordinates so x1 < x2
- if(x2 < x1)
- {
- y2 ^= y1;
- y1 ^= y2;
- y2 ^= y1;
- x1 ^= x2;
- x2 ^= x1;
- x1 ^= x2;
- }
- int numerator = y2 - y1;
- int denominator = x2 - x1;
- for(int i = x1; i < x2; i++)
- {
- int y = y1 + (int64_t)(i - x1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, i, y);
- }
- }
- else
- {
-// Flip coordinates so y1 < y2
- if(y2 < y1)
- {
- y2 ^= y1;
- y1 ^= y2;
- y2 ^= y1;
- x1 ^= x2;
- x2 ^= x1;
- x1 ^= x2;
- }
- int numerator = x2 - x1;
- int denominator = y2 - y1;
- for(int i = y1; i < y2; i++)
- {
- int x = x1 + (int64_t)(i - y1) * (int64_t)numerator / (int64_t)denominator;
- draw_pixel(frame, x, i);
- }
- }
-//printf("MotionMain2::draw_line 2\n");
+ int iw = frame->get_w(), ih = frame->get_h();
+ int mx = iw > ih ? iw : ih;
+ int n = mx/800 + 1;
+ Motion2VVFrame vfrm(frame, n);
+ vfrm.set_pixel_color(WHITE);
+ int m = 2; while( m < n ) m <<= 1;
+ vfrm.set_stiple(2*m);
+ vfrm.draw_line(x1,y1, x2,y2);
}
+
#define ARROW_SIZE 10
void MotionMain2::draw_arrow(VFrame *frame, int x1, int y1, int x2, int y2)
{
+class Motion2VVFrame : public VFrame
+{
+public:
+ Motion2VVFrame(VFrame *vfrm, int n);
+ int draw_pixel(int x, int y);
+ int n;
+};
+
+
{
VFrame::draw_pixel(x+0, y+0);
for( int i=1; i<n; ++i ) {
- VFrame::draw_pixel(x-i, y+0);
- VFrame::draw_pixel(x+0, y+i);
- VFrame::draw_pixel(x+i, y+0);
- VFrame::draw_pixel(x+0, y-i);
+ VFrame::draw_pixel(x-i, y-i);
+ VFrame::draw_pixel(x-i, y+i);
+ VFrame::draw_pixel(x+i, y-i);
+ VFrame::draw_pixel(x+i, y+i);
}
return 0;
}
{
int iw = img->get_w(), ih = img->get_h();
int mx = iw > ih ? iw : ih;
- Motion51VVFrame vfrm(img, mx/800+1);
+ int n = mx/800 + 1;
+ Motion51VVFrame vfrm(img, n);
+ vfrm.set_pixel_color(WHITE);
+ int m = 2; while( m < n ) m <<= 1;
+ vfrm.set_stiple(2*m);
vfrm.draw_arrow(rx, ry, rx+current_dx, ry+current_dy);
// vfrm.draw_smooth(rx-rr,ry, rx-rr,ry+rr, rx,ry+rr);