diff options
-rw-r--r-- | Jamfile | 4 | ||||
-rw-r--r-- | include/fitz/object.h | 2 | ||||
-rw-r--r-- | mupdf/fontfilefc.c | 3 | ||||
-rw-r--r-- | mupdf/resources.c | 2 | ||||
-rw-r--r-- | object/simple.c | 51 | ||||
-rw-r--r-- | render/rastport.c | 128 | ||||
-rw-r--r-- | render/scale.c | 6 | ||||
-rw-r--r-- | tree/optimize.c | 2 |
8 files changed, 183 insertions, 15 deletions
@@ -18,7 +18,7 @@ Library libfitz : #util/strlcat.c # base runtime - base/rune.c + base/cpudep.c base/error.c base/memory.c base/md5.c @@ -26,7 +26,7 @@ Library libfitz : base/rect.c base/matrix.c base/hash.c - base/cpudep.c + base/rune.c # object object/simple.c diff --git a/include/fitz/object.h b/include/fitz/object.h index 777e889f..015f1e74 100644 --- a/include/fitz/object.h +++ b/include/fitz/object.h @@ -83,6 +83,8 @@ int fz_isdict(fz_obj *obj); int fz_isindirect(fz_obj *obj); int fz_ispointer(fz_obj *obj); +int fz_cmpobj(fz_obj *a, fz_obj *b); + /* silent failure, no error reporting */ int fz_tobool(fz_obj *obj); int fz_toint(fz_obj *obj); diff --git a/mupdf/fontfilefc.c b/mupdf/fontfilefc.c index e47cc759..36368c28 100644 --- a/mupdf/fontfilefc.c +++ b/mupdf/fontfilefc.c @@ -214,7 +214,7 @@ pdf_loadsystemfont(pdf_font *font, char *basefont, char *collection) goto cleanup; file = FcNameUnparse(searchpat); -printf(" fontconfig %s\n", file); +printf(" fontconfig %s: %s\n", basefont, file); free(file); fcerr = FcResultMatch; @@ -233,6 +233,7 @@ free(file); if (file && style && strcmp(style, file)) font->substitute = 1; +if (font->substitute) printf(" inexact match\n"); fcerr = FcPatternGetString(matchpat, FC_FILE, 0, (FcChar8**)&file); diff --git a/mupdf/resources.c b/mupdf/resources.c index 953f2d24..3d962a43 100644 --- a/mupdf/resources.c +++ b/mupdf/resources.c @@ -6,7 +6,7 @@ pdf_findresource(pdf_rsrc *rsrc, fz_obj *key) { while (rsrc) { - if (rsrc->key == key) /* TODO: compare equality not identity */ + if (!fz_cmpobj(rsrc->key, key)) return rsrc->val; rsrc = rsrc->next; } diff --git a/object/simple.c b/object/simple.c index 629fdf85..d9a0e12e 100644 --- a/object/simple.c +++ b/object/simple.c @@ -232,3 +232,54 @@ fz_topointer(fz_obj *obj) return nil; } +int +fz_cmpobj(fz_obj *a, fz_obj *b) +{ + int i; + + if (a == b) + return 0; + if (a->kind != b->kind) + return 1; + + switch (a->kind) + { + case FZ_NULL: return 0; + case FZ_BOOL: return a->u.b - b->u.b; + case FZ_INT: return a->u.i - b->u.i; + case FZ_REAL: return a->u.f - b->u.f; + case FZ_STRING: + if (a->u.s.len != b->u.s.len) + return a->u.s.len - b->u.s.len; + return memcmp(a->u.s.buf, b->u.s.buf, a->u.s.len); + case FZ_NAME: + return strcmp(a->u.n, b->u.n); + + case FZ_INDIRECT: + if (a->u.r.oid == b->u.r.oid) + return a->u.r.gid - b->u.r.gid; + return a->u.r.oid - b->u.r.oid; + + case FZ_ARRAY: + if (a->u.a.len != b->u.a.len) + return a->u.a.len - b->u.a.len; + for (i = 0; i < a->u.a.len; i++) + if (fz_cmpobj(a->u.a.items[i], b->u.a.items[i])) + return 1; + return 0; + + case FZ_DICT: + if (a->u.d.len != b->u.d.len) + return a->u.d.len - b->u.d.len; + for (i = 0; i < a->u.d.len; i++) + { + if (fz_cmpobj(a->u.d.items[i].k, b->u.d.items[i].k)) + return 1; + if (fz_cmpobj(a->u.d.items[i].v, b->u.d.items[i].v)) + return 1; + } + return 0; + } + return 1; +} + diff --git a/render/rastport.c b/render/rastport.c index d329b9e2..9cae06d5 100644 --- a/render/rastport.c +++ b/render/rastport.c @@ -1,7 +1,5 @@ #include <fitz.h> -/* XXX: half of these funcs are totally wrong. fix! */ - typedef unsigned char byte; /* @@ -77,6 +75,7 @@ duff_NiMoN(byte *sp0, int sw, int sn, byte *mp0, int mw, int mn, byte *dp0, int int w = w0; while (w--) { + /* TODO: validate this */ byte ma = mp[0]; byte sa = fz_mul255(sp[0], ma); byte ssa = 255 - sa; @@ -96,32 +95,145 @@ duff_NiMoN(byte *sp0, int sw, int sn, byte *mp0, int mw, int mn, byte *dp0, int static void duff_1o1(byte *sp0, int sw, byte *dp0, int dw, int w0, int h) { - duff_NoN(sp0, sw, 1, dp0, dw, w0, h); + /* duff_NoN(sp0, sw, 1, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + dp[0] = sp[0] + fz_mul255(dp[0], 255 - sp[0]); + sp ++; + dp ++; + } + sp0 += sw; + dp0 += dw; + } } static void duff_4o4(byte *sp0, int sw, byte *dp0, int dw, int w0, int h) { - duff_NoN(sp0, sw, 4, dp0, dw, w0, h); + /* duff_NoN(sp0, sw, 4, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + byte ssa = 255 - sp[0]; + dp[0] = sp[0] + fz_mul255(dp[0], ssa); + dp[1] = sp[1] + fz_mul255(dp[1], ssa); + dp[2] = sp[2] + fz_mul255(dp[2], ssa); + dp[3] = sp[3] + fz_mul255(dp[3], ssa); + sp += 4; + dp += 4; + } + sp0 += sw; + dp0 += dw; + } } static void duff_1i1c1(byte *sp0, int sw, byte *mp0, int mw, byte *dp0, int dw, int w0, int h) { - duff_NiMcN(sp0, sw, 1, mp0, mw, 1, dp0, dw, w0, h); + /* duff_NiMcN(sp0, sw, 1, mp0, mw, 1, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *mp = mp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + dp[0] = fz_mul255(sp[0], mp[0]); + sp ++; + mp ++; + dp ++; + } + sp0 += sw; + mp0 += mw; + dp0 += dw; + } } static void duff_4i1c4(byte *sp0, int sw, byte *mp0, int mw, byte *dp0, int dw, int w0, int h) { - duff_NiMcN(sp0, sw, 4, mp0, mw, 1, dp0, dw, w0, h); + /* duff_NiMcN(sp0, sw, 4, mp0, mw, 1, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *mp = mp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + byte ma = mp[0]; + dp[0] = fz_mul255(sp[0], ma); + dp[1] = fz_mul255(sp[1], ma); + dp[2] = fz_mul255(sp[2], ma); + dp[3] = fz_mul255(sp[3], ma); + sp += 4; + mp += 1; + dp += 4; + } + sp0 += sw; + mp0 += mw; + dp0 += dw; + } } static void duff_1i1o1(byte *sp0, int sw, byte *mp0, int mw, byte *dp0, int dw, int w0, int h) { - duff_NiMoN(sp0, sw, 1, mp0, mw, 1, dp0, dw, w0, h); + /* duff_NiMoN(sp0, sw, 1, mp0, mw, 1, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *mp = mp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + byte ma = mp[0]; + byte sa = fz_mul255(sp[0], ma); + byte ssa = 255 - sa; + dp[0] = fz_mul255(sp[0], ma) + fz_mul255(dp[0], ssa); + sp ++; + mp ++; + dp ++; + } + sp0 += sw; + mp0 += mw; + dp0 += dw; + } } static void duff_4i1o4(byte *sp0, int sw, byte *mp0, int mw, byte *dp0, int dw, int w0, int h) { - duff_NiMoN(sp0, sw, 4, mp0, mw, 1, dp0, dw, w0, h); + /* duff_NiMoN(sp0, sw, 4, mp0, mw, 1, dp0, dw, w0, h); */ + while (h--) + { + byte *sp = sp0; + byte *mp = mp0; + byte *dp = dp0; + int w = w0; + while (w--) + { + byte ma = mp[0]; + byte sa = fz_mul255(sp[0], ma); + byte ssa = 255 - sa; + dp[0] = fz_mul255(sp[0], ma) + fz_mul255(dp[0], ssa); + dp[1] = fz_mul255(sp[1], ma) + fz_mul255(dp[1], ssa); + dp[2] = fz_mul255(sp[2], ma) + fz_mul255(dp[2], ssa); + dp[3] = fz_mul255(sp[3], ma) + fz_mul255(dp[3], ssa); + sp += 4; + mp += 1; + dp += 4; + } + sp0 += sw; + mp0 += mw; + dp0 += dw; + } } /* diff --git a/render/scale.c b/render/scale.c index 461f5100..01ebec2d 100644 --- a/render/scale.c +++ b/render/scale.c @@ -1,5 +1,7 @@ #include <fitz.h> +/* TODO: these should go in fz_rastfuncs */ + typedef void (*rowfunc)(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom); typedef void (*colfunc)(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom); @@ -119,7 +121,7 @@ scalecols(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) static void scalecols1(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) { - int x, y, k; + int x, y; unsigned char *s; int sum; @@ -136,7 +138,7 @@ scalecols1(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) static void scalecols2(unsigned char *src, unsigned char *dst, int w, int ncomp, int denom) { - int x, y, k; + int x, y; unsigned char *s; int sum0, sum1; diff --git a/tree/optimize.c b/tree/optimize.c index b37df876..d052d51d 100644 --- a/tree/optimize.c +++ b/tree/optimize.c @@ -144,7 +144,7 @@ fz_optimizetree(fz_tree *tree) { if (getenv("DONTOPT")) return nil; -// cleanovers(tree->root); + cleanovers(tree->root); cleanmasks(tree->root); return nil; } |