motion draw_vectors using VFrame draw_pixel brush
[goodguy/history.git] / cinelerra-5.1 / plugins / motion / motion.C
index 21468bdeb794d75c4c593226417d649fcec71cf6..8b437b864f06b5cbb9360d4e4768996ea6119d5d 100644 (file)
@@ -1009,78 +1009,35 @@ void MotionMain::draw_vectors(VFrame *frame)
        }
 }
 
+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