summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Jamfile4
-rw-r--r--include/fitz/object.h2
-rw-r--r--mupdf/fontfilefc.c3
-rw-r--r--mupdf/resources.c2
-rw-r--r--object/simple.c51
-rw-r--r--render/rastport.c128
-rw-r--r--render/scale.c6
-rw-r--r--tree/optimize.c2
8 files changed, 183 insertions, 15 deletions
diff --git a/Jamfile b/Jamfile
index 83d242c8..6357a47d 100644
--- a/Jamfile
+++ b/Jamfile
@@ -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;
}