2 * fbpdf - a small framebuffer pdf viewer using mupdf
4 * Copyright (C) 2009-2011 Ali Gholami Rudi
6 * This program is released under GNU GPL version 2.
19 #define CTRLKEY(x) ((x) - 96)
22 #define PDFCOLS (1 << 11)
23 #define PDFROWS (1 << 12)
25 static fbval_t pbuf
[PDFROWS
* PDFCOLS
];
28 static struct termios termios
;
29 static char filename
[256];
36 static struct doc
*doc
;
39 static void draw(void)
42 for (i
= head
; i
< MIN(head
+ fb_rows(), PDFROWS
); i
++)
43 fb_set(i
- head
, 0, pbuf
+ i
* PDFCOLS
+ left
, fb_cols());
46 static int showpage(int p
)
48 if (p
< 1 || p
> pagecount
)
50 memset(pbuf
, 0x00, sizeof(pbuf
));
51 doc_draw(doc
, pbuf
, p
, PDFROWS
, PDFCOLS
, zoom
, rotate
);
58 static int readkey(void)
61 if (read(STDIN_FILENO
, &b
, 1) <= 0)
66 static int getcount(int def
)
68 int result
= count
? count
: def
;
73 static void printinfo(void)
76 printf("FBPDF: file:%s page:%d(%d) zoom:%d%% \x1b[K",
77 filename
, num
, pagecount
, zoom
* 10);
81 static void term_setup(void)
83 struct termios newtermios
;
84 tcgetattr(STDIN_FILENO
, &termios
);
86 newtermios
.c_lflag
&= ~ICANON
;
87 newtermios
.c_lflag
&= ~ECHO
;
88 tcsetattr(STDIN_FILENO
, TCSAFLUSH
, &newtermios
);
91 static void term_cleanup(void)
93 tcsetattr(STDIN_FILENO
, 0, &termios
);
96 static void sigcont(int sig
)
101 static void mainloop(void)
103 int step
= fb_rows() / PAGESTEPS
;
104 int hstep
= fb_cols() / PAGESTEPS
;
107 signal(SIGCONT
, sigcont
);
109 while ((c
= readkey()) != -1) {
110 int maxhead
= PDFROWS
- fb_rows();
111 int maxleft
= PDFCOLS
- fb_cols();
115 showpage(num
+ getcount(1));
119 showpage(num
- getcount(1));
122 showpage(getcount(pagecount
));
129 rotate
= getcount(0);
143 count
= count
* 10 + c
- '0';
147 head
+= step
* getcount(1);
150 head
-= step
* getcount(1);
153 left
+= hstep
* getcount(1);
156 left
-= hstep
* getcount(1);
169 head
+= fb_rows() * getcount(1) - step
;
173 head
-= fb_rows() * getcount(1) - step
;
178 /* no need to redraw */
181 head
= MAX(0, MIN(maxhead
, head
));
182 left
= MAX(0, MIN(maxleft
, left
));
188 "usage: fbpdf [-r rotation] [-z zoom x10] [-p page] filename\n";
190 int main(int argc
, char *argv
[])
192 char *hide
= "\x1b[?25l";
193 char *show
= "\x1b[?25h";
194 char *clear
= "\x1b[2J";
200 strcpy(filename
, argv
[argc
- 1]);
201 doc
= doc_open(filename
);
203 printf("cannot open file\n");
206 pagecount
= doc_pages(doc
);
207 while (i
+ 2 < argc
&& argv
[i
][0] == '-') {
208 if (argv
[i
][1] == 'r')
209 rotate
= atoi(argv
[i
+ 1]);
210 if (argv
[i
][1] == 'z')
211 zoom
= atoi(argv
[i
+ 1]);
212 if (argv
[i
][1] == 'p')
213 num
= atoi(argv
[i
+ 1]);
217 write(STDIN_FILENO
, hide
, strlen(hide
));
218 write(STDOUT_FILENO
, clear
, strlen(clear
));
223 write(STDIN_FILENO
, show
, strlen(show
));