Skip to content

Commit

Permalink
update mupdf
Browse files Browse the repository at this point in the history
  • Loading branch information
Krzysztof Kowalczyk committed Jan 16, 2024
1 parent cd2acc3 commit 2020df1
Show file tree
Hide file tree
Showing 7 changed files with 198 additions and 31 deletions.
2 changes: 1 addition & 1 deletion mupdf/docs/src/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ rst2pdf
# define sphinx versioning
sphinx==5.3.0
sphinx_rtd_theme==1.1.1
readthedocs-sphinx-search==0.1.1
readthedocs-sphinx-search==0.3.2
furo==2023.03.27
99 changes: 99 additions & 0 deletions mupdf/platform/java/jni/pdfobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,105 @@ FUN(PDFObject_putDictionaryPDFObjectDate)(JNIEnv *env, jobject self, jobject jna
jni_rethrow_void(env, ctx);
}

JNIEXPORT void JNICALL
FUN(PDFObject_putDictionaryStringRect)(JNIEnv *env, jobject self, jstring jname, jobject jrect)
{
fz_context *ctx = get_context(env);
pdf_obj *dict = from_PDFObject(env, self);
fz_rect rect = from_Rect(env, jrect);
const char *name = NULL;
pdf_obj *key = NULL;

if (!ctx || !dict) return;
if (jname)
{
name = (*env)->GetStringUTFChars(env, jname, NULL);
if (!name) return;
}

fz_var(key);

fz_try(ctx)
{
key = name ? pdf_new_name(ctx, name) : NULL;
pdf_dict_put_rect(ctx, dict, key, rect);
}
fz_always(ctx)
{
pdf_drop_obj(ctx, key);
if (name)
(*env)->ReleaseStringUTFChars(env, jname, name);
}
fz_catch(ctx)
jni_rethrow_void(env, ctx);
}

JNIEXPORT void JNICALL
FUN(PDFObject_putDictionaryStringMatrix)(JNIEnv *env, jobject self, jstring jname, jobject jmatrix)
{
fz_context *ctx = get_context(env);
pdf_obj *dict = from_PDFObject(env, self);
fz_matrix matrix = from_Matrix(env, jmatrix);
const char *name = NULL;
pdf_obj *key = NULL;

if (!ctx || !dict) return;
if (jname)
{
name = (*env)->GetStringUTFChars(env, jname, NULL);
if (!name) return;
}

fz_var(key);

fz_try(ctx)
{
key = name ? pdf_new_name(ctx, name) : NULL;
pdf_dict_put_matrix(ctx, dict, key, matrix);
}
fz_always(ctx)
{
pdf_drop_obj(ctx, key);
if (name)
(*env)->ReleaseStringUTFChars(env, jname, name);
}
fz_catch(ctx)
jni_rethrow_void(env, ctx);
}

JNIEXPORT void JNICALL
FUN(PDFObject_putDictionaryStringDate)(JNIEnv *env, jobject self, jstring jname, jlong time)
{
fz_context *ctx = get_context(env);
pdf_obj *dict = from_PDFObject(env, self);
const char *name = NULL;
pdf_obj *key = NULL;

if (!ctx || !dict) return;
if (jname)
{
name = (*env)->GetStringUTFChars(env, jname, NULL);
if (!name) return;
}

fz_var(key);

fz_try(ctx)
{
key = name ? pdf_new_name(ctx, name) : NULL;
pdf_dict_put_date(ctx, dict, key, time);
}
fz_always(ctx)
{
pdf_drop_obj(ctx, key);
if (name)
(*env)->ReleaseStringUTFChars(env, jname, name);
}
fz_catch(ctx)
jni_rethrow_void(env, ctx);
}


JNIEXPORT void JNICALL
FUN(PDFObject_deleteArray)(JNIEnv *env, jobject self, jint index)
{
Expand Down
24 changes: 24 additions & 0 deletions mupdf/platform/java/mupdf_native.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions mupdf/platform/java/src/com/artifex/mupdf/fitz/PDFObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,9 @@ public PDFObject getInheritable(PDFObject name) {
private native void putDictionaryStringFloat(String name, float f);
private native void putDictionaryStringString(String name, String str);
private native void putDictionaryStringPDFObject(String name, PDFObject obj);
private native void putDictionaryStringRect(String name, Rect r);
private native void putDictionaryStringMatrix(String name, Matrix m);
private native void putDictionaryStringDate(String name, long secs);

private native void putDictionaryPDFObjectBoolean(PDFObject name, boolean b);
private native void putDictionaryPDFObjectInteger(PDFObject name, int i);
Expand Down Expand Up @@ -189,6 +192,18 @@ public void put(String name, PDFObject obj) {
putDictionaryStringPDFObject(name, obj);
}

public void put(String name, Rect r) {
putDictionaryStringRect(name, r);
}

public void put(String name, Matrix m) {
putDictionaryStringMatrix(name, m);
}

public void put(String name, Date time) {
putDictionaryStringDate(name, time.getTime());
}

public void put(PDFObject name, boolean b) {
putDictionaryPDFObjectBoolean(name, b);
}
Expand Down
68 changes: 45 additions & 23 deletions mupdf/source/fitz/uncfb.c
Original file line number Diff line number Diff line change
Expand Up @@ -585,35 +585,57 @@ make_absolute(fz_context *ctx, fz_cfb_archive *cfb, char *prefix, int node, int
{
uint32_t type;

if (node == (int)NOSTREAM)
return;
/* To avoid recursion where possible. */
while (1)
{
if (node == (int)NOSTREAM)
return;

if (node < 0 || node >= cfb->count)
fz_throw(ctx, FZ_ERROR_GENERIC, "Invalid tree");
if (node < 0 || node >= cfb->count)
fz_throw(ctx, FZ_ERROR_GENERIC, "Invalid tree");

if (depth >= 32)
fz_throw(ctx, FZ_ERROR_GENERIC, "CBF Tree too deep");
if (depth >= 32)
fz_throw(ctx, FZ_ERROR_GENERIC, "CBF Tree too deep");

type = cfb->entries[node].t;
if (type == REACHED || type == REACHED_KEEP)
fz_throw(ctx, FZ_ERROR_GENERIC, "CBF Tree has cycles");
cfb->entries[node].t = (type == 2) ? REACHED_KEEP : REACHED;
type = cfb->entries[node].t;
if (type == REACHED || type == REACHED_KEEP)
fz_throw(ctx, FZ_ERROR_GENERIC, "CBF Tree has cycles");
cfb->entries[node].t = (type == 2) ? REACHED_KEEP : REACHED;

make_absolute(ctx, cfb, prefix, cfb->entries[node].l, depth+1);
make_absolute(ctx, cfb, prefix, cfb->entries[node].r, depth+1);
if (prefix)
{
size_t z0 = strlen(prefix);
size_t z1 = strlen(cfb->entries[node].name);
char *newname = fz_malloc(ctx, z0+z1+2);
memcpy(newname, prefix, z0);
newname[z0] = '/';
memcpy(newname+z0+1, cfb->entries[node].name, z1+1);
fz_free(ctx, cfb->entries[node].name);
cfb->entries[node].name = newname;
}

if (prefix)
{
size_t z0 = strlen(prefix);
size_t z1 = strlen(cfb->entries[node].name);
char *newname = fz_malloc(ctx, z0+z1+2);
memcpy(newname, prefix, z0);
newname[z0] = '/';
memcpy(newname+z0+1, cfb->entries[node].name, z1+1);
fz_free(ctx, cfb->entries[node].name);
cfb->entries[node].name = newname;
if (cfb->entries[node].d == NOSTREAM && cfb->entries[node].r == NOSTREAM)
{
/* Handle 'l' without recursion, because there is no 'r' or 'd'. */
node = cfb->entries[node].l;
continue;
}
make_absolute(ctx, cfb, prefix, cfb->entries[node].l, depth+1);
if (cfb->entries[node].d == NOSTREAM)
{
/* Handle 'r' without recursion, because there is no 'd'. */
node = cfb->entries[node].r;
continue;
}
make_absolute(ctx, cfb, prefix, cfb->entries[node].r, depth+1);

/* Rather than recursing:
* make_absolute(ctx, cfb, node == 0 ? NULL : cfb->entries[node].name, cfb->entries[node].d, depth+1);
* instead just loop. */
prefix = node == 0 ? NULL : cfb->entries[node].name;
node = cfb->entries[node].d;
}
make_absolute(ctx, cfb, node == 0 ? NULL : cfb->entries[node].name, cfb->entries[node].d, depth+1);

}

static void
Expand Down
2 changes: 1 addition & 1 deletion mupdf/source/html/html-imp.h
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ struct fz_html_box_s
/* Only needed during layout */
struct {
float x, y, w, b; /* content */
float em;
float em, baseline;
} layout;
} s;

Expand Down
19 changes: 13 additions & 6 deletions mupdf/source/html/html-layout.c
Original file line number Diff line number Diff line change
Expand Up @@ -490,14 +490,11 @@ static void layout_line(fz_context *ctx, float indent, float page_w, float line_
{
default:
case VA_BASELINE:
va = 0;
break;
case VA_SUB:
va = node->box->s.layout.em * 0.2f;
break;
case VA_SUPER:
va = node->box->s.layout.em * -0.3f;
va = node->box->s.layout.baseline;
break;

case VA_TOP:
case VA_TEXT_TOP:
va = -baseline + node->box->s.layout.em * 0.8f;
Expand Down Expand Up @@ -633,7 +630,7 @@ static void layout_flow(fz_context *ctx, layout_data *ld, fz_html_box *box, fz_h
int align;
fz_html_restarter *restart = ld->restart;

float em = box->s.layout.em = fz_from_css_number(box->style->font_size, top->s.layout.em, top->s.layout.em, top->s.layout.em);
float em = box->s.layout.em;
indent = box->is_first_flow ? fz_from_css_number(top->style->text_indent, em, top->s.layout.w, 0) : 0;
align = top->style->text_align;

Expand Down Expand Up @@ -1458,12 +1455,20 @@ static void layout_block(fz_context *ctx, layout_data *ld, fz_html_box *box, fz_
static void layout_update_styles(fz_context *ctx, fz_html_box *box, fz_html_box *top)
{
float top_em = top->s.layout.em;
float top_baseline = top->s.layout.baseline;
float top_w = top->s.layout.w;
while (box)
{
const fz_css_style *style = box->style;
float em = box->s.layout.em = fz_from_css_number(style->font_size, top_em, top_em, top_em);

if (style->vertical_align == VA_SUPER)
box->s.layout.baseline = top_baseline - top_em / 3;
else if (style->vertical_align == VA_SUB)
box->s.layout.baseline = top_baseline + top_em / 5;
else
box->s.layout.baseline = top_baseline;

if (box->type != BOX_INLINE && box->type != BOX_FLOW)
{
float *margin = box->u.block.margin;
Expand Down Expand Up @@ -1660,6 +1665,7 @@ fz_restartable_layout_html(fz_context *ctx, fz_html_tree *tree, float start_x, f
{
fz_warn(ctx, "html: nothing to layout");
box->s.layout.em = em;
box->s.layout.baseline = 0;
box->s.layout.x = start_x;
box->s.layout.w = page_w;
box->s.layout.y = start_y;
Expand Down Expand Up @@ -1688,6 +1694,7 @@ fz_restartable_layout_html(fz_context *ctx, fz_html_tree *tree, float start_x, f
if (box->s.layout.em != em || box->s.layout.x != start_x || box->s.layout.w != page_w)
{
box->s.layout.em = em;
box->s.layout.baseline = 0;
box->s.layout.x = start_x;
box->s.layout.w = page_w;
layout_update_styles(ctx, box->down, box);
Expand Down

0 comments on commit 2020df1

Please sign in to comment.