additional Andrew provided Termux mods +
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / vframe.h
index da53bfdda22bdb315613238362c512b1061f2ec6..dc907821efca0fb90f721cb444b6c9127bc21994 100644 (file)
 #include "bctexture.inc"
 #include "bcwindowbase.inc"
 #include "bccmodels.h"
-#include "bccmodels.h"
 #include "vframe.inc"
 
 // Maximum number of prev or next effects to be pushed onto the stacks.
 #define MAX_STACK_ELEMENTS 255
 #define SHM_MIN_SIZE 2048
 
+#define ALIAS_OFF 0
+#define ALIAS_TOP 1
+#define ALIAS_CTR 2
+#define ALIAS_BOT 4
+#define ALIAS_DBL 5
+#define ALIAS_NRM 6
+
 // Scene graph for 3D models
 // Defined by the subclass
 class VFrameScene
@@ -50,6 +56,7 @@ public:
 class VFrame
 {
        friend class VFramePng;
+       friend class VFrameJpeg;
        friend class PngReadFunction;
 public:
 // Create new frame with shared data if *data is nonzero.
@@ -112,8 +119,11 @@ public:
                int data_size,
                int data_allocated);
 
-// Write a PNG for debugging
+// Write a PNG/PPM for debugging
        int write_png(const char *path);
+       static void write_ppm(VFrame *vfrm, const char *fmt, ...);
+       void write_ppm(const char *path) { write_ppm(this, "%s", path); }
+//static int n = 0; write_ppm(vframe, "/tmp/data/f%05d", ++n);
 
 // if frame points to the same data as this return 1
        int equals(VFrame *frame);
@@ -137,7 +147,8 @@ public:
                return transfer_from(frame, bg_color, 0,0, frame->get_w(),frame->get_h());
        }
 // Required for YUV
-       int clear_frame();
+       void black_frame();
+       void clear_frame();
        int allocate_compressed_data(long bytes);
 
 // Sequence number. -1 means invalid.  Passing frames to the encoder is
@@ -180,14 +191,14 @@ public:
        long get_bytes_per_line();
        int get_memory_type();
 
-
-
        static int calculate_bytes_per_pixel(int colormodel);
 // Get size + 4 for assembly language
        static long calculate_data_size(int w, int h,
                int bytes_per_line = -1, int color_model = BC_RGB888);
 // Get size of uncompressed frame buffer without extra 4 bytes
        long get_data_size();
+// alloc/reset temp vframe to spec
+       static void get_temp(VFrame *&vfrm, int w, int h, int color_model);
 
        void rotate270();
        void rotate90();
@@ -280,12 +291,7 @@ public:
        BC_PBuffer* get_pbuffer();
 
 // Bind the frame's texture to GL_TEXTURE_2D and enable it.
-// If a texture_unit is supplied, the texture unit is made active
-// and the commands are run in the right sequence to
-// initialize it to our preferred specifications.
-       void bind_texture(int texture_unit = -1);
-
-
+       void bind_texture(int texture_unit, int nearest=0);
 
 // Create a frustum with 0,0 in the upper left and w,-h in the bottom right.
 // Set preferred opengl settings.
@@ -293,6 +299,11 @@ public:
 // Calls init_screen with the current frame's dimensions.
        void init_screen();
 
+// color used by clear_frame, default -1 (unset) which clears to BLACK
+       void set_clear_color(int color, int alpha);
+       int get_clear_color();
+       int get_clear_alpha();
+
 // Compiles and links the shaders into a program.
 // Adds the program with put_shader.
 // Returns the program handle.
@@ -339,16 +350,20 @@ public:
        void copy_stacks(VFrame *src);
 // Updates the params with values from src
        void copy_params(VFrame *src);
-
 // This clears the stacks and the param table
        void clear_stacks();
 
-       virtual int draw_pixel(int x, int y);
-       int pixel_rgb, pixel_yuv, stipple;
+// pixel drawing
+       virtual int draw_pixel(float x, float y, float a=1.f);
+       virtual int draw_pixel(float x, float y, float frac, int axis);
+       void set_draw_alpha(float a);
+       void set_draw_flags(int flags);
+       int pixel_rgb, pixel_yuv, stipple, draw_flags;
+       float draw_alpha;
 
-       void set_pixel_color(int rgb);
+       void set_pixel_color(int rgb, int a=0xff);
        void set_stiple(int mask);
-       void draw_line(int x1, int y1, int x2, int y2);
+       void draw_line(float x1, float y1, float x2, float y2);
        void draw_smooth(int x1, int y1, int x2, int y2, int x3, int y3);
        void smooth_draw(int x1, int y1, int x2, int y2, int x3, int y3);
        void draw_rect(int x1, int y1, int x2, int y2);
@@ -402,7 +417,7 @@ private:
        {
                PRIVATE,
                SHARED,
-               SHMGET
+               SHM_GET
        };
 
 // Data pointer is pointing to someone else's buffer.
@@ -434,6 +449,8 @@ private:
        unsigned char *a;
 // Dimensions of frame
        int w, h;
+// color used by clear_frame
+       int clear_color, clear_alpha;
 // Info for reading png images
        const unsigned char *image;
        long image_offset;
@@ -470,4 +487,21 @@ public:
        static VFrame *vframe_png(const char *png_path, double xs=1, double ys=1);
 };
 
+// Create a frame with the jpeg image
+//  jpeg_model must be BC_RGB888, BC_YUV888, or BC_GREY8
+class VFrameJpeg : public VFrame
+{
+// Read a JPEG into the frame (no alpha)
+       int read_jpeg(const unsigned char *data, long sz,
+               double xscale, double yscale, int jpeg_model);
+public:
+       VFrameJpeg(const unsigned char *jpeg_data, double s=0);
+       VFrameJpeg(const unsigned char *jpeg_data, long image_size, double xs=0, double ys=0);
+       virtual ~VFrameJpeg();
+       static VFrame *vframe_jpeg(int fd,
+               double xs=1, double ys=1, int jpeg_model=BC_RGB888);
+       static VFrame *vframe_jpeg(const char *jpeg_path,
+               double xs=1, double ys=1, int jpeg_model=BC_RGB888);
+};
+
 #endif