#pragma once #include #include #include #include #include "status.h" #include "Cache.h" extern "C" { #include "mupdf/fitz.h" #include "mupdf/pdf-tools.h" } #define MAX_SEARCH 500 enum { SVG_OUT, PNM_OUT, PCL_OUT, PWG_OUT }; enum { HTML = 0, XML, TEXT }; typedef struct point_s { double X; double Y; } point_t; /* Links */ typedef struct document_link_s { link_t type; point_t upper_left; point_t lower_right; std::unique_ptr uri; int page_num; } document_link_t; #define sh_link std::shared_ptr #define sh_vector_link std::shared_ptr> /* Text Search */ typedef struct text_search_s { point_t upper_left; point_t lower_right; } text_search_t; #define sh_text std::shared_ptr #define sh_vector_text std::shared_ptr> /* Content Results */ typedef struct content_s { int page; std::string string_orig; std::string string_margin; } content_t; #define sh_content std::shared_ptr #define sh_vector_content std::shared_ptr> #ifdef _WINRT_DLL using namespace Windows::Storage::Streams; using namespace Windows::Foundation; typedef struct win_stream_struct_s { IRandomAccessStream^ stream; unsigned char public_buffer[4096]; } win_stream_struct; #else typedef struct win_stream_struct_s { char* stream; } win_stream_struct; #endif class muctx { private: CRITICAL_SECTION mu_criticalsec[FZ_LOCK_MAX]; win_stream_struct win_stream; fz_locks_context mu_locks; fz_context *mu_ctx; fz_document *mu_doc; fz_outline *mu_outline; fz_rect mu_hit_bbox[MAX_SEARCH]; void FlattenOutline(fz_outline *outline, int level, sh_vector_content contents_vec); Cache *page_cache; Cache *annot_cache; public: muctx(void); ~muctx(void); void CleanUp(void); 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, void *a_dlist, int page_width, int page_height, unsigned char *bmp_data, int bmp_width, int bmp_height, 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); fz_display_list * CreateDisplayListText(int page_num, int *width, int *height, fz_text_page **text, int *length); fz_display_list * CreateAnnotationList(int page_num); 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); void SetAA(int level); int GetTextSearch(int page_num, char* needle, sh_vector_text texts_vec); int GetContents(sh_vector_content contents_vec); std::string GetText(int page_num, int type); void ReleaseText(void *text); bool RequiresPassword(void); bool ApplyPassword(char* password); status_t SavePage(char *filename, int pagenum, int resolution, int type, bool append); #ifdef _WINRT_DLL status_t InitializeStream(IRandomAccessStream^ readStream, char *ext); #else status_t OpenDocument(char *filename); #endif };