summaryrefslogtreecommitdiff
path: root/platform/winrt
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2014-01-15 10:10:47 -0800
committerMichael Vrhel <michael.vrhel@artifex.com>2014-01-15 10:11:37 -0800
commit9a83c56291d358b497a6603b0cd20f28c27d23da (patch)
tree1a63d5b0bf3f950cd6a41a4398397cc2246a150d /platform/winrt
parentc9161e3c56149e960c68ec504807ae0612dc6c18 (diff)
downloadmupdf-9a83c56291d358b497a6603b0cd20f28c27d23da.tar.xz
Clearer division in WinRT vs std C++ code
To share as much code as possible between the Windows 8 app, windows phone app and Windows desktop app, remove dependencies of Platform and Windows::Foundation in files that interface to mupdf and replace with C/C++ std methods.
Diffstat (limited to 'platform/winrt')
-rw-r--r--platform/winrt/mupdfwinrt/muctx.cpp88
-rw-r--r--platform/winrt/mupdfwinrt/muctx.h44
-rw-r--r--platform/winrt/mupdfwinrt/mudocument.cpp33
-rw-r--r--platform/winrt/mupdfwinrt/utils.cpp2
-rw-r--r--platform/winrt/mupdfwinrt/utils.h2
5 files changed, 87 insertions, 82 deletions
diff --git a/platform/winrt/mupdfwinrt/muctx.cpp b/platform/winrt/mupdfwinrt/muctx.cpp
index 4e8a4ad2..cc3feff3 100644
--- a/platform/winrt/mupdfwinrt/muctx.cpp
+++ b/platform/winrt/mupdfwinrt/muctx.cpp
@@ -6,13 +6,8 @@
/* This class interfaces to mupdf API with minimal windows objects
* (other than the file streaming stuff) */
-/* File streaming set up for mupdf */
-
-/* win_read_file etc. Reading of windows managed stream. This is
- * not ideal as I have to read into a managed buffer and then transfer
- * to the actual buffer I want. I would like a more direct approach.
- * Alternate approach is to push this off outside the winrt and read
- * from a memory buffer. */
+#ifdef _WINRT_DLL
+/* File streaming set up for WinRT */
static int win_read_file(fz_stream *stm, unsigned char *buf, int len)
{
void *temp = stm->state;
@@ -80,6 +75,30 @@ static void win_close_file(fz_context *ctx, void *state)
delete stream;
}
+status_t muctx::InitializeStream(IRandomAccessStream^ readStream, char *ext)
+{
+ win_stream.stream = readStream;
+ fz_stream *mu_stream = fz_new_stream(mu_ctx, 0, win_read_file, win_close_file, NULL);
+ mu_stream->seek = win_seek_file;
+ mu_stream->state = reinterpret_cast <void*> (&win_stream);
+
+ /* Now lets see if we can open the file */
+ fz_try(mu_ctx)
+ {
+ mu_doc = fz_open_document_with_stream(mu_ctx, ext, mu_stream);
+ }
+ fz_always(mu_ctx)
+ {
+ fz_close(mu_stream);
+ }
+ fz_catch(mu_ctx)
+ {
+ return E_FAILURE;
+ }
+ return S_ISOK;
+}
+#endif
+
/* mutext functions see mupdf readme for details */
static void lock_mutex(void *user, int lock)
{
@@ -156,30 +175,6 @@ muctx::~muctx(void)
page_cache = NULL;
}
-/* Set up the stream access */
-status_t muctx::InitializeStream(IRandomAccessStream^ readStream, char *ext)
-{
- win_stream.stream = readStream;
- fz_stream *mu_stream = fz_new_stream(mu_ctx, 0, win_read_file, win_close_file, NULL);
- mu_stream->seek = win_seek_file;
- mu_stream->state = reinterpret_cast <void*> (&win_stream);
-
- /* Now lets see if we can open the file */
- fz_try(mu_ctx)
- {
- mu_doc = fz_open_document_with_stream(mu_ctx, ext, mu_stream);
- }
- fz_always(mu_ctx)
- {
- fz_close(mu_stream);
- }
- fz_catch(mu_ctx)
- {
- return E_FAILURE;
- }
- return S_ISOK;
-}
-
/* Return the documents page count */
int muctx::GetPageCount()
{
@@ -190,7 +185,7 @@ int muctx::GetPageCount()
}
/* Get page size */
-int muctx::MeasurePage(int page_num, Point *size)
+int muctx::MeasurePage(int page_num, point_t *size)
{
fz_rect rect;
fz_page *page;
@@ -211,9 +206,9 @@ int muctx::MeasurePage(int page_num, Point *size)
}
/* Get page size */
-Point muctx::MeasurePage(fz_page *page)
+point_t muctx::MeasurePage(fz_page *page)
{
- Point pageSize;
+ point_t pageSize;
fz_rect rect;
fz_rect *bounds;
@@ -233,8 +228,8 @@ void muctx::FlattenOutline(fz_outline *outline, int level,
memset(indent, ' ', level * 4);
indent[level * 4] = 0;
- String^ indent_str = char_to_String(indent);
- String^ str_indent;
+ std::string indent_str = indent;
+ std::string str_indent;
while (outline)
{
@@ -246,9 +241,10 @@ void muctx::FlattenOutline(fz_outline *outline, int level,
/* Add to the contents std:vec */
sh_content content_item(new content_t());
content_item->page = page;
- content_item->string_orig = char_to_String(outline->title);
- content_item->string_margin =
- str_indent->Concat(indent_str, content_item->string_orig);
+ content_item->string_orig = outline->title;
+ str_indent = content_item->string_orig;
+ str_indent.insert(0, indent_str);
+ content_item->string_margin = str_indent;
contents_vec->push_back(content_item);
}
}
@@ -403,7 +399,7 @@ fz_display_list * muctx::CreateDisplayList(int page_num, int *width, int *height
{
fz_device *dev = NULL;
fz_page *page = NULL;
- Point page_size;
+ point_t page_size;
/* First see if we have this one in the cache */
fz_display_list *dlist = page_cache->Use(page_num, width, height, mu_ctx);
@@ -445,8 +441,8 @@ fz_display_list * muctx::CreateDisplayList(int page_num, int *width, int *height
/* Render display list bmp_data buffer. No lock needed for this operation */
status_t muctx::RenderPageMT(void *dlist, int page_width, int page_height,
unsigned char *bmp_data, int bmp_width, int bmp_height,
- float scale, bool flipy, bool tile, Point top_left,
- Point bottom_right)
+ float scale, bool flipy, bool tile, point_t top_left,
+ point_t bottom_right)
{
fz_device *dev = NULL;
fz_pixmap *pix = NULL;
@@ -505,7 +501,7 @@ status_t muctx::RenderPage(int page_num, unsigned char *bmp_data, int bmp_width,
fz_pixmap *pix = NULL;
fz_page *page = NULL;
fz_matrix ctm, *pctm = &ctm;
- Point page_size;
+ point_t page_size;
fz_var(dev);
fz_var(pix);
@@ -551,7 +547,7 @@ bool muctx::ApplyPassword(char* password)
return fz_authenticate_password(mu_doc, password) != 0;
}
-String^ muctx::GetHTML(int page_num)
+std::string muctx::GetHTML(int page_num)
{
fz_output *out = NULL;
fz_device *dev = NULL;
@@ -559,7 +555,7 @@ String^ muctx::GetHTML(int page_num)
fz_text_sheet *sheet = NULL;
fz_text_page *text = NULL;
fz_buffer *buf = NULL;
- String^ html;
+ std::string html;
fz_var(dev);
fz_var(page);
@@ -579,7 +575,7 @@ String^ muctx::GetHTML(int page_num)
buf = fz_new_buffer(mu_ctx, 256);
out = fz_new_output_with_buffer(mu_ctx, buf);
fz_print_text_page_html(mu_ctx, out, text);
- html = char_to_String((char*) buf->data);
+ html = std::string(((char*) buf->data));
}
fz_always(mu_ctx)
{
diff --git a/platform/winrt/mupdfwinrt/muctx.h b/platform/winrt/mupdfwinrt/muctx.h
index 80d165ed..0a27af52 100644
--- a/platform/winrt/mupdfwinrt/muctx.h
+++ b/platform/winrt/mupdfwinrt/muctx.h
@@ -5,7 +5,6 @@
#include <vector>
#include <windows.h>
#include <mutex>
-#include "utils.h"
#include "Cache.h"
#include "status.h"
@@ -15,18 +14,18 @@ extern "C" {
#define MAX_SEARCH 500
-using namespace Platform; /* For String */
-using namespace Windows::Foundation; /* For Point */
-
-/* These are the std objects used to interface to muctx. We do use windows
- String and Point types however */
+typedef struct point_s
+{
+ double X;
+ double Y;
+} point_t;
/* Links */
typedef struct document_link_s
{
link_t type;
- Point upper_left;
- Point lower_right;
+ point_t upper_left;
+ point_t lower_right;
std::unique_ptr<char[]> uri;
int page_num;
} document_link_t;
@@ -36,8 +35,8 @@ typedef struct document_link_s
/* Text Search */
typedef struct text_search_s
{
- Point upper_left;
- Point lower_right;
+ point_t upper_left;
+ point_t lower_right;
} text_search_t;
#define sh_text std::shared_ptr<text_search_t>
#define sh_vector_text std::shared_ptr<std::vector<sh_text>>
@@ -46,16 +45,13 @@ typedef struct text_search_s
typedef struct content_s
{
int page;
- String^ string_orig;
- String^ string_margin;
+ std::string string_orig;
+ std::string string_margin;
} content_t;
#define sh_content std::shared_ptr<content_t>
#define sh_vector_content std::shared_ptr<std::vector<sh_content>>
-/* Used for HTML return */
-#define sh_vector_char std::shared_ptr<std::vector<char>>
-
-/* Needed for file handling */
+#ifdef _WINRT_DLL
using namespace Windows::Storage::Streams;
using namespace Windows::Foundation;
@@ -63,6 +59,7 @@ typedef struct win_stream_struct_s
{
IRandomAccessStream^ stream;
} win_stream_struct;
+#endif
class muctx
{
@@ -82,22 +79,25 @@ public:
muctx(void);
~muctx(void);
void CleanUp(void);
- status_t InitializeStream(IRandomAccessStream^ readStream, char *ext);
int GetPageCount();
status_t InitializeContext();
status_t RenderPage(int page_num, unsigned char *bmp_data, int bmp_width,
int bmp_height, float scale, bool flipy);
status_t RenderPageMT(void *dlist, int page_width, int page_height,
unsigned char *bmp_data, int bmp_width, int bmp_height,
- float scale, bool flipy, bool tile, Point top_left,
- Point bottom_right);
+ float scale, bool flipy, bool tile, point_t top_left,
+ point_t bottom_right);
fz_display_list* CreateDisplayList(int page_num, int *width, int *height);
- int MeasurePage(int page_num, Point *size);
- Point MeasurePage(fz_page *page);
+ int MeasurePage(int page_num, point_t *size);
+ point_t MeasurePage(fz_page *page);
unsigned int GetLinks(int page_num, sh_vector_link links_vec);
int GetTextSearch(int page_num, char* needle, sh_vector_text texts_vec);
int GetContents(sh_vector_content contents_vec);
- String^ GetHTML(int page_num);
+ std::string GetHTML(int page_num);
bool RequiresPassword(void);
bool ApplyPassword(char* password);
+#ifdef _WINRT_DLL
+ status_t InitializeStream(IRandomAccessStream^ readStream, char *ext);
+#endif
+
};
diff --git a/platform/winrt/mupdfwinrt/mudocument.cpp b/platform/winrt/mupdfwinrt/mudocument.cpp
index b37b45aa..d73a5ed0 100644
--- a/platform/winrt/mupdfwinrt/mudocument.cpp
+++ b/platform/winrt/mupdfwinrt/mudocument.cpp
@@ -7,6 +7,7 @@
#include "pch.h"
#include "mudocument.h"
#include "status.h"
+#include "utils.h"
using namespace mupdfwinrt;
using namespace concurrency;
@@ -43,14 +44,18 @@ int mudocument::GetNumPages()
Point mudocument::GetPageSize(int page_num)
{
- Point size;
+ Point size_out;
+ point_t size;
mutex_lock.lock();
int code = this->mu_object.MeasurePage(page_num, &size);
mutex_lock.unlock();
if (code < 0)
throw ref new Exception(code, ref new String(L"Get Page Size Failed"));
- return size;
+
+ size_out.X = size.X;
+ size_out.Y = size.Y;
+ return size_out;
}
Windows::Foundation::IAsyncOperation<int>^ mudocument::OpenFileAsync(StorageFile^ file)
@@ -208,7 +213,8 @@ int mudocument::RenderPageBitmapSync(int page_num, int bmp_width, int bmp_height
}
code = mu_object.RenderPageMT(dlist, page_width, page_height,
&(bmp_data[0]), bmp_width, bmp_height,
- scale, flipy, tile, top_left, bottom_right);
+ scale, flipy, tile, { top_left.X, top_left.Y },
+ { bottom_right.X, bottom_right.Y });
}
else
{
@@ -323,8 +329,8 @@ unsigned int mudocument::ComputeLinks(int page_num)
return 0;
}
sh_link muctx_link = link_smart_ptr_vec->at(k);
- new_link->LowerRight = muctx_link->lower_right;
- new_link->UpperLeft = muctx_link->upper_left;
+ new_link->LowerRight = { (float) muctx_link->lower_right.X, (float) muctx_link->lower_right.Y };
+ new_link->UpperLeft = { (float) muctx_link->upper_left.X, (float) muctx_link->upper_left.Y };
new_link->PageNum = muctx_link->page_num;
new_link->Type = muctx_link->type;
if (new_link->Type == LINK_URI)
@@ -377,8 +383,8 @@ int mudocument::ComputeTextSearch(String^ text, int page_num)
return 0;
}
sh_text muctx_text = text_smart_ptr_vec->at(k);
- new_link->LowerRight = muctx_text->lower_right;
- new_link->UpperLeft = muctx_text->upper_left;
+ new_link->LowerRight = { (float) muctx_text->lower_right.X, (float) muctx_text->lower_right.Y };
+ new_link->UpperLeft = { (float) muctx_text->upper_left.X, (float) muctx_text->upper_left.Y };
new_link->Type = TEXTBOX;
this->textsearch->Append(new_link);
}
@@ -416,7 +422,7 @@ unsigned int mudocument::ComputeContents()
if (!has_content)
return 0;
- /* Pack into winRT type*/
+ /* Pack into winRT type */
this->contents = ref new Platform::Collections::Vector<ContentItem^>();
if (this->contents == nullptr)
return 0;
@@ -432,8 +438,8 @@ unsigned int mudocument::ComputeContents()
}
sh_content muctx_content = content_smart_ptr_vec->at(k);
new_content->Page = muctx_content->page;
- new_content->StringMargin = muctx_content->string_margin;
- new_content->StringOrig = muctx_content->string_orig;
+ new_content->StringMargin = char_to_String(muctx_content->string_margin.c_str());
+ new_content->StringOrig = char_to_String(muctx_content->string_orig.c_str());
this->contents->Append(new_content);
}
return num_items;
@@ -448,10 +454,13 @@ ContentItem^ mudocument::GetContent(unsigned int k)
String^ mudocument::ComputeHTML(int page_num)
{
- String^ html;
+ String^ html = nullptr;
+ std::string html_cstr;
mutex_lock.lock();
- html = mu_object.GetHTML(page_num);
+ html_cstr = mu_object.GetHTML(page_num);
mutex_lock.unlock();
+
+ html = char_to_String(html_cstr.c_str());
return html;
}
diff --git a/platform/winrt/mupdfwinrt/utils.cpp b/platform/winrt/mupdfwinrt/utils.cpp
index 38e11ada..9c20c620 100644
--- a/platform/winrt/mupdfwinrt/utils.cpp
+++ b/platform/winrt/mupdfwinrt/utils.cpp
@@ -2,7 +2,7 @@
#include "utils.h"
/* Window string hurdles.... */
-String^ char_to_String(char *char_in)
+String^ char_to_String(const char *char_in)
{
size_t size = MultiByteToWideChar(CP_UTF8, 0, char_in, -1, NULL, 0);
wchar_t *pw;
diff --git a/platform/winrt/mupdfwinrt/utils.h b/platform/winrt/mupdfwinrt/utils.h
index 6ffc7e20..78f4dbc4 100644
--- a/platform/winrt/mupdfwinrt/utils.h
+++ b/platform/winrt/mupdfwinrt/utils.h
@@ -3,5 +3,5 @@
#include "Windows.h"
using namespace Platform;
-String^ char_to_String(char *char_in);
+String^ char_to_String(const char *char_in);
char* String_to_char(String^ text);