diff options
Diffstat (limited to 'winrt/mupdfwinrt/mudocument.cpp')
-rw-r--r-- | winrt/mupdfwinrt/mudocument.cpp | 348 |
1 files changed, 174 insertions, 174 deletions
diff --git a/winrt/mupdfwinrt/mudocument.cpp b/winrt/mupdfwinrt/mudocument.cpp index bc21a994..c3003e96 100644 --- a/winrt/mupdfwinrt/mudocument.cpp +++ b/winrt/mupdfwinrt/mudocument.cpp @@ -13,233 +13,233 @@ using namespace Platform::Collections; mudocument::mudocument() { - this->mu_object.InitializeContext(); - this->links = nullptr; + this->mu_object.InitializeContext(); + this->links = nullptr; } void mudocument::CleanUp() { - this->mu_object.CleanUp(); + this->mu_object.CleanUp(); } int mudocument::GetNumPages() { - return this->mu_object.GetPageCount(); + return this->mu_object.GetPageCount(); } Point mudocument::GetPageSize(int page_num) { - std::lock_guard<std::mutex> lock(mutex_lock); - return this->mu_object.MeasurePage(page_num); + std::lock_guard<std::mutex> lock(mutex_lock); + return this->mu_object.MeasurePage(page_num); } Windows::Foundation::IAsyncAction^ mudocument::OpenFile(StorageFile^ file) { - return create_async([this, file]() - { - String^ path = file->Path; - const wchar_t *w = path->Data(); - int cb = WideCharToMultiByte(CP_UTF8, 0, w, -1, nullptr, 0, nullptr, nullptr); - char* name = new char[cb]; - - WideCharToMultiByte(CP_UTF8, 0, w ,-1 ,name ,cb ,nullptr, nullptr); - char *ext = strrchr(name, '.'); - - auto t = create_task(file->OpenAsync(FileAccessMode::Read)); - - return t.then([this, file, ext](task<IRandomAccessStream^> task) - { - try - { - IRandomAccessStream^ readStream = task.get(); - UINT64 const size = readStream->Size; - - if (size <= MAXUINT32) - { - HRESULT code = this->mu_object.InitializeStream(readStream, ext); - return; - } - else - { - delete readStream; - return; - } - } - catch(COMException^ ex) { - /* Need to do something useful here */ - throw ex; - } - }); - }); + return create_async([this, file]() + { + String^ path = file->Path; + const wchar_t *w = path->Data(); + int cb = WideCharToMultiByte(CP_UTF8, 0, w, -1, nullptr, 0, nullptr, nullptr); + char* name = new char[cb]; + + WideCharToMultiByte(CP_UTF8, 0, w ,-1 ,name ,cb ,nullptr, nullptr); + char *ext = strrchr(name, '.'); + + auto t = create_task(file->OpenAsync(FileAccessMode::Read)); + + return t.then([this, file, ext](task<IRandomAccessStream^> task) + { + try + { + IRandomAccessStream^ readStream = task.get(); + UINT64 const size = readStream->Size; + + if (size <= MAXUINT32) + { + HRESULT code = this->mu_object.InitializeStream(readStream, ext); + return; + } + else + { + delete readStream; + return; + } + } + catch(COMException^ ex) { + /* Need to do something useful here */ + throw ex; + } + }); + }); } /* Header info for bmp stream so that we can use the image brush */ static void Prepare_bmp(int width, int height, DataWriter ^dw) { - int row_size = width * 4; - int bmp_size = row_size * height + 54; - - dw->WriteString("BM"); - dw->ByteOrder = ByteOrder::LittleEndian; - dw->WriteInt32(bmp_size); - dw->WriteInt16(0); - dw->WriteInt16(0); - dw->WriteInt32(54); - dw->WriteInt32(40); - dw->WriteInt32(width); - dw->WriteInt32(height); - dw->WriteInt16(1); - dw->WriteInt16(32); - dw->WriteInt32(0); - dw->WriteInt32(row_size * height); - dw->WriteInt32(2835); - dw->WriteInt32(2835); - dw->WriteInt32(0); - dw->WriteInt32(0); + int row_size = width * 4; + int bmp_size = row_size * height + 54; + + dw->WriteString("BM"); + dw->ByteOrder = ByteOrder::LittleEndian; + dw->WriteInt32(bmp_size); + dw->WriteInt16(0); + dw->WriteInt16(0); + dw->WriteInt32(54); + dw->WriteInt32(40); + dw->WriteInt32(width); + dw->WriteInt32(height); + dw->WriteInt16(1); + dw->WriteInt16(32); + dw->WriteInt32(0); + dw->WriteInt32(row_size * height); + dw->WriteInt32(2835); + dw->WriteInt32(2835); + dw->WriteInt32(0); + dw->WriteInt32(0); } /* Pack the page into a bmp stream so that we can use it with an image brush */ Windows::Foundation::IAsyncOperation<InMemoryRandomAccessStream^>^ - mudocument::RenderPage(int page_num, int width, int height) + mudocument::RenderPage(int page_num, int width, int height) { - return create_async([this, width, height, page_num](cancellation_token ct) -> InMemoryRandomAccessStream^ - { - /* Allocate space for bmp */ - Array<unsigned char>^ bmp_data = ref new Array<unsigned char>(height * 4 * width); - /* Set up the memory stream */ - InMemoryRandomAccessStream ^ras = ref new InMemoryRandomAccessStream(); - DataWriter ^dw = ref new DataWriter(ras->GetOutputStreamAt(0)); - - /* Go ahead and write our header data into the memory stream */ - Prepare_bmp(width, height, dw); - - std::lock_guard<std::mutex> lock(mutex_lock); - - /* Get raster bitmap stream */ - HRESULT code = mu_object.RenderPage(page_num, width, height, &(bmp_data[0])); - if (code != S_OK) - { - throw ref new FailureException("Page Rendering Failed"); - } - /* Now the data into the memory stream */ - dw->WriteBytes(bmp_data); - DataWriterStoreOperation^ result = dw->StoreAsync(); - /* Block on this Async call? */ - while(result->Status != AsyncStatus::Completed) { - } - /* Return raster stream */ - return ras; - }); + return create_async([this, width, height, page_num](cancellation_token ct) -> InMemoryRandomAccessStream^ + { + /* Allocate space for bmp */ + Array<unsigned char>^ bmp_data = ref new Array<unsigned char>(height * 4 * width); + /* Set up the memory stream */ + InMemoryRandomAccessStream ^ras = ref new InMemoryRandomAccessStream(); + DataWriter ^dw = ref new DataWriter(ras->GetOutputStreamAt(0)); + + /* Go ahead and write our header data into the memory stream */ + Prepare_bmp(width, height, dw); + + std::lock_guard<std::mutex> lock(mutex_lock); + + /* Get raster bitmap stream */ + HRESULT code = mu_object.RenderPage(page_num, width, height, &(bmp_data[0])); + if (code != S_OK) + { + throw ref new FailureException("Page Rendering Failed"); + } + /* Now the data into the memory stream */ + dw->WriteBytes(bmp_data); + DataWriterStoreOperation^ result = dw->StoreAsync(); + /* Block on this Async call? */ + while(result->Status != AsyncStatus::Completed) { + } + /* Return raster stream */ + return ras; + }); } int mudocument::ComputeLinks(int page_num) { - std::lock_guard<std::mutex> lock(mutex_lock); - /* We get back a standard smart pointer from muctx interface and go to WinRT - type here */ - sh_vector_link link_smart_ptr_vec(new std::vector<sh_link>()); - int num_items = mu_object.GetLinks(page_num, link_smart_ptr_vec); - if (num_items == 0) - return 0; - /* Pack into winRT type*/ - this->links = ref new Platform::Collections::Vector<Links^>(); - for (int k = 0; k < num_items; k++) - { - auto new_link = ref new Links(); - 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->PageNum = muctx_link->page_num; - new_link->Type = muctx_link->type; - if (new_link->Type == LINK_URI) - { - String^ str = char_to_String(muctx_link->uri.get()); - // The URI to launch - new_link->Uri = ref new Windows::Foundation::Uri(str); - } - this->links->Append(new_link); - } - return num_items; + std::lock_guard<std::mutex> lock(mutex_lock); + /* We get back a standard smart pointer from muctx interface and go to WinRT + type here */ + sh_vector_link link_smart_ptr_vec(new std::vector<sh_link>()); + int num_items = mu_object.GetLinks(page_num, link_smart_ptr_vec); + if (num_items == 0) + return 0; + /* Pack into winRT type*/ + this->links = ref new Platform::Collections::Vector<Links^>(); + for (int k = 0; k < num_items; k++) + { + auto new_link = ref new Links(); + 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->PageNum = muctx_link->page_num; + new_link->Type = muctx_link->type; + if (new_link->Type == LINK_URI) + { + String^ str = char_to_String(muctx_link->uri.get()); + // The URI to launch + new_link->Uri = ref new Windows::Foundation::Uri(str); + } + this->links->Append(new_link); + } + return num_items; } Links^ mudocument::GetLink(int k) { - if (k >= this->links->Size) - return nullptr; - return this->links->GetAt(k); + if (k >= this->links->Size) + return nullptr; + return this->links->GetAt(k); } int mudocument::ComputeTextSearch(String^ text, int page_num) { - std::lock_guard<std::mutex> lock(mutex_lock); - /* We get back a standard smart pointer from muctx interface and go to WinRT - type here */ - char* text_char = String_to_char(text); - sh_vector_text text_smart_ptr_vec(new std::vector<sh_text>()); - - int num_items = mu_object.GetTextSearch(page_num, text_char, text_smart_ptr_vec); - if (num_items == 0) - return 0; - /* Pack into winRT type*/ - this->textsearch = ref new Platform::Collections::Vector<Links^>(); - for (int k = 0; k < num_items; k++) - { - auto new_link = ref new Links(); - 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->Type = TEXTBOX; - this->textsearch->Append(new_link); - } - delete []text_char; - return num_items; + std::lock_guard<std::mutex> lock(mutex_lock); + /* We get back a standard smart pointer from muctx interface and go to + * WinRT type here */ + char* text_char = String_to_char(text); + sh_vector_text text_smart_ptr_vec(new std::vector<sh_text>()); + + int num_items = mu_object.GetTextSearch(page_num, text_char, text_smart_ptr_vec); + if (num_items == 0) + return 0; + /* Pack into winRT type*/ + this->textsearch = ref new Platform::Collections::Vector<Links^>(); + for (int k = 0; k < num_items; k++) + { + auto new_link = ref new Links(); + 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->Type = TEXTBOX; + this->textsearch->Append(new_link); + } + delete []text_char; + return num_items; } /* Returns the kth item for a page after a text search query */ Links^ mudocument::GetTextSearch(int k) { - if (k >= this->textsearch->Size) - return nullptr; - return this->textsearch->GetAt(k); + if (k >= this->textsearch->Size) + return nullptr; + return this->textsearch->GetAt(k); } int mudocument::ComputeContents() { - std::lock_guard<std::mutex> lock(mutex_lock); - /* We get back a standard smart pointer from muctx interface and go to WinRT - type here */ - - sh_vector_content content_smart_ptr_vec(new std::vector<sh_content>()); - - int has_content = mu_object.GetContents(content_smart_ptr_vec); - - if (!has_content) - return 0; - /* Pack into winRT type*/ - this->contents = ref new Platform::Collections::Vector<ContentItem^>(); - int num_items = content_smart_ptr_vec->size(); - - for (int k = 0; k < num_items; k++) - { - auto new_content = ref new ContentItem(); - 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; - this->contents->Append(new_content); - } - return num_items; + std::lock_guard<std::mutex> lock(mutex_lock); + /* We get back a standard smart pointer from muctx interface and go to + * WinRT type here */ + + sh_vector_content content_smart_ptr_vec(new std::vector<sh_content>()); + + int has_content = mu_object.GetContents(content_smart_ptr_vec); + + if (!has_content) + return 0; + /* Pack into winRT type*/ + this->contents = ref new Platform::Collections::Vector<ContentItem^>(); + int num_items = content_smart_ptr_vec->size(); + + for (int k = 0; k < num_items; k++) + { + auto new_content = ref new ContentItem(); + 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; + this->contents->Append(new_content); + } + return num_items; } ContentItem^ mudocument::GetContent(int k) { - if (k >= this->contents->Size) - return nullptr; - return this->contents->GetAt(k); + if (k >= this->contents->Size) + return nullptr; + return this->contents->GetAt(k); } String^ mudocument::ComputeHTML(int page_num) { - std::lock_guard<std::mutex> lock(mutex_lock); - return mu_object.GetHTML(page_num); + std::lock_guard<std::mutex> lock(mutex_lock); + return mu_object.GetHTML(page_num); } |