Sync with upstream
This commit is contained in:
parent
a3bda3ce50
commit
210ac9b9bb
4
BUILDING
4
BUILDING
|
@ -6,7 +6,7 @@ be found here[3], dependencies here[4]
|
|||
Note that MuPDF is a moving target therefore bellow is the commit id
|
||||
of the git version of MuPDF that this version of llpp is known to work
|
||||
with:
|
||||
7d1810f61496633ad55dd2be64912c0d0444aba8
|
||||
386c713b83f8788a80bb165431bf598b982385b3
|
||||
|
||||
llpp also depends on OCaml[5], lablGL[6], having a C compiler wouldn't
|
||||
hurt either.
|
||||
|
@ -36,6 +36,6 @@ $ ./llpp -p password /path/to/some.password.protected.pdf
|
|||
[4] http://mupdf.com/download/source/mupdf-thirdparty.zip
|
||||
[5] http://caml.inria.fr/
|
||||
[6] http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/lablgl.html
|
||||
[7] mupdf-7d1810f61496633ad55dd2be64912c0d0444aba8.tgz (6926909 bytes)
|
||||
[7] mupdf-386c713b83f8788a80bb165431bf598b982385b3.tgz (6934923 bytes)
|
||||
mupdf-thirdparty-2012-08-14.zip (6944385 bytes)
|
||||
lablgl-1.04.tar.gz (410525 bytes)
|
||||
|
|
|
@ -18,7 +18,7 @@ root=$(pwd)
|
|||
|
||||
lablgl=http://wwwfun.kurims.kyoto-u.ac.jp/soft/lsl/dist/lablgl-1.04.tar.gz
|
||||
mupdf3p=http://mupdf.com/download/archive/mupdf-thirdparty-2012-08-14.zip
|
||||
mupdfrev=7d1810f61496633ad55dd2be64912c0d0444aba8
|
||||
mupdfrev=386c713b83f8788a80bb165431bf598b982385b3
|
||||
mudir=mupdf-$(printf "%.7s" $mupdfrev)
|
||||
mutgz=mupdf-$mupdfrev.tgz
|
||||
muurl="http://git.ghostscript.com/?p=mupdf.git;a=snapshot;h=$mupdfrev;sf=tgz"
|
||||
|
|
241
link.c
241
link.c
|
@ -143,14 +143,14 @@ struct pagedim {
|
|||
int rotate;
|
||||
int left;
|
||||
int tctmready;
|
||||
fz_bbox bounds;
|
||||
fz_irect bounds;
|
||||
fz_rect pagebox;
|
||||
fz_rect mediabox;
|
||||
fz_matrix ctm, zoomctm, lctm, tctm;
|
||||
};
|
||||
|
||||
struct slink {
|
||||
fz_bbox bbox;
|
||||
fz_irect bbox;
|
||||
fz_link *link;
|
||||
};
|
||||
|
||||
|
@ -217,7 +217,7 @@ struct {
|
|||
int aalevel;
|
||||
|
||||
int trimanew;
|
||||
fz_bbox trimfuzz;
|
||||
fz_irect trimfuzz;
|
||||
fz_pixmap *pig;
|
||||
|
||||
pthread_t thread;
|
||||
|
@ -249,7 +249,7 @@ static void UNUSED_ATTR debug_rect (const char *cap, fz_rect r)
|
|||
printf ("%s(rect) %.2f,%.2f,%.2f,%.2f\n", cap, r.x0, r.y0, r.x1, r.y1);
|
||||
}
|
||||
|
||||
static void UNUSED_ATTR debug_bbox (const char *cap, fz_bbox r)
|
||||
static void UNUSED_ATTR debug_bbox (const char *cap, fz_irect r)
|
||||
{
|
||||
printf ("%s(bbox) %d,%d,%d,%d\n", cap, r.x0, r.y0, r.x1, r.y1);
|
||||
}
|
||||
|
@ -653,11 +653,17 @@ static fz_matrix trimctm (pdf_page *page, int pindex)
|
|||
if (!pdim->tctmready) {
|
||||
if (state.trimmargins) {
|
||||
fz_rect realbox;
|
||||
fz_matrix rm, sm, tm, im, ctm1;
|
||||
|
||||
ctm = fz_concat (fz_rotate (-pdim->rotate), fz_scale (1, -1));
|
||||
realbox = fz_transform_rect (ctm, pdim->mediabox);
|
||||
ctm = fz_concat (ctm, fz_translate (-realbox.x0, -realbox.y0));
|
||||
ctm = fz_concat (fz_invert_matrix (page->ctm), ctm);
|
||||
fz_rotate (&rm, -pdim->rotate);
|
||||
fz_scale (&sm, 1, -1);
|
||||
fz_concat (&ctm, &rm, &sm);
|
||||
realbox = pdim->mediabox;
|
||||
fz_transform_rect (&realbox, &ctm);
|
||||
fz_translate (&tm, -realbox.x0, -realbox.y0);
|
||||
fz_concat (&ctm1, &ctm, &tm);
|
||||
fz_invert_matrix (&im, &ctm1);
|
||||
fz_concat (&ctm, &im, &ctm);
|
||||
}
|
||||
else {
|
||||
ctm = fz_identity;
|
||||
|
@ -670,19 +676,19 @@ static fz_matrix trimctm (pdf_page *page, int pindex)
|
|||
|
||||
static fz_matrix pagectm (struct page *page)
|
||||
{
|
||||
fz_matrix ctm, tm;
|
||||
|
||||
if (page->type == DPDF) {
|
||||
return fz_concat (trimctm (page->u.pdfpage, page->pdimno),
|
||||
state.pagedims[page->pdimno].ctm);
|
||||
tm = trimctm (page->u.pdfpage, page->pdimno);
|
||||
fz_concat (&ctm, &tm, &state.pagedims[page->pdimno].ctm);
|
||||
}
|
||||
else {
|
||||
fz_matrix ctm;
|
||||
struct pagedim *pdim = &state.pagedims[page->pdimno];
|
||||
|
||||
ctm = state.pagedims[page->pdimno].ctm;
|
||||
ctm = fz_concat (fz_translate (-pdim->mediabox.x0,
|
||||
-pdim->mediabox.y0), ctm);
|
||||
return ctm;
|
||||
fz_translate (&tm, -pdim->mediabox.x0, -pdim->mediabox.y0);
|
||||
fz_concat (&ctm, &tm, &state.pagedims[page->pdimno].ctm);
|
||||
}
|
||||
return ctm;
|
||||
}
|
||||
|
||||
static void *loadpage (int pageno, int pindex)
|
||||
|
@ -701,19 +707,22 @@ static void *loadpage (int pageno, int pindex)
|
|||
switch (state.type) {
|
||||
case DPDF:
|
||||
page->u.pdfpage = pdf_load_page (state.u.pdf, pageno);
|
||||
pdf_run_page (state.u.pdf, page->u.pdfpage, dev, fz_identity, NULL);
|
||||
pdf_run_page (state.u.pdf, page->u.pdfpage, dev,
|
||||
&fz_identity, NULL);
|
||||
page->freepage = freepdfpage;
|
||||
break;
|
||||
|
||||
case DXPS:
|
||||
page->u.xpspage = xps_load_page (state.u.xps, pageno);
|
||||
xps_run_page (state.u.xps, page->u.xpspage, dev, fz_identity, NULL);
|
||||
xps_run_page (state.u.xps, page->u.xpspage, dev,
|
||||
&fz_identity, NULL);
|
||||
page->freepage = freexpspage;
|
||||
break;
|
||||
|
||||
case DCBZ:
|
||||
page->u.cbzpage = cbz_load_page (state.u.cbz, pageno);
|
||||
cbz_run_page (state.u.cbz, page->u.cbzpage, dev, fz_identity, NULL);
|
||||
cbz_run_page (state.u.cbz, page->u.cbzpage, dev,
|
||||
&fz_identity, NULL);
|
||||
page->freepage = freecbzpage;
|
||||
break;
|
||||
}
|
||||
|
@ -760,17 +769,21 @@ static struct tile *alloctile (int h)
|
|||
#ifdef OBSCURED_OPT
|
||||
struct obs {
|
||||
int cured;
|
||||
fz_bbox b;
|
||||
fz_irect b;
|
||||
};
|
||||
|
||||
static void obs_fill_image (fz_device *dev, fz_image *image, fz_matrix ctm,
|
||||
float alpha)
|
||||
static void obs_fill_image (fz_device *dev, fz_image *image,
|
||||
const fz_matrix *ctm, float alpha)
|
||||
{
|
||||
struct obs *obs = dev->user;
|
||||
|
||||
if (!obs->cured && fabs (1.0 - alpha) < 1e6) {
|
||||
fz_bbox b = fz_round_rect (fz_transform_rect (ctm, fz_unit_rect));
|
||||
b = fz_intersect_bbox (b, obs->b);
|
||||
fz_irect b;
|
||||
fz_rect rect = fz_unit_rect;
|
||||
|
||||
fz_transform_rect (&rect, ctm);
|
||||
fz_round_rect (&b, &rect);
|
||||
fz_intersect_irect (&b, &obs->b);
|
||||
obs->cured = b.x0 == obs->b.x0
|
||||
&& b.x1 == obs->b.x1
|
||||
&& b.y0 == obs->b.y0
|
||||
|
@ -778,8 +791,10 @@ static void obs_fill_image (fz_device *dev, fz_image *image, fz_matrix ctm,
|
|||
}
|
||||
}
|
||||
|
||||
static int obscured (struct page *page, fz_bbox bbox)
|
||||
static int obscured (struct page *page, fz_irect bbox)
|
||||
{
|
||||
fz_rect rect;
|
||||
fz_matrix ctm;
|
||||
fz_device dev;
|
||||
struct obs obs;
|
||||
|
||||
|
@ -791,8 +806,9 @@ static int obscured (struct page *page, fz_bbox bbox)
|
|||
dev.ctx = state.ctx;
|
||||
dev.fill_image = obs_fill_image;
|
||||
obs.b = bbox;
|
||||
fz_run_display_list (page->dlist, &dev, pagectm (page),
|
||||
fz_rect_from_bbox (bbox), NULL);
|
||||
fz_rect_from_irect (&rect, &bbox);
|
||||
ctm = pagectm (page);
|
||||
fz_run_display_list (page->dlist, &dev, &ctm, &rect, NULL);
|
||||
return obs.cured;
|
||||
}
|
||||
#define OBSCURED obscured
|
||||
|
@ -803,7 +819,9 @@ static int obscured (struct page *page, fz_bbox bbox)
|
|||
static struct tile *rendertile (struct page *page, int x, int y, int w, int h,
|
||||
struct pbo *pbo)
|
||||
{
|
||||
fz_bbox bbox;
|
||||
fz_rect rect;
|
||||
fz_irect bbox;
|
||||
fz_matrix ctm;
|
||||
fz_device *dev;
|
||||
struct tile *tile;
|
||||
struct pagedim *pdim;
|
||||
|
@ -834,12 +852,12 @@ static struct tile *rendertile (struct page *page, int x, int y, int w, int h,
|
|||
if (pbo) {
|
||||
tile->pixmap =
|
||||
fz_new_pixmap_with_bbox_and_data (state.ctx, state.colorspace,
|
||||
bbox, pbo->ptr);
|
||||
&bbox, pbo->ptr);
|
||||
tile->pbo = pbo;
|
||||
}
|
||||
else {
|
||||
tile->pixmap =
|
||||
fz_new_pixmap_with_bbox (state.ctx, state.colorspace, bbox);
|
||||
fz_new_pixmap_with_bbox (state.ctx, state.colorspace, &bbox);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -849,8 +867,9 @@ static struct tile *rendertile (struct page *page, int x, int y, int w, int h,
|
|||
clearpixmap (tile->pixmap);
|
||||
}
|
||||
dev = fz_new_draw_device (state.ctx, tile->pixmap);
|
||||
fz_run_display_list (page->dlist, dev, pagectm (page),
|
||||
fz_rect_from_bbox (bbox), NULL);
|
||||
ctm = pagectm (page);
|
||||
fz_rect_from_irect (&rect, &bbox);
|
||||
fz_run_display_list (page->dlist, dev, &ctm, &rect, NULL);
|
||||
fz_free_device (dev);
|
||||
|
||||
return tile;
|
||||
|
@ -896,18 +915,18 @@ static void initpdims (void)
|
|||
|
||||
dev = fz_new_bbox_device (state.ctx, &rect);
|
||||
dev->hints |= FZ_IGNORE_SHADE;
|
||||
ctm = fz_invert_matrix (page->ctm);
|
||||
pdf_run_page (state.u.pdf, page, dev, fz_identity, NULL);
|
||||
fz_invert_matrix (&ctm, &page->ctm);
|
||||
pdf_run_page (state.u.pdf, page, dev, &fz_identity, NULL);
|
||||
fz_free_device (dev);
|
||||
|
||||
rect.x0 += state.trimfuzz.x0;
|
||||
rect.x1 += state.trimfuzz.x1;
|
||||
rect.y0 += state.trimfuzz.y0;
|
||||
rect.y1 += state.trimfuzz.y1;
|
||||
rect = fz_transform_rect (ctm, rect);
|
||||
rect = fz_intersect_rect (rect, page->mediabox);
|
||||
fz_transform_rect (&rect, &ctm);
|
||||
fz_intersect_rect (&rect, &page->mediabox);
|
||||
|
||||
if (fz_is_empty_rect (rect)) {
|
||||
if (fz_is_empty_rect (&rect)) {
|
||||
mediabox = page->mediabox;
|
||||
}
|
||||
else {
|
||||
|
@ -945,9 +964,9 @@ static void initpdims (void)
|
|||
else {
|
||||
fz_rect cropbox;
|
||||
|
||||
mediabox = pdf_to_rect (state.ctx,
|
||||
pdf_dict_gets (pageobj, "MediaBox"));
|
||||
if (fz_is_empty_rect (mediabox)) {
|
||||
pdf_to_rect (state.ctx, pdf_dict_gets (pageobj, "MediaBox"),
|
||||
&mediabox);
|
||||
if (fz_is_empty_rect (&mediabox)) {
|
||||
fprintf (stderr, "cannot find page size for page %d\n",
|
||||
pageno+1);
|
||||
mediabox.x0 = 0;
|
||||
|
@ -956,10 +975,10 @@ static void initpdims (void)
|
|||
mediabox.y1 = 792;
|
||||
}
|
||||
|
||||
cropbox = pdf_to_rect (state.ctx,
|
||||
pdf_dict_gets (pageobj, "CropBox"));
|
||||
if (!fz_is_empty_rect (cropbox)) {
|
||||
mediabox = fz_intersect_rect (mediabox, cropbox);
|
||||
pdf_to_rect (state.ctx, pdf_dict_gets (pageobj, "CropBox"),
|
||||
&cropbox);
|
||||
if (!fz_is_empty_rect (&cropbox)) {
|
||||
fz_intersect_rect (&mediabox, &cropbox);
|
||||
}
|
||||
rotate = pdf_to_int (pdf_dict_gets (pageobj, "Rotate"));
|
||||
}
|
||||
|
@ -972,7 +991,7 @@ static void initpdims (void)
|
|||
|
||||
fz_try (state.ctx) {
|
||||
page = xps_load_page (state.u.xps, pageno);
|
||||
mediabox = xps_bound_page (state.u.xps, page);
|
||||
xps_bound_page (state.u.xps, page, &mediabox);
|
||||
rotate = 0;
|
||||
if (state.trimmargins) {
|
||||
fz_rect rect;
|
||||
|
@ -980,16 +999,17 @@ static void initpdims (void)
|
|||
|
||||
dev = fz_new_bbox_device (state.ctx, &rect);
|
||||
dev->hints |= FZ_IGNORE_SHADE;
|
||||
xps_run_page (state.u.xps, page, dev, fz_identity, NULL);
|
||||
xps_run_page (state.u.xps, page, dev,
|
||||
&fz_identity, NULL);
|
||||
fz_free_device (dev);
|
||||
|
||||
rect.x0 += state.trimfuzz.x0;
|
||||
rect.x1 += state.trimfuzz.x1;
|
||||
rect.y0 += state.trimfuzz.y0;
|
||||
rect.y1 += state.trimfuzz.y1;
|
||||
rect = fz_intersect_rect (rect, mediabox);
|
||||
fz_intersect_rect (&rect, &mediabox);
|
||||
|
||||
if (!fz_is_empty_rect (rect)) {
|
||||
if (!fz_is_empty_rect (&rect)) {
|
||||
mediabox = rect;
|
||||
}
|
||||
}
|
||||
|
@ -1011,7 +1031,7 @@ static void initpdims (void)
|
|||
|
||||
fz_try (state.ctx) {
|
||||
page = cbz_load_page (state.u.cbz, pageno);
|
||||
mediabox = cbz_bound_page (state.u.cbz, page);
|
||||
cbz_bound_page (state.u.cbz, page, &mediabox);
|
||||
cbz_free_page (state.u.cbz, page);
|
||||
printd ("progress %f Trimming %d",
|
||||
(double) (pageno + 1) / state.pagecount,
|
||||
|
@ -1096,8 +1116,11 @@ static void layout (void)
|
|||
|
||||
if (state.proportional) {
|
||||
for (pindex = 0; pindex < state.pagedimcount; ++pindex, ++p) {
|
||||
box = fz_transform_rect (fz_rotate (p->rotate + state.rotate),
|
||||
p->mediabox);
|
||||
fz_matrix rm;
|
||||
|
||||
fz_rotate (&rm, p->rotate + state.rotate);
|
||||
box = p->mediabox;
|
||||
fz_transform_rect (&box, &rm);
|
||||
w = box.x1 - box.x0;
|
||||
maxw = MAX (w, maxw);
|
||||
}
|
||||
|
@ -1105,11 +1128,13 @@ static void layout (void)
|
|||
|
||||
p = state.pagedims;
|
||||
for (pindex = 0; pindex < state.pagedimcount; ++pindex, ++p) {
|
||||
fz_bbox bbox;
|
||||
fz_rect rect;
|
||||
fz_matrix tm, sm, rm;
|
||||
|
||||
ctm = fz_rotate (state.rotate);
|
||||
box = fz_transform_rect (fz_rotate (p->rotate + state.rotate),
|
||||
p->mediabox);
|
||||
fz_rotate (&ctm, state.rotate);
|
||||
fz_rotate (&rm, p->rotate + state.rotate);
|
||||
box = p->mediabox;
|
||||
fz_transform_rect (&box, &rm);
|
||||
w = box.x1 - box.x0;
|
||||
|
||||
if (state.proportional) {
|
||||
|
@ -1120,25 +1145,27 @@ static void layout (void)
|
|||
zoom = state.w / w;
|
||||
}
|
||||
|
||||
p->zoomctm = fz_scale (zoom, zoom);
|
||||
ctm = fz_concat (p->zoomctm, ctm);
|
||||
fz_scale (&p->zoomctm, zoom, zoom);
|
||||
fz_concat (&ctm, &p->zoomctm, &ctm);
|
||||
|
||||
p->pagebox = fz_transform_rect (fz_rotate (p->rotate), p->mediabox);
|
||||
fz_rotate (&rm, p->rotate);
|
||||
p->pagebox = p->mediabox;
|
||||
fz_transform_rect (&p->pagebox, &rm);
|
||||
p->pagebox.x1 -= p->pagebox.x0;
|
||||
p->pagebox.y1 -= p->pagebox.y0;
|
||||
p->pagebox.x0 = 0;
|
||||
p->pagebox.y0 = 0;
|
||||
bbox = fz_round_rect (fz_transform_rect (ctm, p->pagebox));
|
||||
rect = p->pagebox;
|
||||
fz_transform_rect (&rect, &ctm);
|
||||
fz_round_rect (&p->bounds, &rect);
|
||||
|
||||
p->bounds = bbox;
|
||||
p->left = state.proportional ? ((maxw - w) * zoom) / 2.0 : 0;
|
||||
p->ctm = ctm;
|
||||
|
||||
ctm = fz_identity;
|
||||
ctm = fz_concat (ctm, fz_translate (0, -p->mediabox.y1));
|
||||
ctm = fz_concat (ctm, fz_scale (zoom, -zoom));
|
||||
ctm = fz_concat (ctm, fz_rotate (p->rotate + state.rotate));
|
||||
p->lctm = ctm;
|
||||
fz_translate (&tm, 0, -p->mediabox.y1);
|
||||
fz_scale (&sm, zoom, -zoom);
|
||||
fz_concat (&ctm, &tm, &sm);
|
||||
fz_concat (&p->lctm, &ctm, &rm);
|
||||
|
||||
p->tctmready = 0;
|
||||
}
|
||||
|
@ -1172,7 +1199,7 @@ static struct anchor { int n; int y; int h; } desttoanchor (fz_link_dest *dest)
|
|||
fz_point p;
|
||||
p.x = 0;
|
||||
p.y = dest->ld.gotor.lt.y;
|
||||
p = fz_transform_point (pdim->lctm, p);
|
||||
fz_transform_point (&p, &pdim->lctm);
|
||||
a.y = p.y;
|
||||
}
|
||||
if (dest->ld.gotor.page >= 0 && dest->ld.gotor.page < 1<<30) {
|
||||
|
@ -1380,7 +1407,7 @@ static void search (regex_t *re, int pageno, int y, int forward)
|
|||
found:
|
||||
|
||||
sheet = fz_new_text_sheet (state.ctx);
|
||||
text = fz_new_text_page (state.ctx, fz_infinite_rect);
|
||||
text = fz_new_text_page (state.ctx, &fz_infinite_rect);
|
||||
tdev = fz_new_text_device (state.ctx, sheet, text);
|
||||
|
||||
switch (state.type) {
|
||||
|
@ -1389,8 +1416,8 @@ static void search (regex_t *re, int pageno, int y, int forward)
|
|||
fz_try (state.ctx) {
|
||||
u.pdfpage = pdf_load_page (state.u.pdf, pageno);
|
||||
trimctm (u.pdfpage, pdim - state.pagedims);
|
||||
ctm = fz_concat (pdim->tctm, pdim->zoomctm);
|
||||
pdf_run_page (state.u.pdf, u.pdfpage, tdev, ctm, NULL);
|
||||
fz_concat (&ctm, &pdim->tctm, &pdim->zoomctm);
|
||||
pdf_run_page (state.u.pdf, u.pdfpage, tdev, &ctm, NULL);
|
||||
}
|
||||
fz_catch (state.ctx) {
|
||||
fz_free_device (tdev);
|
||||
|
@ -1401,8 +1428,7 @@ static void search (regex_t *re, int pageno, int y, int forward)
|
|||
|
||||
case DXPS:
|
||||
u.xpspage = xps_load_page (state.u.xps, pageno);
|
||||
ctm = pdim->ctm;
|
||||
xps_run_page (state.u.xps, u.xpspage, tdev, ctm, NULL);
|
||||
xps_run_page (state.u.xps, u.xpspage, tdev, &pdim->ctm, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1830,7 +1856,7 @@ static void * mainloop (void *unused)
|
|||
}
|
||||
else if (!strncmp ("settrim", p, 7)) {
|
||||
int trimmargins;
|
||||
fz_bbox fuzz;
|
||||
fz_irect fuzz;
|
||||
|
||||
ret = sscanf (p + 7, " %d %d %d %d %d", &trimmargins,
|
||||
&fuzz.x0, &fuzz.y0, &fuzz.x1, &fuzz.y1);
|
||||
|
@ -1902,7 +1928,7 @@ CAMLprim value ml_realloctexts (value texcount_v)
|
|||
static void showsel (struct page *page, int ox, int oy)
|
||||
{
|
||||
int seen = 0;
|
||||
fz_bbox bbox;
|
||||
fz_irect bbox;
|
||||
fz_rect rect;
|
||||
fz_text_line *line;
|
||||
fz_text_span *span;
|
||||
|
@ -1953,9 +1979,9 @@ static void showsel (struct page *page, int ox, int oy)
|
|||
|
||||
if (seen) {
|
||||
for (i = j; i <= k; ++i) {
|
||||
rect = fz_union_rect (rect, span->text[i].bbox);
|
||||
fz_union_rect (&rect, &span->text[i].bbox);
|
||||
}
|
||||
bbox = fz_round_rect (rect);
|
||||
fz_round_rect (&bbox, &rect);
|
||||
lprintf ("%d %d %d %d oy=%d ox=%d\n",
|
||||
bbox.x0,
|
||||
bbox.y0,
|
||||
|
@ -1980,7 +2006,7 @@ static void showsel (struct page *page, int ox, int oy)
|
|||
|
||||
static void highlightlinks (struct page *page, int xoff, int yoff)
|
||||
{
|
||||
fz_matrix ctm;
|
||||
fz_matrix ctm, tm, pm;
|
||||
fz_link *link, *links;
|
||||
|
||||
switch (page->type) {
|
||||
|
@ -2002,7 +2028,9 @@ static void highlightlinks (struct page *page, int xoff, int yoff)
|
|||
|
||||
xoff -= state.pagedims[page->pdimno].bounds.x0;
|
||||
yoff -= state.pagedims[page->pdimno].bounds.y0;
|
||||
ctm = fz_concat (pagectm (page), fz_translate (xoff, yoff));
|
||||
fz_translate (&tm, xoff, yoff);
|
||||
pm = pagectm (page);
|
||||
fz_concat (&ctm, &pm, &tm);
|
||||
|
||||
glBegin (GL_QUADS);
|
||||
for (link = links; link; link = link->next) {
|
||||
|
@ -2020,10 +2048,10 @@ static void highlightlinks (struct page *page, int xoff, int yoff)
|
|||
p4.x = link->rect.x0;
|
||||
p4.y = link->rect.y1;
|
||||
|
||||
p1 = fz_transform_point (ctm, p1);
|
||||
p2 = fz_transform_point (ctm, p2);
|
||||
p3 = fz_transform_point (ctm, p3);
|
||||
p4 = fz_transform_point (ctm, p4);
|
||||
fz_transform_point (&p1, &ctm);
|
||||
fz_transform_point (&p2, &ctm);
|
||||
fz_transform_point (&p3, &ctm);
|
||||
fz_transform_point (&p4, &ctm);
|
||||
|
||||
switch (link->dest.kind) {
|
||||
case FZ_LINK_GOTO: glColor3ub (255, 0, 0); break;
|
||||
|
@ -2092,8 +2120,8 @@ static void ensureslinks (struct page *page)
|
|||
switch (page->type) {
|
||||
case DPDF:
|
||||
links = page->u.pdfpage->links;
|
||||
ctm = fz_concat (trimctm (page->u.pdfpage, page->pdimno),
|
||||
state.pagedims[page->pdimno].ctm);
|
||||
ctm = trimctm (page->u.pdfpage, page->pdimno);
|
||||
fz_concat (&ctm, &ctm, &state.pagedims[page->pdimno].ctm);
|
||||
break;
|
||||
|
||||
case DXPS:
|
||||
|
@ -2116,9 +2144,12 @@ static void ensureslinks (struct page *page)
|
|||
}
|
||||
|
||||
for (i = 0, link = links; link; ++i, link = link->next) {
|
||||
fz_rect rect;
|
||||
|
||||
rect = link->rect;
|
||||
fz_transform_rect (&link->rect, &ctm);
|
||||
page->slinks[i].link = link;
|
||||
page->slinks[i].bbox =
|
||||
fz_round_rect (fz_transform_rect (ctm, link->rect));
|
||||
fz_round_rect (&page->slinks[i].bbox, &rect);
|
||||
}
|
||||
qsort (page->slinks, count, slinksize, compareslinks);
|
||||
}
|
||||
|
@ -2368,9 +2399,9 @@ static fz_link *getlink (struct page *page, int x, int y)
|
|||
p.x = x;
|
||||
p.y = y;
|
||||
|
||||
ctm = fz_concat (ctm, state.pagedims[page->pdimno].ctm);
|
||||
ctm = fz_invert_matrix (ctm);
|
||||
p = fz_transform_point (ctm, p);
|
||||
fz_concat (&ctm, &ctm, &state.pagedims[page->pdimno].ctm);
|
||||
fz_invert_matrix (&ctm, &ctm);
|
||||
fz_transform_point (&p, &ctm);
|
||||
|
||||
for (link = links; link; link = link->next) {
|
||||
if (p.x >= link->rect.x0 && p.x <= link->rect.x1) {
|
||||
|
@ -2389,15 +2420,14 @@ static void ensuretext (struct page *page)
|
|||
page->tgen = state.gen;
|
||||
}
|
||||
if (!page->text) {
|
||||
fz_matrix ctm;
|
||||
fz_device *tdev;
|
||||
|
||||
page->text = fz_new_text_page (state.ctx, fz_infinite_rect);
|
||||
page->text = fz_new_text_page (state.ctx, &fz_infinite_rect);
|
||||
page->sheet = fz_new_text_sheet (state.ctx);
|
||||
tdev = fz_new_text_device (state.ctx, page->sheet, page->text);
|
||||
fz_run_display_list (page->dlist,
|
||||
tdev,
|
||||
pagectm (page),
|
||||
fz_infinite_rect, NULL);
|
||||
ctm = pagectm (page);
|
||||
fz_run_display_list (page->dlist, tdev, &ctm, &fz_infinite_rect, NULL);
|
||||
qsort (page->text->blocks, page->text->len,
|
||||
sizeof (*page->text->blocks), compareblocks);
|
||||
fz_free_device (tdev);
|
||||
|
@ -2605,7 +2635,7 @@ enum { uuri, ugoto, utext, uunexpected, ulaunch, unamed, uremote };
|
|||
\
|
||||
if (link->dest.ld.gotor.flags & fz_link_flag_t_valid) { \
|
||||
p.y = link->dest.ld.gotor.lt.y; \
|
||||
p = fz_transform_point (pdim->lctm, p); \
|
||||
fz_transform_point (&p, &pdim->lctm); \
|
||||
} \
|
||||
tup_v = caml_alloc_tuple (2); \
|
||||
ret_v = caml_alloc_small (1, ugoto); \
|
||||
|
@ -3204,11 +3234,13 @@ CAMLprim value ml_zoom_for_height (value winw_v, value winh_v,
|
|||
}
|
||||
|
||||
for (i = 0, p = state.pagedims; i < state.pagedimcount; ++i, ++p) {
|
||||
double x0, x1, y0, y1, w, h, scaledh, scale;
|
||||
fz_rect rect;
|
||||
fz_matrix rm;
|
||||
double x0, x1, y0, y1, w, h, scaledh, scale;
|
||||
|
||||
rect = fz_transform_rect (fz_rotate (p->rotate + state.rotate),
|
||||
p->mediabox);
|
||||
fz_rotate (&rm, p->rotate + state.rotate);
|
||||
rect = p->mediabox;
|
||||
fz_transform_rect (&rect, &rm);
|
||||
x0 = MIN (rect.x0, rect.x1);
|
||||
x1 = MAX (rect.x0, rect.x1);
|
||||
y0 = MIN (rect.y0, rect.y1);
|
||||
|
@ -3273,7 +3305,8 @@ CAMLprim value ml_getpagebox (value opaque_v)
|
|||
CAMLparam1 (opaque_v);
|
||||
CAMLlocal1 (ret_v);
|
||||
fz_rect rect;
|
||||
fz_bbox bbox;
|
||||
fz_irect bbox;
|
||||
fz_matrix ctm;
|
||||
fz_device *dev;
|
||||
char *s = String_val (opaque_v);
|
||||
struct page *page = parse_pointer ("ml_getpagebox", s);
|
||||
|
@ -3284,11 +3317,13 @@ CAMLprim value ml_getpagebox (value opaque_v)
|
|||
|
||||
switch (page->type) {
|
||||
case DPDF:
|
||||
pdf_run_page (state.u.pdf, page->u.pdfpage, dev, pagectm (page), NULL);
|
||||
ctm = pagectm (page);
|
||||
pdf_run_page (state.u.pdf, page->u.pdfpage, dev, &ctm, NULL);
|
||||
break;
|
||||
|
||||
case DXPS:
|
||||
xps_run_page (state.u.xps, page->u.xpspage, dev, pagectm (page), NULL);
|
||||
ctm = pagectm (page);
|
||||
xps_run_page (state.u.xps, page->u.xpspage, dev, &ctm, NULL);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -3297,7 +3332,7 @@ CAMLprim value ml_getpagebox (value opaque_v)
|
|||
}
|
||||
|
||||
fz_free_device (dev);
|
||||
bbox = fz_round_rect (rect);
|
||||
fz_round_rect (&bbox, &rect);
|
||||
Field (ret_v, 0) = Val_int (bbox.x0);
|
||||
Field (ret_v, 1) = Val_int (bbox.y0);
|
||||
Field (ret_v, 2) = Val_int (bbox.x1);
|
||||
|
@ -3597,9 +3632,9 @@ CAMLprim value ml_unproject (value ptr_v, value x_v, value y_v)
|
|||
p.x = x;
|
||||
p.y = y;
|
||||
|
||||
ctm = fz_concat (ctm, pdim->ctm);
|
||||
ctm = fz_invert_matrix (ctm);
|
||||
p = fz_transform_point (ctm, p);
|
||||
fz_concat (&ctm, &ctm, &pdim->ctm);
|
||||
fz_invert_matrix (&ctm, &ctm);
|
||||
fz_transform_point (&p, &ctm);
|
||||
|
||||
tup_v = caml_alloc_tuple (2);
|
||||
ret_v = caml_alloc_small (1, 1);
|
||||
|
|
Loading…
Reference in a new issue