diff --git a/djvu.c b/djvu.c index f3c699fe4..1538a2f29 100644 --- a/djvu.c +++ b/djvu.c @@ -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"); @@ -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}, diff --git a/pdf.c b/pdf.c index 0366a6d81..82d01da38 100644 --- a/pdf.c +++ b/pdf.c @@ -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"); @@ -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},