mirror of
https://github.com/koreader/koreader
synced 2024-10-31 21:20:20 +00:00
add page size limit in reading pdf/djvu files
This commit is contained in:
parent
3b0fc4b659
commit
e0a9548975
77
k2pdfopt.c
77
k2pdfopt.c
@ -90,18 +90,10 @@
|
||||
** Constants from the front of the CRC standard math tables
|
||||
** (Accuracy = 50 digits)
|
||||
*/
|
||||
/* The 50 digits cause problems with MPW's Mr. C on the Macintosh, */
|
||||
/* so I've truncated to 20 digits. */
|
||||
/*
|
||||
#define PI 3.14159265358979323846264338327950288419716939937511
|
||||
#define SQRT2 1.41421356237309504880168872420969807856967187537695
|
||||
#define SQRT3 1.73205080756887729352744634150587236694280525381039
|
||||
#define LOG10E 0.43429448190325182765112891891660508229439700580367
|
||||
*/
|
||||
#define PI 3.1415926535897932384
|
||||
#define SQRT2 1.4142135623730950488
|
||||
#define SQRT3 1.7320508075688772935
|
||||
#define LOG10E 0.4342944819032518276
|
||||
#define PI 3.14159265358979323846264338327950288419716939937511
|
||||
#define SQRT2 1.41421356237309504880168872420969807856967187537695
|
||||
#define SQRT3 1.73205080756887729352744634150587236694280525381039
|
||||
#define LOG10E 0.43429448190325182765112891891660508229439700580367
|
||||
#define DBPERNEP (20.*LOG10E)
|
||||
|
||||
#define SRC_TYPE_PDF 1
|
||||
@ -414,6 +406,9 @@ static MASTERINFO _masterinfo, *masterinfo;
|
||||
static int master_bmp_inited = 0;
|
||||
static int master_bmp_width = 0;
|
||||
static int master_bmp_height = 0;
|
||||
static int max_page_width_pix = 3000;
|
||||
static int max_page_height_pix = 4000;
|
||||
static double shrink_factor = 0.9;
|
||||
|
||||
static void k2pdfopt_reflow_bmp(MASTERINFO *masterinfo, WILLUSBITMAP *src) {
|
||||
PAGEINFO _pageinfo, *pageinfo;
|
||||
@ -475,14 +470,62 @@ static void k2pdfopt_reflow_bmp(MASTERINFO *masterinfo, WILLUSBITMAP *src) {
|
||||
bmp_free(srcgrey);
|
||||
}
|
||||
|
||||
void k2pdfopt_mupdf_reflow(fz_context *ctx, fz_pixmap *pix, double rot_deg) {
|
||||
void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx, \
|
||||
double dpi, double gamma, double rot_deg) {
|
||||
fz_device *dev;
|
||||
fz_pixmap *pix;
|
||||
fz_rect bounds,bounds2;
|
||||
fz_matrix ctm;
|
||||
fz_bbox bbox;
|
||||
WILLUSBITMAP _src, *src;
|
||||
|
||||
double dpp;
|
||||
do {
|
||||
dpp = dpi / 72.;
|
||||
pix = NULL;
|
||||
fz_var(pix);
|
||||
bounds = fz_bound_page(doc, page);
|
||||
ctm = fz_scale(dpp, dpp);
|
||||
// ctm=fz_concat(ctm,fz_rotate(rotation));
|
||||
bounds2 = fz_transform_rect(ctm, bounds);
|
||||
bbox = fz_round_rect(bounds2);
|
||||
printf("reading page:%d,%d,%d,%d dpi:%.0f\n",bbox.x0,bbox.y0,bbox.x1,bbox.y1,dpi);
|
||||
dpi = dpi*shrink_factor;
|
||||
} while (bbox.x1 > max_page_width_pix | bbox.y1 > max_page_height_pix);
|
||||
// ctm=fz_translate(0,-page->mediabox.y1);
|
||||
// ctm=fz_concat(ctm,fz_scale(dpp,-dpp));
|
||||
// ctm=fz_concat(ctm,fz_rotate(page->rotate));
|
||||
// ctm=fz_concat(ctm,fz_rotate(0));
|
||||
// bbox=fz_round_rect(fz_transform_rect(ctm,page->mediabox));
|
||||
// pix=fz_new_pixmap_with_rect(colorspace,bbox);
|
||||
pix = fz_new_pixmap_with_bbox(ctx, fz_device_gray, bbox);
|
||||
fz_clear_pixmap_with_value(ctx, pix, 0xff);
|
||||
dev = fz_new_draw_device(ctx, pix);
|
||||
#ifdef MUPDF_TRACE
|
||||
fz_device *tdev;
|
||||
fz_try(ctx) {
|
||||
tdev = fz_new_trace_device(ctx);
|
||||
fz_run_page(doc, page, tdev, ctm, NULL);
|
||||
}
|
||||
fz_always(ctx) {
|
||||
fz_free_device(tdev);
|
||||
}
|
||||
#endif
|
||||
fz_run_page(doc, page, dev, ctm, NULL);
|
||||
fz_free_device(dev);
|
||||
|
||||
if(gamma >= 0.0) {
|
||||
fz_gamma_pixmap(ctx, pix, gamma);
|
||||
}
|
||||
|
||||
src = &_src;
|
||||
masterinfo = &_masterinfo;
|
||||
bmp_init(src);
|
||||
int status = bmpmupdf_pixmap_to_bmp(src, ctx, pix);
|
||||
k2pdfopt_reflow_bmp(masterinfo, src);
|
||||
bmp_free(src);
|
||||
|
||||
fz_drop_pixmap(ctx, pix);
|
||||
}
|
||||
|
||||
void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
@ -499,8 +542,12 @@ void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
ih = ddjvu_page_get_height(page);
|
||||
idpi = ddjvu_page_get_resolution(page);
|
||||
prect.x = prect.y = 0;
|
||||
prect.w = iw * dpi / idpi;
|
||||
prect.h = ih * dpi / idpi;
|
||||
do {
|
||||
prect.w = iw * dpi / idpi;
|
||||
prect.h = ih * dpi / idpi;
|
||||
printf("reading page:%d,%d,%d,%d dpi:%.0f\n",prect.x,prect.y,prect.w,prect.h,dpi);
|
||||
dpi = dpi*shrink_factor;
|
||||
} while (prect.w > max_page_width_pix | prect.h > max_page_height_pix);
|
||||
rrect = prect;
|
||||
|
||||
src = &_src;
|
||||
|
@ -26,7 +26,8 @@
|
||||
#include <fitz/fitz-internal.h>
|
||||
#include <libdjvu/ddjvuapi.h>
|
||||
|
||||
void k2pdfopt_mupdf_reflow(fz_context *ctx, fz_pixmap *pix, double rot_deg);
|
||||
void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx, \
|
||||
double dpi, double gamma, double rot_deg);
|
||||
void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
ddjvu_render_mode_t mode, ddjvu_format_t *fmt, double dpi);
|
||||
void k2pdfopt_rfbmp_size(int *width, int *height);
|
||||
|
44
pdf.c
44
pdf.c
@ -512,61 +512,19 @@ static int closePage(lua_State *L) {
|
||||
}
|
||||
|
||||
static int reflowPage(lua_State *L) {
|
||||
fz_context *ctx;
|
||||
fz_device *dev;
|
||||
fz_pixmap *pix;
|
||||
fz_rect bounds,bounds2;
|
||||
fz_matrix ctm;
|
||||
fz_bbox bbox;
|
||||
|
||||
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
|
||||
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
|
||||
|
||||
double dpi = 250*(dc->zoom);
|
||||
double dpp;
|
||||
dpp = dpi / 72.;
|
||||
pix = NULL;
|
||||
fz_var(pix);
|
||||
bounds = fz_bound_page(page->doc->xref, page->page);
|
||||
ctm = fz_scale(dpp, dpp);
|
||||
// ctm=fz_concat(ctm,fz_rotate(rotation));
|
||||
bounds2 = fz_transform_rect(ctm, bounds);
|
||||
bbox = fz_round_rect(bounds2);
|
||||
// ctm=fz_translate(0,-page->mediabox.y1);
|
||||
// ctm=fz_concat(ctm,fz_scale(dpp,-dpp));
|
||||
// ctm=fz_concat(ctm,fz_rotate(page->rotate));
|
||||
// ctm=fz_concat(ctm,fz_rotate(0));
|
||||
// bbox=fz_round_rect(fz_transform_rect(ctm,page->mediabox));
|
||||
// pix=fz_new_pixmap_with_rect(colorspace,bbox);
|
||||
pix = fz_new_pixmap_with_bbox(page->doc->context, fz_device_gray, bbox);
|
||||
printf("bbox:%d,%d,%d,%d\n",bbox.x0,bbox.y0,bbox.x1,bbox.y1);
|
||||
fz_clear_pixmap_with_value(page->doc->context, pix, 0xff);
|
||||
dev = fz_new_draw_device(page->doc->context, pix);
|
||||
#ifdef MUPDF_TRACE
|
||||
fz_device *tdev;
|
||||
fz_try(page->doc->context) {
|
||||
tdev = fz_new_trace_device(page->doc->context);
|
||||
fz_run_page(page->doc->xref, page->page, tdev, ctm, NULL);
|
||||
}
|
||||
fz_always(page->doc->context) {
|
||||
fz_free_device(tdev);
|
||||
}
|
||||
#endif
|
||||
fz_run_page(page->doc->xref, page->page, dev, ctm, NULL);
|
||||
fz_free_device(dev);
|
||||
|
||||
if(dc->gamma >= 0.0) {
|
||||
fz_gamma_pixmap(page->doc->context, pix, dc->gamma);
|
||||
}
|
||||
int width, height;
|
||||
k2pdfopt_mupdf_reflow(page->doc->context, pix, 0);
|
||||
k2pdfopt_mupdf_reflow(page->doc->xref, page->page, page->doc->context, dpi, dc->gamma, 0);
|
||||
k2pdfopt_rfbmp_size(&width, &height);
|
||||
|
||||
lua_pushnumber(L, (double)width);
|
||||
lua_pushnumber(L, (double)height);
|
||||
|
||||
fz_drop_pixmap(page->doc->context, pix);
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user