Skip to content

Commit

Permalink
Merge pull request #193 from chrox/master
Browse files Browse the repository at this point in the history
update mupdf and k2pdfopt to latest version
  • Loading branch information
hwhw committed Jul 1, 2014
2 parents 50dd9e3 + a1d2e83 commit 9eeaed7
Show file tree
Hide file tree
Showing 11 changed files with 187 additions and 70 deletions.
1 change: 0 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,6 @@ $(MUPDF_LIB): $(JPEG_LIB) $(FREETYPE_LIB)
$(CFLAGS) \
-Wl,-E -Wl,-rpath,'$$ORIGIN' \
-Wl,--whole-archive $(MUPDF_LIB_STATIC) \
-Wl,--whole-archive $(MUPDF_JS_LIB_STATIC) \
-Wl,--no-whole-archive $(MUPDF_THIRDPARTY_LIBS) \
-Wl,-soname=$(notdir $(MUPDF_LIB)) \
$(JPEG_LIB) $(FREETYPE_LIB) \
Expand Down
3 changes: 2 additions & 1 deletion ffi/koptcontext_h.lua
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,9 @@ PIX * pixBlendBackgroundToColor(PIX *pixd, PIX *pixs, BOX *box, l_uint32 color,
/* K2pdfopt */
void bmp_init(WILLUSBITMAP *bmap);
void bmp_free(WILLUSBITMAP *bmap);
int bmp_alloc(WILLUSBITMAP *bmap);
int bmp_copy(WILLUSBITMAP *dest,WILLUSBITMAP *src);
unsigned char *bmp_rowptr_from_top(WILLUSBITMAP *bmp,int row);
void wrectmaps_init(WRECTMAPS *wrectmaps);
void wrectmaps_free(WRECTMAPS *wrectmaps);
int wrectmap_inside(WRECTMAP *wrmap,int xc,int yc);
Expand All @@ -242,7 +244,6 @@ void k2pdfopt_tocr_single_word(WILLUSBITMAP *src,
char *word, int max_length,
char *datadir, char *lang, int ocr_type,
int allow_spaces, int std_proc);
int bmpmupdf_pdffile_to_bmp(WILLUSBITMAP *bmp,char *filename,int pageno,double dpi,int bpp);
void k2pdfopt_reflow_bmp(KOPTContext *kctx);
void k2pdfopt_tocr_end();
void pageregions_init(PAGEREGIONS *regions);
Expand Down
58 changes: 50 additions & 8 deletions ffi/mupdf_h.lua
Original file line number Diff line number Diff line change
@@ -1,8 +1,30 @@
local ffi = require("ffi")
ffi.cdef[[
typedef struct fz_alloc_context_s fz_alloc_context;
typedef struct fz_locks_context_s fz_locks_context;
typedef struct fz_colorspace_s fz_colorspace;
typedef struct fz_document_s fz_document;
typedef struct fz_context_s fz_context;
typedef struct fz_matrix_s fz_matrix;
typedef struct fz_cookie_s fz_cookie;
typedef struct fz_pixmap_s fz_pixmap;
typedef struct fz_device_s fz_device;
typedef struct fz_irect_s fz_irect;
typedef struct fz_rect_s fz_rect;
typedef struct fz_page_s fz_page;

struct fz_matrix_s {
float a, b, c, d, e, f;
};
struct fz_rect_s {
float x0, y0;
float x1, y1;
};
struct fz_irect_s {
int x0, y0;
int x1, y1;
};

typedef void fz_store_free_fn(struct fz_context_s *, struct fz_storable_s *);
struct fz_storable_s {
int refs;
Expand All @@ -23,12 +45,32 @@ struct fz_pixmap_s {
unsigned char *samples;
int free_samples;
};
typedef struct fz_pixmap_s fz_pixmap;
struct fz_context_s *fz_new_context_imp(struct fz_alloc_context_s *, struct fz_locks_context_s *, unsigned int, const char *);
struct fz_pixmap_s *fz_new_pixmap(struct fz_context_s *, struct fz_colorspace_s *, int, int);
void fz_convert_pixmap(struct fz_context_s *, struct fz_pixmap_s *, struct fz_pixmap_s *);
void fz_drop_pixmap(struct fz_context_s *, struct fz_pixmap_s *);
struct fz_colorspace_s *fz_device_gray(struct fz_context_s *);
void fz_free_context(struct fz_context_s *);
struct fz_pixmap_s *fz_load_png(struct fz_context_s *, unsigned char *, int);

fz_context *fz_new_context_imp(fz_alloc_context*, fz_locks_context*, unsigned int, const char *);
void fz_register_document_handlers(fz_context *ctx);
fz_colorspace *fz_device_gray(fz_context*);
fz_colorspace *fz_device_rgb(fz_context *ctx);
fz_document *fz_open_document(fz_context *ctx, const char *filename);
int fz_count_pages(fz_document *doc);
fz_page *fz_load_page(fz_document *doc, int number);
fz_rect *fz_bound_page(fz_document *doc, fz_page *page, fz_rect *rect);
fz_matrix *fz_scale(fz_matrix *m, float sx, float sy);
fz_rect *fz_transform_rect(fz_rect *restrict rect, const fz_matrix *restrict transform);
fz_irect *fz_round_rect(fz_irect *restrict bbox, const fz_rect *restrict rect);
void fz_clear_pixmap_with_value(fz_context *ctx, fz_pixmap *pix, int value);
void fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, const fz_matrix *transform, fz_cookie *cookie);
fz_pixmap *fz_new_pixmap_with_bbox(fz_context *ctx, fz_colorspace *colorspace, const fz_irect *bbox);
fz_device *fz_new_draw_device(fz_context *ctx, fz_pixmap *dest);
void fz_free_device(fz_device *dev);
fz_pixmap *fz_new_pixmap(fz_context*, fz_colorspace *, int, int);
void fz_convert_pixmap(fz_context*, fz_pixmap*, fz_pixmap*);
int fz_pixmap_width(fz_context *ctx, fz_pixmap *pix);
int fz_pixmap_height(fz_context *ctx, fz_pixmap *pix);
int fz_pixmap_components(fz_context *ctx, fz_pixmap *pix);
unsigned char *fz_pixmap_samples(fz_context *ctx, fz_pixmap *pix);
void fz_drop_pixmap(fz_context*, fz_pixmap*);
void fz_free_page(fz_document *doc, fz_page *page);
void fz_free_context(fz_context*);
void fz_close_document(fz_document *doc);
fz_pixmap *fz_load_png(fz_context*, unsigned char *, int);
]]
72 changes: 72 additions & 0 deletions ffi/mupdfbmp.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
--[[
converting pdf page to willus bmp
--]]

local ffi = require("ffi")
local dummy = require("ffi/mupdf_h")
local dummy = require("ffi/koptcontext_h")
local mupdf = ffi.load("libs/libmupdf.so")
local k2pdfopt = ffi.load("libs/libk2pdfopt.so.2")

local Bitmap = {}

function Bitmap:pixmap_to_bmp(bmp, ctx, pixmap)
bmp.width = mupdf.fz_pixmap_width(ctx, pixmap)
bmp.height = mupdf.fz_pixmap_height(ctx, pixmap)
local ncomp = mupdf.fz_pixmap_components(ctx, pixmap)
if ncomp ~= 2 and ncomp ~= 4 then return -1 end
bmp.bpp = ncomp == 2 and 8 or 24
k2pdfopt.bmp_alloc(bmp)
if ncomp == 2 then
for i=0, 255 do
bmp.red[i] = i
bmp.green[i] = i
bmp.blue[i] = i
end
end
local p = mupdf.fz_pixmap_samples(ctx, pixmap)
if ncomp == 2 then
for row=0, bmp.height - 1 do
local dest = k2pdfopt.bmp_rowptr_from_top(bmp, row)
for col=0, bmp.width - 1 do
dest[0] = p[0]
dest = dest + 1
p = p + 2
end
end
end
return 0
end

function Bitmap:pdffile_to_bmp(bmp, filename, pageno, dpi, bpp)
local ctx = mupdf.fz_new_context_imp(nil, nil, bit.lshift(8, 20), "1.4")
if ctx == nil then return -1 end
mupdf.fz_register_document_handlers(ctx)
local colorspace = bpp == 8 and mupdf.fz_device_gray(ctx) or mupdf.fz_device_rgb(ctx)
local doc = mupdf.fz_open_document(ctx, filename)
if mupdf.fz_count_pages(doc) < pageno or pageno < 1 then
return -1
end
local page = mupdf.fz_load_page(doc, pageno-1)
local ctm = ffi.new("fz_matrix[1]")[0]
local bbox = ffi.new("fz_irect[1]")[0]
local bounds = ffi.new("fz_rect[1]")[0]
mupdf.fz_bound_page(doc, page, bounds)
mupdf.fz_scale(ctm, dpi/72, dpi/72)
mupdf.fz_transform_rect(bounds, ctm)
mupdf.fz_round_rect(bbox, bounds)
local pix = mupdf.fz_new_pixmap_with_bbox(ctx, colorspace, bbox)
mupdf.fz_clear_pixmap_with_value(ctx, pix, 0xFF)
local dev = mupdf.fz_new_draw_device(ctx, pix)
mupdf.fz_run_page(doc, page, dev, ctm, nil)
mupdf.fz_free_device(dev)
if self:pixmap_to_bmp(bmp, ctx, pix) ~= 0 then return -1 end
mupdf.fz_drop_pixmap(ctx, pix)
mupdf.fz_free_page(doc, page)
mupdf.fz_close_document(doc)
mupdf.fz_free_context(ctx)

return 0
end

return Bitmap
4 changes: 2 additions & 2 deletions ffi/mupdfimg.lua
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ require("ffi/mupdf_h")
local Image = {}

function Image:initContext(cache_size)
self.context = mupdf.fz_new_context_imp(nil, nil, cache_size or bit.lshift(8, 20), "1.3")
self.context = mupdf.fz_new_context_imp(nil, nil, cache_size or bit.lshift(8, 20), "1.4")
end

function Image:_getFileData(filename)
Expand All @@ -29,7 +29,7 @@ function Image:toBlitBuffer()
local pixmap = ffi.new("fz_pixmap[1]")
pixmap = self.pixmap
if self.pixmap.n ~= 2 then
self.pixmap = mupdf.fz_new_pixmap(self.context, mupdf.fz_device_gray(self.context),
self.pixmap = mupdf.fz_new_pixmap(self.context, mupdf.fz_device_gray(self.context),
pixmap.w, pixmap.h);
mupdf.fz_convert_pixmap(self.context, self.pixmap, pixmap);
mupdf.fz_drop_pixmap(self.context, pixmap);
Expand Down
2 changes: 1 addition & 1 deletion kpvcrlib/crengine
Submodule crengine updated 1 files
+3 −3 crengine/src/lvtextfm.cpp
2 changes: 1 addition & 1 deletion mupdf
Submodule mupdf updated from 43bcd8 to eebc33
82 changes: 41 additions & 41 deletions mupdf.patch
Original file line number Diff line number Diff line change
@@ -1,48 +1,48 @@
diff --git a/source/pdf/pdf-font.c b/source/pdf/pdf-font.c
index f79a076..4ecb159 100644
index 8454e92..0d3bfea 100644
--- a/source/pdf/pdf-font.c
+++ b/source/pdf/pdf-font.c
@@ -185,7 +185,12 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname)
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname);
@@ -188,7 +188,12 @@ pdf_load_builtin_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontname,
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin font: '%s'", fontname);

+#ifndef NOBUILTINFONT
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
+#else
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+#endif
}

if (!strcmp(fontname, "Symbol") || !strcmp(fontname, "ZapfDingbats"))
fontdesc->flags |= PDF_FD_SYMBOLIC;
@@ -205,7 +210,12 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font");
if (!strcmp(clean_name, "Symbol") || !strcmp(clean_name, "ZapfDingbats"))
@@ -212,7 +217,12 @@ pdf_load_substitute_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fontnam
if (!data)
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find substitute font");

+#ifndef NOBUILTINFONT
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 1);
+#else
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+#endif
fontdesc->font->ft_bold = bold && !ft_is_bold(fontdesc->font->ft_face);
fontdesc->font->ft_italic = italic && !ft_is_italic(fontdesc->font->ft_face);
}
@@ -234,7 +244,12 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin CJK font");

fontdesc->font->ft_substitute = 1;
fontdesc->font->ft_bold = bold && !ft_is_bold(fontdesc->font->ft_face);
@@ -223,7 +233,12 @@ pdf_load_substitute_cjk_font(fz_context *ctx, pdf_font_desc *fontdesc, char *fon
fz_throw(ctx, FZ_ERROR_GENERIC, "cannot find builtin CJK font");

/* a glyph bbox cache is too big for droid sans fallback (51k glyphs!) */
/* a glyph bbox cache is too big for droid sans fallback (51k glyphs!) */
+#ifndef NOBUILTINFONT
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 0);
fontdesc->font = fz_new_font_from_memory(ctx, fontname, data, len, 0, 0);
+#else
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+ fontdesc->font = fz_new_font_from_file(ctx, fontname, data, 0, 1);
+ free(data);
+#endif
}

fontdesc->font->ft_substitute = 1;
}
diff --git a/source/pdf/pdf-fontfile.c b/source/pdf/pdf-fontfile.c
index c9990da..9c091a7 100644
index 2e33768..a5ab5e0 100644
--- a/source/pdf/pdf-fontfile.c
+++ b/source/pdf/pdf-fontfile.c
@@ -14,6 +14,8 @@
Expand Down Expand Up @@ -81,50 +81,50 @@ index c9990da..9c091a7 100644
+}
+
+unsigned char *
+pdf_lookup_builtin_font(char *name, unsigned int *len)
+pdf_lookup_builtin_font(const char *name, unsigned int *len)
+{
+ *len = 0;
+ if (!strcmp("Courier", name)) {
+ return get_font_file("NimbusMonL-Regu.cff");
+ return get_font_file("urw/NimbusMon-Reg.cff");
+ }
+ if (!strcmp("Courier-Bold", name)) {
+ return get_font_file("NimbusMonL-Bold.cff");
+ return get_font_file("urw/NimbusMon-Bol.cff");
+ }
+ if (!strcmp("Courier-Oblique", name)) {
+ return get_font_file("NimbusMonL-ReguObli.cff");
+ return get_font_file("urw/NimbusMon-Obl.cff");
+ }
+ if (!strcmp("Courier-BoldOblique", name)) {
+ return get_font_file("NimbusMonL-BoldObli.cff");
+ return get_font_file("urw/NimbusMon-BolObl.cff");
+ }
+ if (!strcmp("Helvetica", name)) {
+ return get_font_file("NimbusSanL-Regu.cff");
+ return get_font_file("urw/NimbusSan-Reg.cff");
+ }
+ if (!strcmp("Helvetica-Bold", name)) {
+ return get_font_file("NimbusSanL-Bold.cff");
+ return get_font_file("urw/NimbusSan-Bol.cff");
+ }
+ if (!strcmp("Helvetica-Oblique", name)) {
+ return get_font_file("NimbusSanL-ReguItal.cff");
+ return get_font_file("urw/NimbusSan-Ita.cff");
+ }
+ if (!strcmp("Helvetica-BoldOblique", name)) {
+ return get_font_file("NimbusSanL-BoldItal.cff");
+ return get_font_file("urw/NimbusSan-BolIta.cff");
+ }
+ if (!strcmp("Times-Roman", name)) {
+ return get_font_file("NimbusRomNo9L-Regu.cff");
+ return get_font_file("urw/NimbusRom-Reg.cff");
+ }
+ if (!strcmp("Times-Bold", name)) {
+ return get_font_file("NimbusRomNo9L-Medi.cff");
+ return get_font_file("urw/NimbusRom-Med.cff");
+ }
+ if (!strcmp("Times-Italic", name)) {
+ return get_font_file("NimbusRomNo9L-ReguItal.cff");
+ return get_font_file("urw/NimbusRom-Ita.cff");
+ }
+ if (!strcmp("Times-BoldItalic", name)) {
+ return get_font_file("NimbusRomNo9L-MediItal.cff");
+ return get_font_file("urw/NimbusRom-MedIta.cff");
+ }
+ if (!strcmp("Symbol", name)) {
+ return get_font_file("StandardSymL.cff");
+ return get_font_file("urw/StandardSymL.cff");
+ }
+ if (!strcmp("ZapfDingbats", name)) {
+ return get_font_file("Dingbats.cff");
+ return get_font_file("urw/Dingbats.cff");
+ }
+ return NULL;
+}
Expand Down
2 changes: 2 additions & 0 deletions pdf.c
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,8 @@ static int openDocument(lua_State *L) {

doc->context = fz_new_context(&my_alloc_default, NULL, cache_size);

fz_register_document_handlers(doc->context);

fz_try(doc->context) {
doc->xref = fz_open_document(doc->context, filename);
}
Expand Down
Loading

0 comments on commit 9eeaed7

Please sign in to comment.