static void zoom_page(int z) { int _zoom = zoom; zoom = MIN(MAXZOOM, MAX(1, z)); if (!loadpage(num)) srow = srow * zoom / _zoom; }
void h_panel_goto_panel() { gui_clean_local_keys(); if (!gui_tabs_exists("panel")) { gui_tabs_addtab("panel"); gui_tabs_select("panel"); } gui_panel_show(); gui_register_key('r', loadpage); gui_register_key(260, prevpage); gui_register_key(261, nextpage); loadpage(); }
static int reload(void) { doc_close(doc); doc = doc_open(filename); if (!doc || !doc_pages(doc)) { fprintf(stderr, "\nfbpdf: cannot open <%s>\n", filename); return 1; } if (!loadpage(num)) draw(); return 0; }
static void jmpmark(int c, int offset) { if (c == '`') c = '\''; if (ISMARK(c) && mark[c]) { int dst = mark[c]; int dst_row = offset ? mark_row[c] * zoom : 0; setmark('\''); if (!loadpage(dst)) srow = offset ? dst_row : prow; } }
static XDBlock* popfree(XDStore *s, int slot) { u32int na; XDBlock *d, *nd; d = s->free[slot]; if(d == nil){ werrstr("empty slot %d", slot); return nil; } if(d->db.n != ~(u32int)0){ fprint(2, "slot %d allocated page on the free list (oops)\n", slot); abort(); } if(d->p == nil){ d->p = loadpage(s, d->db.addr&~(s->ds.pagesize-1)); if(d->p == nil){ werrstr("loadpage %ud: %r", d->db.addr&~(s->ds.pagesize-1)); return nil; } d->pa = d->p->a + (d->db.addr&(s->ds.pagesize-1)); d->db.a = d->pa+HdrSize; } if(d->next){ DBG print("used slot %d got %ud next %ud\n", slot, d->db.addr, d->next->db.addr); s->free[slot] = d->next; return d; } na = gbit32(d->db.a); if(na == 0){ DBG print("used slot %d got %ud next 0\n", slot, d->db.addr); s->free[slot] = nil; return d; } nd = loaddata(s, na); if(nd == nil){ /* if we return d we'll leak the rest of the free chain */ DBG print("used slot %d got %ud next %ud bad: %r\n", slot, d->db.addr, na); werrstr("loaddata %ud: %r", na); return nil; } pbit32((uchar*)nd->db.a+4, 0); ((Dpage*)nd->p)->flags |= DDirty; s->free[slot] = nd; DBG print("used slot %d got %ud next %ud (loaded)\n", slot, d->db.addr, nd->db.addr); return d; }
static XDBlock* loaddata(XDStore *s, u32int addr) { XDBlock *d; Dpage *p; p = loadpage(s, addr&~(s->ds.pagesize-1)); if(p == nil) return nil; d = mkdata(s, p, p->a+(addr&(s->ds.pagesize-1)), 0); if(d == nil){ p->nref--; return nil; } //print("load %ud p->addr %ud off %ud pa %p ", // addr, p->addr, (addr&(s->ds.pagesize-1)), p->a); //print("%.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux %.2ux\n", // d->pa[0], d->pa[1], d->pa[2], d->pa[3], // d->pa[4], d->pa[5], d->pa[6], d->pa[7]); d->m = gbit32(d->pa); d->db.n = gbit32(d->pa+4); return d; }
void prevpage() { if (pagina == 1) return; pagina--; loadpage(); }
void nextpage() { if (pagina == n_pagine) return; pagina++; loadpage(); }
static inline void drawframe(uint16_t framenumber) { loadpage(findpage(framenumber), &anim->thepage); renderframe(framenumber, anim->thepage); }
static void mainloop(void) { int step = srows / PAGESTEPS; int hstep = scols / PAGESTEPS; int c; term_setup(); signal(SIGCONT, sigcont); loadpage(num); srow = prow; scol = -scols / 2; draw(); while ((c = readkey()) != -1) { if (c == 'q') break; if (c == 'e' && reload()) break; switch (c) { /* commands that do not require redrawing */ case 'o': numdiff = num - getcount(num); break; case 'Z': zoom_def = getcount(zoom); break; case 'i': printinfo(); break; case 27: count = 0; break; case 'm': setmark(readkey()); break; case 'd': sleep(getcount(1)); break; default: if (isdigit(c)) count = count * 10 + c - '0'; } switch (c) { /* commands that require redrawing */ case CTRLKEY('f'): case 'J': if (!loadpage(num + getcount(1))) srow = prow; break; case CTRLKEY('b'): case 'K': if (!loadpage(num - getcount(1))) srow = prow; break; case 'G': setmark('\''); if (!loadpage(getcount(doc_pages(doc) - numdiff) + numdiff)) srow = prow; break; case 'O': numdiff = num - getcount(num); setmark('\''); if (!loadpage(num + numdiff)) srow = prow; break; case 'z': zoom_page(getcount(zoom_def)); break; case 'w': zoom_page(pcols ? zoom * scols / pcols : zoom); break; case 'W': if (lmargin() < rmargin()) zoom_page(zoom * (scols - hstep) / (rmargin() - lmargin())); break; case 'f': zoom_page(prows ? zoom * srows / prows : zoom); break; case 'r': rotate = getcount(0); if (!loadpage(num)) srow = prow; break; case '`': case '\'': jmpmark(readkey(), c == '`'); break; case 'j': srow += step * getcount(1); break; case 'k': srow -= step * getcount(1); break; case 'l': scol += hstep * getcount(1); break; case 'h': scol -= hstep * getcount(1); break; case 'H': srow = prow; break; case 'L': srow = prow + prows - srows; break; case 'M': srow = prow + prows / 2 - srows / 2; break; case 'C': scol = -scols / 2; break; case ' ': case CTRLKEY('d'): srow += srows * getcount(1) - step; break; case 127: case CTRLKEY('u'): srow -= srows * getcount(1) - step; break; case '[': scol = pcol; break; case ']': scol = pcol + pcols - scols; break; case '{': scol = pcol + lmargin() - hstep / 2; break; case '}': scol = pcol + rmargin() + hstep / 2 - scols; break; case CTRLKEY('l'): break; case 'I': invert = !invert; loadpage(num); break; default: /* no need to redraw */ continue; } srow = MAX(prow - srows + MARGIN, MIN(prow + prows - MARGIN, srow)); scol = MAX(pcol - scols + MARGIN, MIN(pcol + pcols - MARGIN, scol)); draw(); } term_cleanup(); }
void drawframe (uint16 framenumber) { CheckAnimStarted ( "drawframe" ); loadpage(findpage(framenumber), anim->thepage); renderframe(framenumber, anim->thepage); }