motion draw_vectors using VFrame draw_pixel brush
[goodguy/history.git] / cinelerra-5.1 / plugins / motion-cv / motion-cv.C
index 923a183df016f32b8624b2907a629e94357dac23..e8249bb0233aceb62b6a109aa834559875c3013d 100644 (file)
@@ -1039,79 +1039,37 @@ void MotionCVMain::draw_vectors(VFrame *frame)
        }
 }
 
-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