Merge CV, ver=5.1; ops/methods from HV, and interface from CV where possible
[goodguy/history.git] / cinelerra-5.1 / guicast / bccmodels.C
diff --git a/cinelerra-5.1/guicast/bccmodels.C b/cinelerra-5.1/guicast/bccmodels.C
new file mode 100644 (file)
index 0000000..88ed1ac
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * This library is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published
+ * by the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ * 
+ * This library 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
+ * Lesser General Public License for more details.
+ * 
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 
+ * USA
+ */
+
+
+
+#include "bccmodels.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int BC_CModels::is_planar(int colormodel)
+{
+       switch(colormodel) {
+       case BC_YUV420P:
+       case BC_YUV422P:
+       case BC_YUV444P:
+       case BC_YUV411P:
+       case BC_YUV410P:
+       case BC_RGB_FLOATP:
+       case BC_RGBA_FLOATP:  return 1;
+       }
+       return 0;
+}
+
+int BC_CModels::components(int colormodel)
+{
+       switch(colormodel) {
+       case BC_A8:           return 1;
+       case BC_A16:          return 1;
+       case BC_A_FLOAT:      return 1;
+       case BC_RGB888:       return 3;
+       case BC_RGBA8888:     return 4;
+       case BC_RGB161616:    return 3;
+       case BC_RGBA16161616: return 4;
+       case BC_YUV888:       return 3;
+       case BC_YUVA8888:     return 4;
+       case BC_YUV161616:    return 3;
+       case BC_YUVA16161616: return 4;
+       case BC_YUV101010:    return 3;
+       case BC_RGB_FLOAT:    return 3;
+       case BC_RGBA_FLOAT:   return 4;
+       case BC_RGB_FLOATP:   return 3;
+       case BC_RGBA_FLOATP:  return 4;
+       }
+       return 0;
+}
+
+int BC_CModels::calculate_pixelsize(int colormodel)
+{
+       switch(colormodel) {
+       case BC_A8:           return 1;
+       case BC_A16:          return 2;
+       case BC_A_FLOAT:      return 4;
+       case BC_TRANSPARENCY: return 1;
+       case BC_COMPRESSED:   return 1;
+       case BC_RGB8:         return 1;
+       case BC_RGB565:       return 2;
+       case BC_BGR565:       return 2;
+       case BC_BGR888:       return 3;
+       case BC_BGR8888:      return 4;
+// Working bitmaps are packed to simplify processing
+       case BC_RGB888:       return 3;
+       case BC_ARGB8888:     return 4;
+       case BC_ABGR8888:     return 4;
+       case BC_RGBA8888:     return 4;
+       case BC_RGB161616:    return 6;
+       case BC_RGBA16161616: return 8;
+       case BC_YUV888:       return 3;
+       case BC_YUVA8888:     return 4;
+       case BC_YUV161616:    return 6;
+       case BC_YUVA16161616: return 8;
+       case BC_YUV101010:    return 4;
+       case BC_VYU888:       return 3;
+       case BC_UYVA8888:     return 4;
+       case BC_RGB_FLOAT:    return 12;
+       case BC_RGBA_FLOAT:   return 16;
+// Planar
+       case BC_YUV420P:      return 1;
+       case BC_YUV422P:      return 1;
+       case BC_YUV444P:      return 1;
+       case BC_YUV422:       return 2;
+       case BC_UVY422:       return 2;
+       case BC_YUV411P:      return 1;
+       case BC_YUV410P:      return 1;
+       case BC_RGB_FLOATP:   return 4;
+       case BC_RGBA_FLOATP:  return 4;
+       }
+       return 0;
+}
+
+int BC_CModels::calculate_max(int colormodel)
+{
+       switch(colormodel) {
+// Working bitmaps are packed to simplify processing
+       case BC_A8:           return 0xff;
+       case BC_A16:          return 0xffff;
+       case BC_A_FLOAT:      return 1;
+       case BC_RGB888:       return 0xff;
+       case BC_RGBA8888:     return 0xff;
+       case BC_RGB161616:    return 0xffff;
+       case BC_RGBA16161616: return 0xffff;
+       case BC_YUV888:       return 0xff;
+       case BC_YUVA8888:     return 0xff;
+       case BC_YUV161616:    return 0xffff;
+       case BC_YUVA16161616: return 0xffff;
+       case BC_RGB_FLOAT:    return 1;
+       case BC_RGBA_FLOAT:   return 1;
+       case BC_RGB_FLOATP:   return 1;
+       case BC_RGBA_FLOATP:  return 1;
+       }
+       return 0;
+}
+
+int BC_CModels::calculate_datasize(int w, int h, int bytes_per_line, int color_model)
+{
+       switch(color_model) {
+       case BC_YUV410P: return w * h + w * h / 8 + 4;
+       case BC_YUV420P:
+       case BC_YUV411P: return w * h + w * h / 2 + 4;
+       case BC_YUV422P: return w * h * 2 + 4;
+       case BC_YUV444P: return w * h * 3 + 4;
+       case BC_RGB_FLOATP: return w * h * 3 * sizeof(float) + 4;
+       case BC_RGBA_FLOATP: return w * h * 4 * sizeof(float) + 4;
+       }
+       if( bytes_per_line < 0 )
+               bytes_per_line = w * calculate_pixelsize(color_model);
+       return h * bytes_per_line + 4;
+}
+
+int BC_CModels::bc_to_x(int color_model)
+{
+       switch(color_model) {
+       case BC_YUV420P: return FOURCC_YV12;
+       case BC_YUV422:  return FOURCC_YUV2;
+       case BC_UVY422:  return FOURCC_UYVY;
+       }
+       return -1;
+}
+
+void BC_CModels::to_text(char *string, int cmodel)
+{
+       switch(cmodel) {
+       case BC_RGB888:       strcpy(string, "RGB-8 Bit");   break;
+       case BC_RGBA8888:     strcpy(string, "RGBA-8 Bit");  break;
+       case BC_RGB161616:    strcpy(string, "RGB-16 Bit");  break;
+       case BC_RGBA16161616: strcpy(string, "RGBA-16 Bit"); break;
+       case BC_YUV888:       strcpy(string, "YUV-8 Bit");   break;
+       case BC_YUVA8888:     strcpy(string, "YUVA-8 Bit");  break;
+       case BC_YUV161616:    strcpy(string, "YUV-16 Bit");  break;
+       case BC_YUVA16161616: strcpy(string, "YUVA-16 Bit"); break;
+       case BC_RGB_FLOAT:    strcpy(string, "RGB-FLOAT");   break;
+       case BC_RGBA_FLOAT:   strcpy(string, "RGBA-FLOAT");  break;
+       case BC_RGB_FLOATP:   strcpy(string, "RGB-FLOATP");  break;
+       case BC_RGBA_FLOATP:  strcpy(string, "RGBA-FLOATP"); break;
+       default: strcpy(string, "RGB-8 Bit"); break;
+       }
+}
+
+int BC_CModels::from_text(const char *text)
+{
+       if(!strcasecmp(text, "RGB-8 Bit"))   return BC_RGB888;
+       if(!strcasecmp(text, "RGBA-8 Bit"))  return BC_RGBA8888;
+       if(!strcasecmp(text, "RGB-16 Bit"))  return BC_RGB161616;
+       if(!strcasecmp(text, "RGBA-16 Bit")) return BC_RGBA16161616;
+       if(!strcasecmp(text, "RGB-FLOAT"))   return BC_RGB_FLOAT;
+       if(!strcasecmp(text, "RGBA-FLOAT"))  return BC_RGBA_FLOAT;
+       if(!strcasecmp(text, "RGB-FLOATP"))  return BC_RGB_FLOATP;
+       if(!strcasecmp(text, "RGBA-FLOATP")) return BC_RGBA_FLOATP;
+       if(!strcasecmp(text, "YUV-8 Bit"))   return BC_YUV888;
+       if(!strcasecmp(text, "YUVA-8 Bit"))  return BC_YUVA8888;
+       if(!strcasecmp(text, "YUV-16 Bit"))  return BC_YUV161616;
+       if(!strcasecmp(text, "YUVA-16 Bit")) return BC_YUVA16161616;
+       return BC_RGB888;
+}
+
+int BC_CModels::has_alpha(int colormodel)
+{
+
+       switch(colormodel) {
+       case BC_RGBA8888:
+       case BC_ARGB8888:
+       case BC_ABGR8888:
+       case BC_RGBA16161616:
+       case BC_YUVA8888:
+       case BC_YUVA16161616:
+       case BC_UYVA8888:
+       case BC_RGBA_FLOAT:
+       case BC_RGBA_FLOATP:
+               return 1;
+       }
+       return 0;
+}
+
+int BC_CModels::is_float(int colormodel)
+{
+       switch(colormodel) {
+       case BC_RGB_FLOAT:
+       case BC_RGBA_FLOAT:
+       case BC_RGB_FLOATP:
+       case BC_RGBA_FLOATP:
+               return 1;
+       }
+       return 0;
+}
+
+int BC_CModels::is_yuv(int colormodel)
+{
+
+       switch(colormodel) {
+       case BC_YUV888:
+       case BC_YUVA8888:
+       case BC_YUV161616:
+       case BC_YUVA16161616:
+       case BC_YUV422:
+       case BC_UVY422:
+       case BC_YUV101010:
+       case BC_VYU888:
+       case BC_UYVA8888:
+       case BC_YUV420P:
+       case BC_YUV422P:
+       case BC_YUV444P:
+       case BC_YUV411P:
+       case BC_YUV410P:
+               return 1;
+       }
+       return 0;
+}
+
+