From 30afe6fa458cef7a6f84020de5bd15d8ae164521 Mon Sep 17 00:00:00 2001 From: Robin Watts Date: Mon, 21 Nov 2016 12:23:59 +0000 Subject: First version of mu-office-lib. --- source/tests/mu-office-test.c | 288 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 288 insertions(+) create mode 100644 source/tests/mu-office-test.c (limited to 'source/tests') diff --git a/source/tests/mu-office-test.c b/source/tests/mu-office-test.c new file mode 100644 index 00000000..c734500a --- /dev/null +++ b/source/tests/mu-office-test.c @@ -0,0 +1,288 @@ +/* + * mu-office-test - Simple test for Muoffice. + */ + +#include "mupdf/memento.h" +#include "mupdf/helpers/mu-office-lib.h" +#include +#include +#include + +static HANDLE loaded; + +/* Forward definition */ +static void save_png(const MuOfficeBitmap *bitmap, const char *filename); + +static void +load_progress(void *cookie, int pages_loaded, int complete) +{ + assert((intptr_t)cookie == 1234); + + fprintf(stderr, "load_progress: pages_loaded=%d complete=%d\n", pages_loaded, complete); + + if (complete) + (void)ReleaseSemaphore(loaded, 1, NULL); +} + +static void +load_error(void *cookie, MuOfficeDocErrorType error) +{ + assert((intptr_t)cookie == 1234); + + fprintf(stderr, "load_error: error=%d\n", error); +} + +static void render_progress(void *cookie, MuError error) +{ + assert((int)cookie == 5678); + + fprintf(stderr, "render_progress: error=%d\n", error); + (void)ReleaseSemaphore(loaded, 1, NULL); +} + +static int +test_async(MuOfficeLib *mu) +{ + MuOfficeDoc *doc; + MuError err; + int count; + MuOfficePage *page; + float w, h; + MuOfficeBitmap bitmap; + MuOfficeRenderArea area; + MuOfficeRender *render; + + err = MuOfficeLib_loadDocument(mu, + "../MyTests/pdf_reference17.pdf", + load_progress, + load_error, + (void *)1234, /* Arbitrary */ + &doc); + + /* Wait for the load to complete */ + WaitForSingleObject(loaded, INFINITE); + + /* Test number of pages */ + err = MuOfficeDoc_getNumPages(doc, &count); + if (err) + { + fprintf(stderr, "Failed to count pages: error=%d\n", err); + return EXIT_FAILURE; + } + fprintf(stderr, "%d Pages in document\n", count); + + /* Get a page */ + err = MuOfficeDoc_getPage(doc, 0, NULL, (void *)4321, &page); + if (err) + { + fprintf(stderr, "Failed to get page: error=%d\n", err); + return EXIT_FAILURE; + } + + /* Get size of page */ + err = MuOfficePage_getSize(page, &w, &h); + if (err) + { + fprintf(stderr, "Failed to get page size: error=%d\n", err); + return EXIT_FAILURE; + } + fprintf(stderr, "Page size = %g x %g\n", w, h); + + /* Allocate ourselves a bitmap */ + bitmap.width = (int)(w * 1.5 + 0.5); + bitmap.height = (int)(h * 1.5 + 0.5); + bitmap.lineSkip = bitmap.width * 4; + bitmap.memptr = malloc(bitmap.lineSkip * bitmap.height); + + /* Set the area to render the whole bitmap */ + area.origin.x = 0; + area.origin.y = 0; + area.renderArea.x = 0; + area.renderArea.y = 0; + area.renderArea.width = (float)bitmap.width; + area.renderArea.height = (float)bitmap.height; + + /* Render into the bitmap */ + err = MuOfficePage_render(page, 1.5f, &bitmap, &area, render_progress, (void *)5678, &render); + if (err) + { + fprintf(stderr, "Page render failed: error=%d\n", err); + return EXIT_FAILURE; + } + + /* Wait for the render to complete */ + WaitForSingleObject(loaded, INFINITE); + + /* Kill the render */ + MuOfficeRender_destroy(render); + + /* Output the bitmap */ + save_png(&bitmap, "out.png"); + free(bitmap.memptr); + + MuOfficePage_destroy(page); + + MuOfficeDoc_destroy(doc); + + CloseHandle(loaded); + loaded = NULL; + + return EXIT_SUCCESS; +} + +static int +test_sync(MuOfficeLib *mu) +{ + MuOfficeDoc *doc; + MuError err; + int count; + MuOfficePage *page; + float w, h; + MuOfficeBitmap bitmap; + MuOfficeRenderArea area; + MuOfficeRender *render; + + loaded = CreateSemaphore(NULL, 0, 1, NULL); + + err = MuOfficeLib_loadDocument(mu, + "../MyTests/pdf_reference17.pdf", + NULL, + NULL, + NULL, + &doc); + + /* Test number of pages */ + err = MuOfficeDoc_getNumPages(doc, &count); + if (err) + { + fprintf(stderr, "Failed to count pages: error=%d\n", err); + return EXIT_FAILURE; + } + fprintf(stderr, "%d Pages in document\n", count); + + /* Get a page */ + err = MuOfficeDoc_getPage(doc, 1, NULL, (void *)4321, &page); + if (err) + { + fprintf(stderr, "Failed to get page: error=%d\n", err); + return EXIT_FAILURE; + } + + /* Get size of page */ + err = MuOfficePage_getSize(page, &w, &h); + if (err) + { + fprintf(stderr, "Failed to get page size: error=%d\n", err); + return EXIT_FAILURE; + } + fprintf(stderr, "Page size = %g x %g\n", w, h); + + /* Allocate ourselves a bitmap */ + bitmap.width = (int)(w * 1.5 + 0.5); + bitmap.height = (int)(h * 1.5 + 0.5); + bitmap.lineSkip = bitmap.width * 4; + bitmap.memptr = malloc(bitmap.lineSkip * bitmap.height); + + /* Set the area to render the whole bitmap */ + area.origin.x = 0; + area.origin.y = 0; + area.renderArea.x = 0; + area.renderArea.y = 0; + area.renderArea.width = (float)bitmap.width; + area.renderArea.height = (float)bitmap.height; + + /* Render into the bitmap */ + err = MuOfficePage_render(page, 1.5f, &bitmap, &area, NULL, NULL, &render); + if (err) + { + fprintf(stderr, "Page render failed: error=%d\n", err); + return EXIT_FAILURE; + } + + err = MuOfficeRender_waitUntilComplete(render); + if (err) + { + fprintf(stderr, "Page render failed to complete: error=%d\n", err); + return EXIT_FAILURE; + } + + /* Kill the render */ + MuOfficeRender_destroy(render); + + /* Output the bitmap */ + save_png(&bitmap, "out1.png"); + free(bitmap.memptr); + + MuOfficePage_destroy(page); + + MuOfficeDoc_destroy(doc); + + return EXIT_SUCCESS; +} + +int main(int argc, char **argv) +{ + MuOfficeLib *mu; + MuError err; + int ret; + + err = MuOfficeLib_create(&mu); + if (err) + { + fprintf(stderr, "Failed to create lib instance: error=%d\n", err); + return EXIT_FAILURE; + } + + ret = test_async(mu); + if (ret) + return ret; + + ret = test_sync(mu); + if (ret) + return ret; + + MuOfficeLib_destroy(mu); + + return EXIT_SUCCESS; +} + +/* + Code beneath here calls MuPDF directly, purely because + this is the easiest way to get PNG saving functionality. + This is not part of the test, which is why this is put + at the end. +*/ + +#include "mupdf/fitz.h" + +static void +save_png(const MuOfficeBitmap *bitmap, const char *filename) +{ + fz_context *ctx = fz_new_context(NULL, NULL, FZ_STORE_DEFAULT); + fz_pixmap *pix; + + if (ctx == NULL) + { + fprintf(stderr, "save_png failed!\n"); + exit(EXIT_FAILURE); + } + + fz_try(ctx) + { + pix = fz_new_pixmap_with_data(ctx, fz_device_rgb(ctx), bitmap->width, bitmap->height, 1, bitmap->lineSkip, bitmap->memptr); + + fz_save_pixmap_as_png(ctx, pix, filename); + } + fz_always(ctx) + { + fz_drop_pixmap(ctx, pix); + } + fz_catch(ctx) + { + fprintf(stderr, "save_png failed!\n"); + fz_drop_context(ctx); + exit(EXIT_FAILURE); + } + + fz_drop_context(ctx); +} -- cgit v1.2.3