summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin Watts <robin.watts@artifex.com>2012-06-13 19:02:12 +0100
committerRobin Watts <robin.watts@artifex.com>2012-06-14 19:15:53 +0100
commit836d6a62162e51e7d7925773064c30ef500ded94 (patch)
tree87fc5e7d94b9ec1ba9538523f1f6c16c3cfa9707
parentf5d721764811484be4e98d7cddc5b83ae72e6277 (diff)
downloadmupdf-836d6a62162e51e7d7925773064c30ef500ded94.tar.xz
Add -j flag to mudraw; create simple mujstest scripts automatically.
We add a new fz_bound_annots function (and associated pdf_bound_annots function) that calls a given callback with the page rectangle of the annotations on a given page. This is marked as being a 'temporary' function, so we can remove it/change it in future if required. It seems likely that we'll want to have some sort of 'iterate over annotations' function eventually, and this does the job for now. Add a -j flag to mudraw that outputs a simple mujstest script. For each page with annotations, the script jumps to that page, then for each annotation on the page, it sets some text to be entered, and clicks the annotation. In the case of text fields, this will cause the text to be entered into that text field; in the case of buttons it will execute the button. At the end of each page with annotations, the script is told to snapshot the page. These test scripts are not designed to be full tests, but they do at least provide an easy way for us to generate scripts where every field in our test suite is interacted with.
-rw-r--r--apps/mudraw.c59
-rw-r--r--fitz/doc_document.c7
-rw-r--r--fitz/fitz-internal.h1
-rw-r--r--fitz/fitz.h9
-rw-r--r--pdf/mupdf.h9
-rw-r--r--pdf/pdf_annot.c16
-rw-r--r--pdf/pdf_xref.c6
7 files changed, 104 insertions, 3 deletions
diff --git a/apps/mudraw.c b/apps/mudraw.c
index 359b102f..ae22d23d 100644
--- a/apps/mudraw.c
+++ b/apps/mudraw.c
@@ -22,6 +22,7 @@ static int showtext = 0;
static int showtime = 0;
static int showmd5 = 0;
static int showoutline = 0;
+static int showannotrects = 0;
static int savealpha = 0;
static int uselist = 1;
static int alphabits = 8;
@@ -37,6 +38,11 @@ static fz_colorspace *colorspace;
static char *filename;
static int files = 0;
+static char *mujstest_filename = NULL;
+static FILE *mujstest_file = NULL;
+static int mujstest_page = 0;
+static int mujstest_count = 0;
+
static struct {
int count, total;
int min, max;
@@ -68,6 +74,7 @@ static void usage(void)
"\t-G gamma\tgamma correct output\n"
"\t-I\tinvert output\n"
"\t-l\tprint outline\n"
+ "\t-j -\tOutput mujstest file\n"
"\tpages\tcomma separated list of ranges\n");
exit(1);
}
@@ -97,6 +104,18 @@ static int isrange(char *s)
return 1;
}
+static void mujsannot(void *arg, fz_rect *rect)
+{
+ if (mujstest_page >= 0)
+ {
+ fprintf(mujstest_file, "GOTO %d\n", mujstest_page);
+ mujstest_page = -1;
+ }
+ fprintf(mujstest_file, "%% %0.2f %0.2f %0.2f %0.2f\n", rect->x0, rect->y0, rect->x1, rect->y1);
+ fprintf(mujstest_file, "TEXT %dTestText\n", ++mujstest_count);
+ fprintf(mujstest_file, "CLICK %0.2f %0.2f\n", (rect->x0+rect->x1)/2, (rect->y0+rect->y1)/2);
+}
+
static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
{
fz_page *page;
@@ -122,6 +141,12 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_throw(ctx, "cannot load page %d in file '%s'", pagenum, filename);
}
+ if (mujstest_file)
+ {
+ mujstest_page = pagenum;
+ fz_bound_annots(doc, page, mujsannot, NULL);
+ }
+
if (uselist)
{
fz_try(ctx)
@@ -378,6 +403,12 @@ static void drawpage(fz_context *ctx, fz_document *doc, int pagenum)
fz_flush_warnings(ctx);
+ if (mujstest_file && mujstest_page < 0)
+ {
+ fprintf(mujstest_file, "SCREENSHOT\n");
+ }
+
+
if (cookie.errors)
errored = 1;
}
@@ -444,7 +475,7 @@ int main(int argc, char **argv)
fz_var(doc);
- while ((c = fz_getopt(argc, argv, "lo:p:r:R:ab:dgmtx5G:Iw:h:f")) != -1)
+ while ((c = fz_getopt(argc, argv, "lo:p:r:R:ab:dgmtx5G:Iw:h:fj:")) != -1)
{
switch (c)
{
@@ -466,6 +497,7 @@ int main(int argc, char **argv)
case 'h': height = atof(fz_optarg); break;
case 'f': fit = 1; break;
case 'I': invert++; break;
+ case 'j': mujstest_filename = fz_optarg; break;
default: usage(); break;
}
}
@@ -473,12 +505,20 @@ int main(int argc, char **argv)
if (fz_optind == argc)
usage();
- if (!showtext && !showxml && !showtime && !showmd5 && !showoutline && !output)
+ if (!showtext && !showxml && !showtime && !showmd5 && !showoutline && !output && !mujstest_filename)
{
printf("nothing to do\n");
exit(0);
}
+ if (mujstest_filename)
+ {
+ if (strcmp(mujstest_filename, "-") == 0)
+ mujstest_file = stdout;
+ else
+ mujstest_file = fopen(mujstest_filename, "wb");
+ }
+
ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT);
if (!ctx)
{
@@ -541,8 +581,18 @@ int main(int argc, char **argv)
}
if (fz_needs_password(doc))
+ {
if (!fz_authenticate_password(doc, password))
fz_throw(ctx, "cannot authenticate password: %s", filename);
+ if (mujstest_file)
+ fprintf(mujstest_file, "PASSWORD %s\n", password);
+
+ }
+
+ if (mujstest_file)
+ {
+ fprintf(mujstest_file, "OPEN %s\n", filename);
+ }
if (showxml || showtext == TEXT_XML)
printf("<document name=\"%s\">\n", filename);
@@ -550,7 +600,7 @@ int main(int argc, char **argv)
if (showoutline)
drawoutline(ctx, doc);
- if (showtext || showxml || showtime || showmd5 || output)
+ if (showtext || showxml || showtime || showmd5 || output || mujstest_file)
{
if (fz_optind == argc || !isrange(argv[fz_optind]))
drawrange(ctx, doc, "1-");
@@ -601,6 +651,9 @@ int main(int argc, char **argv)
}
}
+ if (mujstest_file && mujstest_file != stdout)
+ fclose(mujstest_file);
+
fz_free_context(ctx);
return (errored != 0);
}
diff --git a/fitz/doc_document.c b/fitz/doc_document.c
index b1ca8eac..0699f00f 100644
--- a/fitz/doc_document.c
+++ b/fitz/doc_document.c
@@ -109,6 +109,13 @@ fz_bound_page(fz_document *doc, fz_page *page)
}
void
+fz_bound_annots(fz_document *doc, fz_page *page, void (*callback)(void *arg, fz_rect *), void *arg)
+{
+ if (doc && doc->bound_annots && page && callback)
+ doc->bound_annots(doc, page, callback, arg);
+}
+
+void
fz_run_page(fz_document *doc, fz_page *page, fz_device *dev, fz_matrix transform, fz_cookie *cookie)
{
if (doc && doc->run_page && page)
diff --git a/fitz/fitz-internal.h b/fitz/fitz-internal.h
index 61ccd2a0..0f413893 100644
--- a/fitz/fitz-internal.h
+++ b/fitz/fitz-internal.h
@@ -1112,6 +1112,7 @@ struct fz_document_s
int (*meta)(fz_document *doc, int key, void *ptr, int size);
fz_interactive *(*interact)(fz_document *doc);
void (*write)(fz_document *doc, char *filename, fz_write_options *opts);
+ void (*bound_annots)(fz_document *doc, fz_page *page, void (*callback)(void *arg, fz_rect *), void *arg);
};
#endif
diff --git a/fitz/fitz.h b/fitz/fitz.h
index 60cddf9a..669ab6e4 100644
--- a/fitz/fitz.h
+++ b/fitz/fitz.h
@@ -2161,6 +2161,15 @@ fz_link *fz_load_links(fz_document *doc, fz_page *page);
fz_rect fz_bound_page(fz_document *doc, fz_page *page);
/*
+ fz_bound_annots: Bound the annotations on a page.
+
+ (Temporary function - do not rely on this remaining in future)
+
+ Does not throw exceptions (unless the callback does).
+*/
+void fz_bound_annots(fz_document *doc, fz_page *page, void(*callback)(void *arg, fz_rect *), void *arg);
+
+/*
fz_run_page: Run a page through a device.
page: Page obtained from fz_load_page.
diff --git a/pdf/mupdf.h b/pdf/mupdf.h
index b3807852..d7cf85f7 100644
--- a/pdf/mupdf.h
+++ b/pdf/mupdf.h
@@ -233,6 +233,15 @@ fz_rect pdf_bound_page(pdf_document *doc, pdf_page *page);
void pdf_free_page(pdf_document *doc, pdf_page *page);
/*
+ pdf_bound_annots: Bound the annotations on a page.
+
+ (Temporary function - do not rely on this remaining in future)
+
+ Does not throw exceptions (unless the callback does).
+*/
+void pdf_bound_annots(pdf_document *doc, pdf_page *page, void(*callback)(void *arg, fz_rect *), void *arg);
+
+/*
pdf_run_page: Interpret a loaded page and render it on a device.
page: A page loaded by pdf_load_page.
diff --git a/pdf/pdf_annot.c b/pdf/pdf_annot.c
index a3dde9a3..ea4fa2c4 100644
--- a/pdf/pdf_annot.c
+++ b/pdf/pdf_annot.c
@@ -431,3 +431,19 @@ pdf_load_annots(pdf_document *xref, pdf_obj *annots, fz_matrix page_ctm)
return head;
}
+
+void
+pdf_bound_annots(pdf_document *doc, pdf_page *page, void (*callback)(void *arg, fz_rect *), void *arg)
+{
+ pdf_annot *a;
+
+ if (!doc || !page || !callback)
+ return;
+
+ a = page->annots;
+ while (a)
+ {
+ callback(arg, &a->pagerect);
+ a = a->next;
+ }
+}
diff --git a/pdf/pdf_xref.c b/pdf/pdf_xref.c
index c5c6507d..8e74850c 100644
--- a/pdf/pdf_xref.c
+++ b/pdf/pdf_xref.c
@@ -1292,6 +1292,11 @@ static fz_rect pdf_bound_page_shim(fz_document *doc, fz_page *page)
return pdf_bound_page((pdf_document*)doc, (pdf_page*)page);
}
+static void pdf_bound_annots_shim(fz_document *doc, fz_page *page, void (*callback)(void *arg, fz_rect *), void *arg)
+{
+ pdf_bound_annots((pdf_document*)doc, (pdf_page*)page, callback, arg);
+}
+
static void pdf_free_page_shim(fz_document *doc, fz_page *page)
{
pdf_free_page((pdf_document*)doc, (pdf_page*)page);
@@ -1316,6 +1321,7 @@ pdf_new_document(fz_stream *file)
doc->super.load_page = pdf_load_page_shim;
doc->super.load_links = pdf_load_links_shim;
doc->super.bound_page = pdf_bound_page_shim;
+ doc->super.bound_annots = pdf_bound_annots_shim;
doc->super.run_page = NULL; /* see pdf_xref_aux.c */
doc->super.free_page = pdf_free_page_shim;
doc->super.meta = pdf_meta_shim;