diff options
author | Michael Vrhel <michael.vrhel@artifex.com> | 2013-05-06 13:41:42 -0700 |
---|---|---|
committer | Robin Watts <robin.watts@artifex.com> | 2013-05-16 19:25:46 +0100 |
commit | 7a9a18d03019ee21bd9c3362523d5599e03dd919 (patch) | |
tree | fbbf7ceb887cff58e9303f1bd5d9b43c348cc959 | |
parent | 7b861bf1835bc247bcc2016e72899f5672d0fa61 (diff) | |
download | mupdf-7a9a18d03019ee21bd9c3362523d5599e03dd919.tar.xz |
Addition of html viewing with winRT library call
-rw-r--r-- | winrt/mupdf_cpp/MainPage.xaml | 17 | ||||
-rw-r--r-- | winrt/mupdf_cpp/MainPage.xaml.cpp | 42 | ||||
-rw-r--r-- | winrt/mupdfwinrt/muctx.cpp | 63 | ||||
-rw-r--r-- | winrt/mupdfwinrt/muctx.h | 4 | ||||
-rw-r--r-- | winrt/mupdfwinrt/mudocument.cpp | 6 | ||||
-rw-r--r-- | winrt/mupdfwinrt/mudocument.h | 1 |
6 files changed, 89 insertions, 44 deletions
diff --git a/winrt/mupdf_cpp/MainPage.xaml b/winrt/mupdf_cpp/MainPage.xaml index 54318e75..b9af3dd9 100644 --- a/winrt/mupdf_cpp/MainPage.xaml +++ b/winrt/mupdf_cpp/MainPage.xaml @@ -134,16 +134,13 @@ </ListView.Background> </ListView> </Grid> - <StackPanel x:Name="xaml_RichGrid" Orientation="Vertical" Margin="5,5,5,50" - Width="Auto" Height="Auto" Visibility="Collapsed"> - <TextBlock HorizontalAlignment="Center" Text="FontSize:" FontSize="18" Margin="0, 10, 0, -10"/> - <Slider x:Name="fontSizeSlider" Width="200" Value="20" Minimum="8" Maximum="40" - TickFrequency="4" Orientation="Horizontal" HorizontalAlignment="Center" /> - <RichEditBox x:Name="xaml_RichText" FontSize="{Binding Value, ElementName=fontSizeSlider}" - Visibility="Collapsed" HorizontalAlignment="Center" - VerticalAlignment="Top"> - </RichEditBox> - </StackPanel> + <WebView x:Name="xaml_WebView" HorizontalAlignment="Stretch" Width="Auto" Height="Auto" + VerticalAlignment="Stretch" Visibility="Collapsed" + ScrollViewer.HorizontalScrollBarVisibility="Visible" + ScrollViewer.VerticalScrollBarVisibility="Visible" + ScrollViewer.VerticalScrollMode="Enabled" + ScrollViewer.HorizontalScrollMode="Enabled" + ScrollViewer.ZoomMode="Enabled"/> </Grid> </Page> diff --git a/winrt/mupdf_cpp/MainPage.xaml.cpp b/winrt/mupdf_cpp/MainPage.xaml.cpp index af38b6d3..a75f1500 100644 --- a/winrt/mupdf_cpp/MainPage.xaml.cpp +++ b/winrt/mupdf_cpp/MainPage.xaml.cpp @@ -1094,12 +1094,12 @@ void mupdf_cpp::MainPage::GridSizeChanged() xaml_vert_flipView->Opacity = 0; } - if (xaml_RichText->Visibility == Windows::UI::Xaml::Visibility::Visible) + if (xaml_WebView->Visibility == Windows::UI::Xaml::Visibility::Visible) { int height = xaml_OutsideGrid->ActualHeight; int height_app = TopAppBar1->ActualHeight; - xaml_RichText->Height = height - height_app; + xaml_WebView->Height = height - height_app; } UpDatePageSizes(); @@ -1416,17 +1416,16 @@ void mupdf_cpp::MainPage::ContentSelected(Platform::Object^ sender, Windows::UI: void mupdf_cpp::MainPage::Reflower(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { -#if 0 if (this->m_num_pages < 0) return; - if (xaml_RichText->Visibility == Windows::UI::Xaml::Visibility::Visible) + if (xaml_WebView->Visibility == Windows::UI::Xaml::Visibility::Visible) { /* Go back to flip view */ - xaml_RichText->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + xaml_WebView->Visibility = Windows::UI::Xaml::Visibility::Collapsed; this->xaml_MainGrid->Opacity = 1.0; this->m_curr_flipView->IsEnabled = true; - xaml_RichGrid->Visibility = Windows::UI::Xaml::Visibility::Collapsed; - xaml_RichGrid->Opacity = 0.0; + xaml_WebView->Visibility = Windows::UI::Xaml::Visibility::Collapsed; + xaml_WebView->Opacity = 0.0; } else if (this->m_curr_flipView->IsEnabled) @@ -1443,39 +1442,16 @@ void mupdf_cpp::MainPage::Reflower(Platform::Object^ sender, Windows::UI::Xaml:: } }).then([this]() { - fz_rect bounds; - fz_output *out; - fz_page *page = fz_load_page(m_doc, this->m_currpage); - fz_text_sheet *sheet = fz_new_text_sheet(ctx); - fz_text_page *text = fz_new_text_page(ctx, &fz_empty_rect); - fz_device *dev = fz_new_text_device(ctx, sheet, text); - - fz_run_page(m_doc, page, dev, &fz_identity, NULL); - fz_free_device(dev); - dev = NULL; - fz_text_analysis(ctx, sheet, text); - fz_buffer *buf = fz_new_buffer(ctx, 256); - out = fz_new_output_buffer(ctx, buf); - fz_print_text_page(ctx, out, text); - xaml_RichText->Visibility = Windows::UI::Xaml::Visibility::Visible; + String^ html_string = mu_doc->ComputeHTML(this->m_currpage); + xaml_WebView->Visibility = Windows::UI::Xaml::Visibility::Visible; this->xaml_MainGrid->Opacity = 0.0; this->m_curr_flipView->IsEnabled = false; - String^ html_string = char_to_String((char*) buf->data); - - xaml_RichGrid->Visibility = Windows::UI::Xaml::Visibility::Visible; - xaml_RichGrid->Opacity = 1.0; - int height = xaml_OutsideGrid->ActualHeight; - int height_app = TopAppBar1->ActualHeight; - - xaml_RichText->Height = height - height_app; - this->xaml_RichText->Document->SetText(Windows::UI::Text::TextSetOptions::FormatRtf, html_string); - + this->xaml_WebView->NavigateToString(html_string); /* Check if thumb rendering is done. If not then restart */ if (this->m_num_pages != this->m_thumb_page_start) this->RenderThumbs(); }, task_continuation_context::use_current()); } -#endif } /* Need to handle resizing of app bar to make sure everything fits */ diff --git a/winrt/mupdfwinrt/muctx.cpp b/winrt/mupdfwinrt/muctx.cpp index 2fefd199..a26ddffa 100644 --- a/winrt/mupdfwinrt/muctx.cpp +++ b/winrt/mupdfwinrt/muctx.cpp @@ -290,7 +290,7 @@ int muctx::GetTextSearch(int page_num, char* needle, sh_vector_text texts_vec) { page = fz_load_page(mu_doc, page_num); sheet = fz_new_text_sheet(ctx_clone); - text = fz_new_text_page(ctx_clone, &fz_empty_rect); + text = fz_new_text_page(ctx_clone, &fz_empty_rect); // Free? dev = fz_new_text_device(ctx_clone, sheet, text); fz_run_page(mu_doc, page, dev, &fz_identity, NULL); fz_free_device(dev); /* Why does this need to be done here? Seems odd */ @@ -468,3 +468,64 @@ HRESULT muctx::RenderPage(int page_num, int width, int height, return S_OK; } + +String^ muctx::GetHTML(int page_num) +{ + fz_output *out; + fz_rect bounds; + fz_device *dev; + fz_page *page; + fz_text_sheet *sheet; + fz_text_page *text; + fz_context *ctx_clone; + fz_buffer *buf; + String^ html; + + if (mu_cookie->abort == 1) + return nullptr; + + ctx_clone = fz_clone_context(mu_ctx); + + fz_var(dev); + fz_var(page); + fz_var(sheet); + fz_var(text); // Free? + fz_var(buf); // Free? + fz_try(ctx_clone) + { + page = fz_load_page(mu_doc, page_num); + sheet = fz_new_text_sheet(ctx_clone); + text = fz_new_text_page(ctx_clone, &fz_empty_rect); + dev = fz_new_text_device(ctx_clone, sheet, text); + fz_run_page(mu_doc, page, dev, &fz_identity, NULL); + fz_free_device(dev); + dev = NULL; + fz_text_analysis(ctx_clone, sheet, text); + buf = fz_new_buffer(ctx_clone, 256); + out = fz_new_output_buffer(ctx_clone, buf); + fz_print_text_page_html(ctx_clone, out, text); + html = char_to_String((char*) buf->data); + } + fz_always(ctx_clone) + { + if (dev != NULL) + { + fz_free_device(dev); + } + if (page != NULL) + { + fz_free_page(mu_doc, page); + } + if (sheet != NULL) + { + fz_free_text_sheet(ctx_clone, sheet); + } + } + fz_catch(ctx_clone) + { + return nullptr; + } + + fz_free_context(ctx_clone); + return html; +} diff --git a/winrt/mupdfwinrt/muctx.h b/winrt/mupdfwinrt/muctx.h index 2c8e45d7..112d6cb5 100644 --- a/winrt/mupdfwinrt/muctx.h +++ b/winrt/mupdfwinrt/muctx.h @@ -54,6 +54,9 @@ typedef struct content_s #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 */ using namespace Windows::Storage::Streams; using namespace Windows::Foundation; @@ -90,4 +93,5 @@ public: 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); }; diff --git a/winrt/mupdfwinrt/mudocument.cpp b/winrt/mupdfwinrt/mudocument.cpp index 18b3c63d..c9b4e33d 100644 --- a/winrt/mupdfwinrt/mudocument.cpp +++ b/winrt/mupdfwinrt/mudocument.cpp @@ -230,3 +230,9 @@ ContentItem^ mudocument::GetContent(int k) 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); +} diff --git a/winrt/mupdfwinrt/mudocument.h b/winrt/mupdfwinrt/mudocument.h index 0bce8654..2c96888d 100644 --- a/winrt/mupdfwinrt/mudocument.h +++ b/winrt/mupdfwinrt/mudocument.h @@ -33,6 +33,7 @@ namespace mupdfwinrt Point GetPageSize(int page_num); Windows::Foundation::IAsyncOperation<InMemoryRandomAccessStream^>^ RenderPage(int page_num, int width, int height); + String^ ComputeHTML(int page_num); int ComputeTextSearch(String^ text, int page_num); Links^ GetTextSearch(int k); int ComputeContents(void); |