summaryrefslogtreecommitdiff
path: root/apps/pdffunction.c
diff options
context:
space:
mode:
authorTor Andersson <tor@ghostscript.com>2005-01-11 07:19:08 +0100
committerTor Andersson <tor@ghostscript.com>2005-01-11 07:19:08 +0100
commit4a6def1aebcb61599f9d975e92079aad5bb423c6 (patch)
tree65d7ae5520822cc10b79ef5d421672f5b7d6f435 /apps/pdffunction.c
parent15db9438f7a852643bb2b5e81e67de4eb805b173 (diff)
downloadmupdf-4a6def1aebcb61599f9d975e92079aad5bb423c6.tar.xz
rename apps directory and reorganize macpdf.app
Diffstat (limited to 'apps/pdffunction.c')
-rw-r--r--apps/pdffunction.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/apps/pdffunction.c b/apps/pdffunction.c
new file mode 100644
index 00000000..20dabf1e
--- /dev/null
+++ b/apps/pdffunction.c
@@ -0,0 +1,263 @@
+#include <fitz.h>
+#include <mupdf.h>
+
+static char *password = "";
+static int dodecode = 0;
+static int dorepair = 0;
+static int doprintxref = 0;
+
+typedef struct psobj_s psobj;
+
+struct pdf_function_s
+{
+ unsigned short type; /* 0=sample 2=exponential 3=stitching 4=postscript */
+ int m; /* number of input values */
+ int n; /* number of output values */
+ float *domain; /* even index : min value, odd index : max value */
+ float *range; /* even index : min value, odd index : max value */
+ union
+ {
+ struct {
+ unsigned short bps;
+ unsigned short order;
+ int *size; /* the num of samples in each input dimension */
+ float *encode;
+ float *decode;
+ int *samples;
+ } sa;
+ struct {
+ float n;
+ float *c0;
+ float *c1;
+ } e;
+ struct {
+ int k;
+ pdf_function **funcs;
+ float *bounds;
+ float *encode;
+ } st;
+ struct {
+ psobj *code;
+ int cap;
+ } p;
+ }u;
+};
+
+void usage()
+{
+ fprintf(stderr, "usage: pdffunction [-drxs] [-u password] file.pdf oid [input ...]\n");
+ exit(1);
+}
+
+static int safecol = 0;
+
+void printsafe(unsigned char *buf, int n)
+{
+ int i;
+ for (i = 0; i < n; i++) {
+ if (buf[i] == '\r' || buf[i] == '\n') {
+ printf("\n");
+ safecol = 0;
+ }
+ else if (buf[i] < 32 || buf[i] > 126) {
+ printf(".");
+ safecol ++;
+ }
+ else {
+ printf("%c", buf[i]);
+ safecol ++;
+ }
+ if (safecol == 79) {
+ printf("\n");
+ safecol = 0;
+ }
+ }
+}
+
+void decodestream(pdf_xref *xref, int oid, int gid)
+{
+ fz_error *error;
+ unsigned char buf[512];
+
+ safecol = 0;
+
+ error = pdf_openstream(xref, oid, gid);
+ if (error) fz_abort(error);
+
+ while (1)
+ {
+ int n = fz_read(xref->stream, buf, sizeof buf);
+ if (n == 0)
+ break;
+ if (n < 0)
+ fz_abort(fz_ferror(xref->stream));
+ printsafe(buf, n);
+ }
+
+ pdf_closestream(xref);
+}
+
+void copystream(pdf_xref *xref, int oid, int gid)
+{
+ fz_error *error;
+ unsigned char buf[512];
+
+ safecol = 0;
+
+ error = pdf_openrawstream(xref, oid, gid);
+ if (error) fz_abort(error);
+
+ while (1)
+ {
+ int n = fz_read(xref->stream, buf, sizeof buf);
+ if (n == 0)
+ break;
+ if (n < 0)
+ fz_abort(fz_ferror(xref->stream));
+ printsafe(buf, n);
+ }
+
+ pdf_closestream(xref);
+}
+
+void printobject(pdf_xref *xref, int oid, int gid)
+{
+ fz_error *error;
+ fz_obj *obj;
+
+ error = pdf_loadobject(&obj, xref, oid, gid);
+ if (error) fz_abort(error);
+
+ printf("%d %d obj\n", oid, gid);
+ fz_debugobj(obj);
+ printf("\n");
+
+ if (xref->table[oid].stmofs) {
+ printf("stream\n");
+ if (dodecode)
+ decodestream(xref, oid, gid);
+ else
+ copystream(xref, oid, gid);
+ printf("endstream\n");
+ }
+
+ printf("endobj\n");
+
+ fz_dropobj(obj);
+}
+
+int main(int argc, char **argv)
+{
+ fz_error *error;
+ char *filename;
+ pdf_xref *xref;
+ int c;
+
+ while ((c = getopt(argc, argv, "drxopu:")) != -1)
+ {
+ switch (c)
+ {
+ case 'd':
+ dodecode ++;
+ break;
+ case 'r':
+ dorepair ++;
+ break;
+ case 'x':
+ doprintxref ++;
+ break;
+ case 'u':
+ password = optarg;
+ break;
+ default:
+ usage();
+ }
+ }
+
+ if (argc - optind == 0)
+ usage();
+
+ filename = argv[optind++];
+
+ if (dorepair)
+ error = pdf_repairpdf(&xref, filename);
+ else
+ error = pdf_openpdf(&xref, filename);
+ if (error)
+ fz_abort(error);
+
+ error = pdf_decryptpdf(xref);
+ if (error)
+ fz_abort(error);
+
+ if (xref->crypt)
+ {
+ error = pdf_setpassword(xref->crypt, password);
+ if (error) fz_abort(error);
+ }
+
+ if (optind == argc)
+ {
+ printf("trailer\n");
+ fz_debugobj(xref->trailer);
+ printf("\n");
+ }
+ else
+ {
+ int oid = atoi(argv[optind++]);
+ if(optind == argc)
+ printobject(xref, oid, 0);
+ else
+ {
+ float *in = nil, *out = nil;
+ pdf_function *func;
+ fz_obj *funcobj;
+ int i;
+
+ /* type 0 and type 4 funcs must be indirect to read stream */
+ error = fz_newindirect(&funcobj,oid,0);
+ if(error) fz_abort(error);
+ error = pdf_loadfunction(&func,xref,funcobj);
+ if(error) fz_abort(error);
+ in = fz_malloc(func->m * sizeof(float));
+ out = fz_malloc(func->n * sizeof(float));
+
+ if(!in || !out)
+ fz_abort(fz_outofmem);
+
+ for(i = 0; optind < argc; optind++, i++)
+ {
+ if(i >= func->m)
+ fz_abort(fz_throw("too much input values"));
+
+ in[i] = atof(argv[optind]);
+ }
+
+ if(i < func->m)
+ fz_abort(fz_throw("too few input values"));
+
+ error = pdf_evalfunction(func, in, func->m, out, func->n);
+ if(error) fz_abort(error);
+
+ for(i = 0; i < func->n; ++i)
+ fprintf(stderr, "output[%d] : %f\n", i, out[i]);
+
+ fz_dropobj(funcobj);
+ pdf_dropfunction(func);
+ }
+ }
+
+ for ( ; optind < argc; optind++)
+ {
+ printobject(xref, atoi(argv[optind]), 0);
+ printf("\n");
+ }
+
+ if (doprintxref)
+ pdf_debugpdf(xref);
+
+ pdf_closepdf(xref);
+
+ return 0;
+}
+