8 #define min(a,b) ((a) < (b) ? (a) : (b))
9 #define max(a,b) ((a) > (b) ? (a) : (b))
10 #define SHOWDELAY 100000
13 #define IDSTRING "fbv 0.93b, s-tech"
15 extern unsigned char * simple_resize(unsigned char * orgin
,int ox
,int oy
,int dx
,int dy
);
16 extern unsigned char * color_average_resize(unsigned char * orgin
,int ox
,int oy
,int dx
,int dy
);
19 int clear
=1,delay
=0,hide
=1,dispinfo
=1,allowstrech
=0;
21 struct formathandler
*fh_root
=NULL
;
23 struct termios oldtermios
;
24 struct termios ourtermios
;
26 int imm_getchar(int s
,int us
)
33 tv
.tv_sec
=s
; tv
.tv_usec
=us
;
34 if(select(1,&fds
,NULL
,NULL
,&tv
))
45 tcgetattr(0,&oldtermios
);
46 memcpy(&ourtermios
,&oldtermios
,sizeof(struct termios
));
47 ourtermios
.c_lflag
&=!(ECHO
|ICANON
);
48 tcsetattr(0,TCSANOW
,&ourtermios
);
52 tcsetattr(0,TCSANOW
,&oldtermios
);
56 void add_format(int (*picsize
)(char *,int *,int*),int (*picread
)(char *,unsigned char *,int,int), int (*id
)(char*))
58 struct formathandler
*fhn
;
59 fhn
=(struct formathandler
*) malloc(sizeof(struct formathandler
));
60 fhn
->get_size
=picsize
; fhn
->get_pic
=picread
; fhn
->id_pic
=id
;
61 fhn
->next
=fh_root
; fh_root
=fhn
;
63 #ifdef FBV_SUPPORT_GIF
64 extern int fh_gif_getsize(char *,int *,int*);
65 extern int fh_gif_load(char *,unsigned char *,int,int);
66 extern int fh_gif_id(char *);
68 #ifdef FBV_SUPPORT_JPEG
69 extern int fh_jpeg_getsize(char *,int *,int*);
70 extern int fh_jpeg_load(char *,unsigned char *,int,int);
71 extern int fh_jpeg_id(char *);
73 #ifdef FBV_SUPPORT_PNG
74 extern int fh_png_getsize(char *,int *,int*);
75 extern int fh_png_load(char *,unsigned char *,int,int);
76 extern int fh_png_id(char *);
79 void init_handlers(void)
81 #ifdef FBV_SUPPORT_GIF
82 add_format(fh_gif_getsize
,fh_gif_load
,fh_gif_id
);
84 #ifdef FBV_SUPPORT_JPEG
85 add_format(fh_jpeg_getsize
,fh_jpeg_load
,fh_jpeg_id
);
87 #ifdef FBV_SUPPORT_PNG
88 add_format(fh_png_getsize
,fh_png_load
,fh_png_id
);
92 struct formathandler
* fh_getsize(char *name
,int *x
,int *y
)
94 struct formathandler
*fh
;
95 for(fh
=fh_root
;fh
!=NULL
;fh
=fh
->next
)
98 if(fh
->get_size(name
,x
,y
)==FH_ERROR_OK
) return(fh
);
103 int show_image(char *name
)
105 int x
,y
,xs
,ys
,xpos
,ypos
,xdelta
,ydelta
,c
,eol
,xstep
,ystep
,rfrsh
,imx
,imy
;
106 unsigned char *buffer
;
107 struct formathandler
*fh
;
109 if(fh
=fh_getsize(name
,&x
,&y
))
111 buffer
=(unsigned char *) malloc(x
*y
*3);
112 if(fh
->get_pic(name
,buffer
,x
,y
)==FH_ERROR_OK
)
114 if(clear
) { printf("\033[H\033[J"); fflush(stdout
); usleep(SHOWDELAY
); } /* temporary solution */
115 if(dispinfo
) printf("%s\n%s\n%d x %d\n",IDSTRING
,name
,x
,y
);
117 getCurrentRes(&xs
,&ys
);
118 if((x
>xs
|| y
>ys
) && allowstrech
)
131 buffer
=simple_resize(buffer
,x
,y
,imx
,imy
);
133 buffer
=color_average_resize(buffer
,x
,y
,imx
,imy
);
137 if(x
<xs
) xpos
=(xs
-x
)/2; else xpos
=0;
138 if(y
<ys
) ypos
=(ys
-y
)/2; else ypos
=0;
141 xstep
=min(max(x
/20,1),xs
);
142 ystep
=min(max(y
/20,1),ys
);
144 for(eol
=-1,rfrsh
=1;eol
==-1;)
146 if(rfrsh
) fb_display(buffer
,x
,y
,xdelta
,ydelta
,xpos
,ypos
);
155 if(xdelta
<0) xdelta
=0;
161 if(xdelta
>(x
-xs
)) xdelta
=x
-xs
;
166 if(ydelta
<0) ydelta
=0;
172 if(ydelta
>(y
-ys
)) ydelta
=y
-ys
;
175 case ' ': case 10: eol
=1; break;
176 case 'r': rfrsh
=1; break;
177 case '.': case '>': eol
=NEXT_IMG
; break;
178 case ',': case '<': case 127: case 255: eol
=PREV_IMG
; break;
179 case 'q': eol
=0; break;
184 if(imm_getchar(delay
/ 10,delay
% 10)=='q') eol
=0; else eol
=1;
189 if(clear
) { printf("\033[0m\033[H\033[J"); fflush(stdout
); }
192 printf("Unable to read file !\n");
196 printf("Unable to read file or format not recognized!\n");
201 void help(char *name
)
203 printf("Usage: %s [options] image1 image2 image3 ...\n\n"
205 " -h : Show this help\n"
206 " -c : Do not clear the screen before/after displaying image\n"
207 " -u : Do not hide/show cursor before/after displaying image\n"
208 " -i : Do not show image information\n"
209 " -f : Strech (using simple resize) the image to fit onto screen if necessary\n"
210 " -k : Strech (using color average resize) the image to fit onto screen if necessary\n"
211 " -s <delay> slideshow, wait 'delay' tenths of a second before displaying each image\n\n"
212 "Use a,d,w and x to scroll the image\n\n"
213 "%s/2000, http://s-tech.linux-pl.com\n",name
,IDSTRING
);
219 int main(int argc
,char **argv
)
222 unsigned char *buffer
;
231 opt
=getopt_long(argc
,argv
,"chukfis:");
235 case 'c': clear
=0; break;
236 case 's': if(optarg
) delay
=atoi(optarg
); break;
237 case 'u': hide
=0; break;
238 case 'h': help(argv
[0]); break;
239 case 'i': dispinfo
=0; break;
240 case 'f': allowstrech
=1; break;
241 case 'k': allowstrech
=2; break;
244 while(imm_getchar(0,0)!=EOF
);
245 if(hide
) printf("\033[?25l");
246 for(a
=optind
;argv
[a
]!=NULL
;a
++)
248 r
=show_image(argv
[a
]);
256 if(hide
) printf("\033[?25h");