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
11 #include <sys/types.h>
14 #include "bcwindowbase.h"
16 #include "bcsignals.h"
22 class TestWindowGUI : public BC_Window
26 TestWindowGUI(int x, int y, int w, int h);
31 class TestWindow : public Thread
35 TestWindow(int x, int y, int w, int h)
37 gui = new TestWindowGUI(x,y,w,h);
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(),
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(); }
54 TestWindowGUI(int x, int y, int w, int h)
55 : BC_Window("test", x,y, w,h, 100,100)
58 clear_box(0,0,get_w(),get_h());
68 void TestWindow::show_text(int tx, int ty, const char *fmt, ...)
73 vsprintf(text, fmt, ap);
75 gui->set_color(0xc080f0);
76 gui->draw_text(tx,ty, text);
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",
88 void write_pgm(uint8_t *tp, int w, int h, const char *fmt, ...)
90 va_list ap; va_start(ap, fmt);
91 char fn[256]; vsnprintf(fn, sizeof(fn), fmt, ap);
93 FILE *fp = !strcmp(fn,"-") ? stdout : fopen(fn,"w");
95 fprintf(fp,"P5\n%d %d\n255\n",w,h);
101 void write_ppm(uint8_t *tp, int w, int h, const char *fmt, ...)
103 va_list ap; va_start(ap, fmt);
104 char fn[256]; vsnprintf(fn, sizeof(fn), fmt, ap);
106 FILE *fp = !strcmp(fn,"-") ? stdout : fopen(fn,"w");
108 fprintf(fp,"P6\n%d %d\n255\n",w,h);
110 if( fp != stdout ) fclose(fp);
114 int64_t tm = 0, tn = 0;
116 static int diff_vframe(VFrame &afrm, VFrame &bfrm)
119 int w = afrm.get_w(), h = afrm.get_h();
120 uint8_t **arows = afrm.get_rows();
121 uint8_t **brows = bfrm.get_rows();
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++;
135 printf(" %d %d %f", m, n, (double)n/sz);
140 int main(int ac, char **av)
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);
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);
178 test_window.close_window();