mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
use koptcontext to keep dozons of parameters for k2pdfopt
This commit is contained in:
5
Makefile
5
Makefile
@@ -116,7 +116,7 @@ POPENNSLIB := $(POPENNSDIR)/libpopen_noshell.a
|
||||
all: kpdfview extr
|
||||
|
||||
VERSION?=$(shell git describe HEAD)
|
||||
kpdfview: kpdfview.o einkfb.o pdf.o k2pdfopt.o blitbuffer.o drawcontext.o input.o $(POPENNSLIB) util.o ft.o lfs.o mupdfimg.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) djvu.o $(DJVULIBS) cre.o $(CRENGINELIBS) pic.o pic_jpeg.o
|
||||
kpdfview: kpdfview.o einkfb.o pdf.o k2pdfopt.o blitbuffer.o drawcontext.o koptcontext.o input.o $(POPENNSLIB) util.o ft.o lfs.o mupdfimg.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) djvu.o $(DJVULIBS) cre.o $(CRENGINELIBS) pic.o pic_jpeg.o
|
||||
echo $(VERSION) > git-rev
|
||||
$(CC) \
|
||||
$(CFLAGS) \
|
||||
@@ -126,6 +126,7 @@ kpdfview: kpdfview.o einkfb.o pdf.o k2pdfopt.o blitbuffer.o drawcontext.o input.
|
||||
k2pdfopt.o \
|
||||
blitbuffer.o \
|
||||
drawcontext.o \
|
||||
koptcontext.o \
|
||||
input.o \
|
||||
$(POPENNSLIB) \
|
||||
util.o \
|
||||
@@ -162,7 +163,7 @@ slider_watcher: slider_watcher.o $(POPENNSLIB)
|
||||
ft.o: %.o: %.c $(THIRDPARTYLIBS)
|
||||
$(CC) -c $(KPDFREADER_CFLAGS) -I$(FREETYPEDIR)/include -I$(MUPDFDIR)/fitz $< -o $@
|
||||
|
||||
kpdfview.o pdf.o blitbuffer.o util.o drawcontext.o einkfb.o input.o mupdfimg.o: %.o: %.c
|
||||
kpdfview.o pdf.o blitbuffer.o util.o drawcontext.o koptcontext.o einkfb.o input.o mupdfimg.o: %.o: %.c
|
||||
$(CC) -c $(KPDFREADER_CFLAGS) $(EMU_CFLAGS) -I$(LFSDIR)/src $< -o $@
|
||||
|
||||
k2pdfopt.o: %.o: %.c
|
||||
|
||||
44
djvu.c
44
djvu.c
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "blitbuffer.h"
|
||||
#include "drawcontext.h"
|
||||
#include "koptcontext.h"
|
||||
#include "djvu.h"
|
||||
|
||||
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
||||
@@ -473,48 +474,21 @@ static int closePage(lua_State *L) {
|
||||
static int reflowPage(lua_State *L) {
|
||||
|
||||
DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage");
|
||||
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
|
||||
ddjvu_render_mode_t mode = (int) luaL_checkint(L, 3);
|
||||
int width = luaL_checkint(L, 4); // framebuffer size
|
||||
int height = luaL_checkint(L, 5);
|
||||
double font_size = luaL_checknumber(L, 6);
|
||||
double page_margin = luaL_checknumber(L, 7);
|
||||
double line_spacing = luaL_checknumber(L, 8);
|
||||
double word_spacing = luaL_checknumber(L, 9);
|
||||
int text_wrap = luaL_checkint(L, 10);
|
||||
int straighten = luaL_checkint(L, 11);
|
||||
int justification = luaL_checkint(L, 12);
|
||||
int detect_indent = luaL_checkint(L, 13);
|
||||
int columns = luaL_checkint(L, 14);
|
||||
double contrast = luaL_checknumber(L, 15);
|
||||
int rotation = luaL_checkint(L, 16);
|
||||
double quality = luaL_checknumber(L, 17);
|
||||
double defect_size = luaL_checknumber(L, 18);
|
||||
int trim_page = luaL_checkint(L, 19);
|
||||
|
||||
k2pdfopt_set_params(width, height, font_size, page_margin, line_spacing, word_spacing, \
|
||||
text_wrap, straighten, justification, detect_indent, columns, contrast, rotation, \
|
||||
quality, defect_size, trim_page);
|
||||
k2pdfopt_djvu_reflow(page->page_ref, page->doc->context, mode, page->doc->pixelformat);
|
||||
k2pdfopt_rfbmp_size(&width, &height);
|
||||
k2pdfopt_rfbmp_zoom(&dc->zoom);
|
||||
k2pdfopt_djvu_reflow(kc, page->page_ref, page->doc->context, mode, page->doc->pixelformat);
|
||||
|
||||
lua_pushnumber(L, (double)width);
|
||||
lua_pushnumber(L, (double)height);
|
||||
lua_pushnumber(L, (double)dc->zoom);
|
||||
|
||||
return 3;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drawReflowedPage(lua_State *L) {
|
||||
uint8_t *pmptr = NULL;
|
||||
|
||||
DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage");
|
||||
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
|
||||
BlitBuffer *bb = (BlitBuffer*) luaL_checkudata(L, 3, "blitbuffer");
|
||||
|
||||
uint8_t *koptr = kc->data;
|
||||
uint8_t *bbptr = bb->data;
|
||||
k2pdfopt_rfbmp_ptr(&pmptr);
|
||||
|
||||
int x_offset = 0;
|
||||
int y_offset = 0;
|
||||
@@ -524,12 +498,12 @@ static int drawReflowedPage(lua_State *L) {
|
||||
for(y = y_offset; y < bb->h; y++) {
|
||||
for(x = x_offset/2; x < (bb->w/2); x++) {
|
||||
int p = x*2 - x_offset;
|
||||
bbptr[x] = (((pmptr[p + 1] & 0xF0) >> 4) | (pmptr[p] & 0xF0)) ^ 0xFF;
|
||||
bbptr[x] = (((koptr[p + 1] & 0xF0) >> 4) | (koptr[p] & 0xF0)) ^ 0xFF;
|
||||
}
|
||||
bbptr += bb->pitch;
|
||||
pmptr += bb->w;
|
||||
koptr += bb->w;
|
||||
if (bb->w & 1) {
|
||||
bbptr[x] = 255 - (pmptr[x*2] & 0xF0);
|
||||
bbptr[x] = 255 - (koptr[x*2] & 0xF0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
90
k2pdfopt.c
90
k2pdfopt.c
@@ -463,13 +463,9 @@ static void wpdfboxes_add_box(WPDFBOXES *boxes, WPDFBOX *box);
|
||||
|
||||
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 double zoom_value = 1.0;
|
||||
static double gamma_correction = 1.0;
|
||||
|
||||
static void k2pdfopt_reflow_bmp(MASTERINFO *masterinfo, WILLUSBITMAP *src) {
|
||||
WPDFPAGEINFO _pageinfo, *pageinfo;
|
||||
@@ -545,37 +541,25 @@ static void k2pdfopt_reflow_bmp(MASTERINFO *masterinfo, WILLUSBITMAP *src) {
|
||||
/* Check to see if master bitmap might need more room */
|
||||
bmpregion_source_page_add(®ion, masterinfo, 1, pageinfo, (int) (0.25 * src_dpi + .5));
|
||||
|
||||
master_bmp_width = masterinfo->bmp.width;
|
||||
master_bmp_height = masterinfo->rows;
|
||||
|
||||
bmp_free(srcgrey);
|
||||
if (pageinfo != NULL)
|
||||
wpdfboxes_free(&pageinfo->boxes);
|
||||
}
|
||||
|
||||
void k2pdfopt_set_params(int bb_width, int bb_height, \
|
||||
double font_size, double page_margin, \
|
||||
double line_space, double word_space, \
|
||||
int wrapping, int straighten, \
|
||||
int justification, int detect_indent,\
|
||||
int columns, double contrast, \
|
||||
int rotation, double quality, \
|
||||
double defect_size, int trim_page) {
|
||||
dst_userwidth = bb_width; // dst_width is adjusted in adjust_params_init
|
||||
dst_userheight = bb_height;
|
||||
zoom_value = font_size;
|
||||
vertical_line_spacing = line_space;
|
||||
word_spacing = word_space;
|
||||
text_wrap = wrapping;
|
||||
src_autostraighten = straighten;
|
||||
preserve_indentation = detect_indent;
|
||||
max_columns = columns;
|
||||
gamma_correction = contrast; // contrast is only used by k2pdfopt_mupdf_reflow
|
||||
src_rot = rotation;
|
||||
src_dpi = (int)300*quality;
|
||||
defect_size_pts = defect_size;
|
||||
static void k2pdfopt_init(KOPTContext *kctx) {
|
||||
dst_userwidth = kctx->dev_width; // dst_width is adjusted in adjust_params_init
|
||||
dst_userheight = kctx->dev_height;
|
||||
vertical_line_spacing = kctx->line_spacing;
|
||||
word_spacing = kctx->word_spacing;
|
||||
text_wrap = kctx->wrap;
|
||||
src_autostraighten = kctx->straighten;
|
||||
preserve_indentation = kctx->indent;
|
||||
max_columns = kctx->columns;
|
||||
src_rot = kctx->rotate;
|
||||
src_dpi = (int)300*kctx->quality;
|
||||
defect_size_pts = kctx->defect_size;
|
||||
|
||||
if (trim_page == 0) {
|
||||
if (kctx->trim == 0) {
|
||||
mar_left = 0;
|
||||
mar_top = 0;
|
||||
mar_right = 0;
|
||||
@@ -588,19 +572,19 @@ void k2pdfopt_set_params(int bb_width, int bb_height, \
|
||||
}
|
||||
|
||||
// margin
|
||||
dst_mar = page_margin;
|
||||
dst_mar = kctx->margin;
|
||||
dst_martop = -1.0;
|
||||
dst_marbot = -1.0;
|
||||
dst_marleft = -1.0;
|
||||
dst_marright = -1.0;
|
||||
|
||||
// justification
|
||||
if (justification < 0) {
|
||||
if (kctx->justification < 0) {
|
||||
dst_justify = -1;
|
||||
dst_fulljustify = -1;
|
||||
}
|
||||
else if (justification <= 2) {
|
||||
dst_justify = justification;
|
||||
else if (kctx->justification <= 2) {
|
||||
dst_justify = kctx->justification;
|
||||
dst_fulljustify = 0;
|
||||
}
|
||||
else {
|
||||
@@ -609,7 +593,7 @@ void k2pdfopt_set_params(int bb_width, int bb_height, \
|
||||
}
|
||||
}
|
||||
|
||||
void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
void k2pdfopt_mupdf_reflow(KOPTContext *kctx, fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
fz_device *dev;
|
||||
fz_pixmap *pix;
|
||||
fz_rect bounds,bounds2;
|
||||
@@ -617,8 +601,10 @@ void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
fz_bbox bbox;
|
||||
WILLUSBITMAP _src, *src;
|
||||
|
||||
k2pdfopt_init(kctx);
|
||||
|
||||
double dpp,zoom;
|
||||
zoom = zoom_value;
|
||||
zoom = kctx->zoom;
|
||||
double dpi = 250*zoom*src_dpi/300;
|
||||
do {
|
||||
dpp = dpi / 72.;
|
||||
@@ -630,7 +616,7 @@ void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
bounds2 = fz_transform_rect(ctm, bounds);
|
||||
bbox = fz_round_rect(bounds2);
|
||||
printf("reading page:%d,%d,%d,%d zoom:%.2f dpi:%.0f\n",bbox.x0,bbox.y0,bbox.x1,bbox.y1,zoom,dpi);
|
||||
zoom_value = zoom;
|
||||
kctx->zoom = zoom;
|
||||
zoom *= shrink_factor;
|
||||
dpi *= shrink_factor;
|
||||
} while (bbox.x1 > max_page_width_pix | bbox.y1 > max_page_height_pix);
|
||||
@@ -656,8 +642,8 @@ void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
fz_run_page(doc, page, dev, ctm, NULL);
|
||||
fz_free_device(dev);
|
||||
|
||||
if(gamma_correction >= 0.0) {
|
||||
fz_gamma_pixmap(ctx, pix, gamma_correction);
|
||||
if(kctx->contrast >= 0.0) {
|
||||
fz_gamma_pixmap(ctx, pix, kctx->contrast);
|
||||
}
|
||||
|
||||
src = &_src;
|
||||
@@ -668,15 +654,22 @@ void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx) {
|
||||
bmp_free(src);
|
||||
|
||||
fz_drop_pixmap(ctx, pix);
|
||||
|
||||
kctx->page_width = masterinfo->bmp.width;
|
||||
kctx->page_height = masterinfo->rows;
|
||||
kctx->data = masterinfo->bmp.data;
|
||||
}
|
||||
|
||||
void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
void k2pdfopt_djvu_reflow(KOPTContext *kctx, ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
ddjvu_render_mode_t mode, ddjvu_format_t *fmt) {
|
||||
WILLUSBITMAP _src, *src;
|
||||
ddjvu_rect_t prect;
|
||||
ddjvu_rect_t rrect;
|
||||
|
||||
k2pdfopt_init(kctx);
|
||||
|
||||
int i, iw, ih, idpi, status;
|
||||
double zoom = zoom_value;
|
||||
double zoom = kctx->zoom;
|
||||
double dpi = 250*zoom;
|
||||
|
||||
while (!ddjvu_page_decoding_done(page))
|
||||
@@ -690,7 +683,7 @@ void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
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);
|
||||
zoom_value = zoom;
|
||||
kctx->zoom = zoom;
|
||||
zoom *= shrink_factor;
|
||||
dpi *= shrink_factor;
|
||||
} while (prect.w > max_page_width_pix | prect.h > max_page_height_pix);
|
||||
@@ -718,19 +711,10 @@ void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, \
|
||||
|
||||
k2pdfopt_reflow_bmp(masterinfo, src);
|
||||
bmp_free(src);
|
||||
}
|
||||
|
||||
void k2pdfopt_rfbmp_size(int *width, int *height) {
|
||||
*width = master_bmp_width;
|
||||
*height = master_bmp_height;
|
||||
}
|
||||
|
||||
void k2pdfopt_rfbmp_ptr(unsigned char** bmp_ptr_ptr) {
|
||||
*bmp_ptr_ptr = masterinfo->bmp.data;
|
||||
}
|
||||
|
||||
void k2pdfopt_rfbmp_zoom(double *zoom) {
|
||||
*zoom = zoom_value;
|
||||
kctx->page_width = masterinfo->bmp.width;
|
||||
kctx->page_height = masterinfo->rows;
|
||||
kctx->data = masterinfo->bmp.data;
|
||||
}
|
||||
|
||||
/* ansi.c */
|
||||
|
||||
42
k2pdfopt.h
42
k2pdfopt.h
@@ -26,19 +26,35 @@
|
||||
#include <fitz/fitz-internal.h>
|
||||
#include <libdjvu/ddjvuapi.h>
|
||||
|
||||
void k2pdfopt_set_params(int bb_width, int bb_height, \
|
||||
double font_size, double page_margin, \
|
||||
double line_space, double word_space, \
|
||||
int wrapping, int straighten, \
|
||||
int justification, int detect_indent, \
|
||||
int columns, double contrast, \
|
||||
int rotation, double quality, \
|
||||
double defect_size, int trim_page);
|
||||
void k2pdfopt_mupdf_reflow(fz_document *doc, fz_page *page, fz_context *ctx);
|
||||
void k2pdfopt_djvu_reflow(ddjvu_page_t *page, ddjvu_context_t *ctx, ddjvu_render_mode_t mode, ddjvu_format_t *fmt);
|
||||
void k2pdfopt_rfbmp_size(int *width, int *height);
|
||||
void k2pdfopt_rfbmp_ptr(unsigned char** bmp_ptr_ptr);
|
||||
void k2pdfopt_rfbmp_zoom(double *zoom);
|
||||
typedef unsigned char uint8_t;
|
||||
typedef struct KOPTContext {
|
||||
int trim;
|
||||
int wrap;
|
||||
int indent;
|
||||
int rotate;
|
||||
int columns;
|
||||
int offset_x;
|
||||
int offset_y;
|
||||
int dev_width;
|
||||
int dev_height;
|
||||
int page_width;
|
||||
int page_height;
|
||||
int straighten;
|
||||
int justification;
|
||||
|
||||
double zoom;
|
||||
double margin;
|
||||
double quality;
|
||||
double contrast;
|
||||
double defect_size;
|
||||
double line_spacing;
|
||||
double word_spacing;
|
||||
|
||||
uint8_t *data;
|
||||
} KOPTContext;
|
||||
|
||||
void k2pdfopt_mupdf_reflow(KOPTContext *kc, fz_document *doc, fz_page *page, fz_context *ctx);
|
||||
void k2pdfopt_djvu_reflow(KOPTContext *kc, ddjvu_page_t *page, ddjvu_context_t *ctx, ddjvu_render_mode_t mode, ddjvu_format_t *fmt);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
234
koptcontext.c
Normal file
234
koptcontext.c
Normal file
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
KindlePDFViewer: a KOPTContext abstraction
|
||||
Copyright (C) 2012 Huang Xin <chrox.huang@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "koptcontext.h"
|
||||
|
||||
static int newKOPTContext(lua_State *L) {
|
||||
int trim = luaL_optint(L, 1, 1);
|
||||
int wrap = luaL_optint(L, 2, 1);
|
||||
int indent = luaL_optint(L, 3, 1);
|
||||
int rotate = luaL_optint(L, 4, 0);
|
||||
int columns = luaL_optint(L, 5, 2);
|
||||
int offset_x = luaL_optint(L, 6, 0);
|
||||
int offset_y = luaL_optint(L, 7, 0);
|
||||
int dev_width = luaL_optint(L, 8, 600);
|
||||
int dev_height = luaL_optint(L, 9, 800);
|
||||
int page_width = luaL_optint(L, 10, 600);
|
||||
int page_height = luaL_optint(L, 11, 800);
|
||||
int straighten = luaL_optint(L, 12, 0);
|
||||
int justification = luaL_optint(L, 13, -1);
|
||||
|
||||
double zoom = luaL_optnumber(L, 14, (double) 1.0);
|
||||
double margin = luaL_optnumber(L, 15, (double) 0.06);
|
||||
double quality = luaL_optnumber(L, 16, (double) 1.0);
|
||||
double contrast = luaL_optnumber(L, 17, (double) 1.0);
|
||||
double defect_size = luaL_optnumber(L, 18, (double) 1.0);
|
||||
double line_spacing = luaL_optnumber(L, 19, (double) 1.2);
|
||||
double word_spacing = luaL_optnumber(L, 20, (double) 1.375);
|
||||
|
||||
uint8_t *data = NULL;
|
||||
|
||||
KOPTContext *kc = (KOPTContext*) lua_newuserdata(L, sizeof(KOPTContext));
|
||||
|
||||
kc->trim = trim;
|
||||
kc->wrap = wrap;
|
||||
kc->indent = indent;
|
||||
kc->rotate = rotate;
|
||||
kc->columns = columns;
|
||||
kc->offset_x = offset_x;
|
||||
kc->offset_y = offset_y;
|
||||
kc->dev_width = dev_width;
|
||||
kc->dev_height = dev_height;
|
||||
kc->page_width = page_width;
|
||||
kc->page_height = page_height;
|
||||
kc->straighten = straighten;
|
||||
kc->justification = justification;
|
||||
|
||||
kc->zoom = zoom;
|
||||
kc->margin = margin;
|
||||
kc->quality = quality;
|
||||
kc->contrast = contrast;
|
||||
kc->defect_size = defect_size;
|
||||
kc->line_spacing = line_spacing;
|
||||
kc->word_spacing = word_spacing;
|
||||
|
||||
kc->data = data;
|
||||
|
||||
luaL_getmetatable(L, "koptcontext");
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int kcSetTrim(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->trim = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetWrap(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->wrap = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetIndent(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->indent = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetRotate(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->rotate = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetColumns(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->columns = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetOffset(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->offset_x = luaL_checkint(L, 2);
|
||||
kc->offset_y = luaL_checkint(L, 3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcGetOffset(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
lua_pushinteger(L, kc->offset_x);
|
||||
lua_pushinteger(L, kc->offset_y);
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int kcSetDeviceDim(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->dev_width = luaL_checkint(L, 2);
|
||||
kc->dev_height = luaL_checkint(L, 3);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcGetPageDim(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
lua_pushinteger(L, kc->page_width);
|
||||
lua_pushinteger(L, kc->page_height);
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int kcSetStraighten(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->straighten = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetJustification(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->justification = luaL_checkint(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetZoom(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->zoom = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcGetZoom(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
lua_pushnumber(L, kc->zoom);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int kcSetMargin(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->margin = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetQuality(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->quality = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetContrast(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->contrast = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetDefectSize(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->defect_size = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetLineSpacing(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->line_spacing = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int kcSetWordSpacing(lua_State *L) {
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 1, "koptcontext");
|
||||
kc->word_spacing = luaL_checknumber(L, 2);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct luaL_Reg koptcontext_meth[] = {
|
||||
{"setTrim", kcSetTrim},
|
||||
{"setWrap", kcSetWrap},
|
||||
{"setIndent", kcSetIndent},
|
||||
{"setRotate", kcSetRotate},
|
||||
{"setColumns", kcSetColumns},
|
||||
{"setOffset", kcSetOffset},
|
||||
{"getOffset", kcGetOffset},
|
||||
{"setDeviceDim", kcSetDeviceDim},
|
||||
{"getPageDim", kcGetPageDim},
|
||||
{"setStraighten", kcSetStraighten},
|
||||
{"setJustification", kcSetJustification},
|
||||
|
||||
{"setZoom", kcSetZoom},
|
||||
{"getZoom", kcGetZoom},
|
||||
{"setMargin", kcSetMargin},
|
||||
{"setQuality", kcSetQuality},
|
||||
{"setContrast", kcSetContrast},
|
||||
{"setDefectSize", kcSetDefectSize},
|
||||
{"setLineSpacing", kcSetLineSpacing},
|
||||
{"setWordSpacing", kcSetWordSpacing},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
static const struct luaL_Reg koptcontext_func[] = {
|
||||
{"new", newKOPTContext},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
int luaopen_koptcontext(lua_State *L) {
|
||||
luaL_newmetatable(L, "koptcontext");
|
||||
lua_pushstring(L, "__index");
|
||||
lua_pushvalue(L, -2);
|
||||
lua_settable(L, -3);
|
||||
luaL_register(L, NULL, koptcontext_meth);
|
||||
lua_pop(L, 1);
|
||||
luaL_register(L, "KOPTContext", koptcontext_func);
|
||||
return 1;
|
||||
}
|
||||
53
koptcontext.h
Normal file
53
koptcontext.h
Normal file
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
KindlePDFViewer: a KOPTContext abstraction
|
||||
Copyright (C) 2012 Huang Xin <chrox.huang@gmail.com>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#ifndef _KOPTCONTEXT_H
|
||||
#define _KOPTCONTEXT_H
|
||||
|
||||
#include <lua.h>
|
||||
#include <lualib.h>
|
||||
#include <lauxlib.h>
|
||||
|
||||
typedef unsigned char uint8_t;
|
||||
typedef struct KOPTContext {
|
||||
int trim;
|
||||
int wrap;
|
||||
int indent;
|
||||
int rotate;
|
||||
int columns;
|
||||
int offset_x;
|
||||
int offset_y;
|
||||
int dev_width;
|
||||
int dev_height;
|
||||
int page_width;
|
||||
int page_height;
|
||||
int straighten;
|
||||
int justification;
|
||||
|
||||
double zoom;
|
||||
double margin;
|
||||
double quality;
|
||||
double contrast;
|
||||
double defect_size;
|
||||
double line_spacing;
|
||||
double word_spacing;
|
||||
|
||||
uint8_t *data;
|
||||
} KOPTContext;
|
||||
|
||||
int luaopen_koptcontext(lua_State *L);
|
||||
#endif
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#include "blitbuffer.h"
|
||||
#include "drawcontext.h"
|
||||
#include "koptcontext.h"
|
||||
#include "pdf.h"
|
||||
#include "mupdfimg.h"
|
||||
#include "djvu.h"
|
||||
@@ -94,6 +95,7 @@ int main(int argc, char **argv) {
|
||||
|
||||
luaopen_blitbuffer(L);
|
||||
luaopen_drawcontext(L);
|
||||
luaopen_koptcontext(L);
|
||||
luaopen_einkfb(L);
|
||||
luaopen_pdf(L);
|
||||
luaopen_djvu(L);
|
||||
|
||||
44
pdf.c
44
pdf.c
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "blitbuffer.h"
|
||||
#include "drawcontext.h"
|
||||
#include "koptcontext.h"
|
||||
#include "pdf.h"
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
@@ -514,47 +515,20 @@ static int closePage(lua_State *L) {
|
||||
static int reflowPage(lua_State *L) {
|
||||
|
||||
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
|
||||
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
|
||||
int width = luaL_checkint(L, 4); // framebuffer size
|
||||
int height = luaL_checkint(L, 5);
|
||||
double font_size = luaL_checknumber(L, 6);
|
||||
double page_margin = luaL_checknumber(L, 7);
|
||||
double line_spacing = luaL_checknumber(L, 8);
|
||||
double word_spacing = luaL_checknumber(L, 9);
|
||||
int text_wrap = luaL_checkint(L, 10);
|
||||
int straighten = luaL_checkint(L, 11);
|
||||
int justification = luaL_checkint(L, 12);
|
||||
int detect_indent = luaL_checkint(L, 13);
|
||||
int columns = luaL_checkint(L, 14);
|
||||
double contrast = luaL_checknumber(L, 15);
|
||||
int rotation = luaL_checkint(L, 16);
|
||||
double quality = luaL_checknumber(L, 17);
|
||||
double defect_size = luaL_checknumber(L, 18);
|
||||
int trim_page = luaL_checkint(L, 19);
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
|
||||
|
||||
k2pdfopt_set_params(width, height, font_size, page_margin, line_spacing, word_spacing, \
|
||||
text_wrap, straighten, justification, detect_indent, columns, contrast, rotation, \
|
||||
quality, defect_size, trim_page);
|
||||
k2pdfopt_mupdf_reflow(page->doc->xref, page->page, page->doc->context);
|
||||
k2pdfopt_rfbmp_size(&width, &height);
|
||||
k2pdfopt_rfbmp_zoom(&dc->zoom);
|
||||
k2pdfopt_mupdf_reflow(kc, page->doc->xref, page->page, page->doc->context);
|
||||
|
||||
lua_pushnumber(L, (double)width);
|
||||
lua_pushnumber(L, (double)height);
|
||||
lua_pushnumber(L, (double)dc->zoom);
|
||||
|
||||
return 3;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drawReflowedPage(lua_State *L) {
|
||||
uint8_t *pmptr = NULL;
|
||||
|
||||
PdfPage *page = (PdfPage*) luaL_checkudata(L, 1, "pdfpage");
|
||||
DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext");
|
||||
KOPTContext *kc = (KOPTContext*) luaL_checkudata(L, 2, "koptcontext");
|
||||
BlitBuffer *bb = (BlitBuffer*) luaL_checkudata(L, 3, "blitbuffer");
|
||||
|
||||
uint8_t *koptr = kc->data;
|
||||
uint8_t *bbptr = bb->data;
|
||||
k2pdfopt_rfbmp_ptr(&pmptr);
|
||||
|
||||
int x_offset = 0;
|
||||
int y_offset = 0;
|
||||
@@ -564,12 +538,12 @@ static int drawReflowedPage(lua_State *L) {
|
||||
for(y = y_offset; y < bb->h; y++) {
|
||||
for(x = x_offset/2; x < (bb->w/2); x++) {
|
||||
int p = x*2 - x_offset;
|
||||
bbptr[x] = (((pmptr[p + 1] & 0xF0) >> 4) | (pmptr[p] & 0xF0)) ^ 0xFF;
|
||||
bbptr[x] = (((koptr[p + 1] & 0xF0) >> 4) | (koptr[p] & 0xF0)) ^ 0xFF;
|
||||
}
|
||||
bbptr += bb->pitch;
|
||||
pmptr += bb->w;
|
||||
koptr += bb->w;
|
||||
if (bb->w & 1) {
|
||||
bbptr[x] = 255 - (pmptr[x*2] & 0xF0);
|
||||
bbptr[x] = 255 - (koptr[x*2] & 0xF0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user