Skip to content

Commit

Permalink
Merge pull request #16 from chrox/master
Browse files Browse the repository at this point in the history
add getPagePix method in pdf/djvu modules
  • Loading branch information
houqp committed May 1, 2013
2 parents 156b784 + 8e81fbe commit 9b16a69
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
33 changes: 33 additions & 0 deletions djvu.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,38 @@ static int getAutoBBox(lua_State *L) {
return 4;
}

static int getPagePix(lua_State *L) {
DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage");
KOPTContext *kctx = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
ddjvu_rect_t prect;
ddjvu_rect_t rrect;
int px, py, pw, ph, rx, ry, rw, rh, status;

prect.x = 0;
prect.y = 0;
prect.w = ddjvu_page_get_width(page->page_ref);
prect.h = ddjvu_page_get_height(page->page_ref);
rrect = prect;

WILLUSBITMAP *dst = &kctx->dst;
bmp_init(dst);
dst->width = rrect.w;
dst->height = rrect.h;
dst->bpp = 8;
bmp_alloc(dst);
if (dst->bpp == 8) {
int ii;
for (ii = 0; ii < 256; ii++)
dst->red[ii] = dst->blue[ii] = dst->green[ii] = ii;
}

ddjvu_format_set_row_order(page->doc->pixelformat, 1);
ddjvu_page_render(page->page_ref, 0, &prect, &rrect, page->doc->pixelformat,
bmp_bytewidth(dst), (char *) dst->data);

return 0;
}

static int reflowPage(lua_State *L) {
DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage");
KOPTContext *kctx = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
Expand Down Expand Up @@ -737,6 +769,7 @@ static const struct luaL_Reg djvupage_meth[] = {
{"getSize", getPageSize},
{"getUsedBBox", getUsedBBox},
{"getAutoBBox", getAutoBBox},
{"getPagePix", getPagePix},
{"close", closePage},
{"__gc", closePage},
{"reflow", reflowPage},
Expand Down
42 changes: 42 additions & 0 deletions pdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -603,6 +603,47 @@ static int getAutoBBox(lua_State *L) {
return 4;
}

static int getPagePix(lua_State *L) {
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
KOPTContext *kctx = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
fz_device *dev;
fz_pixmap *pix = NULL;
fz_rect bounds,bounds2;
fz_matrix ctm;
fz_bbox bbox;

fz_var(pix);

bounds = fz_bound_page(page->doc->xref, page->page);
bounds2 = fz_transform_rect(fz_identity, bounds);
bbox = fz_round_rect(bounds2);

fz_try(page->doc->context) {
pix = fz_new_pixmap_with_bbox(page->doc->context, fz_device_gray, bbox);
fz_clear_pixmap_with_value(page->doc->context, pix, 0xff);
dev = fz_new_draw_device(page->doc->context, pix);
fz_run_page(page->doc->xref, page->page, dev, fz_identity, NULL);
}
fz_always(page->doc->context) {
fz_free_device(dev);
}
fz_catch(page->doc->context) {
return luaL_error(L, "cannot calculate bbox for page");
}

WILLUSBITMAP *dst = &kctx->dst;
bmp_init(dst);

bmpmupdf_pixmap_to_bmp(dst, page->doc->context, pix);

kctx->page_width = dst->width;
kctx->page_height = dst->height;

fz_drop_pixmap(page->doc->context, pix);

return 0;
}

static int reflowPage(lua_State *L) {
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
KOPTContext *kctx = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
Expand Down Expand Up @@ -846,6 +887,7 @@ static const struct luaL_Reg pdfpage_meth[] = {
{"getSize", getPageSize},
{"getUsedBBox", getUsedBBox},
{"getAutoBBox", getAutoBBox},
{"getPagePix", getPagePix},
{"getPageText", getPageText},
{"getPageLinks", getPageLinks},
{"close", closePage},
Expand Down

0 comments on commit 9b16a69

Please sign in to comment.