fix make_shader segment count, repair mask tweak keyfrm updates for xlat,rotate,scale
[goodguy/cinelerra.git] / cinelerra-5.1 / guicast / test4.C
1
2 //c++ -g -I../guicast test4.C ../guicast/x86_64/libguicast.a \
3 // -DHAVE_GL -DHAVE_XFT -I/usr/include/freetype2 -lGL -lX11 -lXext \
4 // -lXinerama -lXv -lpng  -lfontconfig -lfreetype -lXft -pthread
5
6 #include <stdio.h>
7 #include <stdarg.h>
8 #include <stdlib.h>
9 #include <unistd.h>
10 #include <fcntl.h>
11 #include <sys/types.h>
12 #include <sys/stat.h>
13
14 #include "bcwindowbase.h"
15 #include "bcwindow.h"
16 #include "bcsignals.h"
17 #include "bccolors.h"
18 #include "fonts.h"
19 #include "thread.h"
20 #include "vframe.h"
21
22 class TestWindowGUI : public BC_Window
23 {
24 public:
25
26         TestWindowGUI(int x, int y, int w, int h);
27         ~TestWindowGUI();
28 };
29
30
31 class TestWindow : public Thread
32 {
33         TestWindowGUI *gui;
34 public:
35         TestWindow(int x, int y, int w, int h)
36          : Thread(1,0,0) {
37                 gui = new TestWindowGUI(x,y,w,h);
38                 start();
39         }
40         void draw(VFrame *vframe) {
41                 gui->draw_vframe(vframe,
42                         0,0,gui->get_w(),gui->get_h(),
43                         0,0,vframe->get_w(),vframe->get_h(),
44                         0);
45                 gui->flash();
46         }
47         void show_text(int tx, int ty, const char *fmt, ...);
48         void close_window() { gui->close(0); }
49         ~TestWindow() { delete gui; }
50         void run() { gui->run_window(); }
51 };
52
53 TestWindowGUI::
54 TestWindowGUI(int x, int y, int w, int h)
55  : BC_Window("test", x,y, w,h, 100,100)
56 {
57         set_bg_color(BLACK);
58         clear_box(0,0,get_w(),get_h());
59         flash();
60         set_font(MEDIUMFONT);
61 }
62
63 TestWindowGUI::
64 ~TestWindowGUI()
65 {
66 }
67
68 void TestWindow::show_text(int tx, int ty, const char *fmt, ...)
69 {
70         char text[1024];
71         va_list ap;
72         va_start(ap, fmt);
73         vsprintf(text, fmt, ap);
74         va_end(ap);
75         gui->set_color(0xc080f0);
76         gui->draw_text(tx,ty, text);
77         gui->flash();
78 }
79
80 const char *cmdl[] = {
81  "transparency", "compressed", "rgb8", "rgb565", "bgr565", "bgr888", "bgr8888", "yuv420p",
82  "yuv422p", "rgb888", "rgba8888", "rgb161616", "rgba16161616", "yuv888", "yuva8888", "yuv161616",
83  "yuva16161616", "yuv411p", "uvy422", "yuv422", "argb8888", "abgr8888", "a8", "a16",
84  "yuv101010", "vyu888", "uyva8888", "yuv444p", "yuv410p", "rgb_float", "rgba_float", "a_float",
85  "rgb_floatp", "rgba_floatp", "yuv420pi", "ayuv16161616", "grey8", "grey16", "gbrp",
86 };
87
88 void write_pgm(uint8_t *tp, int w, int h, const char *fmt, ...)
89 {
90   va_list ap;    va_start(ap, fmt);
91   char fn[256];  vsnprintf(fn, sizeof(fn), fmt, ap);
92   va_end(ap);
93   FILE *fp = !strcmp(fn,"-") ? stdout : fopen(fn,"w");
94   if( fp ) {
95     fprintf(fp,"P5\n%d %d\n255\n",w,h);
96     fwrite(tp,w,h,fp);
97     fclose(fp);
98   }
99 }
100
101 void write_ppm(uint8_t *tp, int w, int h, const char *fmt, ...)
102 {
103   va_list ap;    va_start(ap, fmt);
104   char fn[256];  vsnprintf(fn, sizeof(fn), fmt, ap);
105   va_end(ap);
106   FILE *fp = !strcmp(fn,"-") ? stdout : fopen(fn,"w");
107   if( fp ) {
108     fprintf(fp,"P6\n%d %d\n255\n",w,h);
109     fwrite(tp,3*w,h,fp);
110     if( fp != stdout ) fclose(fp);
111   }
112 }
113
114 int64_t tm = 0, tn = 0;
115
116 static int diff_vframe(VFrame &afrm, VFrame &bfrm)
117 {
118   int n = 0, m = 0;
119   int w = afrm.get_w(), h = afrm.get_h();
120   uint8_t **arows = afrm.get_rows();
121   uint8_t **brows = bfrm.get_rows();
122
123   for( int y=0; y<h; ++y ) {
124     uint8_t *ap = arows[y], *bp = brows[y];
125     for( int x=0; x<w; ++x ) {
126       for( int i=0; i<3; ++i ) {
127         int d = *ap++ - *bp++;
128         m += d;
129         if( d < 0 ) d = -d;
130         n += d;
131       }
132     }
133   }
134   int sz = h*w*3;
135   printf(" %d %d %f", m, n, (double)n/sz);
136   tm += m;  tn += n;
137   return n;
138 }
139
140 int main(int ac, char **av)
141 {
142         BC_Signals signals;
143         signals.initialize();
144         int fd = open("test.png",O_RDONLY);
145         if( fd < 0 ) exit(1);
146         struct stat st;  fstat(fd,&st);
147         unsigned char *dat = new unsigned char[st.st_size];
148         read(fd, dat, st.st_size);
149         VFramePng ifrm(dat, st.st_size);
150         delete [] dat;
151         close(fd);
152         int w = ifrm.get_w(), h = ifrm.get_h();
153         TestWindow test_window(100, 100, w, h);
154         for( int fr_cmdl=1; fr_cmdl<=38; ++fr_cmdl ) {
155                 if( fr_cmdl == BC_TRANSPARENCY || fr_cmdl == BC_COMPRESSED ) continue;
156                 if( fr_cmdl == BC_A8 || fr_cmdl == BC_A16 ) continue;
157                 if( fr_cmdl == BC_A_FLOAT || fr_cmdl == 8 ) continue;
158                 VFrame afrm(w, h, fr_cmdl, -1);
159                 afrm.transfer_from(&ifrm, 0);
160                 for( int to_cmdl=1; to_cmdl<=38; ++to_cmdl ) {
161                         if( to_cmdl == BC_TRANSPARENCY || to_cmdl == BC_COMPRESSED ) continue;
162                         if( to_cmdl == BC_A8 || to_cmdl == BC_A16 ) continue;
163                         if( to_cmdl == BC_A_FLOAT || to_cmdl == 8 ) continue;
164                         printf("xfer_%s_to_%s ", cmdl[fr_cmdl],cmdl[to_cmdl]);
165                         VFrame bfrm(w, h, to_cmdl, -1);
166                         bfrm.transfer_from(&afrm, 0);
167                         test_window.draw(&bfrm);
168                         VFrame cfrm(w, h, BC_RGB888, -1);
169                         cfrm.transfer_from(&bfrm, 0);
170                         test_window.show_text(50,50, "xfer_%s_to_%s",cmdl[fr_cmdl],cmdl[to_cmdl]);
171                         write_ppm(cfrm.get_data(), w,h, "/tmp/test/xfer_%s_to_%s.pgm",
172                                 cmdl[fr_cmdl],cmdl[to_cmdl]);
173                         diff_vframe(ifrm, cfrm);
174 //                      usleep(100000);
175                         printf("\n");
176                 }
177         }
178         test_window.close_window();
179         test_window.join();
180         return 0;
181 }
182