refresh frame fix, dblclk proxy viewer fix, vicon refresh fix for awdw resize, fix...
[goodguy/history.git] / cinelerra-5.1 / guicast / bccmodels.C
1 /*
2  * This library is free software; you can redistribute it and/or modify it
3  * under the terms of the GNU Lesser General Public License as published
4  * by the Free Software Foundation; either version 2 of the License, or
5  * (at your option) any later version.
6  *
7  * This library is distributed in the hope that it will be useful, but
8  * WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
10  * Lesser General Public License for more details.
11  *
12  * You should have received a copy of the GNU Lesser General Public
13  * License along with this library; if not, write to the Free Software
14  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
15  * USA
16  */
17
18
19
20 #include "bccmodels.h"
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 int BC_CModels::is_planar(int colormodel)
26 {
27         switch(colormodel) {
28         case BC_YUV420P:
29         case BC_YUV420PI:
30         case BC_YUV422P:
31         case BC_YUV444P:
32         case BC_GBRP:
33         case BC_YUV411P:
34         case BC_YUV410P:
35         case BC_RGB_FLOATP:
36         case BC_RGBA_FLOATP:
37                 return 1;
38         }
39         return 0;
40 }
41
42 int BC_CModels::components(int colormodel)
43 {
44         switch(colormodel) {
45         case BC_RGB8:
46         case BC_RGB565:
47         case BC_BGR565:
48         case BC_BGR888:
49         case BC_RGB888:
50         case BC_RGB161616:
51         case BC_RGB_FLOAT:
52         case BC_BGR8888:
53         case BC_YUV888:
54         case BC_YUV161616:
55         case BC_UVY422:
56         case BC_YUV422:
57         case BC_YUV101010:
58         case BC_VYU888:
59                 return 3;
60         case BC_RGBA8888:
61         case BC_ARGB8888:
62         case BC_ABGR8888:
63         case BC_RGBA16161616:
64         case BC_RGBA_FLOAT:
65         case BC_YUVA8888:
66         case BC_YUVA16161616:
67         case BC_UYVA8888:
68         case BC_AYUV16161616:
69                 return 4;
70         case BC_A8:
71         case BC_A16:
72         case BC_A_FLOAT:
73         case BC_GREY8:
74         case BC_GREY16:
75                 return 1;
76         }
77 // planar, compressed, transparent
78         return 0;
79 }
80
81 int BC_CModels::calculate_pixelsize(int colormodel)
82 {
83         switch(colormodel) {
84         case BC_A8:           return 1;
85         case BC_A16:          return 2;
86         case BC_A_FLOAT:      return 4;
87         case BC_TRANSPARENCY: return 1;
88         case BC_COMPRESSED:   return 1;
89         case BC_RGB8:         return 1;
90         case BC_RGB565:       return 2;
91         case BC_BGR565:       return 2;
92         case BC_BGR888:       return 3;
93         case BC_BGR8888:      return 4;
94 // Working bitmaps are packed to simplify processing
95         case BC_RGB888:       return 3;
96         case BC_ARGB8888:     return 4;
97         case BC_ABGR8888:     return 4;
98         case BC_RGBA8888:     return 4;
99         case BC_RGB161616:    return 6;
100         case BC_RGBA16161616: return 8;
101         case BC_YUV888:       return 3;
102         case BC_YUVA8888:     return 4;
103         case BC_YUV161616:    return 6;
104         case BC_YUVA16161616: return 8;
105         case BC_AYUV16161616: return 8;
106         case BC_YUV101010:    return 4;
107         case BC_VYU888:       return 3;
108         case BC_UYVA8888:     return 4;
109         case BC_RGB_FLOAT:    return 12;
110         case BC_RGBA_FLOAT:   return 16;
111         case BC_GREY8:        return 1;
112         case BC_GREY16:       return 2;
113 // Planar
114         case BC_YUV420P:      return 1;
115         case BC_YUV420PI:     return 1;
116         case BC_YUV422P:      return 1;
117         case BC_YUV444P:      return 1;
118         case BC_GBRP:         return 1;
119         case BC_YUV422:       return 2;
120         case BC_UVY422:       return 2;
121         case BC_YUV411P:      return 1;
122         case BC_YUV410P:      return 1;
123         case BC_RGB_FLOATP:   return 4;
124         case BC_RGBA_FLOATP:  return 4;
125         }
126         return 0;
127 }
128
129 int BC_CModels::calculate_max(int colormodel)
130 {
131         switch(colormodel) {
132 // Working bitmaps are packed to simplify processing
133         case BC_A8:           return 0xff;
134         case BC_A16:          return 0xffff;
135         case BC_A_FLOAT:      return 1;
136         case BC_RGB888:       return 0xff;
137         case BC_RGBA8888:     return 0xff;
138         case BC_RGB161616:    return 0xffff;
139         case BC_RGBA16161616: return 0xffff;
140         case BC_YUV888:       return 0xff;
141         case BC_YUVA8888:     return 0xff;
142         case BC_YUV161616:    return 0xffff;
143         case BC_YUVA16161616: return 0xffff;
144         case BC_AYUV16161616: return 0xffff;
145         case BC_RGB_FLOAT:    return 1;
146         case BC_RGBA_FLOAT:   return 1;
147         case BC_RGB_FLOATP:   return 1;
148         case BC_RGBA_FLOATP:  return 1;
149         case BC_GREY8:        return 0xff;
150         case BC_GREY16:       return 0xffff;
151         case BC_GBRP:         return 0xff;
152         }
153         return 0;
154 }
155
156 int BC_CModels::calculate_datasize(int w, int h, int bytes_per_line, int color_model)
157 {
158         switch(color_model) {
159         case BC_YUV410P: return w * h + w * h / 8 + 4;
160         case BC_YUV420P:
161         case BC_YUV420PI:
162         case BC_YUV411P: return w * h + w * h / 2 + 4;
163         case BC_YUV422P: return w * h * 2 + 4;
164         case BC_YUV444P: return w * h * 3 + 4;
165         case BC_GBRP:    return w * h * 3 + 4;
166         case BC_RGB_FLOATP: return w * h * 3 * sizeof(float) + 4;
167         case BC_RGBA_FLOATP: return w * h * 4 * sizeof(float) + 4;
168         }
169         if( bytes_per_line < 0 )
170                 bytes_per_line = w * calculate_pixelsize(color_model);
171         return h * bytes_per_line + 4;
172 }
173
174 int BC_CModels::bc_to_x(int color_model)
175 {
176         switch(color_model) {
177         case BC_YUV420P: return FOURCC_YV12;
178         case BC_YUV422:  return FOURCC_YUV2;
179         case BC_UVY422:  return FOURCC_UYVY;
180         }
181         return -1;
182 }
183
184 void BC_CModels::to_text(char *string, int cmodel)
185 {
186         switch(cmodel) {
187         case BC_RGB888:       strcpy(string, "RGB-8 Bit");   break;
188         case BC_RGBA8888:     strcpy(string, "RGBA-8 Bit");  break;
189         case BC_RGB161616:    strcpy(string, "RGB-16 Bit");  break;
190         case BC_RGBA16161616: strcpy(string, "RGBA-16 Bit"); break;
191         case BC_YUV888:       strcpy(string, "YUV-8 Bit");   break;
192         case BC_YUVA8888:     strcpy(string, "YUVA-8 Bit");  break;
193         case BC_YUV161616:    strcpy(string, "YUV-16 Bit");  break;
194         case BC_YUVA16161616: strcpy(string, "YUVA-16 Bit"); break;
195         case BC_AYUV16161616: strcpy(string, "AYUV-16 Bit"); break;
196         case BC_RGB_FLOAT:    strcpy(string, "RGB-FLOAT");   break;
197         case BC_RGBA_FLOAT:   strcpy(string, "RGBA-FLOAT");  break;
198         case BC_RGB_FLOATP:   strcpy(string, "RGB-FLOATP");  break;
199         case BC_RGBA_FLOATP:  strcpy(string, "RGBA-FLOATP"); break;
200         default: strcpy(string, "RGB-8 Bit"); break;
201         }
202 }
203
204 int BC_CModels::from_text(const char *text)
205 {
206         if(!strcasecmp(text, "RGB-8 Bit"))   return BC_RGB888;
207         if(!strcasecmp(text, "RGBA-8 Bit"))  return BC_RGBA8888;
208         if(!strcasecmp(text, "RGB-16 Bit"))  return BC_RGB161616;
209         if(!strcasecmp(text, "RGBA-16 Bit")) return BC_RGBA16161616;
210         if(!strcasecmp(text, "RGB-FLOAT"))   return BC_RGB_FLOAT;
211         if(!strcasecmp(text, "RGBA-FLOAT"))  return BC_RGBA_FLOAT;
212         if(!strcasecmp(text, "RGB-FLOATP"))  return BC_RGB_FLOATP;
213         if(!strcasecmp(text, "RGBA-FLOATP")) return BC_RGBA_FLOATP;
214         if(!strcasecmp(text, "YUV-8 Bit"))   return BC_YUV888;
215         if(!strcasecmp(text, "YUVA-8 Bit"))  return BC_YUVA8888;
216         if(!strcasecmp(text, "YUV-16 Bit"))  return BC_YUV161616;
217         if(!strcasecmp(text, "YUVA-16 Bit")) return BC_YUVA16161616;
218         if(!strcasecmp(text, "AYUV-16 Bit")) return BC_AYUV16161616;
219         return BC_RGB888;
220 }
221
222 int BC_CModels::has_alpha(int colormodel)
223 {
224
225         switch(colormodel) {
226         case BC_RGBA8888:
227         case BC_ARGB8888:
228         case BC_ABGR8888:
229         case BC_RGBA16161616:
230         case BC_YUVA8888:
231         case BC_YUVA16161616:
232         case BC_UYVA8888:
233         case BC_RGBA_FLOAT:
234         case BC_RGBA_FLOATP:
235                 return 1;
236         }
237         return 0;
238 }
239
240 int BC_CModels::is_float(int colormodel)
241 {
242         switch(colormodel) {
243         case BC_RGB_FLOAT:
244         case BC_RGBA_FLOAT:
245         case BC_RGB_FLOATP:
246         case BC_RGBA_FLOATP:
247                 return 1;
248         }
249         return 0;
250 }
251
252 int BC_CModels::is_yuv(int colormodel)
253 {
254
255         switch(colormodel) {
256         case BC_YUV888:
257         case BC_YUVA8888:
258         case BC_YUV161616:
259         case BC_YUVA16161616:
260         case BC_AYUV16161616:
261         case BC_YUV422:
262         case BC_UVY422:
263         case BC_YUV101010:
264         case BC_VYU888:
265         case BC_UYVA8888:
266         case BC_YUV420P:
267         case BC_YUV420PI:
268         case BC_YUV422P:
269         case BC_YUV444P:
270         case BC_YUV411P:
271         case BC_YUV410P:
272         case BC_GREY8:
273         case BC_GREY16:
274                 return 1;
275         }
276         return 0;
277 }
278
279