X-Git-Url: http://git.cinelerra-gg.org/git/?a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Faffine.h;fp=cinelerra-5.1%2Fcinelerra%2Faffine.h;h=46119e2b1e202b0128b175cdc5e8d9f3da7aa920;hb=30bdb85eb33a8ee7ba675038a86c6be59c43d7bd;hp=0000000000000000000000000000000000000000;hpb=52fcc46226f9df46f9ce9d0566dc568455a7db0b;p=goodguy%2Fhistory.git diff --git a/cinelerra-5.1/cinelerra/affine.h b/cinelerra-5.1/cinelerra/affine.h new file mode 100644 index 00000000..46119e2b --- /dev/null +++ b/cinelerra-5.1/cinelerra/affine.h @@ -0,0 +1,174 @@ + +/* + * CINELERRA + * Copyright (C) 2008-2014 Adam Williams + * + * 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