main.c.old
上传用户:hengzhunsh
上传日期:2013-09-07
资源大小:19k
文件大小:9k
源码类别:

浏览器

开发平台:

Unix_Linux

  1. /*
  2. fbv  --  simple image viewer for the linux framebuffer
  3. Copyright (C) 2000, 2001, 2003  Mateusz Golicz
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include "config.h"
  17. #include "fbv.h"
  18. #include <stdio.h>
  19. #include <termios.h>
  20. #include <sys/time.h>
  21. #include <sys/types.h>
  22. #include <unistd.h>
  23. #include <getopt.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #define min(a,b) ((a) < (b) ? (a) : (b))
  27. #define max(a,b) ((a) > (b) ? (a) : (b))
  28. #define SHOWDELAY 100000
  29. #define NEXT_IMG -3
  30. #define PREV_IMG -4
  31. extern unsigned char * simple_resize(unsigned char * orgin,int ox,int oy,int dx,int dy);
  32. extern unsigned char * alpha_resize(unsigned char * orgin,int ox,int oy,int dx,int dy);
  33. extern unsigned char * color_average_resize(unsigned char * orgin,int ox,int oy,int dx,int dy);
  34. int clear=1,delay=0,hide=1,dispinfo=1,allowstrech=0,opt_alpha = 0, allow_enlarging = 0, ignore_ratio = 0;
  35. struct formathandler *fh_root=NULL;
  36. struct termios oldtermios;
  37. struct termios ourtermios;
  38. int imm_getchar(int s,int us)
  39. {
  40. struct timeval tv;
  41. unsigned char c;
  42. fd_set fds;
  43. FD_ZERO(&fds);
  44. FD_SET(0,&fds);
  45. tv.tv_sec=s; tv.tv_usec=us;
  46. if(select(1,&fds,NULL,NULL,&tv))
  47. {
  48. read(0,&c,1);
  49. return((int) c);
  50. }
  51. else
  52. return(EOF);
  53. }
  54. void contoraw(void)
  55. {
  56. tcgetattr(0,&oldtermios);
  57. memcpy(&ourtermios,&oldtermios,sizeof(struct termios));
  58. ourtermios.c_lflag&=!(ECHO|ICANON);
  59. tcsetattr(0,TCSANOW,&ourtermios);
  60. }
  61. void connorm(void)
  62. {
  63. tcsetattr(0,TCSANOW,&oldtermios);
  64. }
  65. void add_format(int (*picsize)(char *,int *,int*),int (*picread)(char *,unsigned char *,unsigned char**,int,int), int (*id)(char*))
  66. {
  67. struct formathandler *fhn;
  68. fhn=(struct formathandler*) malloc(sizeof(struct formathandler));
  69. fhn->get_size=picsize; fhn->get_pic=picread; fhn->id_pic=id;
  70. fhn->next=fh_root; fh_root=fhn;
  71. }
  72. #ifdef FBV_SUPPORT_GIF
  73. extern int fh_gif_getsize(char *,int *,int*);
  74. extern int fh_gif_load(char *,unsigned char *,unsigned char **, int,int);
  75. extern int fh_gif_id(char *);
  76. #endif
  77. #ifdef FBV_SUPPORT_JPEG
  78. extern int fh_jpeg_getsize(char *,int *,int*);
  79. extern int fh_jpeg_load(char *,unsigned char *,unsigned char **, int,int);
  80. extern int fh_jpeg_id(char *);
  81. #endif
  82. #ifdef FBV_SUPPORT_PNG
  83. extern int fh_png_getsize(char *,int *,int*);
  84. extern int fh_png_load(char *,unsigned char *,unsigned char **,int,int);
  85. extern int fh_png_id(char *);
  86. #endif
  87. #ifdef FBV_SUPPORT_BMP
  88. extern int fh_bmp_getsize(char *,int *,int*);
  89. extern int fh_bmp_load(char *,unsigned char *,unsigned char **, int,int);
  90. extern int fh_bmp_id(char *);
  91. #endif
  92. void init_handlers(void)
  93. {
  94. #ifdef FBV_SUPPORT_GIF
  95. add_format(fh_gif_getsize,fh_gif_load,fh_gif_id);
  96. #endif
  97. #ifdef FBV_SUPPORT_JPEG
  98. add_format(fh_jpeg_getsize,fh_jpeg_load,fh_jpeg_id);
  99. #endif
  100. #ifdef FBV_SUPPORT_PNG
  101. add_format(fh_png_getsize,fh_png_load,fh_png_id);
  102. #endif
  103. #ifdef FBV_SUPPORT_BMP
  104. add_format(fh_bmp_getsize,fh_bmp_load,fh_bmp_id);
  105. #endif
  106. }
  107. struct formathandler * fh_getsize(char *name,int *x,int *y)
  108. {
  109. struct formathandler *fh;
  110. for(fh=fh_root;fh!=NULL;fh=fh->next)
  111. {
  112. if(fh->id_pic(name))
  113. if(fh->get_size(name,x,y)==FH_ERROR_OK) return(fh);
  114. }
  115. return(NULL);
  116. }
  117. int show_image(char *name)
  118. {
  119. int x,y,xs,ys,xpos,ypos,xdelta,ydelta,c,eol,xstep,ystep,rfrsh,imx,imy;
  120. unsigned char *buffer;
  121. unsigned char *alpha = NULL;
  122. struct formathandler *fh;
  123. eol=1;
  124. if((fh=fh_getsize(name,&x,&y)))
  125. {
  126. buffer=(unsigned char *) malloc(x*y*3);
  127. if(fh->get_pic(name,buffer,&alpha,x,y)==FH_ERROR_OK)
  128. {
  129. if(clear) { printf("33[H33[J"); fflush(stdout); usleep(SHOWDELAY); } /* temporary solution */
  130. if(dispinfo) printf("%sn%sn%d x %dn",IDSTRING,name,x,y); 
  131. contoraw();
  132. getCurrentRes(&xs,&ys);
  133. if((x>xs || y>ys) && allowstrech)
  134. {
  135. if(ignore_ratio)
  136. {
  137. if(x > xs)
  138. imx = xs;
  139. if(y > ys)
  140. imy = ys;
  141. }
  142. else
  143. {
  144. if( (y*xs/x) <= ys)
  145. {
  146. imx=xs;
  147. imy=y*xs/x;
  148. }
  149. else
  150. {
  151. imx=x*ys/y;
  152. imy=ys;
  153. }
  154. }
  155. if(allowstrech==1)
  156. buffer=simple_resize(buffer,x,y,imx,imy);
  157. else
  158. buffer=color_average_resize(buffer,x,y,imx,imy);
  159. if(alpha)
  160. alpha=alpha_resize(alpha,x,y,imx,imy);
  161. x=imx; y=imy;
  162. }
  163. if(((x < xs) || (y < ys)) && allow_enlarging)
  164. {
  165. int new_x, new_y;
  166. if(ignore_ratio)
  167. {
  168. if(x < xs)
  169. new_x = xs;
  170. if(y < ys)
  171. new_y = ys;
  172. }
  173. else
  174. {
  175. }
  176. }
  177. if(x<xs) xpos=(xs-x)/2; else xpos=0;
  178. if(y<ys) ypos=(ys-y)/2; else ypos=0;
  179. xdelta=0; ydelta=0;
  180. xstep=min(max(x/20,1),xs);
  181. ystep=min(max(y/20,1),ys);
  182. for(eol=-1,rfrsh=1;eol==-1;)
  183. {
  184. if(rfrsh)
  185. fb_display(buffer, opt_alpha ? alpha : NULL, x,y,xdelta,ydelta,xpos,ypos);
  186. rfrsh=0;
  187. if(!delay)
  188. {
  189. c=getchar();
  190. switch(c)
  191. {
  192. case 'a': case 'D':
  193. xdelta-=xstep;
  194. if(xdelta<0) xdelta=0;
  195. rfrsh=1;
  196. break;
  197. case 'd': case 'C':
  198. if(xpos) break;
  199. xdelta+=xstep;
  200. if(xdelta>(x-xs)) xdelta=x-xs;
  201. rfrsh=1;
  202. break;
  203. case 'w': case 'A':
  204. ydelta-=ystep;
  205. if(ydelta<0) ydelta=0;
  206. rfrsh=1;
  207. break;
  208. case 'x': case 'B':
  209. if(ypos) break;
  210. ydelta+=ystep;
  211. if(ydelta>(y-ys)) ydelta=y-ys;
  212. rfrsh=1;
  213. break;
  214. case ' ': case 10: eol=1; break;
  215. case 'r': rfrsh=1; break;
  216. case '.': case '>': eol=NEXT_IMG; break;
  217. case ',': case '<': case 127: case 255: eol=PREV_IMG; break;
  218. case 'q': eol=0; break;
  219. }
  220. }
  221. else
  222. {
  223. if(imm_getchar(delay / 10,delay % 10)=='q') eol=0; else eol=1;
  224. break;
  225. }
  226. }
  227. connorm();
  228. if(clear) { printf("33[0m33[H33[J"); fflush(stdout); }
  229. }
  230. else
  231. printf("Unable to read file !n");
  232. free(buffer);
  233. free(alpha);
  234. }
  235. else
  236. printf("Unable to read file or file format not recognized!n");
  237. return(eol);
  238. }
  239. void help(char *name)
  240. {
  241. printf("Usage: %s [options] image1 image2 image3 ...nn"
  242.    "Available options:n"
  243.    " --help  | -h : Show this helpn"
  244.    " --alpha  | -a : Use alpha channel (if applicable)n"
  245.    " --noclear  | -c : Do not clear the screen before/after displaying imagen"
  246.    " --unhide  | -u : Do not hide/show the cursor before/after displaying imagen"
  247.    " --noinfo  | -i : Supress image informationn"
  248.    " --stretch | -f : Strech (using a simple resizing routine) the image to fit onto screen if necessaryn"
  249.    " --colorstretch | -k : Strech (using a 'color average' resizing routine) the image to fit onto screen if necessaryn"
  250.    " --enlarge   | -e : Enlarge the image to fit the whole screen if necessaryn"
  251.    " --ignore-ratio | -r : Ignore the image aspect while resizingn"
  252.    " --delay  | -s <delay> slideshow, wait 'delay' tenths of a second before displaying each imagenn"
  253.    "Use a,d,w and x to scroll the imagenn"
  254.    "fbv 0.99 Copyright (C) 2000 - 2003 Mateusz Golicz, Tomasz Sterna.n", name);
  255. }
  256. extern int optind;
  257. extern char *optarg;
  258. int main(int argc,char **argv)
  259. {
  260. int opt,a,r;
  261. static struct option long_options[] =
  262. {
  263. {"help", no_argument, 0, 'h'},
  264. {"noclear",  no_argument,  0, 'c'},
  265. {"alpha",  no_argument,  0, 'a'},
  266. {"unhide",   no_argument,  0, 'h'},
  267. {"noinfo",   no_argument,  0, 'i'},
  268. {"stretch",  no_argument,  0, 'f'},
  269. {"colorstrech", no_argument,  0, 'k'},
  270. {"delay",  required_argument, 0, 's'},
  271. {"enlarge", no_argument, 0, 'e'},
  272. {"ignore-ratio", no_argument, 0, 'r'},
  273. {0, 0, 0, 0}
  274. };
  275. init_handlers();    
  276. if(argc<2)
  277. help(argv[0]);
  278. else
  279. {
  280. for(;;)
  281. {
  282. opt=getopt_long_only(argc,argv,"achukfis:er",long_options,NULL);
  283. if(opt==EOF) break;
  284. switch(opt)
  285. {
  286. case 'a': opt_alpha = 1; break;
  287. case 'c': clear=0; break;
  288. case 's': if(optarg) delay=atoi(optarg); break;
  289. case 'u': hide=0; break;
  290. case 'h': help(argv[0]); break;
  291. case 'i': dispinfo=0; break;
  292. case 'f': allowstrech=1; break;
  293. case 'k': allowstrech=2; break;
  294. case 'e': allow_enlarging = 1; break;
  295. case 'r': ignore_ratio = 1; break;
  296. }
  297. }
  298. if(argv[optind]==NULL) {printf("You have to specify a filename!n"); return(1);}
  299. while(imm_getchar(0,0)!=EOF);
  300. if(hide) printf("33[?25l");
  301. for(a=optind;argv[a]!=NULL;a++) 
  302. {
  303. r=show_image(argv[a]);
  304. if(!r) break;
  305. if(r==PREV_IMG)
  306. {
  307. if((a-1)>=optind)
  308. a-=2;
  309. else
  310. a-=1;
  311. }
  312. }
  313. if(hide) printf("33[?25h");
  314. }
  315. return(0);
  316. }