Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / cinelerra / affine.h
diff --git a/cinelerra-5.1/cinelerra/affine.h b/cinelerra-5.1/cinelerra/affine.h
new file mode 100644 (file)
index 0000000..46119e2
--- /dev/null
@@ -0,0 +1,174 @@
+
+/*
+ * CINELERRA
+ * Copyright (C) 2008-2014 Adam Williams <broadcast at earthling dot net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#ifndef AFFINE_H
+#define AFFINE_H
+
+
+#include "affine.inc"
+#include "loadbalance.h"
+#include "vframe.inc"
+
+// Affine transform library
+
+#define AFFINE_OVERSAMPLE 2
+
+class AffineMatrix
+{
+public:
+       AffineMatrix();
+       void identity();
+       void translate(double x, double y);
+       void scale(double x, double y);
+// Result is put in dst
+       void multiply(AffineMatrix *dst);
+       void copy_from(AffineMatrix *src);
+       void invert(AffineMatrix *dst);
+       void transform_point(float x, float y, float *newx, float *newy);
+       double determinant();
+       void dump();
+       double values[3][3];
+};
+
+class AffinePackage : public LoadPackage
+{
+public:
+       AffinePackage();
+       int y1, y2;
+};
+
+class AffineUnit : public LoadClient
+{
+public:
+       AffineUnit(AffineEngine *server);
+       void process_package(LoadPackage *package);
+       void calculate_matrix(
+               double in_x1,
+               double in_y1,
+               double in_x2,
+               double in_y2,
+               double out_x1,
+               double out_y1,
+               double out_x2,
+               double out_y2,
+               double out_x3,
+               double out_y3,
+               double out_x4,
+               double out_y4,
+               AffineMatrix *result);
+       float transform_cubic(float dx,
+       float jm1,
+       float j,
+       float jp1,
+       float jp2);
+       AffineEngine *server;
+};
+
+class AffineEngine : public LoadServer
+{
+public:
+       AffineEngine(int total_clients,
+               int total_packages);
+
+// Range of coords is 0 to 100 for coordinates in the image.
+// The coordinate locations are clockwise around the image.
+       void process(VFrame *output,
+               VFrame *input,
+               VFrame *temp,
+               int mode,
+               float x1,
+               float y1,
+               float x2,
+               float y2,
+               float x3,
+               float y3,
+               float x4,
+               float y4,
+               int forward);
+// Do rotation with the affine/perspective transform.
+// This removes some of the extremely faint artifacts in the trig rotation.
+       void rotate(VFrame *output,
+               VFrame *input,
+               float angle);
+       void set_matrix(AffineMatrix *matrix);
+// Set the viewport to transform.  The transform is based on the input viewport.
+// The output viewport clips the transformed output.
+       void set_in_viewport(int x, int y, int w, int h);
+// Only used by motion tracker.  Not used in OpenGL.
+       void set_out_viewport(int x, int y, int w, int h);
+
+// Set the viewport for both input and output.  Removed in HV 4.5.
+// Compatibility function introduced to avoid having to rewrite old
+// plugins.  Should be removed when no plugin uses it any more.
+       void set_viewport(int x, int y, int w, int h);
+// For rotation, set the pivot point.  Also affects output in OpenGL.
+// The default is in the middle of the viewport.
+       void set_in_pivot(int x, int y);
+// Set the pivot point in the output.  Only used by motion tracker.
+       void set_out_pivot(int x, int y);
+// Set the pivot point for both input and output.  Removed in HV 4.5.
+// Compatibility function introduced to avoid having to rewrite old
+// plugins.
+       void set_pivot(int x, int y);
+// Never used
+       void unset_pivot();
+       void unset_viewport();
+// To use OpenGL for the processing, set to 1
+       void set_opengl(int value);
+       void init_packages();
+       LoadClient* new_client();
+       LoadPackage* new_package();
+
+
+       VFrame *input, *output, *temp;
+       int mode;
+       enum
+       {
+               PERSPECTIVE,
+               SHEER,
+               STRETCH,
+               ROTATE,
+// multiply directly by a matrix.
+               TRANSFORM
+       };
+
+// arbitrary matrix
+       AffineMatrix matrix;
+// Transformation coordinates
+       float x1, y1, x2, y2, x3, y3, x4, y4;
+// Viewport coordinates
+       int in_x, in_y, in_w, in_h;
+       int out_x, out_y, out_w, out_h;
+// Pivot coordinates
+       int in_pivot_x, in_pivot_y;
+       int out_pivot_x, out_pivot_y;
+       int user_in_pivot;
+       int user_out_pivot;
+       int user_in_viewport;
+       int user_out_viewport;
+       int forward;
+       int use_opengl;
+       int total_packages;
+};
+
+
+
+#endif