summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Vrhel <michael.vrhel@artifex.com>2013-05-06 13:41:42 -0700
committerRobin Watts <robin.watts@artifex.com>2013-05-16 19:25:46 +0100
commit7a9a18d03019ee21bd9c3362523d5599e03dd919 (patch)
treefbbf7ceb887cff58e9303f1bd5d9b43c348cc959
parent7b861bf1835bc247bcc2016e72899f5672d0fa61 (diff)
downloadmupdf-7a9a18d03019ee21bd9c3362523d5599e03dd919.tar.xz
Addition of html viewing with winRT library call
-rw-r--r--winrt/mupdf_cpp/MainPage.xaml17
-rw-r--r--winrt/mupdf_cpp/MainPage.xaml.cpp42
-rw-r--r--winrt/mupdfwinrt/muctx.cpp63
-rw-r--r--winrt/mupdfwinrt/muctx.h4
-rw-r--r--winrt/mupdfwinrt/mudocument.cpp6
-rw-r--r--winrt/mupdfwinrt/mudocument.h1
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);