From e067b19903248578131696905de4241cc58dece0 Mon Sep 17 00:00:00 2001 From: Alex Fabijanic Date: Tue, 21 Nov 2017 20:42:14 -0600 Subject: [PATCH] upgrade libHaru to 2.3.0; make UTF-8 encoding default; some internal modifications and fixes --- PDF/PDF_vs90.vcproj | 968 +++++++++++++++++------- PDF/include/Poco/PDF/Document.h | 28 +- PDF/include/Poco/PDF/Page.h | 27 +- PDF/include/Poco/PDF/hpdf.h | 342 ++++++++- PDF/include/Poco/PDF/hpdf_3dmeasure.h | 57 ++ PDF/include/Poco/PDF/hpdf_annotation.h | 47 +- PDF/include/Poco/PDF/hpdf_catalog.h | 14 +- PDF/include/Poco/PDF/hpdf_conf.h | 15 +- PDF/include/Poco/PDF/hpdf_config.h | 75 ++ PDF/include/Poco/PDF/hpdf_consts.h | 14 +- PDF/include/Poco/PDF/hpdf_destination.h | 5 +- PDF/include/Poco/PDF/hpdf_doc.h | 5 +- PDF/include/Poco/PDF/hpdf_encoder.h | 17 +- PDF/include/Poco/PDF/hpdf_encrypt.h | 5 +- PDF/include/Poco/PDF/hpdf_encryptdict.h | 5 +- PDF/include/Poco/PDF/hpdf_error.h | 16 +- PDF/include/Poco/PDF/hpdf_exdata.h | 41 + PDF/include/Poco/PDF/hpdf_ext_gstate.h | 5 +- PDF/include/Poco/PDF/hpdf_font.h | 5 +- PDF/include/Poco/PDF/hpdf_fontdef.h | 9 +- PDF/include/Poco/PDF/hpdf_gstate.h | 5 +- PDF/include/Poco/PDF/hpdf_image.h | 31 +- PDF/include/Poco/PDF/hpdf_info.h | 5 +- PDF/include/Poco/PDF/hpdf_list.h | 7 +- PDF/include/Poco/PDF/hpdf_mmgr.h | 5 +- PDF/include/Poco/PDF/hpdf_namedict.h | 76 ++ PDF/include/Poco/PDF/hpdf_objects.h | 29 +- PDF/include/Poco/PDF/hpdf_outline.h | 5 +- PDF/include/Poco/PDF/hpdf_page_label.h | 5 +- PDF/include/Poco/PDF/hpdf_pages.h | 5 +- PDF/include/Poco/PDF/hpdf_pdfa.h | 43 ++ PDF/include/Poco/PDF/hpdf_streams.h | 10 +- PDF/include/Poco/PDF/hpdf_types.h | 85 ++- PDF/include/Poco/PDF/hpdf_u3d.h | 53 ++ PDF/include/Poco/PDF/hpdf_utils.h | 14 +- PDF/include/Poco/PDF/hpdf_version.h | 8 + PDF/samples/Image/Image.pdf | Bin 0 -> 4367 bytes PDF/samples/Text/FreeSans.ttf | Bin 0 -> 568896 bytes PDF/samples/Text/Text.pdf | Bin 0 -> 15904 bytes PDF/samples/Text/src/Text.cpp | Bin 1311 -> 3238 bytes PDF/src/Document.cpp | 24 +- PDF/src/Page.cpp | 55 +- PDF/src/hpdf_3dmeasure.c | 235 ++++++ PDF/src/hpdf_annotation.c | 779 ++++++++++++++++++- PDF/src/hpdf_array.c | 12 +- PDF/src/hpdf_binary.c | 5 +- PDF/src/hpdf_boolean.c | 5 +- PDF/src/hpdf_catalog.c | 41 +- PDF/src/hpdf_destination.c | 13 +- PDF/src/hpdf_dict.c | 40 +- PDF/src/hpdf_doc.c | 392 +++++++++- PDF/src/hpdf_doc_png.c | 55 +- PDF/src/hpdf_encoder.c | 91 ++- PDF/src/hpdf_encoder_cns.c | 9 +- PDF/src/hpdf_encoder_cnt.c | 7 +- PDF/src/hpdf_encoder_jp.c | 9 +- PDF/src/hpdf_encoder_kr.c | 9 +- PDF/src/hpdf_encoder_utf.c | 276 +++++++ PDF/src/hpdf_encrypt.c | 51 +- PDF/src/hpdf_encryptdict.c | 23 +- PDF/src/hpdf_error.c | 8 +- PDF/src/hpdf_exdata.c | 69 ++ PDF/src/hpdf_ext_gstate.c | 7 +- PDF/src/hpdf_font.c | 6 +- PDF/src/hpdf_font_cid.c | 218 ++++-- PDF/src/hpdf_font_tt.c | 18 +- PDF/src/hpdf_font_type1.c | 9 +- PDF/src/hpdf_fontdef.c | 7 +- PDF/src/hpdf_fontdef_base14.c | 8 +- PDF/src/hpdf_fontdef_cid.c | 7 +- PDF/src/hpdf_fontdef_cns.c | 5 +- PDF/src/hpdf_fontdef_cnt.c | 5 +- PDF/src/hpdf_fontdef_jp.c | 79 +- PDF/src/hpdf_fontdef_kr.c | 5 +- PDF/src/hpdf_fontdef_tt.c | 191 +++-- PDF/src/hpdf_fontdef_type1.c | 52 +- PDF/src/hpdf_gstate.c | 6 +- PDF/src/hpdf_image.c | 146 +++- PDF/src/hpdf_image_ccitt.c | 797 +++++++++++++++++++ PDF/src/hpdf_image_png.c | 463 +++++++++--- PDF/src/hpdf_info.c | 16 +- PDF/src/hpdf_list.c | 7 +- PDF/src/hpdf_mmgr.c | 13 +- PDF/src/hpdf_name.c | 5 +- PDF/src/hpdf_namedict.c | 237 ++++++ PDF/src/hpdf_null.c | 5 +- PDF/src/hpdf_number.c | 5 +- PDF/src/hpdf_objects.c | 7 +- PDF/src/hpdf_outline.c | 13 +- PDF/src/hpdf_page_label.c | 5 +- PDF/src/hpdf_page_operator.c | 551 +++++++++----- PDF/src/hpdf_pages.c | 511 ++++++++++++- PDF/src/hpdf_pdfa.c | 386 ++++++++++ PDF/src/hpdf_real.c | 5 +- PDF/src/hpdf_streams.c | 107 ++- PDF/src/hpdf_string.c | 27 +- PDF/src/hpdf_u3d.c | 880 +++++++++++++++++++++ PDF/src/hpdf_utils.c | 23 +- PDF/src/hpdf_xref.c | 9 +- PDF/src/t4.h | 285 +++++++ 100 files changed, 8241 insertions(+), 1179 deletions(-) create mode 100644 PDF/include/Poco/PDF/hpdf_3dmeasure.h create mode 100644 PDF/include/Poco/PDF/hpdf_config.h create mode 100644 PDF/include/Poco/PDF/hpdf_exdata.h create mode 100644 PDF/include/Poco/PDF/hpdf_namedict.h create mode 100644 PDF/include/Poco/PDF/hpdf_pdfa.h create mode 100644 PDF/include/Poco/PDF/hpdf_u3d.h create mode 100644 PDF/include/Poco/PDF/hpdf_version.h create mode 100644 PDF/samples/Image/Image.pdf create mode 100644 PDF/samples/Text/FreeSans.ttf create mode 100644 PDF/samples/Text/Text.pdf create mode 100644 PDF/src/hpdf_3dmeasure.c create mode 100644 PDF/src/hpdf_encoder_utf.c create mode 100644 PDF/src/hpdf_exdata.c create mode 100644 PDF/src/hpdf_image_ccitt.c create mode 100644 PDF/src/hpdf_namedict.c create mode 100644 PDF/src/hpdf_pdfa.c create mode 100644 PDF/src/hpdf_u3d.c create mode 100644 PDF/src/t4.h diff --git a/PDF/PDF_vs90.vcproj b/PDF/PDF_vs90.vcproj index 8c6d0569b..a051b4726 100644 --- a/PDF/PDF_vs90.vcproj +++ b/PDF/PDF_vs90.vcproj @@ -1,35 +1,46 @@ + Keyword="Win32Proj" + TargetFrameworkVersion="0" + > + Name="Win32" + /> - + + + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + /> + Name="VCALinkTool" + /> + Name="VCManifestTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCAppVerifierTool" + /> + Name="VCPostBuildEventTool" + /> + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + /> + Name="VCALinkTool" + /> + Name="VCManifestTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCAppVerifierTool" + /> + Name="VCPostBuildEventTool" + /> + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + OutputFile="..\lib\PocoPDFmtd.lib" + /> + Name="VCALinkTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCPostBuildEventTool" + /> + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + OutputFile="..\lib\PocoPDFmt.lib" + /> + Name="VCALinkTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCPostBuildEventTool" + /> + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + OutputFile="..\lib\PocoPDFmdd.lib" + /> + Name="VCALinkTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCPostBuildEventTool" + /> + CharacterSet="2" + > + Name="VCPreBuildEventTool" + /> + Name="VCCustomBuildTool" + /> + Name="VCXMLDataGeneratorTool" + /> + Name="VCWebServiceProxyGeneratorTool" + /> + Name="VCMIDLTool" + /> + /> + Name="VCManagedResourceCompilerTool" + /> + Name="VCResourceCompilerTool" + /> + Name="VCPreLinkEventTool" + /> + OutputFile="..\lib\PocoPDFmd.lib" + /> + Name="VCALinkTool" + /> + Name="VCXDCMakeTool" + /> + Name="VCBscMakeTool" + /> + Name="VCFxCopTool" + /> + Name="VCPostBuildEventTool" + /> - + + + Name="Source Files" + > + RelativePath=".\src\Destination.cpp" + > + + RelativePath=".\src\Document.cpp" + > + + RelativePath=".\src\Encoder.cpp" + > + + RelativePath=".\src\Font.cpp" + > + + RelativePath=".\src\Image.cpp" + > + + RelativePath=".\src\LinkAnnotation.cpp" + > + + RelativePath=".\src\Outline.cpp" + > + + RelativePath=".\src\Page.cpp" + > + + RelativePath=".\src\PDFException.cpp" + > + + RelativePath=".\src\TextAnnotation.cpp" + > + + Name="Header Files" + > + RelativePath=".\include\Poco\PDF\Destination.h" + > + + RelativePath=".\include\Poco\PDF\Document.h" + > + + RelativePath=".\include\Poco\PDF\Encoder.h" + > + + RelativePath=".\include\Poco\PDF\Font.h" + > + + RelativePath=".\include\Poco\PDF\Image.h" + > + + RelativePath=".\include\Poco\PDF\LinkAnnotation.h" + > + + RelativePath=".\include\Poco\PDF\Outline.h" + > + + RelativePath=".\include\Poco\PDF\Page.h" + > + + RelativePath=".\include\Poco\PDF\PDF.h" + > + + RelativePath=".\include\Poco\PDF\PDFException.h" + > + + RelativePath=".\include\Poco\PDF\Resource.h" + > + + RelativePath=".\include\Poco\PDF\TextAnnotation.h" + > + + Name="3rd Party" + > + Name="PNG" + > + Name="Header Files" + > + RelativePath=".\include\Poco\PDF\png.h" + > + + RelativePath=".\include\Poco\PDF\pngconf.h" + > + + Name="Source Files" + > + RelativePath=".\src\png.c" + > + + RelativePath=".\src\pngerror.c" + > + + RelativePath=".\src\pnggccrd.c" + > + + RelativePath=".\src\pngget.c" + > + + RelativePath=".\src\pngmem.c" + > + + RelativePath=".\src\pngpread.c" + > + + RelativePath=".\src\pngread.c" + > + + RelativePath=".\src\pngrio.c" + > + + RelativePath=".\src\pngrtran.c" + > + + RelativePath=".\src\pngrutil.c" + > + + RelativePath=".\src\pngset.c" + > + + RelativePath=".\src\pngtest.c" + > + + RelativePath=".\src\pngtrans.c" + > + + RelativePath=".\src\pngvcrd.c" + > + + RelativePath=".\src\pngwio.c" + > + + RelativePath=".\src\pngwrite.c" + > + + RelativePath=".\src\pngwtran.c" + > + + RelativePath=".\src\pngwutil.c" + > + + Name="zlib" + > + Name="Header Files" + > + RelativePath=".\include\Poco\PDF\crc32.h" + > + + RelativePath=".\include\Poco\PDF\deflate.h" + > + + RelativePath=".\include\Poco\PDF\inffast.h" + > + + RelativePath=".\include\Poco\PDF\inffixed.h" + > + + RelativePath=".\include\Poco\PDF\inflate.h" + > + + RelativePath=".\include\Poco\PDF\inftrees.h" + > + + RelativePath=".\include\Poco\PDF\trees.h" + > + + RelativePath=".\include\Poco\PDF\zconf.h" + > + + RelativePath=".\include\Poco\PDF\zlib.h" + > + + RelativePath=".\include\Poco\PDF\zutil.h" + > + + Name="Source Files" + > + RelativePath=".\src\adler32.c" + > + + RelativePath=".\src\compress.c" + > + + RelativePath=".\src\crc32.c" + > + + RelativePath=".\src\deflate.c" + > + + RelativePath=".\src\gzio.c" + > + + RelativePath=".\src\infback.c" + > + + RelativePath=".\src\inffast.c" + > + + RelativePath=".\src\inflate.c" + > + + RelativePath=".\src\inftrees.c" + > + + RelativePath=".\src\trees.c" + > + + RelativePath=".\src\zutil.c" + > + + Name="HARU" + > + Name="Source Files" + > + RelativePath=".\src\hpdf_3dmeasure.c" + > + + RelativePath=".\src\hpdf_annotation.c" + > + + RelativePath=".\src\hpdf_array.c" + > + + RelativePath=".\src\hpdf_binary.c" + > + + RelativePath=".\src\hpdf_boolean.c" + > + + RelativePath=".\src\hpdf_catalog.c" + > + + RelativePath=".\src\hpdf_destination.c" + > + + RelativePath=".\src\hpdf_dict.c" + > + + RelativePath=".\src\hpdf_doc.c" + > + + RelativePath=".\src\hpdf_doc_png.c" + > + + RelativePath=".\src\hpdf_encoder.c" + > + + RelativePath=".\src\hpdf_encoder_cns.c" + > + + RelativePath=".\src\hpdf_encoder_cnt.c" + > + + RelativePath=".\src\hpdf_encoder_jp.c" + > + + RelativePath=".\src\hpdf_encoder_kr.c" + > + + RelativePath=".\src\hpdf_encoder_utf.c" + > + + RelativePath=".\src\hpdf_encrypt.c" + > + + RelativePath=".\src\hpdf_encryptdict.c" + > + + RelativePath=".\src\hpdf_error.c" + > + + RelativePath=".\src\hpdf_exdata.c" + > + + RelativePath=".\src\hpdf_ext_gstate.c" + > + + RelativePath=".\src\hpdf_font.c" + > + + RelativePath=".\src\hpdf_font_cid.c" + > + + RelativePath=".\src\hpdf_font_tt.c" + > + + RelativePath=".\src\hpdf_font_type1.c" + > + + RelativePath=".\src\hpdf_fontdef.c" + > + + RelativePath=".\src\hpdf_fontdef_base14.c" + > + + RelativePath=".\src\hpdf_fontdef_cid.c" + > + + RelativePath=".\src\hpdf_fontdef_cns.c" + > + + RelativePath=".\src\hpdf_fontdef_cnt.c" + > + + RelativePath=".\src\hpdf_fontdef_jp.c" + > + + RelativePath=".\src\hpdf_fontdef_kr.c" + > + + RelativePath=".\src\hpdf_fontdef_tt.c" + > + + RelativePath=".\src\hpdf_fontdef_type1.c" + > + + RelativePath=".\src\hpdf_gstate.c" + > + + RelativePath=".\src\hpdf_image.c" + > + + RelativePath=".\src\hpdf_image_ccitt.c" + > + + RelativePath=".\src\hpdf_image_png.c" + > + + RelativePath=".\src\hpdf_info.c" + > + + RelativePath=".\src\hpdf_list.c" + > + + RelativePath=".\src\hpdf_mmgr.c" + > + + RelativePath=".\src\hpdf_name.c" + > + + RelativePath=".\src\hpdf_namedict.c" + > + + RelativePath=".\src\hpdf_null.c" + > + + RelativePath=".\src\hpdf_number.c" + > + + RelativePath=".\src\hpdf_objects.c" + > + + RelativePath=".\src\hpdf_outline.c" + > + + RelativePath=".\src\hpdf_page_label.c" + > + + RelativePath=".\src\hpdf_page_operator.c" + > + + RelativePath=".\src\hpdf_pages.c" + > + + + + + + + + + + + + + + + + Name="Header Files" + > + RelativePath=".\include\Poco\PDF\hpdf.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_3dmeasure.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_annotation.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_catalog.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_conf.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_consts.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_destination.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_doc.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_encoder.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_encrypt.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_encryptdict.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_error.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_exdata.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_ext_gstate.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_font.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_fontdef.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_gstate.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_image.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_info.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_list.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_mmgr.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_namedict.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_objects.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_outline.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_page_label.h" + > + + RelativePath=".\include\Poco\PDF\hpdf_pages.h" + > + + + + + + + + + + + + + - + + diff --git a/PDF/include/Poco/PDF/Document.h b/PDF/include/Poco/PDF/Document.h index b34ecb0da..c3ed14a28 100644 --- a/PDF/include/Poco/PDF/Document.h +++ b/PDF/include/Poco/PDF/Document.h @@ -219,7 +219,7 @@ public: /// Loads type 1 font from file. Returns font name. std::string loadTTFont(const std::string& fileName, bool embedding, int index = -1); - /// Loads type 1 font from file. Returns font name. + /// Loads true type font from file. Returns font name. /// If the embedding parameter is true, the glyph data of the font is embedded, /// otherwise only the matrix data is included in PDF file. @@ -253,6 +253,9 @@ public: void addPageLabel(int pageNum, PageNumberStyle style, int firstPage, const std::string& prefix = ""); /// adds page labeling range for the document. + void useUTF8Encoding(); + /// Enables use of UTF-8 encoding (default enabled). + void useJapaneseFonts(); /// Enables use of Japanese fonts. @@ -304,7 +307,13 @@ public: std::size_t pageCount() const; /// Returns number of pages in the document. + private: + HPDF_Doc& handle(); + + void init(Poco::UInt32 pageCount, + Page::Size pageSize, Page::Orientation orientation); + void reset(bool all = false); /// Resets the current document. If all is true, the loaded /// resources (e.g. fonts, encodings ...)are unloaded. Otherwise @@ -321,6 +330,8 @@ private: EncoderContainer _encoders; OutlineContainer _outlines; ImageContainer _images; + + friend class Page; }; @@ -360,8 +371,7 @@ inline Document::PageMode Document::getPageMode() const /* inline void openAction() { - HPDF_SetOpenAction(_pdf, - HPDF_Destination open_action); + HPDF_SetOpenAction(_pdf, HPDF_Destination open_action); } */ @@ -394,6 +404,12 @@ inline void Document::addPageLabel(int pageNum, PageNumberStyle style, int first } +inline void Document::useUTF8Encoding() +{ + HPDF_UseUTFEncodings(_pdf); +} + + inline void Document::useJapaneseFonts() { HPDF_UseJPFonts(_pdf); @@ -478,6 +494,12 @@ inline std::size_t Document::pageCount() const } +inline HPDF_Doc& Document::handle() +{ + return _pdf; +} + + } } // namespace Poco::PDF diff --git a/PDF/include/Poco/PDF/Page.h b/PDF/include/Poco/PDF/Page.h index 54bbd98f4..538b64f4e 100644 --- a/PDF/include/Poco/PDF/Page.h +++ b/PDF/include/Poco/PDF/Page.h @@ -34,6 +34,9 @@ namespace Poco { namespace PDF { +class Document; + + class PDF_API Page /// A Page represents a PDF page object. { @@ -74,9 +77,9 @@ public: enum Orientation { ORIENTATION_PORTRAIT = HPDF_PAGE_PORTRAIT, - // Portrait orientation. + // Portrait orientation. ORIENTATION_LANDSCAPE = HPDF_PAGE_LANDSCAPE - // Landscape orientation. + // Landscape orientation. }; enum RenderMode @@ -141,7 +144,7 @@ public: /// Add spaces between the words to justify both left and right side. }; - Page(HPDF_Doc* pPDF, + Page(Document* pDocument, const HPDF_Page& page, Size pageSize = PAGE_SIZE_LETTER, Orientation orientation = ORIENTATION_PORTRAIT); @@ -199,6 +202,9 @@ public: void setFont(const Font& font, float size); /// Sets the font. + void setFont(const std::string& fontName, float size, const std::string& encoding = ""); + /// Sets the font. + float textWidth(const std::string& text); /// Returns the width of the supplied text. @@ -511,7 +517,7 @@ public: private: Page(); - HPDF_Doc* _pPDF; + Document* _pDocument; HPDF_Page _page; Size _size; Orientation _orientation; @@ -533,12 +539,6 @@ inline Page::operator const Page::Type& () const } -inline bool Page::operator == (const Page& other) const -{ - return _pPDF == other._pPDF && _page == other._page; -} - - inline void Page::setWidth(float value) { HPDF_Page_SetWidth(_page, value); @@ -795,13 +795,6 @@ inline void Page::moveTextNextLine() } -inline const Font& Page::getFont() const -{ - delete _pCurrentFont; - return *(_pCurrentFont = new Font(_pPDF, HPDF_Page_GetCurrentFont(_page))); -} - - inline float Page::getFontSize() const { return HPDF_Page_GetCurrentFontSize(_page); diff --git a/PDF/include/Poco/PDF/hpdf.h b/PDF/include/Poco/PDF/hpdf.h index c849db8aa..e369f6744 100644 --- a/PDF/include/Poco/PDF/hpdf.h +++ b/PDF/include/Poco/PDF/hpdf.h @@ -1,7 +1,7 @@ /* * << Haru Free PDF Library 2.0.8 >> -- hpdf.h * - * URL http://libharu.sourceforge.net/ + * URL http://libharu.org/ * * Copyright (c) 1999-2006 Takeshi Kanno * @@ -17,6 +17,11 @@ #ifndef _HPDF_H #define _HPDF_H +#include "hpdf_config.h" +#include "hpdf_version.h" + +#define HPDF_UNUSED(a) ((void)(a)) + #ifdef HPDF_DLL_MAKE # define HPDF_EXPORT(A) __declspec(dllexport) A __stdcall #else @@ -57,10 +62,21 @@ typedef HPDF_HANDLE HPDF_Image; typedef HPDF_HANDLE HPDF_Font; typedef HPDF_HANDLE HPDF_Outline; typedef HPDF_HANDLE HPDF_Encoder; +typedef HPDF_HANDLE HPDF_3DMeasure; +typedef HPDF_HANDLE HPDF_ExData; typedef HPDF_HANDLE HPDF_Destination; typedef HPDF_HANDLE HPDF_XObject; typedef HPDF_HANDLE HPDF_Annotation; typedef HPDF_HANDLE HPDF_ExtGState; +typedef HPDF_HANDLE HPDF_FontDef; +typedef HPDF_HANDLE HPDF_U3D; +typedef HPDF_HANDLE HPDF_JavaScript; +typedef HPDF_HANDLE HPDF_Error; +typedef HPDF_HANDLE HPDF_MMgr; +typedef HPDF_HANDLE HPDF_Dict; +typedef HPDF_HANDLE HPDF_EmbeddedFile; +typedef HPDF_HANDLE HPDF_OutputIntent; +typedef HPDF_HANDLE HPDF_Xref; #else @@ -70,6 +86,8 @@ typedef HPDF_HANDLE HPDF_ExtGState; #include "hpdf_consts.h" #include "hpdf_doc.h" +#include "hpdf_error.h" +#include "hpdf_pdfa.h" #endif /* HPDF_SHARED */ @@ -121,6 +139,10 @@ HPDF_FreeDocAll (HPDF_Doc pdf); HPDF_EXPORT(HPDF_STATUS) HPDF_SaveToStream (HPDF_Doc pdf); +HPDF_EXPORT(HPDF_STATUS) +HPDF_GetContents (HPDF_Doc pdf, + HPDF_BYTE *buf, + HPDF_UINT32 *size); HPDF_EXPORT(HPDF_UINT32) HPDF_GetStreamSize (HPDF_Doc pdf); @@ -152,6 +174,10 @@ HPDF_EXPORT(void) HPDF_ResetError (HPDF_Doc pdf); +HPDF_EXPORT(HPDF_STATUS) +HPDF_CheckError (HPDF_Error error); + + HPDF_EXPORT(HPDF_STATUS) HPDF_SetPagesConfiguration (HPDF_Doc pdf, HPDF_UINT page_per_pages); @@ -233,6 +259,10 @@ HPDF_EXPORT(HPDF_STATUS) HPDF_Page_SetRotate (HPDF_Page page, HPDF_UINT16 angle); +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetZoom (HPDF_Page page, + HPDF_REAL zoom); + /*---------------------------------------------------------------------------*/ /*----- font handling -------------------------------------------------------*/ @@ -249,6 +279,11 @@ HPDF_LoadType1FontFromFile (HPDF_Doc pdf, const char *data_file_name); +HPDF_EXPORT(HPDF_FontDef) +HPDF_GetTTFontDefFromFile (HPDF_Doc pdf, + const char *file_name, + HPDF_BOOL embedding); + HPDF_EXPORT(const char*) HPDF_LoadTTFontFromFile (HPDF_Doc pdf, const char *file_name, @@ -411,15 +446,34 @@ HPDF_EXPORT(HPDF_STATUS) HPDF_UseCNTEncodings (HPDF_Doc pdf); +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseUTFEncodings (HPDF_Doc pdf); + + /*--------------------------------------------------------------------------*/ /*----- annotation ---------------------------------------------------------*/ +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_Create3DAnnot (HPDF_Page page, + HPDF_Rect rect, + HPDF_U3D u3d); + HPDF_EXPORT(HPDF_Annotation) HPDF_Page_CreateTextAnnot (HPDF_Page page, HPDF_Rect rect, const char *text, HPDF_Encoder encoder); +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateFreeTextAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateLineAnnot (HPDF_Page page, + const char *text, + HPDF_Encoder encoder); HPDF_EXPORT(HPDF_Annotation) HPDF_Page_CreateLinkAnnot (HPDF_Page page, @@ -433,6 +487,67 @@ HPDF_Page_CreateURILinkAnnot (HPDF_Page page, const char *uri); +HPDF_Annotation +HPDF_Page_CreateTextMarkupAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder, + HPDF_AnnotType subType); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateHighlightAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateUnderlineAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquigglyAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStrikeOutAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreatePopupAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_Annotation parent); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStampAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateProjectionAnnot(HPDF_Page page, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquareAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateCircleAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder); + HPDF_EXPORT(HPDF_STATUS) HPDF_LinkAnnot_SetHighlightMode (HPDF_Annotation annot, HPDF_AnnotHighlightMode mode); @@ -454,11 +569,179 @@ HPDF_EXPORT(HPDF_STATUS) HPDF_TextAnnot_SetOpened (HPDF_Annotation annot, HPDF_BOOL opened); +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetRGBColor (HPDF_Annotation annot, HPDF_RGBColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetGrayColor (HPDF_Annotation annot, HPDF_REAL color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetNoColor (HPDF_Annotation annot); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTitle (HPDF_Annotation annot, const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetSubject (HPDF_Annotation annot, const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCreationDate (HPDF_Annotation annot, HPDF_Date value); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTransparency (HPDF_Annotation annot, HPDF_REAL value); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetIntent (HPDF_Annotation annot, HPDF_AnnotIntent intent); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetPopup (HPDF_Annotation annot, HPDF_Annotation popup); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetRectDiff (HPDF_Annotation annot, HPDF_Rect rect); /* RD entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCloudEffect (HPDF_Annotation annot, HPDF_INT cloudIntensity); /* BE entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorRGBColor (HPDF_Annotation annot, HPDF_RGBColor color); /* IC with RGB entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color); /* IC with CMYK entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorGrayColor (HPDF_Annotation annot, HPDF_REAL color); /* IC with Gray entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorTransparent (HPDF_Annotation annot); /* IC with No Color entry */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_TextMarkupAnnot_SetQuadPoints ( HPDF_Annotation annot, HPDF_Point lb, HPDF_Point rb, HPDF_Point rt, HPDF_Point lt); /* l-left, r-right, b-bottom, t-top positions */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_Set3DView ( HPDF_MMgr mmgr, + HPDF_Annotation annot, + HPDF_Annotation annot3d, + HPDF_Dict view); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_PopupAnnot_SetOpened (HPDF_Annotation annot, + HPDF_BOOL opened); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetLineEndingStyle (HPDF_Annotation annot, HPDF_LineAnnotEndingStyle startStyle, HPDF_LineAnnotEndingStyle endStyle); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set3PointCalloutLine (HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point kneePoint, HPDF_Point endPoint); /* Callout line will be in default user space */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set2PointCalloutLine (HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point endPoint); /* Callout line will be in default user space */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetDefaultStyle (HPDF_Annotation annot, const char* style); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetPosition (HPDF_Annotation annot, + HPDF_Point startPoint, HPDF_LineAnnotEndingStyle startStyle, + HPDF_Point endPoint, HPDF_LineAnnotEndingStyle endStyle); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetLeader (HPDF_Annotation annot, HPDF_INT leaderLen, HPDF_INT leaderExtLen, HPDF_INT leaderOffsetLen); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetCaption (HPDF_Annotation annot, HPDF_BOOL showCaption, HPDF_LineAnnotCapPosition position, HPDF_INT horzOffset, HPDF_INT vertOffset); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annotation_SetBorderStyle (HPDF_Annotation annot, + HPDF_BSSubtype subtype, + HPDF_REAL width, + HPDF_UINT16 dash_on, + HPDF_UINT16 dash_off, + HPDF_UINT16 dash_phase); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ProjectionAnnot_SetExData(HPDF_Annotation annot, HPDF_ExData exdata); +/*--------------------------------------------------------------------------*/ +/*----- 3D Measure ---------------------------------------------------------*/ +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_Create3DC3DMeasure(HPDF_Page page, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint + ); + +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_CreatePD33DMeasure(HPDF_Page page, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetName(HPDF_3DMeasure measure, + const char* name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetColor(HPDF_3DMeasure measure, + HPDF_RGBColor color); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetTextSize(HPDF_3DMeasure measure, + HPDF_REAL textsize); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetTextBoxSize(HPDF_3DMeasure measure, + HPDF_INT32 x, + HPDF_INT32 y); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetText(HPDF_3DMeasure measure, + const char* text, + HPDF_Encoder encoder); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetProjectionAnotation(HPDF_3DMeasure measure, + HPDF_Annotation projectionanotation); + +/*--------------------------------------------------------------------------*/ +/*----- External Data ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_ExData) +HPDF_Page_Create3DAnnotExData(HPDF_Page page ); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DAnnotExData_Set3DMeasurement(HPDF_ExData exdata, HPDF_3DMeasure measure); + +/*--------------------------------------------------------------------------*/ +/*--------------------------------------------------------------------------*/ +/*----- 3D View ---------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_Dict) +HPDF_Page_Create3DView (HPDF_Page page, + HPDF_U3D u3d, + HPDF_Annotation annot3d, + const char *name); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DView_Add3DC3DMeasure(HPDF_Dict view, + HPDF_3DMeasure measure); + /*--------------------------------------------------------------------------*/ /*----- image data ---------------------------------------------------------*/ +HPDF_EXPORT(HPDF_Image) +HPDF_LoadPngImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size); + HPDF_EXPORT(HPDF_Image) HPDF_LoadPngImageFromFile (HPDF_Doc pdf, const char *filename); @@ -473,6 +756,29 @@ HPDF_EXPORT(HPDF_Image) HPDF_LoadJpegImageFromFile (HPDF_Doc pdf, const char *filename); +HPDF_EXPORT(HPDF_Image) +HPDF_LoadJpegImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size); + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadU3DFromFile (HPDF_Doc pdf, + const char *filename); + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadU3DFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size); + +HPDF_EXPORT(HPDF_Image) +HPDF_Image_LoadRaw1BitImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buf, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL black_is1, + HPDF_BOOL top_is_first); + HPDF_EXPORT(HPDF_Image) HPDF_LoadRawImageFromFile (HPDF_Doc pdf, @@ -490,6 +796,9 @@ HPDF_LoadRawImageFromMem (HPDF_Doc pdf, HPDF_ColorSpace color_space, HPDF_UINT bits_per_component); +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_AddSMask (HPDF_Image image, + HPDF_Image smask); HPDF_EXPORT(HPDF_Point) HPDF_Image_GetSize (HPDF_Image image); @@ -632,6 +941,14 @@ HPDF_Font_MeasureText (HPDF_Font font, HPDF_REAL *real_width); +/*--------------------------------------------------------------------------*/ +/*----- attachements -------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_EmbeddedFile) +HPDF_AttachFile (HPDF_Doc pdf, + const char *file); + + /*--------------------------------------------------------------------------*/ /*----- extended graphics state --------------------------------------------*/ @@ -1148,6 +1465,17 @@ HPDF_EXPORT(HPDF_STATUS) HPDF_Page_ExecuteXObject (HPDF_Page page, HPDF_XObject obj); +/*--- Content streams ----------------------------------------------------*/ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_New_Content_Stream (HPDF_Page page, + HPDF_Dict* new_stream); + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Insert_Shared_Content_Stream (HPDF_Page page, + HPDF_Dict shared_stream); + + /*--- Marked content -----------------------------------------------------*/ /* BMC --not implemented yet */ @@ -1219,6 +1547,18 @@ HPDF_Page_SetSlideShow (HPDF_Page page, HPDF_REAL trans_time); +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_ICC_LoadIccFromMem (HPDF_Doc pdf, + HPDF_MMgr mmgr, + HPDF_Stream iccdata, + HPDF_Xref xref, + int numcomponent); + +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_LoadIccProfileFromFile (HPDF_Doc pdf, + const char* icc_file_name, + int numcomponent); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/PDF/include/Poco/PDF/hpdf_3dmeasure.h b/PDF/include/Poco/PDF/hpdf_3dmeasure.h new file mode 100644 index 000000000..ebfa7b077 --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_3dmeasure.h @@ -0,0 +1,57 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_3DMEASURE_H +#define _HPDF_3DMEASURE_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_3DMeasure -----------------------------------------------------*/ + + +HPDF_3DMeasure +HPDF_3DC3DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint + ); + +HPDF_3DMeasure +HPDF_PD33DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_3DMEASURE_H */ + diff --git a/PDF/include/Poco/PDF/hpdf_annotation.h b/PDF/include/Poco/PDF/hpdf_annotation.h index 8ae3b38b8..699373ac0 100644 --- a/PDF/include/Poco/PDF/hpdf_annotation.h +++ b/PDF/include/Poco/PDF/hpdf_annotation.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_annotation.h + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -47,21 +50,39 @@ HPDF_URILinkAnnot_New (HPDF_MMgr mmgr, HPDF_Annotation -HPDF_TextAnnot_New (HPDF_MMgr mmgr, - HPDF_Xref xref, - HPDF_Rect rect, - const char *text, - HPDF_Encoder encoder); +HPDF_3DAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_U3D u3d); +HPDF_Annotation +HPDF_MarkupAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder, + HPDF_AnnotType subtype); -HPDF_STATUS -HPDF_Annotation_SetBorderStyle (HPDF_Annotation annot, - HPDF_BSSubtype subtype, - HPDF_REAL width, - HPDF_UINT16 dash_on, - HPDF_UINT16 dash_off, - HPDF_UINT16 dash_phase); +HPDF_Annotation +HPDF_PopupAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_Annotation parent); +HPDF_Annotation +HPDF_StampAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder); + +HPDF_Annotation +HPDF_ProjectionAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder); HPDF_BOOL HPDF_Annotation_Validate (HPDF_Annotation annot); diff --git a/PDF/include/Poco/PDF/hpdf_catalog.h b/PDF/include/Poco/PDF/hpdf_catalog.h index 882721b3b..469d2a48d 100644 --- a/PDF/include/Poco/PDF/hpdf_catalog.h +++ b/PDF/include/Poco/PDF/hpdf_catalog.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_catalog.h + * << Haru Free PDF Library >> -- hpdf_catalog.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -28,6 +31,15 @@ HPDF_Catalog_New (HPDF_MMgr mmgr, HPDF_Xref xref); +HPDF_NameDict +HPDF_Catalog_GetNames (HPDF_Catalog catalog); + + +HPDF_STATUS +HPDF_Catalog_SetNames (HPDF_Catalog catalog, + HPDF_NameDict dict); + + HPDF_Pages HPDF_Catalog_GetRoot (HPDF_Catalog catalog); diff --git a/PDF/include/Poco/PDF/hpdf_conf.h b/PDF/include/Poco/PDF/hpdf_conf.h index c99f474b6..d25b46466 100644 --- a/PDF/include/Poco/PDF/hpdf_conf.h +++ b/PDF/include/Poco/PDF/hpdf_conf.h @@ -1,9 +1,10 @@ /* - * << Haru Free PDF Library 2.0.7 >> -- hpdf_conf.h + * << Haru Free PDF Library >> -- hpdf_conf.h * - * URL http://libharu.sourceforge.net/ + * URL: http://libharu.org * - * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -19,6 +20,14 @@ #include #include +#if defined(_MSC_VER) +#ifndef _USE_MATH_DEFINES +#define _USE_MATH_DEFINES 1 +#endif /* _USE_MATH_DEFINES */ +#endif +#ifndef __USE_XOPEN +#define __USE_XOPEN /* for M_PI */ +#endif /* __USE_XOPEN */ #include /*----------------------------------------------------------------------------*/ diff --git a/PDF/include/Poco/PDF/hpdf_config.h b/PDF/include/Poco/PDF/hpdf_config.h new file mode 100644 index 000000000..d3aa381e6 --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_config.h @@ -0,0 +1,75 @@ +/* include/hpdf_config.h.in. Generated from configure.in by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_INTTYPES_H + +/* Define to 1 if you have the `png' library (-lpng). */ +#define LIBHPDF_HAVE_LIBPNG 1 + +/* Define to 1 if you have the `z' library (-lz). */ +#define LIBHPDF_HAVE_LIBZ 1 + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#undef LIBHPDF_HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#define LIBHPDF_HAVE_UNISTD_H 1 + +/* define pi */ +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif /* M_PI */ + +/* debug build */ +#undef LIBHPDF_DEBUG + +/* debug trace enabled */ +#undef LIBHPDF_DEBUG_TRACE + +/* libpng is not available */ +#undef LIBHPDF_HAVE_NOPNGLIB + +/* zlib is not available */ +#undef LIBHPDF_HAVE_NOZLIB + +/* Define to the address where bug reports for this package should be sent. */ +#undef LIBHPDF_PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef LIBHPDF_PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#define LIBHPDF_PACKAGE_STRING "libhpdf 2.2.0" + +/* Define to the one symbol short name of this package. */ +#undef LIBHPDF_PACKAGE_TARNAME + +/* Define to the version of this package. */ +#define LIBHPDF_PACKAGE_VERSION "2.2.0" + +/* Define to 1 if you have the ANSI C header files. */ +#define LIBHPDF_STDC_HEADERS 1 + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/PDF/include/Poco/PDF/hpdf_consts.h b/PDF/include/Poco/PDF/hpdf_consts.h index de237f9ea..d080f8df6 100644 --- a/PDF/include/Poco/PDF/hpdf_consts.h +++ b/PDF/include/Poco/PDF/hpdf_consts.h @@ -1,9 +1,10 @@ /* - * << Haru Free PDF Library 2.0.8 >> -- hpdf_consts.h + * << Haru Free PDF Library >> -- hpdf_consts.h * - * URL http://libharu.sourceforge.net/ + * URL: http://libharu.org * - * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -67,8 +68,6 @@ #define HPDF_DEF_PAGE_WIDTH 595.276F #define HPDF_DEF_PAGE_HEIGHT 841.89F -#define HPDF_VERSION_TEXT "2.0.8" - /*---------------------------------------------------------------------------*/ /*----- compression mode ----------------------------------------------------*/ @@ -101,6 +100,7 @@ #define HPDF_HIDE_WINDOW_UI 4 #define HPDF_FIT_WINDOW 8 #define HPDF_CENTER_WINDOW 16 +#define HPDF_PRINT_SCALING_NONE 32 /*---------------------------------------------------------------------------*/ @@ -115,7 +115,7 @@ #define HPDF_LIMIT_MAX_STRING_LEN 65535 #define HPDF_LIMIT_MAX_NAME_LEN 127 -#define HPDF_LIMIT_MAX_ARRAY 8191 +#define HPDF_LIMIT_MAX_ARRAY 32767 #define HPDF_LIMIT_MAX_DICT_ELEMENT 4095 #define HPDF_LIMIT_MAX_XREF_ELEMENT 8388607 #define HPDF_LIMIT_MAX_GSTATE 28 @@ -142,7 +142,7 @@ #define HPDF_MAX_WORDSPACE 300 #define HPDF_MIN_CHARSPACE -30 #define HPDF_MAX_CHARSPACE 300 -#define HPDF_MAX_FONTSIZE 300 +#define HPDF_MAX_FONTSIZE 600 #define HPDF_MAX_ZOOMSIZE 10 #define HPDF_MAX_LEADING 300 #define HPDF_MAX_LINEWIDTH 100 diff --git a/PDF/include/Poco/PDF/hpdf_destination.h b/PDF/include/Poco/PDF/hpdf_destination.h index 134cabf6d..daf08ed73 100644 --- a/PDF/include/Poco/PDF/hpdf_destination.h +++ b/PDF/include/Poco/PDF/hpdf_destination.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_destination.c + * << Haru Free PDF Library >> -- hpdf_destination.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_doc.h b/PDF/include/Poco/PDF/hpdf_doc.h index 831d0a3b1..fcf3039d9 100644 --- a/PDF/include/Poco/PDF/hpdf_doc.h +++ b/PDF/include/Poco/PDF/hpdf_doc.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_doc.h + * << Haru Free PDF Library >> -- hpdf_doc.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_encoder.h b/PDF/include/Poco/PDF/hpdf_encoder.h index f2ba73cce..820fe1fb6 100644 --- a/PDF/include/Poco/PDF/hpdf_encoder.h +++ b/PDF/include/Poco/PDF/hpdf_encoder.h @@ -1,9 +1,10 @@ /* - * << Haru Free PDF Library 2.0.2 >> -- hpdf_encoder.h + * << Haru Free PDF Library >> -- hpdf_encoder.h * - * URL http://libharu.sourceforge.net/ + * URL: http://libharu.org * - * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -92,6 +93,11 @@ typedef HPDF_UNICODE (*HPDF_Encoder_ToUnicode_Func) (HPDF_Encoder encoder, HPDF_UINT16 code); +typedef char * +(*HPDF_Encoder_EncodeText_Func) (HPDF_Encoder encoder, + const char *text, + HPDF_UINT len, + HPDF_UINT *encoded_length); typedef HPDF_STATUS (*HPDF_Encoder_Write_Func) (HPDF_Encoder encoder, @@ -108,13 +114,14 @@ typedef void typedef struct _HPDF_Encoder_Rec { HPDF_UINT32 sig_bytes; - char name[HPDF_LIMIT_MAX_NAME_LEN + 1]; + char name[HPDF_LIMIT_MAX_NAME_LEN + 1]; HPDF_MMgr mmgr; HPDF_Error error; HPDF_EncoderType type; HPDF_Encoder_ByteType_Func byte_type_fn; HPDF_Encoder_ToUnicode_Func to_unicode_fn; + HPDF_Encoder_EncodeText_Func encode_text_fn; HPDF_Encoder_Write_Func write_fn; HPDF_Encoder_Free_Func free_fn; HPDF_Encoder_Init_Func init_fn; @@ -230,7 +237,7 @@ typedef struct _HPDF_CMapEncoderAttr_Rec { HPDF_Encoder HPDF_CMapEncoder_New (HPDF_MMgr mmgr, - char *name, + char *name, HPDF_Encoder_Init_Func init_fn); diff --git a/PDF/include/Poco/PDF/hpdf_encrypt.h b/PDF/include/Poco/PDF/hpdf_encrypt.h index 3211e4905..a34cc3dd2 100644 --- a/PDF/include/Poco/PDF/hpdf_encrypt.h +++ b/PDF/include/Poco/PDF/hpdf_encrypt.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encrypt.h + * << Haru Free PDF Library >> -- hpdf_encrypt.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_encryptdict.h b/PDF/include/Poco/PDF/hpdf_encryptdict.h index 1bda2c0e6..018b3dd62 100644 --- a/PDF/include/Poco/PDF/hpdf_encryptdict.h +++ b/PDF/include/Poco/PDF/hpdf_encryptdict.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encryptdict.h + * << Haru Free PDF Library >> -- hpdf_encryptdict.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_error.h b/PDF/include/Poco/PDF/hpdf_error.h index dbc9176fe..b04e2cd11 100644 --- a/PDF/include/Poco/PDF/hpdf_error.h +++ b/PDF/include/Poco/PDF/hpdf_error.h @@ -1,9 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_error.h + * << Haru Free PDF Library >> -- hpdf_error.h * - * URL http://libharu.sourceforge.net/ + * URL: http://libharu.org * - * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -141,6 +142,11 @@ extern "C" { #define HPDF_EXT_GSTATE_OUT_OF_RANGE 0x1080 #define HPDF_INVALID_EXT_GSTATE 0x1081 #define HPDF_EXT_GSTATE_READ_ONLY 0x1082 +#define HPDF_INVALID_U3D_DATA 0x1083 +#define HPDF_NAME_CANNOT_GET_NAMES 0x1084 +#define HPDF_INVALID_ICC_COMPONENT_NUM 0x1085 + +/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/ /*----- HPDF_Error ----------------------------------------------------------*/ @@ -184,10 +190,6 @@ HPDF_SetError (HPDF_Error error, HPDF_STATUS detail_no); -HPDF_STATUS -HPDF_CheckError (HPDF_Error error); - - HPDF_STATUS HPDF_RaiseError (HPDF_Error error, HPDF_STATUS error_no, diff --git a/PDF/include/Poco/PDF/hpdf_exdata.h b/PDF/include/Poco/PDF/hpdf_exdata.h new file mode 100644 index 000000000..8d92e7909 --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_exdata.h @@ -0,0 +1,41 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_EXDATA_H +#define _HPDF_EXDATA_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_ExData -----------------------------------------------------*/ + +HPDF_ExData +HPDF_3DAnnotExData_New(HPDF_MMgr mmgr, + HPDF_Xref xref ); + + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_EXDATA_H */ + diff --git a/PDF/include/Poco/PDF/hpdf_ext_gstate.h b/PDF/include/Poco/PDF/hpdf_ext_gstate.h index 55f93518c..7dae6d4bd 100644 --- a/PDF/include/Poco/PDF/hpdf_ext_gstate.h +++ b/PDF/include/Poco/PDF/hpdf_ext_gstate.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_ext_gstate.h + * << Haru Free PDF Library >> -- hpdf_ext_gstate.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_font.h b/PDF/include/Poco/PDF/hpdf_font.h index 1926cc561..fd3a25616 100644 --- a/PDF/include/Poco/PDF/hpdf_font.h +++ b/PDF/include/Poco/PDF/hpdf_font.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_font.h + * << Haru Free PDF Library >> -- hpdf_font.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_fontdef.h b/PDF/include/Poco/PDF/hpdf_fontdef.h index b18c1af33..792588c6c 100644 --- a/PDF/include/Poco/PDF/hpdf_fontdef.h +++ b/PDF/include/Poco/PDF/hpdf_fontdef.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.4 >> -- hpdf_fontdef.h + * << Haru Free PDF Library >> -- hpdf_fontdef.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -300,7 +303,8 @@ typedef struct _HPDF_TTFontDefAttr_Rec { HPDF_TTF_OffsetTbl offset_tbl; HPDF_TTF_CmapRange cmap; HPDF_UINT16 fs_type; - HPDF_BYTE panose[12]; + HPDF_BYTE sfamilyclass[2]; + HPDF_BYTE panose[10]; HPDF_UINT32 code_page_range1; HPDF_UINT32 code_page_range2; @@ -400,4 +404,3 @@ HPDF_CIDFontDef_ChangeStyle (HPDF_FontDef fontdef, #endif /* __cplusplus */ #endif /* _HPDF_FONTDEF_H */ - diff --git a/PDF/include/Poco/PDF/hpdf_gstate.h b/PDF/include/Poco/PDF/hpdf_gstate.h index c7147580c..233ae528f 100644 --- a/PDF/include/Poco/PDF/hpdf_gstate.h +++ b/PDF/include/Poco/PDF/hpdf_gstate.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_gstate.h + * << Haru Free PDF Library >> -- hpdf_gstate.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_image.h b/PDF/include/Poco/PDF/hpdf_image.h index a84de29bd..4e1aa6c09 100644 --- a/PDF/include/Poco/PDF/hpdf_image.h +++ b/PDF/include/Poco/PDF/hpdf_image.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_image.h + * << Haru Free PDF Library >> -- hpdf_image.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -21,7 +24,18 @@ extern "C" { #endif -#ifndef HPDF_NOPNGLIB +HPDF_Image +HPDF_Image_Load1BitImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_Xref xref, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL top_is_first + ); + + +#ifndef LIBHPDF_HAVE_NOPNGLIB HPDF_Image HPDF_Image_LoadPngImage (HPDF_MMgr mmgr, @@ -36,6 +50,11 @@ HPDF_Image_LoadJpegImage (HPDF_MMgr mmgr, HPDF_Stream jpeg_data, HPDF_Xref xref); +HPDF_Image +HPDF_Image_LoadJpegImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_UINT size, + HPDF_Xref xref); HPDF_Image HPDF_Image_LoadRawImage (HPDF_MMgr mmgr, @@ -64,6 +83,14 @@ HPDF_STATUS HPDF_Image_SetMask (HPDF_Image image, HPDF_BOOL mask); +HPDF_STATUS +HPDF_Image_SetColorSpace (HPDF_Image image, + HPDF_Array colorspace); + +HPDF_STATUS +HPDF_Image_SetRenderingIntent (HPDF_Image image, + const char* intent); + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/PDF/include/Poco/PDF/hpdf_info.h b/PDF/include/Poco/PDF/hpdf_info.h index 623c4c27b..14bcdd015 100644 --- a/PDF/include/Poco/PDF/hpdf_info.h +++ b/PDF/include/Poco/PDF/hpdf_info.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_info.c + * << Haru Free PDF Library >> -- hpdf_info.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_list.h b/PDF/include/Poco/PDF/hpdf_list.h index c0920e14c..c46d01319 100644 --- a/PDF/include/Poco/PDF/hpdf_list.h +++ b/PDF/include/Poco/PDF/hpdf_list.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_list.h + * << Haru Free PDF Library >> -- hpdf_list.h * - * Copyright (c) 1999-2005 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_mmgr.h b/PDF/include/Poco/PDF/hpdf_mmgr.h index 7e3683b27..d815afd65 100644 --- a/PDF/include/Poco/PDF/hpdf_mmgr.h +++ b/PDF/include/Poco/PDF/hpdf_mmgr.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_mmgr.h + * << Haru Free PDF Library >> -- hpdf_mmgr.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_namedict.h b/PDF/include/Poco/PDF/hpdf_namedict.h new file mode 100644 index 000000000..179d103df --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_namedict.h @@ -0,0 +1,76 @@ +/* + * << Haru Free PDF Library >> -- hpdf_namedict.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_NAMEDICT_H +#define _HPDF_NAMEDICT_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +HPDF_NameDict +HPDF_NameDict_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + +HPDF_NameTree +HPDF_NameDict_GetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key); + +HPDF_STATUS +HPDF_NameDict_SetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key, + HPDF_NameTree tree); + +HPDF_BOOL +HPDF_NameDict_Validate (HPDF_NameDict namedict); + + +/*------- NameTree -------*/ + +HPDF_NameTree +HPDF_NameTree_New (HPDF_MMgr mmgr, + HPDF_Xref xref); + +HPDF_STATUS +HPDF_NameTree_Add (HPDF_NameTree tree, + HPDF_String name, + void *obj); + +HPDF_BOOL +HPDF_NameTree_Validate (HPDF_NameTree tree); + + +/*------- EmbeddedFile -------*/ + +HPDF_EmbeddedFile +HPDF_EmbeddedFile_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + const char *file); + +HPDF_BOOL +HPDF_EmbeddedFile_Validate (HPDF_EmbeddedFile emfile); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_NAMEDICT_H */ + diff --git a/PDF/include/Poco/PDF/hpdf_objects.h b/PDF/include/Poco/PDF/hpdf_objects.h index aaa11c966..525adda0c 100644 --- a/PDF/include/Poco/PDF/hpdf_objects.h +++ b/PDF/include/Poco/PDF/hpdf_objects.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.5 >> -- hpdf_objects.c + * << Haru Free PDF Library >> -- hpdf_objects.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -56,6 +59,8 @@ extern "C" { #define HPDF_OSUBCLASS_ENCRYPT 0x0900 #define HPDF_OSUBCLASS_EXT_GSTATE 0x0A00 #define HPDF_OSUBCLASS_EXT_GSTATE_R 0x0B00 /* read only object */ +#define HPDF_OSUBCLASS_NAMEDICT 0x0C00 +#define HPDF_OSUBCLASS_NAMETREE 0x0D00 @@ -268,10 +273,9 @@ HPDF_String_Write (HPDF_String obj, HPDF_Stream stream, HPDF_Encrypt e); - -HPDF_STATUS -HPDF_String_SetValue (HPDF_String obj, - const char *value); +HPDF_INT32 +HPDF_String_Cmp (HPDF_String s1, + HPDF_String s2); /*---------------------------------------------------------------------------*/ @@ -386,6 +390,10 @@ void HPDF_Array_Clear (HPDF_Array array); +HPDF_UINT +HPDF_Array_Items (HPDF_Array array); + + /*---------------------------------------------------------------------------*/ /*----- HPDF_Dict -----------------------------------------------------------*/ @@ -417,6 +425,7 @@ typedef struct _HPDF_Dict_Rec { HPDF_Dict_FreeFunc free_fn; HPDF_Stream stream; HPDF_UINT filter; + HPDF_Dict filterParams; void *attr; } HPDF_Dict_Rec; @@ -568,16 +577,24 @@ HPDF_Xref_GetEntryByObjectId (HPDF_Xref xref, +typedef HPDF_Dict HPDF_EmbeddedFile; +typedef HPDF_Dict HPDF_NameDict; +typedef HPDF_Dict HPDF_NameTree; typedef HPDF_Dict HPDF_Pages; typedef HPDF_Dict HPDF_Page; typedef HPDF_Dict HPDF_Annotation; +typedef HPDF_Dict HPDF_3DMeasure; +typedef HPDF_Dict HPDF_ExData; typedef HPDF_Dict HPDF_XObject; typedef HPDF_Dict HPDF_Image; typedef HPDF_Dict HPDF_Outline; typedef HPDF_Dict HPDF_EncryptDict; typedef HPDF_Dict HPDF_Action; typedef HPDF_Dict HPDF_ExtGState; -typedef HPDF_Array HPDF_Destination; +typedef HPDF_Array HPDF_Destination; +typedef HPDF_Dict HPDF_U3D; +typedef HPDF_Dict HPDF_OutputIntent; +typedef HPDF_Dict HPDF_JavaScript; #ifdef __cplusplus } diff --git a/PDF/include/Poco/PDF/hpdf_outline.h b/PDF/include/Poco/PDF/hpdf_outline.h index 0e8db6381..18cdb08de 100644 --- a/PDF/include/Poco/PDF/hpdf_outline.h +++ b/PDF/include/Poco/PDF/hpdf_outline.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_outline.h + * << Haru Free PDF Library >> -- hpdf_outline.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_page_label.h b/PDF/include/Poco/PDF/hpdf_page_label.h index 14fb22985..05f454fca 100644 --- a/PDF/include/Poco/PDF/hpdf_page_label.h +++ b/PDF/include/Poco/PDF/hpdf_page_label.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_page_label.h + * << Haru Free PDF Library >> -- hpdf_page_label.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_pages.h b/PDF/include/Poco/PDF/hpdf_pages.h index 1fdca30e7..44b816c2c 100644 --- a/PDF/include/Poco/PDF/hpdf_pages.h +++ b/PDF/include/Poco/PDF/hpdf_pages.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_pages.c + * << Haru Free PDF Library >> -- hpdf_pages.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/include/Poco/PDF/hpdf_pdfa.h b/PDF/include/Poco/PDF/hpdf_pdfa.h new file mode 100644 index 000000000..8566a3745 --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_pdfa.h @@ -0,0 +1,43 @@ +/* + * << Haru Free PDF Library >> -- hpdf_pdfa.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_PDFA_H +#define _HPDF_PDFA_H + +#include "hpdf_doc.h" +#include "hpdf_objects.h" + + + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_STATUS +HPDF_PDFA_AppendOutputIntents(HPDF_Doc pdf, const char *iccname, HPDF_Dict iccdict); + +HPDF_STATUS +HPDF_PDFA_SetPDFAConformance (HPDF_Doc pdf, + HPDF_PDFAType pdfatype); + +HPDF_STATUS +HPDF_PDFA_GenerateID(HPDF_Doc); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/PDF/include/Poco/PDF/hpdf_streams.h b/PDF/include/Poco/PDF/hpdf_streams.h index 08cf73236..a24d046f3 100644 --- a/PDF/include/Poco/PDF/hpdf_streams.h +++ b/PDF/include/Poco/PDF/hpdf_streams.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_streams.h + * << Haru Free PDF Library >> -- hpdf_streams.h * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -31,7 +34,7 @@ typedef enum _HPDF_StreamType { HPDF_STREAM_UNKNOWN = 0, HPDF_STREAM_CALLBACK, HPDF_STREAM_FILE, - HPDF_STREAM_MEMORY, + HPDF_STREAM_MEMORY } HPDF_StreamType; #define HPDF_STREAM_FILTER_NONE 0x0000 @@ -39,6 +42,7 @@ typedef enum _HPDF_StreamType { #define HPDF_STREAM_FILTER_ASCII85 0x0200 #define HPDF_STREAM_FILTER_FLATE_DECODE 0x0400 #define HPDF_STREAM_FILTER_DCT_DECODE 0x0800 +#define HPDF_STREAM_FILTER_CCITT_DECODE 0x1000 typedef enum _HPDF_WhenceMode { HPDF_SEEK_SET = 0, diff --git a/PDF/include/Poco/PDF/hpdf_types.h b/PDF/include/Poco/PDF/hpdf_types.h index f0e8a6af7..8b3e0a893 100644 --- a/PDF/include/Poco/PDF/hpdf_types.h +++ b/PDF/include/Poco/PDF/hpdf_types.h @@ -1,9 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_types.h + * << Haru Free PDF Library >> -- hpdf_types.h * - * URL http://libharu.sourceforge.net/ + * URL: http://libharu.org * - * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -107,6 +108,14 @@ typedef struct _HPDF_Rect { HPDF_REAL top; } HPDF_Rect; +/* HPDF_Point3D struct +*/ +typedef struct _HPDF_Point3D { + HPDF_REAL x; + HPDF_REAL y; + HPDF_REAL z; +} HPDF_Point3D; + typedef struct _HPDF_Rect HPDF_Box; /* HPDF_Date struct @@ -136,9 +145,19 @@ typedef enum _HPDF_InfoType { HPDF_INFO_TITLE, HPDF_INFO_SUBJECT, HPDF_INFO_KEYWORDS, + HPDF_INFO_TRAPPED, + HPDF_INFO_GTS_PDFX, HPDF_INFO_EOF } HPDF_InfoType; +/* PDF-A Types */ + +typedef enum _HPDF_PDFA_TYPE +{ + HPDF_PDFA_1A = 0, + HPDF_PDFA_1B = 1 +} HPDF_PDFAType; + typedef enum _HPDF_PdfVer { HPDF_VER_12 = 0, @@ -146,6 +165,7 @@ typedef enum _HPDF_PdfVer { HPDF_VER_14, HPDF_VER_15, HPDF_VER_16, + HPDF_VER_17, HPDF_VER_EOF } HPDF_PDFVer; @@ -290,6 +310,8 @@ typedef enum _HPDF_PageLayout { HPDF_PAGE_LAYOUT_ONE_COLUMN, HPDF_PAGE_LAYOUT_TWO_COLUMN_LEFT, HPDF_PAGE_LAYOUT_TWO_COLUMN_RIGHT, + HPDF_PAGE_LAYOUT_TWO_PAGE_LEFT, + HPDF_PAGE_LAYOUT_TWO_PAGE_RIGHT, HPDF_PAGE_LAYOUT_EOF } HPDF_PageLayout; @@ -342,7 +364,11 @@ typedef enum _HPDF_AnnotType { HPDF_ANNOT_UNDERLINE, HPDF_ANNOT_INK, HPDF_ANNOT_FILE_ATTACHMENT, - HPDF_ANNOT_POPUP + HPDF_ANNOT_POPUP, + HPDF_ANNOT_3D, + HPDF_ANNOT_SQUIGGLY, + HPDF_ANNOT_LINE, + HPDF_ANNOT_PROJECTION } HPDF_AnnotType; @@ -377,7 +403,50 @@ typedef enum _HPDF_AnnotIcon { HPDF_ANNOT_ICON_EOF } HPDF_AnnotIcon; +typedef enum _HPDF_AnnotIntent { + HPDF_ANNOT_INTENT_FREETEXTCALLOUT = 0, + HPDF_ANNOT_INTENT_FREETEXTTYPEWRITER, + HPDF_ANNOT_INTENT_LINEARROW, + HPDF_ANNOT_INTENT_LINEDIMENSION, + HPDF_ANNOT_INTENT_POLYGONCLOUD, + HPDF_ANNOT_INTENT_POLYLINEDIMENSION, + HPDF_ANNOT_INTENT_POLYGONDIMENSION +} HPDF_AnnotIntent; +typedef enum _HPDF_LineAnnotEndingStyle { + HPDF_LINE_ANNOT_NONE = 0, + HPDF_LINE_ANNOT_SQUARE, + HPDF_LINE_ANNOT_CIRCLE, + HPDF_LINE_ANNOT_DIAMOND, + HPDF_LINE_ANNOT_OPENARROW, + HPDF_LINE_ANNOT_CLOSEDARROW, + HPDF_LINE_ANNOT_BUTT, + HPDF_LINE_ANNOT_ROPENARROW, + HPDF_LINE_ANNOT_RCLOSEDARROW, + HPDF_LINE_ANNOT_SLASH +} HPDF_LineAnnotEndingStyle; + +typedef enum _HPDF_LineAnnotCapPosition{ + HPDF_LINE_ANNOT_CAP_INLINE = 0, + HPDF_LINE_ANNOT_CAP_TOP +} HPDF_LineAnnotCapPosition; + +typedef enum _HPDF_StampAnnotName{ + HPDF_STAMP_ANNOT_APPROVED = 0, + HPDF_STAMP_ANNOT_EXPERIMENTAL, + HPDF_STAMP_ANNOT_NOTAPPROVED, + HPDF_STAMP_ANNOT_ASIS, + HPDF_STAMP_ANNOT_EXPIRED, + HPDF_STAMP_ANNOT_NOTFORPUBLICRELEASE, + HPDF_STAMP_ANNOT_CONFIDENTIAL, + HPDF_STAMP_ANNOT_FINAL, + HPDF_STAMP_ANNOT_SOLD, + HPDF_STAMP_ANNOT_DEPARTMENTAL, + HPDF_STAMP_ANNOT_FORCOMMENT, + HPDF_STAMP_ANNOT_TOPSECRET, + HPDF_STAMP_ANNOT_DRAFT, + HPDF_STAMP_ANNOT_FORPUBLICRELEASE +} HPDF_StampAnnotName; /*----------------------------------------------------------------------------*/ /*------ border stype --------------------------------------------------------*/ @@ -480,6 +549,14 @@ typedef enum _HPDF_TextAlignment { HPDF_TALIGN_JUSTIFY } HPDF_TextAlignment; +/*----------------------------------------------------------------------------*/ + +/* Name Dictionary values -- see PDF reference section 7.7.4 */ +typedef enum _HPDF_NameDictKey { + HPDF_NAME_EMBEDDED_FILES = 0, /* TODO the rest */ + HPDF_NAME_EOF +} HPDF_NameDictKey; + #ifdef __cplusplus } #endif /* __cplusplus */ diff --git a/PDF/include/Poco/PDF/hpdf_u3d.h b/PDF/include/Poco/PDF/hpdf_u3d.h new file mode 100644 index 000000000..9a3dba869 --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_u3d.h @@ -0,0 +1,53 @@ +/* + * << Haru Free PDF Library >> -- hpdf_u3d.h + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#ifndef _HPDF_U3D_H +#define _HPDF_U3D_H + +#include "hpdf_objects.h" + +#ifdef __cplusplus +extern "C" { +#endif + +HPDF_EXPORT(HPDF_JavaScript) HPDF_CreateJavaScript(HPDF_Doc pdf, const char *code); + + +HPDF_EXPORT(HPDF_U3D) HPDF_LoadU3DFromFile (HPDF_Doc pdf, const char *filename); +HPDF_EXPORT(HPDF_Image) HPDF_LoadU3DFromMem (HPDF_Doc pdf, const HPDF_BYTE *buffer, HPDF_UINT size); +HPDF_EXPORT(HPDF_Dict) HPDF_Create3DView (HPDF_MMgr mmgr, const char *name); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_Add3DView(HPDF_U3D u3d, HPDF_Dict view); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_SetDefault3DView(HPDF_U3D u3d, const char *name); +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_AddOnInstanciate(HPDF_U3D u3d, HPDF_JavaScript javaScript); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_AddNode(HPDF_Dict view, const char *name, HPDF_REAL opacity, HPDF_BOOL visible); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetLighting(HPDF_Dict view, const char *scheme); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetBackgroundColor(HPDF_Dict view, HPDF_REAL r, HPDF_REAL g, HPDF_REAL b); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetPerspectiveProjection(HPDF_Dict view, HPDF_REAL fov); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetOrthogonalProjection(HPDF_Dict view, HPDF_REAL mag); +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetCamera(HPDF_Dict view, HPDF_REAL coox, HPDF_REAL cooy, HPDF_REAL cooz, HPDF_REAL c2cx, HPDF_REAL c2cy, HPDF_REAL c2cz, HPDF_REAL roo, HPDF_REAL roll); + +HPDF_Dict +HPDF_3DView_New ( HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_U3D u3d, + const char *name); +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* _HPDF_U3D_H */ + diff --git a/PDF/include/Poco/PDF/hpdf_utils.h b/PDF/include/Poco/PDF/hpdf_utils.h index d20a86397..9028004a2 100644 --- a/PDF/include/Poco/PDF/hpdf_utils.h +++ b/PDF/include/Poco/PDF/hpdf_utils.h @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- fpdf_utils.h + * << Haru Free PDF Library >> -- fpdf_utils.h + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -15,6 +18,7 @@ #ifndef _HPDF_UTILS_H #define _HPDF_UTILS_H +#include "hpdf_config.h" #include "hpdf_types.h" #ifdef __cplusplus @@ -114,7 +118,7 @@ HPDF_UInt16Swap (HPDF_UINT16 *value); } #endif /* __cplusplus */ -#define HPDF_NEEDS_ESCAPE(c) (c < 0x21 || \ +#define HPDF_NEEDS_ESCAPE(c) (c < 0x20 || \ c > 0x7e || \ c == '\\' || \ c == '%' || \ @@ -139,11 +143,11 @@ HPDF_UInt16Swap (HPDF_UINT16 *value); /*----------------------------------------------------------------------------*/ /*----- macros for debug -----------------------------------------------------*/ -#ifdef HPDF_DEBUG +#ifdef LIBHPDF_DEBUG_TRACE #ifndef HPDF_PTRACE_ON #define HPDF_PTRACE_ON #endif /* HPDF_PTRACE_ON */ -#endif /* HPDF_DEBUG */ +#endif /* LIBHPDF_DEBUG_TRACE */ #ifdef HPDF_PTRACE_ON #define HPDF_PTRACE(ARGS) HPDF_PRINTF ARGS @@ -151,7 +155,7 @@ HPDF_UInt16Swap (HPDF_UINT16 *value); #define HPDF_PTRACE(ARGS) /* do nothing */ #endif /* HPDF_PTRACE */ -#ifdef HPDF_DEBUG +#ifdef LIBHPDF_DEBUG #define HPDF_PRINT_BINARY(BUF, LEN, CAPTION) HPDF_PrintBinary(BUF, LEN, CAPTION) #else #define HPDF_PRINT_BINARY(BUF, LEN, CAPTION) /* do nothing */ diff --git a/PDF/include/Poco/PDF/hpdf_version.h b/PDF/include/Poco/PDF/hpdf_version.h new file mode 100644 index 000000000..99a07a62d --- /dev/null +++ b/PDF/include/Poco/PDF/hpdf_version.h @@ -0,0 +1,8 @@ +/* automatically generated by configure */ +/* edit configure.in to change version number */ +#define HPDF_MAJOR_VERSION 2 +#define HPDF_MINOR_VERSION 3 +#define HPDF_BUGFIX_VERSION 0 +#define HPDF_EXTRA_VERSION "RC2" +#define HPDF_VERSION_TEXT "2.3.0RC2" +#define HPDF_VERSION_ID 20300 diff --git a/PDF/samples/Image/Image.pdf b/PDF/samples/Image/Image.pdf new file mode 100644 index 0000000000000000000000000000000000000000..314adc172f3685f66b6ad94737f4c3b88fba28da GIT binary patch literal 4367 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 Mjwn-84?hCx-`1z_RsaA1 literal 0 HcmV?d00001 diff --git a/PDF/samples/Text/FreeSans.ttf b/PDF/samples/Text/FreeSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9d5134705231d06401279e861a1ae5ac2110f97c GIT binary patch literal 568896 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 z

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 WI$ZmyoS%E|ba@}oJU?|t{r?5-wzL2M literal 0 HcmV?d00001 diff --git a/PDF/samples/Text/Text.pdf b/PDF/samples/Text/Text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ae62cdaac651dbe05616ada82d010eb16fb3f946 GIT binary patch literal 15904 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 literal 0 HcmV?d00001 diff --git a/PDF/samples/Text/src/Text.cpp b/PDF/samples/Text/src/Text.cpp index 84e62652a586ab8af81f0a19d37eca8df6040207..ef6add96733686e34d5fdaf5613c856d51cbc591 100644 GIT binary patch literal 3238 zcmdUxYflqF6o${&n)n|k^^$s_AYvpMKPXTzQ6NEsMvZ}X!D=Z@cMBRLKV5yFGaYuh zWB6n??at23xxMc>XXelENt?9mc1{127VM2>_T36=TH6MC(n@->Lp3`wbLEnA%BjpC# z;>y0F+8uiv^~CvPot^vIOBTaLQSl=36{Yr_yTa{aaUlC-A&BJqr!s@AdW8mNkB-I!6aF#ePC16q0|UC-xUK zQm-l3mc=pA279Jo-EP{?imey2vSthRtAbIrf90A_y{{ZK#bQSm>h^RTQ|9^g?{Tdw zs%5dVV(aqb>e1agCAM2vj;*g~yNWk)$b0138?jD#1`9FM7#+{Gh}Fe%EoZkFV|(%b zRWZCRhA+||Gx+>nDR1Mh6fZeNm!fMiZumbl^y6*iBi*2_+Ti=Hp0u(z=JcmyS5sD} z4w&+j%#WUd8K*2A2E-dDa`=w4MbB!^2WMZ>({x$73ca_Xot%l~DyI_XFlQ30WrVd8 zOi`V5j$&wsU{5(RT$y66D^lfaVm1ZTUTCn^oHHi&l0^-BAsiQdRJe$LRK{nF>QK99@R%a zPK@m{=3Y7NT$Ng3rqC@blOOSZN0vpoM`8q&&-aTAIE$YLNBAlABpwc=9UQq?fk^Im zgLsQsw2wk)&K~;vg+}BzXL%3;n_kyc9$ldC-Uqv_HSUO+ebY*;YC1$v{=i(ozrwb znynCwbh>-*-qR_)UeN2o4c_@AGltgfwv-N>s7-~CW383*R(N#aON6oT0xG$(!tRpC zf{`{mE7zrmFpJ=#-+vdw(3nbM4pUWVTMI8U2Mb;Jt*{7}YAqF_m1+$i>(vzl!LX{J zMR8!!q1|A9Ah_X<=+`LItSaeB0yb6~E74OQ;B;d%giPlMx;Vzo1plYMA#s^j9+h_t z;+eCMSNGU<* zAO!NqyWdwB0;PP;U_DS`wV`V|Bqap}!|oMDk>083G94?V>7>uE#P9tdbi%>Jp=YR& zp<=jr!zI5@1H~)Nqd=&%Ae&*SZI$oGcyxYF{#!3rq6#_O>6h0hMn3c=EuB Qy@?%*zOf4WgWw_f36=e>F8}}l diff --git a/PDF/src/Document.cpp b/PDF/src/Document.cpp index ee22e9ff9..02ed6a994 100644 --- a/PDF/src/Document.cpp +++ b/PDF/src/Document.cpp @@ -36,9 +36,7 @@ Document::Document(const std::string fileName, _pRawData(0), _size(0) { - compression(COMPRESSION_ALL); - for (Poco::UInt32 i = 0; i < pageCount; ++i) - addPage(pageSize, orientation); + init(pageCount, pageSize, orientation); } @@ -49,9 +47,7 @@ Document::Document(Poco::UInt32 pageCount, _pRawData(0), _size(0) { - compression(COMPRESSION_ALL); - for (Poco::UInt32 i = 0; i < pageCount; ++i) - addPage(); + init(pageCount, pageSize, orientation); } @@ -62,6 +58,16 @@ Document::~Document() } +void Document::init(Poco::UInt32 pageCount, + Page::Size pageSize, Page::Orientation orientation) +{ + useUTF8Encoding(); + compression(COMPRESSION_ALL); + for (Poco::UInt32 i = 0; i < pageCount; ++i) + addPage(pageSize, orientation); +} + + void Document::createNew(bool resetAll) { reset(resetAll); @@ -99,7 +105,7 @@ Document::SizeType Document::size() const Page& Document::addPage(Page::Size pageSize, Page::Orientation orientation) { - Page page(&_pdf, HPDF_AddPage(_pdf), pageSize); + Page page(this, HPDF_AddPage(_pdf), pageSize); page.setSizeAndOrientation(pageSize, orientation); _pages.push_back(page); return _pages.back(); @@ -114,7 +120,7 @@ const Page& Document::insertPage(int index, poco_assert (index < _pages.size()); HPDF_Page target = *((HPDF_Page*) HPDF_List_ItemAt(_pdf->page_list, static_cast(index))); return *_pages.insert(_pages.begin() + index, - Page(&_pdf, + Page(this, HPDF_InsertPage(_pdf, target), pageSize, orientation)); @@ -123,7 +129,7 @@ const Page& Document::insertPage(int index, const Page& Document::getCurrentPage() { - Page p(&_pdf, HPDF_GetCurrentPage(_pdf)); + Page p(this, HPDF_GetCurrentPage(_pdf)); PageContainer::iterator it = _pages.begin(); PageContainer::iterator end = _pages.end(); for (;it != end; ++it) diff --git a/PDF/src/Page.cpp b/PDF/src/Page.cpp index 4ee008507..9e79b7df5 100644 --- a/PDF/src/Page.cpp +++ b/PDF/src/Page.cpp @@ -13,6 +13,7 @@ #include "Poco/PDF/Page.h" +#include "Poco/PDF/Document.h" #include "Poco/PDF/PDFException.h" #undef min #undef max @@ -23,24 +24,25 @@ namespace Poco { namespace PDF { -Page::Page(HPDF_Doc* pPDF, +Page::Page(Document* pDocument, const HPDF_Page& page, Size pageSize, - Orientation orientation): - _pPDF(pPDF), - _page(page), - _size(pageSize), - _orientation(orientation), - _pCurrentFont(0) + Orientation orientation): + _pDocument(pDocument), + _page(page), + _size(pageSize), + _orientation(orientation), + _pCurrentFont(0) { } -Page::Page(const Page& other): - _pPDF(other._pPDF), +Page::Page(const Page& other): + _pDocument(other._pDocument), _page(other._page), _size(other._size), - _orientation(other._orientation) + _orientation(other._orientation), + _pCurrentFont(other._pCurrentFont ? new Font(*other._pCurrentFont) : (Font*)0) { } @@ -58,14 +60,21 @@ Page& Page::operator = (const Page& page) } +bool Page::operator == (const Page& other) const +{ + return &_pDocument->handle() == &other._pDocument->handle() && _page == other._page; +} + + void Page::swap(Page& other) { using std::swap; - - swap(_pPDF, other._pPDF); + + swap(_pDocument, other._pDocument); swap(_page, other._page); swap(_size, other._size); swap(_orientation, other._orientation); + swap(_pCurrentFont, other._pCurrentFont); } @@ -97,6 +106,20 @@ float Page::textWidth(const std::string& text) } +void Page::setFont(const std::string& name, float size, const std::string& encoding) +{ + Font font(&_pDocument->handle(), HPDF_GetFont(_pDocument->handle(), name.c_str(), encoding.empty() ? 0 : encoding.c_str())); + setFont(font, size); +} + + +const Font& Page::getFont() const +{ + delete _pCurrentFont; + return *(_pCurrentFont = new Font(&_pDocument->handle(), HPDF_Page_GetCurrentFont(_page))); +} + + void Page::setRotation(int angle) { if (0 != angle % 90 || angle > std::numeric_limits::max()) @@ -112,7 +135,7 @@ const Destination& Page::createDestination(const std::string& name) if (_destinations.end() != it) throw InvalidArgumentException("Destination already exists."); - Destination dest(_pPDF, HPDF_Page_CreateDestination(_page), name); + Destination dest(&_pDocument->handle(), HPDF_Page_CreateDestination(_page), name); std::pair ret = _destinations.insert(DestinationContainer::value_type(name, dest)); @@ -131,7 +154,7 @@ const TextAnnotation& Page::createTextAnnotation(const std::string& name, if (_textAnnotations.end() != it) throw InvalidArgumentException("Annotation already exists."); - TextAnnotation ann(_pPDF, + TextAnnotation ann(&_pDocument->handle(), HPDF_Page_CreateTextAnnot(_page, rect, text.c_str(), encoder), name); @@ -152,7 +175,7 @@ const LinkAnnotation& Page::createLinkAnnotation(const std::string& name, if (_linkAnnotations.end() != it) throw InvalidArgumentException("Annotation already exists."); - LinkAnnotation ann(_pPDF, + LinkAnnotation ann(&_pDocument->handle(), HPDF_Page_CreateLinkAnnot(_page, rect, dest), name); std::pair ret = @@ -172,7 +195,7 @@ const LinkAnnotation& Page::createURILinkAnnotation(const std::string& name, if (_linkAnnotations.end() != it) throw InvalidArgumentException("Annotation already exists."); - LinkAnnotation ann(_pPDF, + LinkAnnotation ann(&_pDocument->handle(), HPDF_Page_CreateURILinkAnnot(_page, rect, uri.c_str()), name); std::pair ret = diff --git a/PDF/src/hpdf_3dmeasure.c b/PDF/src/hpdf_3dmeasure.c new file mode 100644 index 000000000..aaa1e811d --- /dev/null +++ b/PDF/src/hpdf_3dmeasure.c @@ -0,0 +1,235 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf_info.h" +#include "hpdf_3dmeasure.h" +#include "hpdf.h" + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_3DMeasure -----------------------------------------------------*/ + +HPDF_STATUS +HPDF_Dict_AddPoint3D(HPDF_Dict dict, const char* key, HPDF_Point3D point) +{ + HPDF_Array array; + HPDF_STATUS ret = HPDF_OK; + array = HPDF_Array_New (dict->mmgr); + if (!array) + return HPDF_Error_GetCode ( dict->error); + + if (HPDF_Dict_Add (dict, key, array) != HPDF_OK) + return HPDF_Error_GetCode ( dict->error); + + ret += HPDF_Array_AddReal(array, point.x); + ret += HPDF_Array_AddReal(array, point.y); + ret += HPDF_Array_AddReal(array, point.z); + + return ret; +} + + + + +HPDF_3DMeasure +HPDF_3DC3DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint + ) +{ + HPDF_3DMeasure measure; + HPDF_STATUS ret = HPDF_OK; + + + HPDF_PTRACE((" HPDF_3DC3DMeasure_New\n")); + + measure = HPDF_Dict_New (mmgr); + if (!measure) + return NULL; + + if (HPDF_Xref_Add (xref, measure) != HPDF_OK) + return NULL; + + ret += HPDF_Dict_AddPoint3D(measure, "A1", firstanchorpoint); + ret += HPDF_Dict_AddPoint3D(measure, "TP", textanchorpoint); + + ret += HPDF_Dict_AddName (measure, "Type", "3DMeasure"); + ret += HPDF_Dict_AddName (measure, "Subtype", "3DC"); + + if (ret != HPDF_OK) + return NULL; + + return measure; +} + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetColor(HPDF_3DMeasure measure, + HPDF_RGBColor color) +{ + HPDF_Array array; + HPDF_STATUS ret = HPDF_OK; + + array = HPDF_Array_New (measure->mmgr); + if (!array) + return HPDF_Error_GetCode (measure->error); + + ret = HPDF_Dict_Add (measure, "C", array); + if (ret != HPDF_OK) + return ret; + + ret += HPDF_Array_AddName(array, "DeviceRGB"); + ret += HPDF_Array_AddReal(array, color.r); + ret += HPDF_Array_AddReal(array, color.g); + ret += HPDF_Array_AddReal(array, color.b); + + return ret; +} + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetTextSize(HPDF_3DMeasure measure, + HPDF_REAL textsize) +{ + HPDF_STATUS ret = HPDF_OK; + + ret = HPDF_Dict_AddReal(measure, "TS", textsize); + + return ret; +} + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DMeasure_SetName(HPDF_3DMeasure measure, + const char* name) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_String s; + + s = HPDF_String_New (measure->mmgr, name, 0); + if (!s) + return HPDF_Error_GetCode ( s->error); + + ret = HPDF_Dict_Add(measure, "TRL", s); + + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetTextBoxSize(HPDF_3DMeasure measure, + HPDF_INT32 x, + HPDF_INT32 y) +{ + HPDF_Array array; + HPDF_STATUS ret = HPDF_OK; + + array = HPDF_Array_New (measure->mmgr); + if (!array) + return HPDF_Error_GetCode (measure->error); + + ret = HPDF_Dict_Add (measure, "TB", array); + if (ret != HPDF_OK) + return ret; + + ret += HPDF_Array_AddNumber(array, x); + ret += HPDF_Array_AddNumber(array, y); + + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetText(HPDF_3DMeasure measure, + const char* text, + HPDF_Encoder encoder) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_String s; + + s = HPDF_String_New (measure->mmgr, text, encoder); + if (!s) + return HPDF_Error_GetCode ( s->error); + + ret = HPDF_Dict_Add(measure, "UT", s); + + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DC3DMeasure_SetProjectionAnotation(HPDF_3DMeasure measure, + HPDF_Annotation projectionanotation) +{ + HPDF_STATUS ret = HPDF_OK; + + ret = HPDF_Dict_Add(measure, "S", projectionanotation); + + return ret; +} + + +HPDF_3DMeasure +HPDF_PD33DMeasure_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ) +{ + HPDF_3DMeasure measure; + HPDF_STATUS ret = HPDF_OK; + HPDF_String s; + + HPDF_PTRACE((" HPDF_3DC3DMeasure_New\n")); + + measure = HPDF_Dict_New (mmgr); + if (!measure) + return NULL; + + if (HPDF_Xref_Add (xref, measure) != HPDF_OK) + return NULL; + + ret += HPDF_Dict_AddPoint3D(measure, "AP", annotationPlaneNormal); + ret += HPDF_Dict_AddPoint3D(measure, "A1", firstAnchorPoint); + ret += HPDF_Dict_AddPoint3D(measure, "A2", secondAnchorPoint); + ret += HPDF_Dict_AddPoint3D(measure, "D1", leaderLinesDirection); + ret += HPDF_Dict_AddPoint3D(measure, "TP", measurementValuePoint); + ret += HPDF_Dict_AddPoint3D(measure, "TY", textYDirection); + + ret += HPDF_Dict_AddReal(measure, "V", value); + + s = HPDF_String_New (measure->mmgr, unitsString, 0); + if (!s) + return NULL; + + ret = HPDF_Dict_Add(measure, "U", s); + + ret += HPDF_Dict_AddName (measure, "Type", "3DMeasure"); + ret += HPDF_Dict_AddName (measure, "Subtype", "PD3"); + + if (ret != HPDF_OK) + return NULL; + + return measure; +} + diff --git a/PDF/src/hpdf_annotation.c b/PDF/src/hpdf_annotation.c index 874e1d783..f90500619 100644 --- a/PDF/src/hpdf_annotation.c +++ b/PDF/src/hpdf_annotation.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_annotation.c + * << Haru Free PDF Library >> -- hpdf_annotation.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -14,10 +17,11 @@ #include "hpdf_conf.h" #include "hpdf_utils.h" +#include "hpdf_info.h" #include "hpdf_annotation.h" #include "hpdf.h" -const static char *HPDF_ANNOT_TYPE_NAMES[] = { +static const char * const HPDF_ANNOT_TYPE_NAMES[] = { "Text", "Link", "Sound", @@ -30,10 +34,14 @@ const static char *HPDF_ANNOT_TYPE_NAMES[] = { "Underline", "Ink", "FileAttachment", - "Popup" + "Popup", + "3D", + "Squiggly", + "Line", + "Projection" }; -const static char *HPDF_ANNOT_ICON_NAMES_NAMES[] = { +static const char * const HPDF_ANNOT_ICON_NAMES_NAMES[] = { "Comment", "Key", "Note", @@ -43,6 +51,50 @@ const static char *HPDF_ANNOT_ICON_NAMES_NAMES[] = { "Insert" }; +static const char * const HPDF_ANNOT_INTENT_NAMES[] = { + "FreeTextCallout", + "FreeTextTypeWriter", + "LineArrow", + "LineDimension", + "PolygonCloud", + "PolyLineDimension", + "PolygonDimension" + }; + +static const char * const HPDF_LINE_ANNOT_ENDING_STYLE_NAMES[] = { + "None", + "Square", + "Circle", + "Diamond", + "OpenArrow", + "ClosedArrow", + "Butt", + "ROpenArrow", + "RClosedArrow", + "Slash" + }; + +static const char * const HPDF_LINE_ANNOT_CAP_POSITION_NAMES[] = { + "Inline", + "Top" + }; + +static const char * const HPDF_STAMP_ANNOT_NAME_NAMES[] = { + "Approved", + "Experimental", + "NotApproved", + "AsIs", + "Expired", + "NotForPublicRelease", + "Confidential", + "Final", + "Sold", + "Departmental", + "ForComment", + "TopSecret", + "Draft", + "ForPublicRelease" + }; static HPDF_BOOL CheckSubType (HPDF_Annotation annot, @@ -104,7 +156,7 @@ HPDF_Annotation_New (HPDF_MMgr mmgr, } -HPDF_STATUS +HPDF_EXPORT(HPDF_STATUS) HPDF_Annotation_SetBorderStyle (HPDF_Annotation annot, HPDF_BSSubtype subtype, HPDF_REAL width, @@ -268,12 +320,12 @@ HPDF_LinkAnnot_SetBorderStyle (HPDF_Annotation annot, ret += HPDF_Array_AddNumber (dash, dash_on); ret += HPDF_Array_AddNumber (dash, dash_off); + + if (ret != HPDF_OK) + return HPDF_CheckError (annot->error); } - if (ret != HPDF_OK) - return HPDF_CheckError (annot->error); - - return ret; + return HPDF_OK; } HPDF_EXPORT(HPDF_STATUS) @@ -309,19 +361,101 @@ HPDF_LinkAnnot_SetHighlightMode (HPDF_Annotation annot, return ret; } + HPDF_Annotation -HPDF_TextAnnot_New (HPDF_MMgr mmgr, +HPDF_3DAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_U3D u3d) +{ + HPDF_Annotation annot; + HPDF_Dict action, appearance, stream; + HPDF_STATUS ret; + + HPDF_PTRACE((" HPDF_3DAnnot_New\n")); + + annot = HPDF_Annotation_New (mmgr, xref, HPDF_ANNOT_3D, rect); + if (!annot) { + return NULL; + } + + HPDF_Dict_Add(annot, "Contents", HPDF_String_New (mmgr, "3D Model", NULL)); + + action = HPDF_Dict_New (mmgr); + if (!action) { + return NULL; + } + + ret = HPDF_Dict_Add (annot, "3DA", action); + if (ret != HPDF_OK) { + return NULL; + } + + ret += HPDF_Dict_AddName (action, "A", "PV"); + + ret += HPDF_Dict_AddBoolean(action, "TB", HPDF_FALSE); + + if (ret != HPDF_OK) { + return NULL; + } + + if (HPDF_Dict_Add (annot, "3DD", u3d) != HPDF_OK) { + return NULL; + } + + appearance = HPDF_Dict_New (mmgr); + if (!appearance) { + return NULL; + } + + ret = HPDF_Dict_Add (annot, "AP", appearance); + if (ret != HPDF_OK) { + return NULL; + } + + stream = HPDF_Dict_New (mmgr); + if (!stream) { + return NULL; + } + ret = HPDF_Dict_Add (appearance, "N", stream); + if (ret != HPDF_OK) { + return NULL; + } + + return annot; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DAnnot_Set3DView (HPDF_Annotation annot) +{ + HPDF_Boolean b; + + HPDF_PTRACE((" HPDF_3DAnnot_Set3DView\n")); + + if (!CheckSubType (annot, HPDF_ANNOT_3D)) + return HPDF_INVALID_ANNOTATION; + + b = HPDF_Boolean_New (annot->mmgr, 0); + if (!b) + return HPDF_CheckError (annot->error); + + return HPDF_Dict_Add (annot, "3DD", b); +} + +HPDF_Annotation +HPDF_MarkupAnnot_New (HPDF_MMgr mmgr, HPDF_Xref xref, HPDF_Rect rect, const char *text, - HPDF_Encoder encoder) + HPDF_Encoder encoder, + HPDF_AnnotType subtype) { HPDF_Annotation annot; HPDF_String s; - HPDF_PTRACE((" HPDF_TextAnnot_New\n")); + HPDF_PTRACE((" HPDF_MarkupAnnot_New\n")); - annot = HPDF_Annotation_New (mmgr, xref, HPDF_ANNOT_TEXT_NOTES, rect); + annot = HPDF_Annotation_New (mmgr, xref, subtype, rect); if (!annot) return NULL; @@ -335,6 +469,90 @@ HPDF_TextAnnot_New (HPDF_MMgr mmgr, return annot; } +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetRGBColor (HPDF_Annotation annot, HPDF_RGBColor color) +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_Annot_SetRGBColor\n")); + + cArray = HPDF_Array_New ( annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add (annot, "C", cArray); + ret += HPDF_Array_AddReal (cArray, color.r); + ret += HPDF_Array_AddReal (cArray, color.g); + ret += HPDF_Array_AddReal (cArray, color.b); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color) +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_Annot_SetCMYKColor\n")); + + cArray = HPDF_Array_New (annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode (annot->error); + + ret += HPDF_Dict_Add (annot, "C", cArray); + ret += HPDF_Array_AddReal (cArray, color.c); + ret += HPDF_Array_AddReal (cArray, color.m); + ret += HPDF_Array_AddReal (cArray, color.y); + ret += HPDF_Array_AddReal (cArray, color.k); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetGrayColor (HPDF_Annotation annot, HPDF_REAL color) +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_Annot_SetGrayColor\n")); + + cArray = HPDF_Array_New (annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add (annot, "C", cArray); + ret += HPDF_Array_AddReal ( cArray, color); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_SetNoColor (HPDF_Annotation annot) +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_Annot_SetNoColor\n")); + + cArray = HPDF_Array_New (annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret = HPDF_Dict_Add (annot, "C", cArray); + + return ret; +} HPDF_EXPORT(HPDF_STATUS) HPDF_TextAnnot_SetIcon (HPDF_Annotation annot, @@ -345,7 +563,7 @@ HPDF_TextAnnot_SetIcon (HPDF_Annotation annot, if (!CheckSubType (annot, HPDF_ANNOT_TEXT_NOTES)) return HPDF_INVALID_ANNOTATION; - if (icon < 0 || icon >= HPDF_ANNOT_ICON_EOF) + if (icon >= HPDF_ANNOT_ICON_EOF) return HPDF_RaiseError (annot->error, HPDF_ANNOT_INVALID_ICON, (HPDF_STATUS)icon); @@ -375,6 +593,162 @@ HPDF_TextAnnot_SetOpened (HPDF_Annotation annot, return HPDF_Dict_Add (annot, "Open", b); } +HPDF_EXPORT(HPDF_STATUS) +HPDF_PopupAnnot_SetOpened (HPDF_Annotation annot, + HPDF_BOOL opened) +{ + HPDF_Boolean b; + + HPDF_PTRACE((" HPDF_TextAnnot_SetOpend\n")); + + if (!CheckSubType (annot, HPDF_ANNOT_POPUP)) + return HPDF_INVALID_ANNOTATION; + + b = HPDF_Boolean_New (annot->mmgr, opened); + if (!b) + return HPDF_CheckError (annot->error); + + return HPDF_Dict_Add (annot, "Open", b); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTitle (HPDF_Annotation annot, const char* name) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetTitle\n")); + + return HPDF_Dict_Add( annot, "T", HPDF_String_New( annot->mmgr, name, NULL)); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetSubject (HPDF_Annotation annot, const char* name) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetSubject\n")); + + return HPDF_Dict_Add( annot, "Subj", HPDF_String_New( annot->mmgr, name, NULL)); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCreationDate (HPDF_Annotation annot, HPDF_Date value) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetCreationDate\n")); + + return HPDF_Info_SetInfoDateAttr( annot, HPDF_INFO_CREATION_DATE, value); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetTransparency (HPDF_Annotation annot, HPDF_REAL value) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetTransparency\n")); + + return HPDF_Dict_AddReal( annot, "CA", value); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetIntent (HPDF_Annotation annot, + HPDF_AnnotIntent intent) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetIntent\n")); + + if (HPDF_Dict_AddName (annot, "IT", + HPDF_ANNOT_INTENT_NAMES[(HPDF_INT)intent]) != HPDF_OK) + return HPDF_CheckError (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetPopup (HPDF_Annotation annot, + HPDF_Annotation popup) +{ + HPDF_PTRACE((" HPDF_MarkupAnnot_SetPopup\n")); + + return HPDF_Dict_Add( annot, "Popup", popup); +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorRGBColor (HPDF_Annotation annot, HPDF_RGBColor color)/* IC with RGB entry */ +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetInteriorRGBColor\n")); + + cArray = HPDF_Array_New ( annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add (annot, "IC", cArray); + ret += HPDF_Array_AddReal (cArray, color.r); + ret += HPDF_Array_AddReal (cArray, color.g); + ret += HPDF_Array_AddReal (cArray, color.b); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorCMYKColor (HPDF_Annotation annot, HPDF_CMYKColor color)/* IC with CMYK entry */ +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetInteriorCMYKColor\n")); + + cArray = HPDF_Array_New ( annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add (annot, "IC", cArray); + ret += HPDF_Array_AddReal (cArray, color.c); + ret += HPDF_Array_AddReal (cArray, color.m); + ret += HPDF_Array_AddReal (cArray, color.y); + ret += HPDF_Array_AddReal (cArray, color.k); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorGrayColor (HPDF_Annotation annot, HPDF_REAL color)/* IC with Gray entry */ +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetInteriorGrayColor\n")); + + cArray = HPDF_Array_New ( annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add (annot, "IC", cArray); + ret += HPDF_Array_AddReal (cArray, color); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetInteriorTransparent (HPDF_Annotation annot) /* IC with No Color entry */ +{ + HPDF_Array cArray; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetInteriorTransparent\n")); + + cArray = HPDF_Array_New ( annot->mmgr); + if (!cArray) + return HPDF_Error_GetCode ( annot->error); + + ret = HPDF_Dict_Add (annot, "IC", cArray); + + return ret; +} HPDF_BOOL HPDF_Annotation_Validate (HPDF_Annotation annot) @@ -413,3 +787,380 @@ CheckSubType (HPDF_Annotation annot, return HPDF_TRUE; } +HPDF_EXPORT(HPDF_STATUS) +HPDF_Annot_Set3DView ( HPDF_MMgr mmgr, + HPDF_Annotation annot, + HPDF_Annotation annot3d, + HPDF_Dict view3d) +{ + HPDF_Proxy proxyView3d; + HPDF_Dict exData = HPDF_Dict_New( mmgr); + HPDF_STATUS retS = HPDF_OK; + + retS += HPDF_Dict_AddName( exData, "Type", "ExData"); + retS += HPDF_Dict_AddName( exData, "Subtype", "Markup3D"); + retS += HPDF_Dict_Add( exData, "3DA", annot3d); + + proxyView3d = HPDF_Proxy_New( mmgr, view3d); + + retS += HPDF_Dict_Add( exData, "3DV", proxyView3d); + retS += HPDF_Dict_Add( annot, "ExData", exData); + return retS; +} + + +HPDF_Annotation +HPDF_PopupAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_Annotation parent) +{ + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_PopupAnnot_New\n")); + + annot = HPDF_Annotation_New (mmgr, xref, HPDF_ANNOT_POPUP, rect); + if (!annot) + return NULL; + + if (HPDF_Dict_Add (annot, "Parent", parent) != HPDF_OK) + return NULL; + + return annot; +} + +HPDF_Annotation +HPDF_StampAnnot_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder) +{ + HPDF_Annotation annot; + HPDF_String s; + HPDF_PTRACE((" HPDF_StampAnnot_New\n")); + + annot = HPDF_Annotation_New (mmgr, xref, HPDF_ANNOT_STAMP, rect); + if (!annot) + return NULL; + + if (HPDF_Dict_AddName ( annot, "Name", HPDF_STAMP_ANNOT_NAME_NAMES[name]) != HPDF_OK) + return NULL; + + s = HPDF_String_New (mmgr, text, encoder); + if (!s) + return NULL; + + if (HPDF_Dict_Add (annot, "Contents", s) != HPDF_OK) + return NULL; + + return annot; +} + +HPDF_Annotation +HPDF_ProjectionAnnot_New(HPDF_MMgr mmgr, + HPDF_Xref xref, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder) +{ + HPDF_Annotation annot; + HPDF_String s; + HPDF_PTRACE((" HPDF_StampAnnot_New\n")); + + annot = HPDF_Annotation_New (mmgr, xref, HPDF_ANNOT_PROJECTION, rect); + if (!annot) + return NULL; + + s = HPDF_String_New (mmgr, text, encoder); + if (!s) + return NULL; + + if (HPDF_Dict_Add (annot, "Contents", s) != HPDF_OK) + return NULL; + + return annot; +} + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_TextMarkupAnnot_SetQuadPoints ( HPDF_Annotation annot, HPDF_Point lb, HPDF_Point rb, HPDF_Point lt, HPDF_Point rt) /* l-left, r-right, b-bottom, t-top positions */ +{ + HPDF_Array quadPoints; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_TextMarkupAnnot_SetQuadPoints\n")); + + quadPoints = HPDF_Array_New ( annot->mmgr); + if ( !quadPoints) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "QuadPoints", quadPoints)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddReal (quadPoints, lb.x); + ret += HPDF_Array_AddReal (quadPoints, lb.y); + ret += HPDF_Array_AddReal (quadPoints, rb.x); + ret += HPDF_Array_AddReal (quadPoints, rb.y); + ret += HPDF_Array_AddReal (quadPoints, lt.x); + ret += HPDF_Array_AddReal (quadPoints, lt.y); + ret += HPDF_Array_AddReal (quadPoints, rt.x); + ret += HPDF_Array_AddReal (quadPoints, rt.y); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (quadPoints->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetLineEndingStyle (HPDF_Annotation annot, HPDF_LineAnnotEndingStyle startStyle, HPDF_LineAnnotEndingStyle endStyle) +{ + HPDF_Array lineEndStyles; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_FreeTextAnnot_SetLineEndingStyle\n")); + + lineEndStyles = HPDF_Array_New ( annot->mmgr); + if ( !lineEndStyles) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "LE", lineEndStyles)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddName (lineEndStyles, HPDF_LINE_ANNOT_ENDING_STYLE_NAMES[(HPDF_INT)startStyle]); + ret += HPDF_Array_AddName (lineEndStyles, HPDF_LINE_ANNOT_ENDING_STYLE_NAMES[(HPDF_INT)endStyle]); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (lineEndStyles->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetRectDiff (HPDF_Annotation annot, HPDF_Rect rect) /* RD entry : this is the difference between Rect and the text annotation rectangle */ +{ + HPDF_Array array; + HPDF_STATUS ret = HPDF_OK; + HPDF_REAL tmp; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetRectDiff\n")); + + array = HPDF_Array_New ( annot->mmgr); + if ( !array) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "RD", array)) != HPDF_OK) + return ret; + + if (rect.top < rect.bottom) { + tmp = rect.top; + rect.top = rect.bottom; + rect.bottom = tmp; + } + + ret += HPDF_Array_AddReal (array, rect.left); + ret += HPDF_Array_AddReal (array, rect.bottom); + ret += HPDF_Array_AddReal (array, rect.right); + ret += HPDF_Array_AddReal (array, rect.top); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (array->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_SetDefaultStyle (HPDF_Annotation annot, + const char* style) +{ + HPDF_String s; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_FreeTextAnnot_SetDefaultStyle\n")); + + s = HPDF_String_New ( annot->mmgr, style, NULL); + if ( !s) + return HPDF_Error_GetCode ( annot->error); + + ret = HPDF_Dict_Add ( annot, "DS", s); + + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set3PointCalloutLine ( HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point kneePoint, HPDF_Point endPoint) /* Callout line will be in default user space */ +{ + HPDF_Array clPoints; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_FreeTextAnnot_Set3PointCalloutLine\n")); + + clPoints = HPDF_Array_New ( annot->mmgr); + if ( !clPoints) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "CL", clPoints)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddReal (clPoints, startPoint.x); + ret += HPDF_Array_AddReal (clPoints, startPoint.y); + ret += HPDF_Array_AddReal (clPoints, kneePoint.x); + ret += HPDF_Array_AddReal (clPoints, kneePoint.y); + ret += HPDF_Array_AddReal (clPoints, endPoint.x); + ret += HPDF_Array_AddReal (clPoints, endPoint.y); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (clPoints->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_FreeTextAnnot_Set2PointCalloutLine ( HPDF_Annotation annot, HPDF_Point startPoint, HPDF_Point endPoint) /* Callout line will be in default user space */ +{ + HPDF_Array clPoints; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_FreeTextAnnot_Set3PointCalloutLine\n")); + + clPoints = HPDF_Array_New ( annot->mmgr); + if ( !clPoints) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "CL", clPoints)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddReal (clPoints, startPoint.x); + ret += HPDF_Array_AddReal (clPoints, startPoint.y); + ret += HPDF_Array_AddReal (clPoints, endPoint.x); + ret += HPDF_Array_AddReal (clPoints, endPoint.y); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (clPoints->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_MarkupAnnot_SetCloudEffect (HPDF_Annotation annot, HPDF_INT cloudIntensity) /* BE entry */ +{ + HPDF_Dict borderEffect; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_MarkupAnnot_SetCloudEffect\n")); + + borderEffect = HPDF_Dict_New ( annot->mmgr); + if (!borderEffect) + return HPDF_Error_GetCode ( annot->error); + + ret += HPDF_Dict_Add ( annot, "BE", borderEffect); + ret += HPDF_Dict_AddName ( borderEffect, "S", "C"); + ret += HPDF_Dict_AddNumber ( borderEffect, "I", cloudIntensity); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetPosition (HPDF_Annotation annot, + HPDF_Point startPoint, HPDF_LineAnnotEndingStyle startStyle, + HPDF_Point endPoint, HPDF_LineAnnotEndingStyle endStyle) +{ + HPDF_Array lineEndPoints; + HPDF_Array lineEndStyles; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_LineAnnot_SetPosition\n")); + + lineEndPoints = HPDF_Array_New ( annot->mmgr); + if ( !lineEndPoints) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "L", lineEndPoints)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddReal (lineEndPoints, startPoint.x); + ret += HPDF_Array_AddReal (lineEndPoints, startPoint.y); + ret += HPDF_Array_AddReal (lineEndPoints, endPoint.x); + ret += HPDF_Array_AddReal (lineEndPoints, endPoint.y); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( lineEndPoints->error); + + lineEndStyles = HPDF_Array_New ( annot->mmgr); + if ( !lineEndStyles) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "LE", lineEndStyles)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddName (lineEndStyles, HPDF_LINE_ANNOT_ENDING_STYLE_NAMES[(HPDF_INT)startStyle]); + ret += HPDF_Array_AddName (lineEndStyles, HPDF_LINE_ANNOT_ENDING_STYLE_NAMES[(HPDF_INT)endStyle]); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( lineEndStyles->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetLeader (HPDF_Annotation annot, HPDF_INT leaderLen, HPDF_INT leaderExtLen, HPDF_INT leaderOffsetLen) +{ + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_LineAnnot_SetLeader\n")); + + ret += HPDF_Dict_AddNumber ( annot, "LL", leaderLen); + ret += HPDF_Dict_AddNumber ( annot, "LLE", leaderExtLen); + ret += HPDF_Dict_AddNumber ( annot, "LLO", leaderOffsetLen); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( annot->error); + + return HPDF_OK; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_LineAnnot_SetCaption (HPDF_Annotation annot, HPDF_BOOL showCaption, HPDF_LineAnnotCapPosition position, HPDF_INT horzOffset, HPDF_INT vertOffset) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Array capOffset; + HPDF_PTRACE((" HPDF_LineAnnot_SetCaption\n")); + + ret += HPDF_Dict_AddBoolean ( annot, "Cap", showCaption); + ret += HPDF_Dict_AddName( annot, "CP", HPDF_LINE_ANNOT_CAP_POSITION_NAMES[(HPDF_INT)position]); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode ( annot->error); + + capOffset = HPDF_Array_New ( annot->mmgr); + if ( !capOffset) + return HPDF_Error_GetCode ( annot->error); + + if ((ret = HPDF_Dict_Add ( annot, "CO", capOffset)) != HPDF_OK) + return ret; + + ret += HPDF_Array_AddNumber (capOffset, horzOffset); + ret += HPDF_Array_AddNumber (capOffset, vertOffset); + + if (ret != HPDF_OK) + return HPDF_Error_GetCode (capOffset->error); + + return HPDF_OK; +} + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_ProjectionAnnot_SetExData(HPDF_Annotation annot, HPDF_ExData exdata) +{ + HPDF_STATUS ret = HPDF_OK; + + ret = HPDF_Dict_Add(annot, "ExData", exdata); + + return ret; +} diff --git a/PDF/src/hpdf_array.c b/PDF/src/hpdf_array.c index 0f9fdf0c8..0984867ef 100644 --- a/PDF/src/hpdf_array.c +++ b/PDF/src/hpdf_array.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_array.c + * << Haru Free PDF Library >> -- hpdf_array.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -211,6 +214,13 @@ HPDF_Array_Add (HPDF_Array array, } +HPDF_UINT +HPDF_Array_Items (HPDF_Array array) +{ + return array->list->count; +} + + HPDF_STATUS HPDF_Array_Insert (HPDF_Array array, void *target, diff --git a/PDF/src/hpdf_binary.c b/PDF/src/hpdf_binary.c index 667650203..64cd0f5da 100644 --- a/PDF/src/hpdf_binary.c +++ b/PDF/src/hpdf_binary.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_binary.c + * << Haru Free PDF Library >> -- hpdf_binary.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_boolean.c b/PDF/src/hpdf_boolean.c index baba49a96..b8d3f6d9b 100644 --- a/PDF/src/hpdf_boolean.c +++ b/PDF/src/hpdf_boolean.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_boolean.h + * << Haru Free PDF Library >> -- hpdf_boolean.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_catalog.c b/PDF/src/hpdf_catalog.c index 34b82e669..6c3107104 100644 --- a/PDF/src/hpdf_catalog.c +++ b/PDF/src/hpdf_catalog.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.5 >> -- hpdf_catalog.c + * << Haru Free PDF Library >> -- hpdf_catalog.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,8 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.08.07 modified. - * 2006.09.01 added ViewerPreference functions. */ #include "hpdf_conf.h" @@ -19,16 +20,18 @@ #include "hpdf_catalog.h" #include "hpdf_pages.h" -static const char *HPDF_PAGE_LAYOUT_NAMES[] = { +static const char * const HPDF_PAGE_LAYOUT_NAMES[] = { "SinglePage", "OneColumn", "TwoColumnLeft", "TwoColumnRight", + "TwoPageLeft", + "TwoPageRight", NULL }; -static const char *HPDF_PAGE_MODE_NAMES[] = { +static const char * const HPDF_PAGE_MODE_NAMES[] = { "UseNone", "UseOutlines", "UseThumbs", @@ -83,6 +86,23 @@ HPDF_Catalog_GetRoot (HPDF_Catalog catalog) } +HPDF_NameDict +HPDF_Catalog_GetNames (HPDF_Catalog catalog) +{ + if (!catalog) + return NULL; + return HPDF_Dict_GetItem (catalog, "Names", HPDF_OCLASS_DICT); +} + + +HPDF_STATUS +HPDF_Catalog_SetNames (HPDF_Catalog catalog, + HPDF_NameDict dict) +{ + return HPDF_Dict_Add (catalog, "Names", dict); +} + + HPDF_PageLayout HPDF_Catalog_GetPageLayout (HPDF_Catalog catalog) { @@ -296,6 +316,17 @@ HPDF_Catalog_SetViewerPreference (HPDF_Catalog catalog, return ret; } + if (value & HPDF_PRINT_SCALING_NONE) { + if ((ret = HPDF_Dict_AddName (preferences, "PrintScaling", + "None")) != HPDF_OK) + return ret; + } else { + if ((ret = HPDF_Dict_RemoveElement (preferences, "PrintScaling")) != + HPDF_OK) + if (ret != HPDF_DICT_ITEM_NOT_FOUND) + return ret; + } + return HPDF_OK; } diff --git a/PDF/src/hpdf_destination.c b/PDF/src/hpdf_destination.c index fed8e47f2..e2566c890 100644 --- a/PDF/src/hpdf_destination.c +++ b/PDF/src/hpdf_destination.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_destination.c + * << Haru Free PDF Library >> -- hpdf_destination.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -16,7 +19,7 @@ #include "hpdf_utils.h" #include "hpdf.h" -const char *HPDF_DESTINATION_TYPE_NAMES[] = { +const char * const HPDF_DESTINATION_TYPE_NAMES[] = { "XYZ", "Fit", "FitH", @@ -82,8 +85,10 @@ HPDF_Destination_Validate (HPDF_Destination dst) return HPDF_FALSE; target = (HPDF_Page)HPDF_Array_GetItem (dst, 0, HPDF_OCLASS_DICT); - if (!HPDF_Page_Validate (target)) - return HPDF_SetError (dst->error, HPDF_INVALID_PAGE, 0); + if (!HPDF_Page_Validate (target)) { + HPDF_SetError (dst->error, HPDF_INVALID_PAGE, 0); + return HPDF_FALSE; + } return HPDF_TRUE; } diff --git a/PDF/src/hpdf_dict.c b/PDF/src/hpdf_dict.c index e4fc5f926..b537649e5 100644 --- a/PDF/src/hpdf_dict.c +++ b/PDF/src/hpdf_dict.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.5 >> -- HPDF_Dict.c + * << Haru Free PDF Library >> -- hpdf_dict.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -113,6 +116,25 @@ HPDF_Dict_Free (HPDF_Dict dict) HPDF_FreeMem (dict->mmgr, dict); } +HPDF_STATUS +HPDF_Dict_Add_FilterParams(HPDF_Dict dict, HPDF_Dict filterParam) +{ + HPDF_Array paramArray; + /* prepare params object */ + paramArray = HPDF_Dict_GetItem (dict, "DecodeParms", + HPDF_OCLASS_ARRAY); + if(paramArray==NULL) { + paramArray = HPDF_Array_New (dict->mmgr); + if (!paramArray) + return HPDF_Error_GetCode (dict->error); + + /* add parameters */ + HPDF_Dict_Add(dict, "DecodeParms", paramArray); + } + HPDF_Array_Add(paramArray, filterParam); + return HPDF_OK; +} + HPDF_STATUS HPDF_Dict_Write (HPDF_Dict dict, @@ -155,13 +177,21 @@ HPDF_Dict_Write (HPDF_Dict dict, HPDF_Array_Clear (array); -#ifndef HPDF_NOZLIB +#ifndef LIBHPDF_HAVE_NOZLIB if (dict->filter & HPDF_STREAM_FILTER_FLATE_DECODE) HPDF_Array_AddName (array, "FlateDecode"); -#endif /* HPDF_NOZLIB */ +#endif /* LIBHPDF_HAVE_NOZLIB */ if (dict->filter & HPDF_STREAM_FILTER_DCT_DECODE) HPDF_Array_AddName (array, "DCTDecode"); + + if(dict->filter & HPDF_STREAM_FILTER_CCITT_DECODE) + HPDF_Array_AddName (array, "CCITTFaxDecode"); + + if(dict->filterParams!=NULL) + { + HPDF_Dict_Add_FilterParams(dict, dict->filterParams); + } } } @@ -220,7 +250,7 @@ HPDF_Dict_Write (HPDF_Dict dict, 0); } - if ((ret = HPDF_Stream_WriteStr (stream, "\012stream\015\012")) + if ((ret = HPDF_Stream_WriteStr (stream, "\012stream\015\012")) /* Acrobat 8.15 requires both \r and \n here */ != HPDF_OK) return ret; diff --git a/PDF/src/hpdf_doc.c b/PDF/src/hpdf_doc.c index a95dfd10d..7d9eb1a44 100644 --- a/PDF/src/hpdf_doc.c +++ b/PDF/src/hpdf_doc.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.5 >> -- hpdf_doc.c + * << Haru Free PDF Library >> -- hpdf_doc.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -16,18 +19,20 @@ #include "hpdf_conf.h" #include "hpdf_utils.h" #include "hpdf_encryptdict.h" +#include "hpdf_namedict.h" #include "hpdf_destination.h" #include "hpdf_info.h" #include "hpdf_page_label.h" #include "hpdf.h" -static const char *HPDF_VERSION_STR[5] = { +static const char * const HPDF_VERSION_STR[6] = { "%PDF-1.2\012%\267\276\255\252\012", "%PDF-1.3\012%\267\276\255\252\012", "%PDF-1.4\012%\267\276\255\252\012", "%PDF-1.5\012%\267\276\255\252\012", - "%PDF-1.6\012%\267\276\255\252\012" + "%PDF-1.6\012%\267\276\255\252\012", + "%PDF-1.7\012%\267\276\255\252\012" }; @@ -255,7 +260,7 @@ HPDF_NewDoc (HPDF_Doc pdf) pdf->cur_pages = pdf->root_pages; - ptr = HPDF_StrCpy (ptr, "Haru Free PDF Library ", eptr); + ptr = (char *)HPDF_StrCpy (ptr, (const char *)"Haru Free PDF Library ", eptr); version = HPDF_GetVersion (); HPDF_StrCpy (ptr, version, eptr); @@ -647,6 +652,39 @@ HPDF_SaveToStream (HPDF_Doc pdf) return HPDF_OK; } +HPDF_EXPORT(HPDF_STATUS) +HPDF_GetContents (HPDF_Doc pdf, + HPDF_BYTE *buf, + HPDF_UINT32 *size) +{ + HPDF_Stream stream; + HPDF_UINT isize = *size; + HPDF_STATUS ret; + + HPDF_PTRACE ((" HPDF_GetContents\n")); + + if (!HPDF_HasDoc (pdf)) { + return HPDF_INVALID_DOCUMENT; + } + + stream = HPDF_MemStream_New (pdf->mmgr, HPDF_STREAM_BUF_SIZ); + + if (!stream) { + return HPDF_CheckError (&pdf->error); + } + + if (InternalSaveToStream (pdf, stream) != HPDF_OK) { + HPDF_Stream_Free (stream); + return HPDF_CheckError (&pdf->error); + } + + ret = HPDF_Stream_Read (stream, buf, &isize); + + *size = isize; + HPDF_Stream_Free (stream); + + return ret; +} HPDF_EXPORT(HPDF_UINT32) HPDF_GetStreamSize (HPDF_Doc pdf) @@ -1186,11 +1224,12 @@ HPDF_SetCurrentEncoder (HPDF_Doc pdf, return HPDF_GetError (pdf); encoder = HPDF_GetEncoder (pdf, encoding_name); - pdf->cur_encoder = encoder; - if (!pdf) + if (!encoder) return HPDF_GetError (pdf); + pdf->cur_encoder = encoder; + return HPDF_OK; } @@ -1281,6 +1320,11 @@ HPDF_GetFont (HPDF_Doc pdf, return NULL; } + if (!encoder) { + HPDF_CheckError (&pdf->error); + return NULL; + } + font = HPDF_Doc_FindFont (pdf, font_name, encoder->name); } else { font = HPDF_Doc_FindFont (pdf, font_name, encoding_name); @@ -1412,10 +1456,33 @@ LoadType1FontFromStream (HPDF_Doc pdf, HPDF_FontDef_Free (def); return NULL; } + return def->base_font; } - return def->base_font; + return NULL; } +HPDF_EXPORT(HPDF_FontDef) +HPDF_GetTTFontDefFromFile (HPDF_Doc pdf, + const char *file_name, + HPDF_BOOL embedding) +{ + HPDF_Stream font_data; + HPDF_FontDef def; + + HPDF_PTRACE ((" HPDF_GetTTFontDefFromFile\n")); + + /* create file stream */ + font_data = HPDF_FileReader_New (pdf->mmgr, file_name); + + if (HPDF_Stream_Validate (font_data)) { + def = HPDF_TTFontDef_Load (pdf->mmgr, font_data, embedding); + } else { + HPDF_CheckError (&pdf->error); + return NULL; + } + + return def; +} HPDF_EXPORT(const char*) HPDF_LoadTTFontFromFile (HPDF_Doc pdf, @@ -1454,14 +1521,14 @@ LoadTTFontFromStream (HPDF_Doc pdf, HPDF_FontDef def; HPDF_PTRACE ((" HPDF_LoadTTFontFromStream\n")); + HPDF_UNUSED (file_name); def = HPDF_TTFontDef_Load (pdf->mmgr, font_data, embedding); if (def) { HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font); if (tmpdef) { HPDF_FontDef_Free (def); - HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0); - return NULL; + return tmpdef->base_font; } if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) { @@ -1473,7 +1540,7 @@ LoadTTFontFromStream (HPDF_Doc pdf, if (embedding) { if (pdf->ttfont_tag[0] == 0) { - HPDF_MemCpy (pdf->ttfont_tag, "HPDFAA", 6); + HPDF_MemCpy (pdf->ttfont_tag, (HPDF_BYTE *)"HPDFAA", 6); } else { HPDF_INT i; @@ -1486,7 +1553,7 @@ LoadTTFontFromStream (HPDF_Doc pdf, } } - HPDF_TTFontDef_SetTagName (def, pdf->ttfont_tag); + HPDF_TTFontDef_SetTagName (def, (char *)pdf->ttfont_tag); } return def->base_font; @@ -1532,14 +1599,14 @@ LoadTTFontFromStream2 (HPDF_Doc pdf, HPDF_FontDef def; HPDF_PTRACE ((" HPDF_LoadTTFontFromStream2\n")); + HPDF_UNUSED (file_name); def = HPDF_TTFontDef_Load2 (pdf->mmgr, font_data, index, embedding); if (def) { HPDF_FontDef tmpdef = HPDF_Doc_FindFontDef (pdf, def->base_font); if (tmpdef) { HPDF_FontDef_Free (def); - HPDF_SetError (&pdf->error, HPDF_FONT_EXISTS, 0); - return NULL; + return tmpdef->base_font; } if (HPDF_List_Add (pdf->fontdef_list, def) != HPDF_OK) { @@ -1551,7 +1618,7 @@ LoadTTFontFromStream2 (HPDF_Doc pdf, if (embedding) { if (pdf->ttfont_tag[0] == 0) { - HPDF_MemCpy (pdf->ttfont_tag, "HPDFAA", 6); + HPDF_MemCpy (pdf->ttfont_tag, (HPDF_BYTE *)"HPDFAA", 6); } else { HPDF_INT i; @@ -1564,7 +1631,7 @@ LoadTTFontFromStream2 (HPDF_Doc pdf, } } - HPDF_TTFontDef_SetTagName (def, pdf->ttfont_tag); + HPDF_TTFontDef_SetTagName (def, (char *)pdf->ttfont_tag); } return def->base_font; @@ -1601,7 +1668,7 @@ HPDF_LoadRawImageFromFile (HPDF_Doc pdf, if (!image) HPDF_CheckError (&pdf->error); - if (pdf->compression_mode & HPDF_COMP_IMAGE) + if (image && pdf->compression_mode & HPDF_COMP_IMAGE) image->filter = HPDF_STREAM_FILTER_FLATE_DECODE; return image; @@ -1623,14 +1690,19 @@ HPDF_LoadRawImageFromMem (HPDF_Doc pdf, if (!HPDF_HasDoc (pdf)) return NULL; - image = HPDF_Image_LoadRawImageFromMem (pdf->mmgr, buf, pdf->xref, width, - height, color_space, bits_per_component); + /* Use directly HPDF_Image_LoadRaw1BitImageFromMem to save B/W images */ + if(color_space == HPDF_CS_DEVICE_GRAY && bits_per_component == 1) { + return HPDF_Image_LoadRaw1BitImageFromMem (pdf, buf, width, height, (width+7)/8, HPDF_TRUE, HPDF_TRUE); + } + + image = HPDF_Image_LoadRawImageFromMem (pdf->mmgr, buf, pdf->xref, width, height, color_space, bits_per_component); if (!image) HPDF_CheckError (&pdf->error); - if (pdf->compression_mode & HPDF_COMP_IMAGE) + if (image && pdf->compression_mode & HPDF_COMP_IMAGE) { image->filter = HPDF_STREAM_FILTER_FLATE_DECODE; + } return image; } @@ -1665,6 +1737,27 @@ HPDF_LoadJpegImageFromFile (HPDF_Doc pdf, return image; } +HPDF_EXPORT(HPDF_Image) +HPDF_LoadJpegImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size) +{ + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_LoadJpegImageFromMem\n")); + + if (!HPDF_HasDoc (pdf)) { + return NULL; + } + + image = HPDF_Image_LoadJpegImageFromMem (pdf->mmgr, buffer, size , pdf->xref); + + if (!image) { + HPDF_CheckError (&pdf->error); + } + + return image; +} /*----- Catalog ------------------------------------------------------------*/ @@ -1695,6 +1788,9 @@ HPDF_SetPageLayout (HPDF_Doc pdf, return HPDF_RaiseError (&pdf->error, HPDF_PAGE_LAYOUT_OUT_OF_RANGE, (HPDF_STATUS)layout); + if ((layout == HPDF_PAGE_LAYOUT_TWO_PAGE_LEFT || layout == HPDF_PAGE_LAYOUT_TWO_PAGE_RIGHT) && pdf->pdf_version < HPDF_VER_15) + pdf->pdf_version = HPDF_VER_15 ; + ret = HPDF_Catalog_SetPageLayout (pdf->catalog, layout); if (ret != HPDF_OK) HPDF_CheckError (&pdf->error); @@ -1786,6 +1882,8 @@ HPDF_SetViewerPreference (HPDF_Doc pdf, if (ret != HPDF_OK) return HPDF_CheckError (&pdf->error); + pdf->pdf_version = HPDF_VER_16; + return HPDF_OK; } @@ -1822,6 +1920,58 @@ HPDF_AddPageLabel (HPDF_Doc pdf, } +HPDF_EXPORT(HPDF_EmbeddedFile) +HPDF_AttachFile (HPDF_Doc pdf, + const char *file) +{ + HPDF_NameDict names; + HPDF_NameTree ntree; + HPDF_EmbeddedFile efile; + HPDF_String name; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_AttachFile\n")); + + if (!HPDF_HasDoc (pdf)) + return NULL; + + names = HPDF_Catalog_GetNames (pdf->catalog); + if (!names) { + names = HPDF_NameDict_New (pdf->mmgr, pdf->xref); + if (!names) + return NULL; + + ret = HPDF_Catalog_SetNames (pdf->catalog, names); + if (ret != HPDF_OK) + return NULL; + } + + ntree = HPDF_NameDict_GetNameTree (names, HPDF_NAME_EMBEDDED_FILES); + if (!ntree) { + ntree = HPDF_NameTree_New (pdf->mmgr, pdf->xref); + if (!ntree) + return NULL; + + ret = HPDF_NameDict_SetNameTree (names, HPDF_NAME_EMBEDDED_FILES, ntree); + if (ret != HPDF_OK) + return NULL; + } + + efile = HPDF_EmbeddedFile_New (pdf->mmgr, pdf->xref, file); + if (!efile) + return NULL; + + name = HPDF_String_New (pdf->mmgr, file, NULL); + if (!name) + return NULL; + + ret += HPDF_NameTree_Add (ntree, name, efile); + if (ret != HPDF_OK) + return NULL; + + return efile; +} + /*----- Info ---------------------------------------------------------------*/ static HPDF_Dict @@ -1976,16 +2126,16 @@ HPDF_SetCompressionMode (HPDF_Doc pdf, if (mode != (mode & HPDF_COMP_MASK)) return HPDF_RaiseError (&pdf->error, HPDF_INVALID_COMPRESSION_MODE, 0); -#ifndef HPDF_NOZLIB +#ifndef LIBHPDF_HAVE_NOZLIB pdf->compression_mode = mode; return HPDF_OK; -#else /* HPDF_NOZLIB */ +#else /* LIBHPDF_HAVE_NOZLIB */ return HPDF_INVALID_COMPRESSION_MODE; -#endif /* HPDF_NOZLIB */ +#endif /* LIBHPDF_HAVE_NOZLIB */ } @@ -2018,3 +2168,201 @@ HPDF_ResetError (HPDF_Doc pdf) HPDF_Error_Reset (&pdf->error); } +/* + * create an intententry + */ +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_OutputIntent_New (HPDF_Doc pdf, + const char* identifier, + const char* condition, + const char* registry, + const char* info, + HPDF_Array outputprofile) +{ + HPDF_OutputIntent intent; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_OutputIntent_New\n")); + + if (!HPDF_HasDoc (pdf)) + return NULL; + + intent = HPDF_Dict_New (pdf->mmgr); + if (!intent) + return NULL; + + if (HPDF_Xref_Add (pdf->xref, intent) != HPDF_OK) { + HPDF_Dict_Free(intent); + return NULL; + } + + ret += HPDF_Dict_AddName (intent, "Type", "OutputIntent"); + ret += HPDF_Dict_AddName (intent, "S", "GTS_PDFX"); + ret += HPDF_Dict_Add (intent, "OutputConditionIdentifier", HPDF_String_New (pdf->mmgr, identifier, NULL)); + ret += HPDF_Dict_Add (intent, "OutputCondition", HPDF_String_New (pdf->mmgr, condition,NULL)); + ret += HPDF_Dict_Add (intent, "RegistryName", HPDF_String_New (pdf->mmgr, registry, NULL)); + + if (info != NULL) { + ret += HPDF_Dict_Add (intent, "Info", HPDF_String_New (pdf->mmgr, info, NULL)); + } + + /* add ICC base stream */ + if (outputprofile != NULL) { + ret += HPDF_Dict_Add (intent, "DestOutputProfile ", outputprofile); + } + + if (ret != HPDF_OK) { + HPDF_Dict_Free(intent); + return NULL; + } + + return intent; +} + +HPDF_EXPORT(HPDF_STATUS) +HPDF_AddIntent(HPDF_Doc pdf, + HPDF_OutputIntent intent) +{ + HPDF_Array intents; + if (!HPDF_HasDoc (pdf)) + return HPDF_INVALID_DOCUMENT; + + intents = HPDF_Dict_GetItem (pdf->catalog, "OutputIntents", HPDF_OCLASS_ARRAY); + if (intents == NULL) { + intents = HPDF_Array_New (pdf->mmgr); + if (intents) { + HPDF_STATUS ret = HPDF_Dict_Add (pdf->catalog, "OutputIntents", intents); + if (ret != HPDF_OK) { + HPDF_CheckError (&pdf->error); + return HPDF_Error_GetDetailCode (&pdf->error); + } + } + } + HPDF_Array_Add(intents,intent); + return HPDF_Error_GetDetailCode (&pdf->error); +} + +/* "Perceptual", "RelativeColorimetric", "Saturation", "AbsoluteColorimetric" */ +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_ICC_LoadIccFromMem (HPDF_Doc pdf, + HPDF_MMgr mmgr, + HPDF_Stream iccdata, + HPDF_Xref xref, + int numcomponent) +{ + HPDF_OutputIntent icc; + HPDF_STATUS ret; + + HPDF_PTRACE ((" HPDF_ICC_LoadIccFromMem\n")); + + icc = HPDF_DictStream_New (mmgr, xref); + if (!icc) + return NULL; + + HPDF_Dict_AddNumber (icc, "N", numcomponent); + switch (numcomponent) { + case 1 : + HPDF_Dict_AddName (icc, "Alternate", "DeviceGray"); + break; + case 3 : + HPDF_Dict_AddName (icc, "Alternate", "DeviceRGB"); + break; + case 4 : + HPDF_Dict_AddName (icc, "Alternate", "DeviceCMYK"); + break; + default : /* unsupported */ + HPDF_RaiseError (&pdf->error, HPDF_INVALID_ICC_COMPONENT_NUM, 0); + HPDF_Dict_Free(icc); + return NULL; + } + + for (;;) { + HPDF_BYTE buf[HPDF_STREAM_BUF_SIZ]; + HPDF_UINT len = HPDF_STREAM_BUF_SIZ; + ret = HPDF_Stream_Read (iccdata, buf, &len); + + if (ret != HPDF_OK) { + if (ret == HPDF_STREAM_EOF) { + if (len > 0) { + ret = HPDF_Stream_Write (icc->stream, buf, len); + if (ret != HPDF_OK) { + HPDF_Dict_Free(icc); + return NULL; + } + } + break; + } else { + HPDF_Dict_Free(icc); + return NULL; + } + } + + if (HPDF_Stream_Write (icc->stream, buf, len) != HPDF_OK) { + HPDF_Dict_Free(icc); + return NULL; + } + } + + return icc; +} + +HPDF_EXPORT(HPDF_Array) +HPDF_AddColorspaceFromProfile (HPDF_Doc pdf, + HPDF_Dict icc) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Array iccentry; + + if (!HPDF_HasDoc (pdf)) + return NULL; + + iccentry = HPDF_Array_New(pdf->mmgr); + if (!iccentry) + return NULL; + + ret = HPDF_Array_AddName (iccentry, "ICCBased" ); + if (ret != HPDF_OK) { + HPDF_Array_Free(iccentry); + HPDF_CheckError (&pdf->error); + return NULL; + } + + ret = HPDF_Array_Add (iccentry, icc ); + if (ret != HPDF_OK) { + HPDF_Array_Free(iccentry); + return NULL; + } + return iccentry; +} + +HPDF_EXPORT(HPDF_OutputIntent) +HPDF_LoadIccProfileFromFile (HPDF_Doc pdf, + const char* icc_file_name, + int numcomponent) +{ + HPDF_Stream iccdata; + HPDF_OutputIntent iccentry; + + HPDF_PTRACE ((" HPDF_LoadIccProfileFromFile\n")); + + if (!HPDF_HasDoc (pdf)) + return NULL; + + /* create file stream */ + iccdata = HPDF_FileReader_New (pdf->mmgr, icc_file_name); + + if (HPDF_Stream_Validate (iccdata)) { + iccentry = HPDF_ICC_LoadIccFromMem(pdf, pdf->mmgr, iccdata, pdf->xref, numcomponent); + } else + iccentry = NULL; + + /* destroy file stream */ + if (iccdata) + HPDF_Stream_Free (iccdata); + + if (!iccentry) + HPDF_CheckError (&pdf->error); + + return iccentry; +} + diff --git a/PDF/src/hpdf_doc_png.c b/PDF/src/hpdf_doc_png.c index 227cebfef..bad87c655 100644 --- a/PDF/src/hpdf_doc_png.c +++ b/PDF/src/hpdf_doc_png.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_doc_png.c + * << Haru Free PDF Library >> -- hpdf_doc_png.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -24,6 +27,46 @@ LoadPngImageFromStream (HPDF_Doc pdf, HPDF_Stream imagedata, HPDF_BOOL delayed_loading); +HPDF_EXPORT(HPDF_Image) +HPDF_LoadPngImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size) +{ + HPDF_Stream imagedata; + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_LoadPngImageFromFile\n")); + + if (!HPDF_HasDoc (pdf)) { + return NULL; + } + + /* create file stream */ + imagedata = HPDF_MemStream_New (pdf->mmgr, size); + + if (!HPDF_Stream_Validate (imagedata)) { + HPDF_RaiseError (&pdf->error, HPDF_INVALID_STREAM, 0); + return NULL; + } + + if (HPDF_Stream_Write (imagedata, buffer, size) != HPDF_OK) { + HPDF_Stream_Free (imagedata); + return NULL; + } + + image = LoadPngImageFromStream (pdf, imagedata, HPDF_FALSE); + + /* destroy file stream */ + HPDF_Stream_Free (imagedata); + + if (!image) { + HPDF_CheckError (&pdf->error); + } + + return image; + +} + HPDF_EXPORT(HPDF_Image) HPDF_LoadPngImageFromFile (HPDF_Doc pdf, @@ -81,8 +124,10 @@ HPDF_LoadPngImageFromFile2 (HPDF_Doc pdf, if (imagedata) HPDF_Stream_Free (imagedata); - if (!image) + if (!image) { HPDF_CheckError (&pdf->error); + return NULL; + } /* add file-name to image dictionary as a hidden entry. * it is used when the image data is needed. @@ -103,7 +148,7 @@ HPDF_LoadPngImageFromFile2 (HPDF_Doc pdf, return image; } -#ifndef HPDF_NOPNGLIB +#ifndef LIBHPDF_HAVE_NOPNGLIB static HPDF_Image LoadPngImageFromStream (HPDF_Doc pdf, HPDF_Stream imagedata, @@ -129,9 +174,11 @@ LoadPngImageFromStream (HPDF_Doc pdf, HPDF_BOOL delayed_loading) { HPDF_SetError (&pdf->error, HPDF_UNSUPPORTED_FUNC, 0); + HPDF_UNUSED (delayed_loading); + HPDF_UNUSED (imagedata); return NULL; } -#endif /* HPDF_NOPNGLIB */ +#endif /* LIBHPDF_HAVE_NOPNGLIB */ diff --git a/PDF/src/hpdf_encoder.c b/PDF/src/hpdf_encoder.c index 6a044862e..a1cbb4b82 100644 --- a/PDF/src/hpdf_encoder.c +++ b/PDF/src/hpdf_encoder.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encoder.c + * << Haru Free PDF Library >> -- hpdf_encoder.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -1094,7 +1097,7 @@ static const HPDF_UNICODE HPDF_UNICODE_MAP_STANDARD[] = { 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000, - 0x0000, 0x0000, 0x0000, 0x0000, 0x00D1, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, @@ -1129,9 +1132,9 @@ static const HPDF_UNICODE HPDF_UNICODE_MAP_WIN_ANSI[] = { 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, - 0x0000, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, - 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x0000, 0x00AE, 0x00AF, - 0x02DA, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, + 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, @@ -1156,21 +1159,21 @@ static const HPDF_UNICODE HPDF_UNICODE_MAP_MAC_ROMAN[] = { 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x0000, - 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x0000, 0x00D6, 0x00DC, 0x00E1, + 0x00C4, 0x00C5, 0x00C7, 0x00C9, 0x00D1, 0x00D6, 0x00DC, 0x00E1, 0x00E0, 0x00E2, 0x00E4, 0x00E3, 0x00E5, 0x00E7, 0x00E9, 0x00E8, 0x00EA, 0x00EB, 0x00ED, 0x00EC, 0x00EE, 0x00EF, 0x00F1, 0x00F3, 0x00F2, 0x00F4, 0x00F6, 0x00F5, 0x00FA, 0x00F9, 0x00FB, 0x00FC, 0x2020, 0x00B0, 0x00A2, 0x00A3, 0x00A7, 0x2022, 0x00B6, 0x00DF, - 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x0000, 0x00C6, 0x00D8, - 0x0000, 0x00B1, 0x0000, 0x0000, 0x00A5, 0x00B5, 0x0000, 0x0000, - 0x0000, 0x0000, 0x0000, 0x00AA, 0x00BA, 0x0000, 0x00E6, 0x00F8, - 0x00BF, 0x00A1, 0x00AC, 0x0000, 0x0192, 0x0000, 0x0000, 0x00AB, - 0x00BB, 0x2026, 0x0020, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, - 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x0000, - 0x00FF, 0x0178, 0x2044, 0x00A4, 0x2039, 0x203A, 0xFB01, 0xFB02, + 0x00AE, 0x00A9, 0x2122, 0x00B4, 0x00A8, 0x2260, 0x00C6, 0x00D8, + 0x221E, 0x00B1, 0x2264, 0x2265, 0x00A5, 0x00B5, 0x2202, 0x2211, + 0x220F, 0x03C0, 0x222B, 0x00AA, 0x00BA, 0x03A9, 0x00E6, 0x00F8, + 0x00BF, 0x00A1, 0x00AC, 0x221A, 0x0192, 0x2248, 0x2206, 0x00AB, + 0x00BB, 0x2026, 0x00A0, 0x00C0, 0x00C3, 0x00D5, 0x0152, 0x0153, + 0x2013, 0x2014, 0x201C, 0x201D, 0x2018, 0x2019, 0x00F7, 0x25CA, + 0x00FF, 0x0178, 0x2044, 0x20AC, 0x2039, 0x203A, 0xFB01, 0xFB02, 0x2021, 0x00B7, 0x201A, 0x201E, 0x2030, 0x00C2, 0x00CA, 0x00C1, 0x00CB, 0x00C8, 0x00CD, 0x00CE, 0x00CF, 0x00CC, 0x00D3, 0x00D4, - 0x0000, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, + 0xF8FF, 0x00D2, 0x00DA, 0x00DB, 0x00D9, 0x0131, 0x02C6, 0x02DC, 0x00AF, 0x02D8, 0x02D9, 0x02DA, 0x00B8, 0x02DD, 0x02DB, 0x02C7 }; @@ -2232,6 +2235,7 @@ HPDF_BasicEncoder_New (HPDF_MMgr mmgr, encoder->error = mmgr->error; encoder->type = HPDF_ENCODER_TYPE_SINGLE_BYTE; encoder->to_unicode_fn = HPDF_BasicEncoder_ToUnicode; + encoder->encode_text_fn = NULL; encoder->write_fn = HPDF_BasicEncoder_Write; encoder->free_fn = HPDF_BasicEncoder_Free; @@ -2478,11 +2482,11 @@ HPDF_BasicEncoder_Write (HPDF_Encoder encoder, const char* char_name = HPDF_UnicodeToGryphName (attr->unicode_map[i]); - ptmp = HPDF_IToA (ptmp, i, tmp + HPDF_TMP_BUF_SIZ - 1); + ptmp = HPDF_IToA (ptmp, i, tmp + HPDF_TEXT_DEFAULT_LEN - 1); *ptmp++ = ' '; *ptmp++ = '/'; - ptmp = HPDF_StrCpy (ptmp, char_name, tmp + - HPDF_TMP_BUF_SIZ - 1); + ptmp = (char *)HPDF_StrCpy (ptmp, char_name, tmp + + HPDF_TEXT_DEFAULT_LEN - 1); *ptmp++ = ' '; *ptmp = 0; @@ -2517,7 +2521,7 @@ HPDF_Encoder_Validate (HPDF_Encoder encoder) HPDF_Encoder HPDF_CMapEncoder_New (HPDF_MMgr mmgr, - char *name, + char *name, HPDF_Encoder_Init_Func init_fn) { HPDF_Encoder encoder; @@ -2602,8 +2606,8 @@ HPDF_UNICODE HPDF_CMapEncoder_ToUnicode (HPDF_Encoder encoder, HPDF_UINT16 code) { - HPDF_BYTE l = code; - HPDF_BYTE h = code >> 8; + HPDF_BYTE l = (HPDF_BYTE)code; + HPDF_BYTE h = (HPDF_BYTE)(code >> 8); HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr; return attr->unicode_map[l][h]; @@ -2614,15 +2618,14 @@ HPDF_UINT16 HPDF_CMapEncoder_ToCID (HPDF_Encoder encoder, HPDF_UINT16 code) { - HPDF_BYTE l = code; - HPDF_BYTE h = code >> 8; + HPDF_BYTE l = (HPDF_BYTE)code; + HPDF_BYTE h = (HPDF_BYTE)(code >> 8); HPDF_CMapEncoderAttr attr = (HPDF_CMapEncoderAttr)encoder->attr; return attr->cid_map[l][h]; } - void HPDF_CMapEncoder_Free (HPDF_Encoder encoder) { @@ -2674,6 +2677,8 @@ HPDF_CMapEncoder_Write (HPDF_Encoder encoder, HPDF_Stream out) { HPDF_STATUS ret = HPDF_OK; + HPDF_UNUSED (out); + HPDF_UNUSED (encoder); return ret; } @@ -2686,6 +2691,7 @@ HPDF_Encoder_SetParseText (HPDF_Encoder encoder, HPDF_UINT len) { HPDF_PTRACE ((" HPDF_CMapEncoder_SetParseText\n")); + HPDF_UNUSED (encoder); state->text = text; state->index = 0; @@ -2745,20 +2751,26 @@ HPDF_CMapEncoder_AddCMap (HPDF_Encoder encoder, HPDF_PTRACE ((" HPDF_CMapEncoder_AddCMap\n")); /* Copy specified pdf_cid_range array to fRangeArray. */ - while (range->from != 0xffff && range->to != 0xffff) { - HPDF_UINT16 code = range->from; - HPDF_UINT16 cid = range->cid; - HPDF_CidRange_Rec *prange; - HPDF_STATUS ret; + while (range->from != 0xffff || range->to != 0xffff) { + HPDF_CidRange_Rec *prange; + HPDF_STATUS ret; - while (code <= range->to) { - HPDF_BYTE l = code; - HPDF_BYTE h = code >> 8; + /* + * Only if we have the default to_unicode_fn + */ + if (encoder->to_unicode_fn == HPDF_CMapEncoder_ToUnicode) { + HPDF_UINT16 code = range->from; + HPDF_UINT16 cid = range->cid; - attr->cid_map[l][h] = cid; - code++; - cid++; - } + while (code <= range->to) { + HPDF_BYTE l = code; + HPDF_BYTE h = code >> 8; + + attr->cid_map[l][h] = cid; + code++; + cid++; + } + } prange = HPDF_GetMem (encoder->mmgr, sizeof(HPDF_CidRange_Rec)); if (!prange) @@ -2840,8 +2852,8 @@ HPDF_CMapEncoder_SetUnicodeArray (HPDF_Encoder encoder, if (array != NULL) while (array->unicode != 0xffff) { - HPDF_BYTE l = array->code; - HPDF_BYTE h = array->code >> 8; + HPDF_BYTE l = (HPDF_BYTE)array->code; + HPDF_BYTE h = (HPDF_BYTE)(array->code >> 8); attr->unicode_map[l][h] = array->unicode; array++; } @@ -2943,7 +2955,7 @@ HPDF_Encoder_GetByteType (HPDF_Encoder encoder, if (encoder->type != HPDF_ENCODER_TYPE_DOUBLE_BYTE) return HPDF_BYTE_TYPE_SINGLE; - HPDF_Encoder_SetParseText (encoder, &parse_state, text, index + 1); + HPDF_Encoder_SetParseText (encoder, &parse_state, (HPDF_BYTE *)text, index + 1); for (;;) { btype = HPDF_CMapEncoder_ByteType (encoder, &parse_state); @@ -2988,4 +3000,3 @@ HPDF_Encoder_GetWritingMode (HPDF_Encoder encoder) return HPDF_WMODE_HORIZONTAL; } - diff --git a/PDF/src/hpdf_encoder_cns.c b/PDF/src/hpdf_encoder_cns.c index 8660de2ca..e525c233f 100644 --- a/PDF/src/hpdf_encoder_cns.c +++ b/PDF/src/hpdf_encoder_cns.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encoder_cns.c + * << Haru Free PDF Library >> -- hpdf_encoder_cns.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -36074,6 +36077,7 @@ static HPDF_BOOL GBK_EUC_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return ((b >= 0x81 && b <= 0xfe)); } @@ -36082,6 +36086,7 @@ static HPDF_BOOL GBK_EUC_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0x40 && b <= 0xfe); } @@ -36197,6 +36202,7 @@ static HPDF_BOOL GB_EUC_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0xa1 && b <= 0xfe); } @@ -36205,6 +36211,7 @@ static HPDF_BOOL GB_EUC_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0xa1 && b <= 0xfe); } diff --git a/PDF/src/hpdf_encoder_cnt.c b/PDF/src/hpdf_encoder_cnt.c index e8538cce8..a3714fc72 100644 --- a/PDF/src/hpdf_encoder_cnt.c +++ b/PDF/src/hpdf_encoder_cnt.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encoder_cnt.c + * << Haru Free PDF Library >> -- hpdf_encoder_cnt.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -15155,6 +15158,7 @@ static HPDF_BOOL ETen_B5_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return ((b >= 0x81 && b <= 0xfe)); } @@ -15163,6 +15167,7 @@ static HPDF_BOOL ETen_B5_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0x40 && b <= 0xfe); } diff --git a/PDF/src/hpdf_encoder_jp.c b/PDF/src/hpdf_encoder_jp.c index 20e878f9c..11e5daf17 100644 --- a/PDF/src/hpdf_encoder_jp.c +++ b/PDF/src/hpdf_encoder_jp.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encoder_jp.c + * << Haru Free PDF Library >> -- hpdf_encoder_jp.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -15769,6 +15772,7 @@ static HPDF_BOOL RKSJ_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return ((b >= 0x81 && b <= 0x9f) || (b >= 0xe0 && b <= 0xfc)); } @@ -15777,6 +15781,7 @@ static HPDF_BOOL RKSJ_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0x40 && b <= 0xfc && b != 0x7f); } @@ -15950,6 +15955,7 @@ static HPDF_BOOL EUC_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return ((b >= 0xa1 && b <= 0xfe) || b == 0x8e); } @@ -15958,6 +15964,7 @@ static HPDF_BOOL EUC_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0xa0 && b <= 0xfe); } diff --git a/PDF/src/hpdf_encoder_kr.c b/PDF/src/hpdf_encoder_kr.c index 77fc4d21d..540b109f4 100644 --- a/PDF/src/hpdf_encoder_kr.c +++ b/PDF/src/hpdf_encoder_kr.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encoder_kr.c + * << Haru Free PDF Library >> -- hpdf_encoder_kr.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -27639,6 +27642,7 @@ static HPDF_BOOL KSCms_UHC_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0x81 && b <= 0xFE); } @@ -27647,6 +27651,7 @@ static HPDF_BOOL KSCms_UHC_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0x41 && b <= 0xfe); } @@ -27804,6 +27809,7 @@ static HPDF_BOOL KSC_EUC_IsLeadByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0xa1 && b <= 0xfe); } @@ -27812,6 +27818,7 @@ static HPDF_BOOL KSC_EUC_IsTrialByte (HPDF_Encoder encoder, HPDF_BYTE b) { + HPDF_UNUSED (encoder); return (b >= 0xa0 && b <= 0xfe); } diff --git a/PDF/src/hpdf_encoder_utf.c b/PDF/src/hpdf_encoder_utf.c new file mode 100644 index 000000000..b8dd7342f --- /dev/null +++ b/PDF/src/hpdf_encoder_utf.c @@ -0,0 +1,276 @@ +/* + * << Haru Free PDF Library >> -- hpdf_encoder_utf.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2008 Antony Dovgal + * Copyright (c) 2010 Sergey Konovalov + * Copyright (c) 2011 Koen Deforche + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf_encoder.h" +#include "hpdf.h" + +typedef struct _UTF8_EncoderAttr_Rec *UTF8_EncoderAttr; +typedef struct _UTF8_EncoderAttr_Rec { + HPDF_BYTE current_byte; + HPDF_BYTE end_byte; + HPDF_BYTE utf8_bytes[8]; +} UTF8_EncoderAttr_Rec; + +static const HPDF_CidRange_Rec UTF8_NOTDEF_RANGE = {0x0000, 0x001F, 1}; +static const HPDF_CidRange_Rec UTF8_SPACE_RANGE = {0x0000, 0xFFFF, 0}; +static const HPDF_CidRange_Rec UTF8_CID_RANGE[] = { + { 0x0000, 0xFFFF, 0x0 }, + { 0xFFFF, 0xFFFF, 0x0 } +}; + +static HPDF_ByteType +UTF8_Encoder_ByteType_Func (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state); + +static HPDF_UNICODE +UTF8_Encoder_ToUnicode_Func (HPDF_Encoder encoder, + HPDF_UINT16 code); + +static char * +UTF8_Encoder_EncodeText_Func (HPDF_Encoder encoder, + const char *text, + HPDF_UINT len, + HPDF_UINT *length); + +static HPDF_STATUS +UTF8_Init (HPDF_Encoder encoder); + +/*--------------------------------------------------------------------------*/ + + +/* + * This function is taken from hpdf_encoder_utf8.c, originally submitted + * to libharu by 'Mirco' + */ +static HPDF_ByteType +UTF8_Encoder_ByteType_Func (HPDF_Encoder encoder, + HPDF_ParseText_Rec *state) +{ + // This function is supposed to increment state->index + // Not logical ! (look at function HPDF_String_Write in hpdf_string.c) + + // When HPDF_BYTE_TYPE_SINGLE is returned, the current byte is the + // CODE argument in call ToUnicode_Func + // When HPDF_BYTE_TYPE_LEAD is returned, the current byte (msb) and the + // next byte (lsb) is the CODE arguement in call ToUnicodeFunc + // When HPDF_BYTE_TYPE_TRIAL is returned, the current byte is ignored + + HPDF_CMapEncoderAttr encoder_attr; + HPDF_BYTE byte; + UTF8_EncoderAttr utf8_attr; + + encoder_attr = (HPDF_CMapEncoderAttr) encoder->attr; + utf8_attr = (UTF8_EncoderAttr) ((void *)encoder_attr->cid_map[0]); + + if (state->index == 0) { + //First byte, initialize. + HPDF_PTRACE ((" UTF8_Encoder_ByteType_Func - Initialize: (%u) %s\n", + state->len, state->text)); + + utf8_attr->current_byte = 0; + } + + byte = state->text[state->index]; + state->index++; + + HPDF_PTRACE ((" UTF8_Encoder_ByteType_Func - Byte: %hx\n", byte)); + + if (utf8_attr->current_byte == 0) { + utf8_attr->utf8_bytes[0] = byte; + utf8_attr->current_byte = 1; + + if (!(byte & 0x80)) { + utf8_attr->current_byte = 0; + utf8_attr->end_byte = 0; + return HPDF_BYTE_TYPE_SINGLE; + } + + if ((byte & 0xf8) == 0xf0) + utf8_attr->end_byte = 3; + else if ((byte & 0xf0) == 0xe0) + utf8_attr->end_byte = 2; + else if ((byte & 0xe0) == 0xc0) + utf8_attr->end_byte = 1; + else + utf8_attr->current_byte = 0; //ERROR, skip this byte + } else { + utf8_attr->utf8_bytes[utf8_attr->current_byte] = byte; + if (utf8_attr->current_byte == utf8_attr->end_byte) { + utf8_attr->current_byte = 0; + return HPDF_BYTE_TYPE_SINGLE; + } + + utf8_attr->current_byte++; + } + + return HPDF_BYTE_TYPE_TRIAL; +} + +/* + * This function is taken from hpdf_encoder_utf8.c, originally submitted + * to libharu by 'Mirco' + */ +static HPDF_UNICODE +UTF8_Encoder_ToUnicode_Func (HPDF_Encoder encoder, + HPDF_UINT16 code) +{ + // Supposed to convert CODE to unicode. + // This function is allways called after ByteType_Func. + // ByteType_Func recognizes the utf-8 bytes belonging to one character. + + HPDF_CMapEncoderAttr encoder_attr; + UTF8_EncoderAttr utf8_attr; + unsigned int val; + + encoder_attr = (HPDF_CMapEncoderAttr) encoder->attr; + utf8_attr = (UTF8_EncoderAttr) ((void *)encoder_attr->cid_map[0]); + + switch (utf8_attr->end_byte) { + case 3: + val = (unsigned int) ((utf8_attr->utf8_bytes[0] & 0x7) << 18) + + (unsigned int) ((utf8_attr->utf8_bytes[1]) << 12) + + (unsigned int) ((utf8_attr->utf8_bytes[2] & 0x3f) << 6) + + (unsigned int) ((utf8_attr->utf8_bytes[3] & 0x3f)); + break; + case 2: + val = (unsigned int) ((utf8_attr->utf8_bytes[0] & 0xf) << 12) + + (unsigned int) ((utf8_attr->utf8_bytes[1] & 0x3f) << 6) + + (unsigned int) ((utf8_attr->utf8_bytes[2] & 0x3f)); + break; + case 1: + val = (unsigned int) ((utf8_attr->utf8_bytes[0] & 0x1f) << 6) + + (unsigned int) ((utf8_attr->utf8_bytes[1] & 0x3f)); + break; + case 0: + val = (unsigned int) utf8_attr->utf8_bytes[0]; + break; + default: + val = 32; // Unknown character + } + + if (val > 65535) //Convert everything outside UCS-2 to space + val = 32; + + return val; +} + +static char * +UTF8_Encoder_EncodeText_Func (HPDF_Encoder encoder, + const char *text, + HPDF_UINT len, + HPDF_UINT *length) +{ + char *result = malloc(len * 2); + char *c = result; + HPDF_ParseText_Rec parse_state; + HPDF_UINT i; + + HPDF_Encoder_SetParseText (encoder, &parse_state, + (const HPDF_BYTE *)text, len); + + for (i = 0; i < len; i++) { + HPDF_UNICODE tmp_unicode; + HPDF_ByteType btype = HPDF_Encoder_ByteType (encoder, &parse_state); + + if (btype != HPDF_BYTE_TYPE_TRIAL) { + tmp_unicode = HPDF_Encoder_ToUnicode (encoder, 0); + + HPDF_UInt16Swap (&tmp_unicode); + HPDF_MemCpy ((HPDF_BYTE *)c, (const HPDF_BYTE*)&tmp_unicode, 2); + c += 2; + } + } + + *length = c - result; + + return result; +} + +static HPDF_STATUS +UTF8_Init (HPDF_Encoder encoder) +{ + HPDF_CMapEncoderAttr attr; + HPDF_STATUS ret; + + if ((ret = HPDF_CMapEncoder_InitAttr (encoder)) != HPDF_OK) + return ret; + + /* + * We override these two + */ + encoder->byte_type_fn = UTF8_Encoder_ByteType_Func; + encoder->to_unicode_fn = UTF8_Encoder_ToUnicode_Func; + encoder->encode_text_fn = UTF8_Encoder_EncodeText_Func; + + attr = (HPDF_CMapEncoderAttr)encoder->attr; + + if (HPDF_CMapEncoder_AddCMap (encoder, UTF8_CID_RANGE) != HPDF_OK) + return encoder->error->error_no; + + if (HPDF_CMapEncoder_AddCodeSpaceRange (encoder, UTF8_SPACE_RANGE) + != HPDF_OK) + return encoder->error->error_no; + + if (HPDF_CMapEncoder_AddNotDefRange (encoder, UTF8_NOTDEF_RANGE) + != HPDF_OK) + return encoder->error->error_no; + + attr->is_lead_byte_fn = NULL; + attr->is_trial_byte_fn = NULL; + + HPDF_StrCpy (attr->registry, "Adobe", attr->registry + + HPDF_LIMIT_MAX_NAME_LEN); + HPDF_StrCpy (attr->ordering, "Identity-H", attr->ordering + + HPDF_LIMIT_MAX_NAME_LEN); + attr->suppliment = 0; + attr->writing_mode = HPDF_WMODE_HORIZONTAL; + + /* Not sure about this + attr->uid_offset = 0; + attr->xuid[0] = 0; + attr->xuid[1] = 0; + attr->xuid[2] = 0; + */ + + encoder->type = HPDF_ENCODER_TYPE_DOUBLE_BYTE; + + return HPDF_OK; +} + +/*--------------------------------------------------------------------------*/ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_UseUTFEncodings (HPDF_Doc pdf) +{ + HPDF_Encoder encoder; + HPDF_STATUS ret; + + if (!HPDF_HasDoc (pdf)) + return HPDF_INVALID_DOCUMENT; + + encoder = HPDF_CMapEncoder_New (pdf->mmgr, "UTF-8", + UTF8_Init); + + if ((ret = HPDF_Doc_RegisterEncoder (pdf, encoder)) != HPDF_OK) + return ret; + + return HPDF_OK; +} diff --git a/PDF/src/hpdf_encrypt.c b/PDF/src/hpdf_encrypt.c index 8f94d137d..a534995f5 100644 --- a/PDF/src/hpdf_encrypt.c +++ b/PDF/src/hpdf_encrypt.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_encryor.c + * << Haru Free PDF Library >> -- hpdf_encryor.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -314,13 +317,13 @@ HPDF_PadOrTrancatePasswd (const char *pwd, HPDF_MemSet (new_pwd, 0x00, HPDF_PASSWD_LEN); - if (len >= HPDF_PASSWD_LEN) - HPDF_MemCpy (new_pwd, pwd, HPDF_PASSWD_LEN); - else { - if (len > 0) - HPDF_MemCpy (new_pwd, pwd, len); - HPDF_MemCpy (new_pwd + len, HPDF_PADDING_STRING, - HPDF_PASSWD_LEN - len); + if (len >= HPDF_PASSWD_LEN) { + HPDF_MemCpy (new_pwd, (HPDF_BYTE *)pwd, HPDF_PASSWD_LEN); + } else { + if (len > 0) { + HPDF_MemCpy (new_pwd, (HPDF_BYTE *)pwd, len); + } + HPDF_MemCpy (new_pwd + len, HPDF_PADDING_STRING, HPDF_PASSWD_LEN - len); } } @@ -365,7 +368,7 @@ HPDF_Encrypt_CreateOwnerKey (HPDF_Encrypt attr) for (i = 0; i < 50; i++) { HPDF_MD5Init(&md5_ctx); - //HPDF_MD5Update (&md5_ctx, digest, HPDF_MD5_KEY_LEN); + /* HPDF_MD5Update (&md5_ctx, digest, HPDF_MD5_KEY_LEN); */ HPDF_MD5Update (&md5_ctx, digest, attr->key_len); HPDF_MD5Final(digest, &md5_ctx); @@ -395,7 +398,7 @@ HPDF_Encrypt_CreateOwnerKey (HPDF_Encrypt attr) HPDF_BYTE new_key[HPDF_MD5_KEY_LEN]; for (j = 0; j < attr->key_len; j++) - new_key[j] = digest[j] ^ i; + new_key[j] = (HPDF_BYTE)(digest[j] ^ i); HPDF_PTRACE(("@ Algorithm 3.3 step 7 loop %u\n", i)); @@ -429,10 +432,10 @@ HPDF_Encrypt_CreateEncryptionKey (HPDF_Encrypt attr) /* Algorithm3.2 step4 */ HPDF_PTRACE(("@@@ permission =%d\n", attr->permission)); - tmp_flg[0] = attr->permission; - tmp_flg[1] = (attr->permission >> 8); - tmp_flg[2] = (attr->permission >> 16); - tmp_flg[3] = (attr->permission >> 24); + tmp_flg[0] = (HPDF_BYTE)(attr->permission); + tmp_flg[1] = (HPDF_BYTE)(attr->permission >> 8); + tmp_flg[2] = (HPDF_BYTE)(attr->permission >> 16); + tmp_flg[3] = (HPDF_BYTE)(attr->permission >> 24); HPDF_MD5Update(&md5_ctx, tmp_flg, 4); @@ -499,7 +502,7 @@ HPDF_Encrypt_CreateUserKey (HPDF_Encrypt attr) HPDF_PTRACE(("@ Algorithm 3.5 step 5 loop %u\n", i)); for (j = 0; j < attr->key_len; j++) - new_key[j] = attr->encryption_key[j] ^ i; + new_key[j] = (HPDF_BYTE)(attr->encryption_key[j] ^ i); HPDF_MemCpy (digest, digest2, HPDF_MD5_KEY_LEN); @@ -526,7 +529,7 @@ ARC4Init (HPDF_ARC4_Ctx_Rec *ctx, HPDF_PTRACE((" ARC4Init\n")); for (i = 0; i < HPDF_ARC4_BUF_SIZE; i++) - ctx->state[i] = i; + ctx->state[i] = (HPDF_BYTE)i; for (i = 0; i < HPDF_ARC4_BUF_SIZE; i++) tmp_array[i] = key[i % key_len]; @@ -561,8 +564,8 @@ ARC4CryptBuf (HPDF_ARC4_Ctx_Rec *ctx, for (i = 0; i < len; i++) { HPDF_BYTE tmp; - ctx->idx1 = (ctx->idx1 + 1) % 256; - ctx->idx2 = (ctx->idx2 + ctx->state[ctx->idx1]) % 256; + ctx->idx1 = (HPDF_BYTE)((ctx->idx1 + 1) % 256); + ctx->idx2 = (HPDF_BYTE)((ctx->idx2 + ctx->state[ctx->idx1]) % 256); tmp = ctx->state[ctx->idx1]; ctx->state[ctx->idx1] = ctx->state[ctx->idx2]; @@ -571,7 +574,7 @@ ARC4CryptBuf (HPDF_ARC4_Ctx_Rec *ctx, t = (ctx->state[ctx->idx1] + ctx->state[ctx->idx2]) % 256; K = ctx->state[t]; - out[i] = in[i] ^ K; + out[i] = (HPDF_BYTE)(in[i] ^ K); } } @@ -586,11 +589,11 @@ HPDF_Encrypt_InitKey (HPDF_Encrypt attr, HPDF_PTRACE((" HPDF_Encrypt_Init\n")); - attr->encryption_key[attr->key_len] = object_id; - attr->encryption_key[attr->key_len + 1] = (object_id >> 8); - attr->encryption_key[attr->key_len + 2] = (object_id >> 16); - attr->encryption_key[attr->key_len + 3] = gen_no; - attr->encryption_key[attr->key_len + 4] = (gen_no >> 8); + attr->encryption_key[attr->key_len] = (HPDF_BYTE)object_id; + attr->encryption_key[attr->key_len + 1] = (HPDF_BYTE)(object_id >> 8); + attr->encryption_key[attr->key_len + 2] = (HPDF_BYTE)(object_id >> 16); + attr->encryption_key[attr->key_len + 3] = (HPDF_BYTE)gen_no; + attr->encryption_key[attr->key_len + 4] = (HPDF_BYTE)(gen_no >> 8); HPDF_PTRACE(("@@@ OID=%u, gen_no=%u\n", (HPDF_INT)object_id, gen_no)); diff --git a/PDF/src/hpdf_encryptdict.c b/PDF/src/hpdf_encryptdict.c index 35df23f7e..1708d7737 100644 --- a/PDF/src/hpdf_encryptdict.c +++ b/PDF/src/hpdf_encryptdict.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.5 >> -- hpdf_encryptdict.c + * << Haru Free PDF Library >> -- hpdf_encryptdict.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,8 +13,7 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.09.04 modified. - *---------------------------------------------------------------------------*/ + */ #include #include "hpdf_conf.h" @@ -19,10 +21,9 @@ #include "hpdf_objects.h" #include "hpdf_encryptdict.h" #include "hpdf_info.h" - -/*---------------------------------------------------------------------------*/ -/*------ HPDF_EncryptDict ---------------------------------------------------*/ - +#ifndef HPDF_UNUSED +#define HPDF_UNUSED(a) ((void)(a)) +#endif HPDF_EncryptDict HPDF_EncryptDict_New (HPDF_MMgr mmgr, @@ -67,13 +68,15 @@ HPDF_EncryptDict_CreateID (HPDF_EncryptDict dict, /* use the result of 'time' function to get random value. * when debugging, 'time' value is ignored. */ -#ifndef HPDF_DEBUG +#ifndef LIBHPDF_DEBUG time_t t = HPDF_TIME (NULL); -#endif /* HPDF_DEBUG */ +#endif /* LIBHPDF_DEBUG */ HPDF_MD5Init (&ctx); + HPDF_UNUSED (xref); + HPDF_UNUSED (info); -#ifndef HPDF_DEBUG +#ifndef LIBHPDF_DEBUG HPDF_MD5Update(&ctx, (HPDF_BYTE *)&t, sizeof(t)); /* create File Identifier from elements of Into dictionary. */ diff --git a/PDF/src/hpdf_error.c b/PDF/src/hpdf_error.c index 5f2913f56..7a82f79e1 100644 --- a/PDF/src/hpdf_error.c +++ b/PDF/src/hpdf_error.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_error.c + * << Haru Free PDF Library >> -- hpdf_error.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -16,6 +19,7 @@ #include "hpdf_utils.h" #include "hpdf_error.h" #include "hpdf_consts.h" +#include "hpdf.h" #ifndef HPDF_STDCALL #ifdef HPDF_DLL_MAKE @@ -80,7 +84,7 @@ HPDF_SetError (HPDF_Error error, } -HPDF_STATUS +HPDF_EXPORT(HPDF_STATUS) HPDF_CheckError (HPDF_Error error) { HPDF_PTRACE((" HPDF_CheckError: error_no=0x%04X detail_no=0x%04X\n", diff --git a/PDF/src/hpdf_exdata.c b/PDF/src/hpdf_exdata.c new file mode 100644 index 000000000..d63aab249 --- /dev/null +++ b/PDF/src/hpdf_exdata.c @@ -0,0 +1,69 @@ +/* + * << Haru Free PDF Library >> -- hpdf_annotation.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf_info.h" +#include "hpdf_exdata.h" +#include "hpdf.h" + +/*----------------------------------------------------------------------------*/ +/*------ HPDF_ExData -----------------------------------------------------*/ + + + +HPDF_ExData +HPDF_3DAnnotExData_New(HPDF_MMgr mmgr, + HPDF_Xref xref) +{ + HPDF_ExData exdata; + HPDF_STATUS ret = HPDF_OK; + + + HPDF_PTRACE((" HPDF_ExData_New\n")); + + exdata = HPDF_Dict_New (mmgr); + if (!exdata) + return NULL; + + if (HPDF_Xref_Add (xref, exdata) != HPDF_OK) + return NULL; + + ret += HPDF_Dict_AddName (exdata, "Type", "ExData"); + ret += HPDF_Dict_AddName (exdata, "Subtype", "3DM"); + + if (ret != HPDF_OK) + return NULL; + + return exdata; +} + + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DAnnotExData_Set3DMeasurement(HPDF_ExData exdata, + HPDF_3DMeasure measure) +{ + HPDF_STATUS ret = HPDF_OK; + + ret = HPDF_Dict_Add (exdata, "M3DREF", measure); + if (ret != HPDF_OK) + return ret; + + return ret; +} + diff --git a/PDF/src/hpdf_ext_gstate.c b/PDF/src/hpdf_ext_gstate.c index 71700292f..60347d04e 100644 --- a/PDF/src/hpdf_ext_gstate.c +++ b/PDF/src/hpdf_ext_gstate.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_ext_gstate.c + * << Haru Free PDF Library >> -- hpdf_ext_gstate.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -17,7 +20,7 @@ #include "hpdf_ext_gstate.h" #include "hpdf.h" -const static char *HPDF_BM_NAMES[] = { +static const char * const HPDF_BM_NAMES[] = { "Normal", "Multiply", "Screen", diff --git a/PDF/src/hpdf_font.c b/PDF/src/hpdf_font.c index 25a4a0d95..114d8f733 100644 --- a/PDF/src/hpdf_font.c +++ b/PDF/src/hpdf_font.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_font.c + * << Haru Free PDF Library >> -- hpdf_font.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,7 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.07.25 modified. */ #include "hpdf_conf.h" diff --git a/PDF/src/hpdf_font_cid.c b/PDF/src/hpdf_font_cid.c index 7fa32ba25..d1c1a824f 100644 --- a/PDF/src/hpdf_font_cid.c +++ b/PDF/src/hpdf_font_cid.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_font_cid.c + * << Haru Free PDF Library >> -- hpdf_font_cid.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,7 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.08.04 modified MeasureText(). */ #include "hpdf_conf.h" @@ -46,10 +48,16 @@ MeasureText (HPDF_Font font, static char* -UINT16ToHex (char *s, - HPDF_UINT16 val, - char *eptr); +UINT16ToHex (char *s, + HPDF_UINT16 val, + char *eptr, + HPDF_BYTE width); +static char * +CidRangeToHex (char *s, + HPDF_UINT16 from, + HPDF_UINT16 to, + char *eptr); static HPDF_Dict CreateCMap (HPDF_Encoder encoder, @@ -130,12 +138,31 @@ HPDF_Type0Font_New (HPDF_MMgr mmgr, if (fontdef->type == HPDF_FONTDEF_TYPE_CID) { ret += HPDF_Dict_AddName (font, "Encoding", encoder->name); } else { - attr->cmap_stream = CreateCMap (encoder, xref); + /* + * Handle the Unicode encoding, see hpdf_encoding_utf.c For some + * reason, xpdf-based readers cannot deal with our cmap but work + * fine when using the predefined "Identity-H" + * encoding. However, text selection does not work, unless we + * add a ToUnicode cmap. This CMap should also be "Identity", + * but that does not work -- specifying our cmap as a stream however + * does work. Who can understand that ? + */ + if (HPDF_StrCmp(encoder_attr->ordering, "Identity-H") == 0) { + ret += HPDF_Dict_AddName (font, "Encoding", "Identity-H"); + attr->cmap_stream = CreateCMap (encoder, xref); - if (attr->cmap_stream) { - ret += HPDF_Dict_Add (font, "Encoding", attr->cmap_stream); - } else - return NULL; + if (attr->cmap_stream) { + ret += HPDF_Dict_Add (font, "ToUnicode", attr->cmap_stream); + } else + return NULL; + } else { + attr->cmap_stream = CreateCMap (encoder, xref); + + if (attr->cmap_stream) { + ret += HPDF_Dict_Add (font, "Encoding", attr->cmap_stream); + } else + return NULL; + } } if (ret != HPDF_OK) @@ -357,9 +384,9 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref) if (HPDF_Dict_Add (font, "DW2", array) != HPDF_OK) return NULL; - ret += HPDF_Array_AddNumber (array, fontdef->font_bbox.bottom); - ret += HPDF_Array_AddNumber (array, fontdef->font_bbox.bottom - - fontdef->font_bbox.top); + ret += HPDF_Array_AddNumber (array, (HPDF_INT32)(fontdef->font_bbox.bottom)); + ret += HPDF_Array_AddNumber (array, (HPDF_INT32)(fontdef->font_bbox.bottom - + fontdef->font_bbox.top)); HPDF_MemSet (tmp_map, 0, sizeof(HPDF_UNICODE) * 65536); @@ -370,15 +397,25 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref) HPDF_UINT j; for (j = 0; j < 256; j++) { - HPDF_UINT16 cid = encoder_attr->cid_map[i][j]; - if (cid != 0) { - HPDF_UNICODE unicode = encoder_attr->unicode_map[i][j]; - HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (fontdef, unicode); - tmp_map[cid] = gid; - if (max < cid) - max = cid; - } - } + if (encoder->to_unicode_fn == HPDF_CMapEncoder_ToUnicode) { + HPDF_UINT16 cid = encoder_attr->cid_map[i][j]; + if (cid != 0) { + HPDF_UNICODE unicode = encoder_attr->unicode_map[i][j]; + HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (fontdef, + unicode); + tmp_map[cid] = gid; + if (max < cid) + max = cid; + } + } else { + HPDF_UNICODE unicode = (i << 8) | j; + HPDF_UINT16 gid = HPDF_TTFontDef_GetGlyphid (fontdef, + unicode); + tmp_map[unicode] = gid; + if (max < unicode) + max = unicode; + } + } } if (max > 0) { @@ -399,14 +436,14 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref) if (w != dw) { if (!tmp_array) { - if ((ret = HPDF_Array_AddNumber (array, i)) != HPDF_OK) + if (HPDF_Array_AddNumber (array, i) != HPDF_OK) return NULL; tmp_array = HPDF_Array_New (font->mmgr); if (!tmp_array) return NULL; - if ((ret = HPDF_Array_Add (array, tmp_array)) != HPDF_OK) + if (HPDF_Array_Add (array, tmp_array) != HPDF_OK) return NULL; } @@ -422,16 +459,15 @@ CIDFontType2_New (HPDF_Font parent, HPDF_Xref xref) if (!attr->map_stream) return NULL; - if ((ret = HPDF_Dict_Add (font, "CIDToGIDMap", attr->map_stream)) - != HPDF_OK) + if (HPDF_Dict_Add (font, "CIDToGIDMap", attr->map_stream) != HPDF_OK) return NULL; for (i = 0; i < max; i++) { HPDF_BYTE u[2]; HPDF_UINT16 gid = tmp_map[i]; - u[0] = gid >> 8; - u[1] = gid; + u[0] = (HPDF_BYTE)(gid >> 8); + u[1] = (HPDF_BYTE)gid; HPDF_MemCpy ((HPDF_BYTE *)(tmp_map + i), u, 2); } @@ -567,14 +603,14 @@ TextWidth (HPDF_Font font, (HPDF_CIDFontDefAttr)attr->fontdef->attr; dw2 = cid_fontdef_attr->DW2[1]; } else { - dw2 = attr->fontdef->font_bbox.bottom - - attr->fontdef->font_bbox.top; + dw2 = (HPDF_INT)(attr->fontdef->font_bbox.bottom - + attr->fontdef->font_bbox.top); } HPDF_Encoder_SetParseText (encoder, &parse_state, text, len); while (i < len) { - HPDF_ByteType btype = HPDF_CMapEncoder_ByteType (encoder, &parse_state); + HPDF_ByteType btype = (encoder->byte_type_fn)(encoder, &parse_state); HPDF_UINT16 cid; HPDF_UNICODE unicode; HPDF_UINT16 code; @@ -585,7 +621,7 @@ TextWidth (HPDF_Font font, if (btype == HPDF_BYTE_TYPE_LEAD) { code <<= 8; - code += *text; + code = (HPDF_UINT16)(code + *text); } if (btype != HPDF_BYTE_TYPE_TRIAL) { @@ -596,7 +632,7 @@ TextWidth (HPDF_Font font, w = HPDF_CIDFontDef_GetCIDWidth (attr->fontdef, cid); } else { /* unicode-based font */ - unicode = HPDF_CMapEncoder_ToUnicode (encoder, code); + unicode = (encoder->to_unicode_fn)(encoder, code); w = HPDF_TTFontDef_GetCharWidth (attr->fontdef, unicode); } } else { @@ -652,8 +688,8 @@ MeasureText (HPDF_Font font, (HPDF_CIDFontDefAttr)attr->fontdef->attr; dw2 = cid_fontdef_attr->DW2[1]; } else { - dw2 = attr->fontdef->font_bbox.bottom - - attr->fontdef->font_bbox.top; + dw2 = (HPDF_INT)(attr->fontdef->font_bbox.bottom - + attr->fontdef->font_bbox.top); } HPDF_Encoder_SetParseText (encoder, &parse_state, text, len); @@ -668,7 +704,7 @@ MeasureText (HPDF_Font font, if (btype == HPDF_BYTE_TYPE_LEAD) { code <<= 8; - code += b2; + code = (HPDF_UINT16)(code + b2); } if (!wordwrap) { @@ -687,7 +723,8 @@ MeasureText (HPDF_Font font, tmp_len = i + 1; if (real_width) *real_width = w; - } else + } /* else + //Commenting this out fixes problem with HPDF_Text_Rect() splitting the words if (last_btype == HPDF_BYTE_TYPE_TRIAL || (btype == HPDF_BYTE_TYPE_LEAD && last_btype == HPDF_BYTE_TYPE_SINGLE)) { @@ -696,7 +733,7 @@ MeasureText (HPDF_Font font, if (real_width) *real_width = w; } - } + }*/ } if (HPDF_IS_WHITE_SPACE(b)) { @@ -711,19 +748,19 @@ MeasureText (HPDF_Font font, tmp_w = HPDF_CIDFontDef_GetCIDWidth (attr->fontdef, cid); } else { /* unicode-based font */ - unicode = HPDF_CMapEncoder_ToUnicode (encoder, code); + unicode = (encoder->to_unicode_fn)(encoder, code); tmp_w = HPDF_TTFontDef_GetCharWidth (attr->fontdef, unicode); } } else { - tmp_w = -dw2; + tmp_w = (HPDF_UINT16)(-dw2); } if (i > 0) w += char_space; } - w += (HPDF_DOUBLE)tmp_w * font_size / 1000; + w += (HPDF_REAL)((HPDF_DOUBLE)tmp_w * font_size / 1000); /* 2006.08.04 break when it encountered line feed */ if (w > width || b == 0x0A) @@ -743,10 +780,12 @@ MeasureText (HPDF_Font font, } + static char* -UINT16ToHex (char *s, - HPDF_UINT16 val, - char *eptr) +UINT16ToHex (char *s, + HPDF_UINT16 val, + char *eptr, + HPDF_BYTE width) { HPDF_BYTE b[2]; HPDF_UINT16 val2; @@ -763,7 +802,14 @@ UINT16ToHex (char *s, *s++ = '<'; - if (b[0] != 0) { + /* + * In principle a range of <00> - <1F> can now not be + * distinguished from <0000> - <001F>..., this seems something + * that is wrong with CID ranges. For the UCS-2 encoding we need + * to add <0000> - and this cannot be <00> - (or at + * least, that crashes Mac OSX Preview). + */ + if (width == 2) { c = b[0] >> 4; if (c <= 9) c += 0x30; @@ -771,7 +817,7 @@ UINT16ToHex (char *s, c += 0x41 - 10; *s++ = c; - c = b[0] & 0x0f; + c = (char)(b[0] & 0x0f); if (c <= 9) c += 0x30; else @@ -779,14 +825,14 @@ UINT16ToHex (char *s, *s++ = c; } - c = b[1] >> 4; + c = (char)(b[1] >> 4); if (c <= 9) c += 0x30; else c += 0x41 - 10; *s++ = c; - c = b[1] & 0x0f; + c = (char)(b[1] & 0x0f); if (c <= 9) c += 0x30; else @@ -799,6 +845,21 @@ UINT16ToHex (char *s, return s; } +static char* +CidRangeToHex (char *s, + HPDF_UINT16 from, + HPDF_UINT16 to, + char *eptr) +{ + HPDF_BYTE width = (to > 255) ? 2 : 1; + char *pbuf; + + pbuf = UINT16ToHex (s, from, eptr, width); + *pbuf++ = ' '; + pbuf = UINT16ToHex (pbuf, to, eptr, width); + + return pbuf; +} static HPDF_Dict CreateCMap (HPDF_Encoder encoder, @@ -843,17 +904,17 @@ CreateCMap (HPDF_Encoder encoder, ret += HPDF_Stream_WriteStr (cmap->stream, "%%IncludeResource: ProcSet (CIDInit)\r\n"); - pbuf = HPDF_StrCpy (buf, "%%BeginResource: CMap (", eptr); - pbuf = HPDF_StrCpy (pbuf, encoder->name, eptr); + pbuf = (char *)HPDF_StrCpy (buf, "%%BeginResource: CMap (", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, encoder->name, eptr); HPDF_StrCpy (pbuf, ")\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); - pbuf = HPDF_StrCpy (buf, "%%Title: (", eptr); - pbuf = HPDF_StrCpy (pbuf, encoder->name, eptr); + pbuf = (char *)HPDF_StrCpy (buf, "%%Title: (", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, encoder->name, eptr); *pbuf++ = ' '; - pbuf = HPDF_StrCpy (pbuf, attr->registry, eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, attr->registry, eptr); *pbuf++ = ' '; - pbuf = HPDF_StrCpy (pbuf, attr->ordering, eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, attr->ordering, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, attr->suppliment, eptr); HPDF_StrCpy (pbuf, ")\r\n", eptr); @@ -874,24 +935,24 @@ CreateCMap (HPDF_Encoder encoder, ret += HPDF_Stream_WriteStr (cmap->stream, "/CIDSystemInfo 3 dict dup begin\r\n"); - pbuf = HPDF_StrCpy (buf, " /Registry (", eptr); - pbuf = HPDF_StrCpy (pbuf, attr->registry, eptr); + pbuf = (char *)HPDF_StrCpy (buf, " /Registry (", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, attr->registry, eptr); HPDF_StrCpy (pbuf, ") def\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); - pbuf = HPDF_StrCpy (buf, " /Ordering (", eptr); - pbuf = HPDF_StrCpy (pbuf, attr->ordering, eptr); + pbuf = (char *)HPDF_StrCpy (buf, " /Ordering (", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, attr->ordering, eptr); HPDF_StrCpy (pbuf, ") def\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); - pbuf = HPDF_StrCpy (buf, " /Supplement ", eptr); + pbuf = (char *)HPDF_StrCpy (buf, " /Supplement ", eptr); pbuf = HPDF_IToA (pbuf, attr->suppliment, eptr); - pbuf = HPDF_StrCpy (pbuf, " def\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, " def\r\n", eptr); HPDF_StrCpy (pbuf, "end def\r\n\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); - pbuf = HPDF_StrCpy (buf, "/CMapName /", eptr); - pbuf = HPDF_StrCpy (pbuf, encoder->name, eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/CMapName /", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, encoder->name, eptr); HPDF_StrCpy (pbuf, " def\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); @@ -899,13 +960,13 @@ CreateCMap (HPDF_Encoder encoder, ret += HPDF_Stream_WriteStr (cmap->stream, "/CMapType 1 def\r\n\r\n"); if (attr->uid_offset >= 0) { - pbuf = HPDF_StrCpy (buf, "/UIDOffset ", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/UIDOffset ", eptr); pbuf = HPDF_IToA (pbuf, attr->uid_offset, eptr); HPDF_StrCpy (pbuf, " def\r\n\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); } - pbuf = HPDF_StrCpy (buf, "/XUID [", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/XUID [", eptr); pbuf = HPDF_IToA (pbuf, attr->xuid[0], eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, attr->xuid[1], eptr); @@ -914,7 +975,7 @@ CreateCMap (HPDF_Encoder encoder, HPDF_StrCpy (pbuf, "] def\r\n\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); - pbuf = HPDF_StrCpy (buf, "/WMode ", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/WMode ", eptr); pbuf = HPDF_IToA (pbuf, (HPDF_UINT32)attr->writing_mode, eptr); HPDF_StrCpy (pbuf, " def\r\n\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); @@ -928,9 +989,8 @@ CreateCMap (HPDF_Encoder encoder, HPDF_CidRange_Rec *range = HPDF_List_ItemAt (attr->code_space_range, i); - pbuf = UINT16ToHex (buf, range->from, eptr); - *pbuf++ = ' '; - pbuf = UINT16ToHex (pbuf, range->to, eptr); + pbuf = CidRangeToHex(buf, range->from, range->to, eptr); + HPDF_StrCpy (pbuf, "\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); @@ -952,9 +1012,7 @@ CreateCMap (HPDF_Encoder encoder, for (i = 0; i < attr->notdef_range->count; i++) { HPDF_CidRange_Rec *range = HPDF_List_ItemAt (attr->notdef_range, i); - pbuf = UINT16ToHex (buf, range->from, eptr); - *pbuf++ = ' '; - pbuf = UINT16ToHex (pbuf, range->to, eptr); + pbuf = CidRangeToHex(buf, range->from, range->to, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, range->cid, eptr); HPDF_StrCpy (pbuf, "\r\n", eptr); @@ -983,9 +1041,7 @@ CreateCMap (HPDF_Encoder encoder, for (i = 0; i < attr->cmap_range->count; i++) { HPDF_CidRange_Rec *range = HPDF_List_ItemAt (attr->cmap_range, i); - pbuf = UINT16ToHex (buf, range->from, eptr); - *pbuf++ = ' '; - pbuf = UINT16ToHex (pbuf, range->to, eptr); + pbuf = CidRangeToHex(buf, range->from, range->to, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, range->cid, eptr); HPDF_StrCpy (pbuf, "\r\n", eptr); @@ -994,7 +1050,7 @@ CreateCMap (HPDF_Encoder encoder, if ((i + 1) %100 == 0) { phase--; - pbuf = HPDF_StrCpy (buf, "endcidrange\r\n\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "endcidrange\r\n\r\n", eptr); if (phase > 0) pbuf = HPDF_IToA (pbuf, 100, eptr); @@ -1011,14 +1067,14 @@ CreateCMap (HPDF_Encoder encoder, } if (odd > 0) - pbuf = HPDF_StrCpy (buf, "endcidrange\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "endcidrange\r\n", eptr); - pbuf = HPDF_StrCpy (pbuf, "endcmap\r\n", eptr); - pbuf = HPDF_StrCpy (pbuf, "CMapName currentdict /CMap " + pbuf = (char *)HPDF_StrCpy (pbuf, "endcmap\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, "CMapName currentdict /CMap " "defineresource pop\r\n", eptr); - pbuf = HPDF_StrCpy (pbuf, "end\r\n", eptr); - pbuf = HPDF_StrCpy (pbuf, "end\r\n\r\n", eptr); - pbuf = HPDF_StrCpy (pbuf, "%%EndResource\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, "end\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, "end\r\n\r\n", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, "%%EndResource\r\n", eptr); HPDF_StrCpy (pbuf, "%%EOF\r\n", eptr); ret += HPDF_Stream_WriteStr (cmap->stream, buf); diff --git a/PDF/src/hpdf_font_tt.c b/PDF/src/hpdf_font_tt.c index 21b936783..8b5512932 100644 --- a/PDF/src/hpdf_font_tt.c +++ b/PDF/src/hpdf_font_tt.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_font_tt.c + * << Haru Free PDF Library >> -- hpdf_font_tt.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -177,6 +180,7 @@ CreateDescriptor (HPDF_Font font) ret += HPDF_Dict_AddName (descriptor, "Type", "FontDescriptor"); ret += HPDF_Dict_AddNumber (descriptor, "Ascent", def->ascent); ret += HPDF_Dict_AddNumber (descriptor, "Descent", def->descent); + ret += HPDF_Dict_AddNumber (descriptor, "CapHeight", def->cap_height); ret += HPDF_Dict_AddNumber (descriptor, "Flags", def->flags); array = HPDF_Box_Array_New (font->mmgr, def->font_bbox); @@ -244,7 +248,7 @@ CharWidth (HPDF_Font font, } -HPDF_TextWidth +static HPDF_TextWidth TextWidth (HPDF_Font font, const HPDF_BYTE *text, HPDF_UINT len) @@ -280,7 +284,7 @@ TextWidth (HPDF_Font font, } -HPDF_UINT +static HPDF_UINT MeasureText (HPDF_Font font, const HPDF_BYTE *text, HPDF_UINT len, @@ -304,14 +308,14 @@ MeasureText (HPDF_Font font, tmp_len = i + 1; if (real_width) - *real_width = w; + *real_width = (HPDF_REAL)w; w += word_space; } else if (!wordwrap) { tmp_len = i; if (real_width) - *real_width = w; + *real_width = (HPDF_REAL)w; } w += (HPDF_DOUBLE)CharWidth (font, b) * font_size / 1000; @@ -326,7 +330,7 @@ MeasureText (HPDF_Font font, /* all of text can be put in the specified width */ if (real_width) - *real_width = w; + *real_width = (HPDF_REAL)w; return len; } @@ -402,5 +406,3 @@ OnFree (HPDF_Dict obj) HPDF_FreeMem (obj->mmgr, attr); } } - - diff --git a/PDF/src/hpdf_font_type1.c b/PDF/src/hpdf_font_type1.c index c4c3a24b9..d1476c4c8 100644 --- a/PDF/src/hpdf_font_type1.c +++ b/PDF/src/hpdf_font_type1.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_font_type1.c + * << Haru Free PDF Library >> -- hpdf_font_type1.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -330,13 +333,13 @@ Type1Font_OnWrite (HPDF_Dict obj, if (!fontdef_attr->is_base14font || encoder_attr->has_differences) { char *pbuf; - pbuf = HPDF_StrCpy (buf, "/FirstChar ", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/FirstChar ", eptr); pbuf = HPDF_IToA (pbuf, encoder_attr->first_char, eptr); HPDF_StrCpy (pbuf, "\012", eptr); if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK) return ret; - pbuf = HPDF_StrCpy (buf, "/LastChar ", eptr); + pbuf = (char *)HPDF_StrCpy (buf, "/LastChar ", eptr); pbuf = HPDF_IToA (pbuf, encoder_attr->last_char, eptr); HPDF_StrCpy (pbuf, "\012", eptr); if ((ret = HPDF_Stream_WriteStr (stream, buf)) != HPDF_OK) diff --git a/PDF/src/hpdf_fontdef.c b/PDF/src/hpdf_fontdef.c index 6570e351f..13d4a0c2a 100644 --- a/PDF/src/hpdf_fontdef.c +++ b/PDF/src/hpdf_fontdef.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef.c + * << Haru Free PDF Library >> -- hpdf_fontdef.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_fontdef_base14.c b/PDF/src/hpdf_fontdef_base14.c index 561e45a5c..67c230c80 100644 --- a/PDF/src/hpdf_fontdef_base14.c +++ b/PDF/src/hpdf_fontdef_base14.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.1 >> -- HPDF_FontDef_base14.c + * << Haru Free PDF Library >> -- hpdf_fontdef_base14.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,7 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.07.25 modified. */ #include "hpdf_conf.h" diff --git a/PDF/src/hpdf_fontdef_cid.c b/PDF/src/hpdf_fontdef_cid.c index a16c99ede..6745188a2 100644 --- a/PDF/src/hpdf_fontdef_cid.c +++ b/PDF/src/hpdf_fontdef_cid.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_cid.c + * << Haru Free PDF Library >> -- hpdf_fontdef_cid.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_fontdef_cns.c b/PDF/src/hpdf_fontdef_cns.c index 793bbce7c..af9ff3cfb 100644 --- a/PDF/src/hpdf_fontdef_cns.c +++ b/PDF/src/hpdf_fontdef_cns.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_cns.c + * << Haru Free PDF Library >> -- hpdf_fontdef_cns.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_fontdef_cnt.c b/PDF/src/hpdf_fontdef_cnt.c index e8a7c9e5e..717c22514 100644 --- a/PDF/src/hpdf_fontdef_cnt.c +++ b/PDF/src/hpdf_fontdef_cnt.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_cnt.c + * << Haru Free PDF Library >> -- hpdf_fontdef_cnt.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_fontdef_jp.c b/PDF/src/hpdf_fontdef_jp.c index db8459258..7e48af8cf 100644 --- a/PDF/src/hpdf_fontdef_jp.c +++ b/PDF/src/hpdf_fontdef_jp.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_jp.c + * << Haru Free PDF Library >> -- hpdf_fontdef_jp.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -777,7 +780,7 @@ static const HPDF_CID_Width MS_PGothic_W_ARRAY[] = { }; -static const HPDF_CID_Width MS_Mincyo_W_ARRAY[] = { +static const HPDF_CID_Width MS_Mincho_W_ARRAY[] = { {1, 500}, {2, 500}, {3, 500}, @@ -1036,7 +1039,7 @@ static const HPDF_CID_Width MS_Mincyo_W_ARRAY[] = { -static const HPDF_CID_Width MS_PMincyo_W_ARRAY[] = { +static const HPDF_CID_Width MS_PMincho_W_ARRAY[] = { {1, 304}, {2, 304}, {3, 460}, @@ -1542,7 +1545,7 @@ static const HPDF_CID_Width MS_PMincyo_W_ARRAY[] = { /*---------------------------------------------------------------------------*/ -/*----- Mincyo Font ---------------------------------------------------------*/ +/*----- Mincho Font ---------------------------------------------------------*/ static HPDF_STATUS @@ -1668,11 +1671,11 @@ MS_PGothic_BoldItalic_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_Mincyo_Init (HPDF_FontDef fontdef) +MS_Mincho_Init (HPDF_FontDef fontdef) { HPDF_STATUS ret; - HPDF_PTRACE ((" HPDF_FontDef_MS_Mincyo_Init\n")); + HPDF_PTRACE ((" HPDF_FontDef_MS_Mincho_Init\n")); fontdef->ascent = 859; fontdef->descent = -140; @@ -1695,9 +1698,9 @@ MS_Mincyo_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_Mincyo_Bold_Init (HPDF_FontDef fontdef) +MS_Mincho_Bold_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_Mincyo_Init (fontdef); + HPDF_STATUS ret = MS_Mincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1707,9 +1710,9 @@ MS_Mincyo_Bold_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_Mincyo_Italic_Init (HPDF_FontDef fontdef) +MS_Mincho_Italic_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_Mincyo_Init (fontdef); + HPDF_STATUS ret = MS_Mincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1718,9 +1721,9 @@ MS_Mincyo_Italic_Init (HPDF_FontDef fontdef) } static HPDF_STATUS -MS_Mincyo_BoldItalic_Init (HPDF_FontDef fontdef) +MS_Mincho_BoldItalic_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_Mincyo_Init (fontdef); + HPDF_STATUS ret = MS_Mincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1730,11 +1733,11 @@ MS_Mincyo_BoldItalic_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_PMincyo_Init (HPDF_FontDef fontdef) +MS_PMincho_Init (HPDF_FontDef fontdef) { HPDF_STATUS ret; - HPDF_PTRACE ((" HPDF_FontDef_MS_PMincyo_Init\n")); + HPDF_PTRACE ((" HPDF_FontDef_MS_PMincho_Init\n")); fontdef->ascent = 859; fontdef->descent = -140; @@ -1756,9 +1759,9 @@ MS_PMincyo_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_PMincyo_Bold_Init (HPDF_FontDef fontdef) +MS_PMincho_Bold_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_PMincyo_Init (fontdef); + HPDF_STATUS ret = MS_PMincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1768,9 +1771,9 @@ MS_PMincyo_Bold_Init (HPDF_FontDef fontdef) static HPDF_STATUS -MS_PMincyo_Italic_Init (HPDF_FontDef fontdef) +MS_PMincho_Italic_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_PMincyo_Init (fontdef); + HPDF_STATUS ret = MS_PMincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1779,9 +1782,9 @@ MS_PMincyo_Italic_Init (HPDF_FontDef fontdef) } static HPDF_STATUS -MS_PMincyo_BoldItalic_Init (HPDF_FontDef fontdef) +MS_PMincho_BoldItalic_Init (HPDF_FontDef fontdef) { - HPDF_STATUS ret = MS_PMincyo_Init (fontdef); + HPDF_STATUS ret = MS_PMincho_Init (fontdef); if (ret != HPDF_OK) return ret; @@ -1849,52 +1852,52 @@ HPDF_UseJPFonts (HPDF_Doc pdf) if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - /* MS-Mincyo */ - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincyo", - MS_Mincyo_Init); + /* MS-Mincho */ + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincho", + MS_Mincho_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincyo,Bold", - MS_Mincyo_Bold_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincho,Bold", + MS_Mincho_Bold_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincyo,Italic", - MS_Mincyo_Italic_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincho,Italic", + MS_Mincho_Italic_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincyo,BoldItalic", - MS_Mincyo_BoldItalic_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-Mincho,BoldItalic", + MS_Mincho_BoldItalic_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - /* MS-PMincyo */ - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincyo", - MS_PMincyo_Init); + /* MS-PMincho */ + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincho", + MS_PMincho_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincyo,Bold", - MS_PMincyo_Bold_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincho,Bold", + MS_PMincho_Bold_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincyo,Italic", - MS_PMincyo_Italic_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincho,Italic", + MS_PMincho_Italic_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; - fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincyo,BoldItalic", - MS_PMincyo_BoldItalic_Init); + fontdef = HPDF_CIDFontDef_New (pdf->mmgr, "MS-PMincho,BoldItalic", + MS_PMincho_BoldItalic_Init); if ((ret = HPDF_Doc_RegisterFontDef (pdf, fontdef)) != HPDF_OK) return ret; diff --git a/PDF/src/hpdf_fontdef_kr.c b/PDF/src/hpdf_fontdef_kr.c index ba60de386..3651f9da1 100644 --- a/PDF/src/hpdf_fontdef_kr.c +++ b/PDF/src/hpdf_fontdef_kr.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_kr.c + * << Haru Free PDF Library >> -- hpdf_fontdef_kr.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_fontdef_tt.c b/PDF/src/hpdf_fontdef_tt.c index 342cf6e0b..f985d3549 100644 --- a/PDF/src/hpdf_fontdef_tt.c +++ b/PDF/src/hpdf_fontdef_tt.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.4 >> -- hpdf_fontdef_tt.c + * << Haru Free PDF Library >> -- hpdf_fontdef_tt.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -22,7 +25,7 @@ #define HPDF_REQUIRED_TAGS_COUNT 13 -static const char *REQUIRED_TAGS[HPDF_REQUIRED_TAGS_COUNT] = { +static const char * const REQUIRED_TAGS[HPDF_REQUIRED_TAGS_COUNT] = { "OS/2", "cmap", "cvt ", @@ -457,11 +460,11 @@ LoadFontData (HPDF_FontDef fontdef, attr->glyph_tbl.base_offset = tbl->offset; fontdef->cap_height = - HPDF_TTFontDef_GetCharBBox (fontdef, (HPDF_UINT16)'H').top; + (HPDF_UINT16)HPDF_TTFontDef_GetCharBBox (fontdef, (HPDF_UINT16)'H').top; fontdef->x_height = - HPDF_TTFontDef_GetCharBBox (fontdef, (HPDF_UINT16)'x').top; - fontdef->missing_width = (HPDF_UINT32)attr->h_metric[0].advance_width * 1000 / - attr->header.units_per_em; + (HPDF_UINT16)HPDF_TTFontDef_GetCharBBox (fontdef, (HPDF_UINT16)'x').top; + fontdef->missing_width = (HPDF_INT16)((HPDF_UINT32)attr->h_metric[0].advance_width * 1000 / + attr->header.units_per_em); HPDF_PTRACE ((" fontdef->cap_height=%d\n", fontdef->cap_height)); HPDF_PTRACE ((" fontdef->x_height=%d\n", fontdef->x_height)); @@ -501,7 +504,7 @@ LoadFontData2 (HPDF_FontDef fontdef, if ((ret = HPDF_Stream_Read (stream, tag, &size)) != HPDF_OK) return ret; - if (HPDF_MemCmp (tag, "ttcf", 4) != 0) + if (HPDF_MemCmp (tag, (HPDF_BYTE *)"ttcf", 4) != 0) return HPDF_SetError (fontdef->error, HPDF_INVALID_TTC_FILE, 0); if ((ret = HPDF_Stream_Seek (stream, 8, HPDF_SEEK_SET)) != HPDF_OK) @@ -557,16 +560,16 @@ HPDF_TTFontDef_GetCharBBox (HPDF_FontDef fontdef, return bbox; ret += GetINT16 (attr->stream, &i); - bbox.left = (HPDF_INT32)i * 1000 / attr->header.units_per_em; + bbox.left = (HPDF_REAL)((HPDF_INT32)i * 1000 / attr->header.units_per_em); ret += GetINT16 (attr->stream, &i); - bbox.bottom = (HPDF_INT32)i * 1000 / attr->header.units_per_em; + bbox.bottom = (HPDF_REAL)((HPDF_INT32)i * 1000 / attr->header.units_per_em); ret += GetINT16 (attr->stream, &i); - bbox.right = (HPDF_INT32)i * 1000 / attr->header.units_per_em; + bbox.right = (HPDF_REAL)((HPDF_INT32)i * 1000 / attr->header.units_per_em); ret += GetINT16 (attr->stream, &i); - bbox.top = (HPDF_INT32)i * 1000 / attr->header.units_per_em; + bbox.top = (HPDF_REAL)((HPDF_INT32)i * 1000 / attr->header.units_per_em); if (ret != HPDF_OK) return HPDF_ToBox(0, 0, 0, 0); @@ -718,7 +721,7 @@ LoadTTFTable (HPDF_FontDef fontdef) for (i = 0; i < attr->offset_tbl.num_tables; i++) { HPDF_UINT siz = 4; - ret += HPDF_Stream_Read (attr->stream, tbl->tag, &siz); + ret += HPDF_Stream_Read (attr->stream, (HPDF_BYTE *)tbl->tag, &siz); ret += GetUINT32 (attr->stream, &tbl->check_sum); ret += GetUINT32 (attr->stream, &tbl->offset); ret += GetUINT32 (attr->stream, &tbl->length); @@ -782,14 +785,14 @@ ParseHead (HPDF_FontDef fontdef) if (ret != HPDF_OK) return HPDF_Error_GetCode (fontdef->error); - fontdef->font_bbox. left = (HPDF_INT32)attr->header.x_min * 1000 / - attr->header.units_per_em; - fontdef->font_bbox. bottom = (HPDF_INT32)attr->header.y_min * 1000 / - attr->header.units_per_em; - fontdef->font_bbox. right = (HPDF_INT32)attr->header.x_max * 1000 / - attr->header.units_per_em; - fontdef->font_bbox. top = (HPDF_INT32)attr->header.y_max * 1000 / - attr->header.units_per_em; + fontdef->font_bbox. left = (HPDF_REAL)((HPDF_INT32)attr->header.x_min * 1000 / + attr->header.units_per_em); + fontdef->font_bbox. bottom = (HPDF_REAL)((HPDF_INT32)attr->header.y_min * 1000 / + attr->header.units_per_em); + fontdef->font_bbox. right = (HPDF_REAL)((HPDF_INT32)attr->header.x_max * 1000 / + attr->header.units_per_em); + fontdef->font_bbox. top = (HPDF_REAL)((HPDF_INT32)attr->header.y_max * 1000 / + attr->header.units_per_em); return HPDF_OK; } @@ -837,11 +840,11 @@ ParseHhea (HPDF_FontDef fontdef) return ret; ret += GetINT16 (attr->stream, &fontdef->ascent); - fontdef->ascent = (HPDF_INT32)fontdef->ascent * 1000 / - attr->header.units_per_em; + fontdef->ascent = (HPDF_INT16)((HPDF_INT32)fontdef->ascent * 1000 / + attr->header.units_per_em); ret += GetINT16 (attr->stream, &fontdef->descent); - fontdef->descent = (HPDF_INT32)fontdef->descent * 1000 / - attr->header.units_per_em; + fontdef->descent = (HPDF_INT16)((HPDF_INT32)fontdef->descent * 1000 / + attr->header.units_per_em); if (ret != HPDF_OK) return HPDF_Error_GetCode (fontdef->error); @@ -1049,7 +1052,7 @@ ParseCMAP_format4 (HPDF_FontDef fontdef, return HPDF_Error_GetCode (fontdef->error); pend_count = attr->cmap.end_count; - for (i = 0; i < attr->cmap.seg_count_x2 / 2; i++) + for (i = 0; i < (HPDF_UINT)attr->cmap.seg_count_x2 / 2; i++) if ((ret = GetUINT16 (attr->stream, pend_count++)) != HPDF_OK) return ret; @@ -1063,7 +1066,7 @@ ParseCMAP_format4 (HPDF_FontDef fontdef, return HPDF_Error_GetCode (fontdef->error); pstart_count = attr->cmap.start_count; - for (i = 0; i < attr->cmap.seg_count_x2 / 2; i++) + for (i = 0; i < (HPDF_UINT)attr->cmap.seg_count_x2 / 2; i++) if ((ret = GetUINT16 (attr->stream, pstart_count++)) != HPDF_OK) return ret; @@ -1074,7 +1077,7 @@ ParseCMAP_format4 (HPDF_FontDef fontdef, return HPDF_Error_GetCode (fontdef->error); pid_delta = attr->cmap.id_delta; - for (i = 0; i < attr->cmap.seg_count_x2 / 2; i++) + for (i = 0; i < (HPDF_UINT)attr->cmap.seg_count_x2 / 2; i++) if ((ret = GetINT16 (attr->stream, pid_delta++)) != HPDF_OK) return ret; @@ -1085,7 +1088,7 @@ ParseCMAP_format4 (HPDF_FontDef fontdef, return HPDF_Error_GetCode (fontdef->error); pid_range_offset = attr->cmap.id_range_offset; - for (i = 0; i < attr->cmap.seg_count_x2 / 2; i++) + for (i = 0; i < (HPDF_UINT)attr->cmap.seg_count_x2 / 2; i++) if ((ret = GetUINT16 (attr->stream, pid_range_offset++)) != HPDF_OK) return ret; @@ -1109,9 +1112,9 @@ ParseCMAP_format4 (HPDF_FontDef fontdef, } else attr->cmap.glyph_id_array = NULL; -#ifdef HPDF_DEBUG +#ifdef LIBHPDF_DEBUG /* print all elements of cmap table */ - for (i = 0; i < attr->cmap.seg_count_x2 / 2; i++) { + for (i = 0; i < (HPDF_UINT)attr->cmap.seg_count_x2 / 2; i++) { HPDF_PTRACE((" ParseCMAP_format4[%d] start_count=0x%04X, " "end_count=0x%04X, id_delta=%d, id_range_offset=%u\n", i, attr->cmap.start_count[i], attr->cmap.end_count[i], @@ -1163,7 +1166,7 @@ HPDF_TTFontDef_GetGlyphid (HPDF_FontDef fontdef, " ret=%u\n", i, unicode, unicode + attr->cmap.id_delta[i])); - return unicode + attr->cmap.id_delta[i]; + return (HPDF_UINT16)(unicode + attr->cmap.id_delta[i]); } else { HPDF_UINT idx = attr->cmap.id_range_offset[i] / 2 + (unicode - attr->cmap.start_count[i]) - (seg_count - i); @@ -1173,8 +1176,8 @@ HPDF_TTFontDef_GetGlyphid (HPDF_FontDef fontdef, i, idx, (HPDF_UINT)attr->cmap.glyph_id_array_count)); return 0; } else { - HPDF_UINT16 gid = attr->cmap.glyph_id_array[idx] + - attr->cmap.id_delta[i]; + HPDF_UINT16 gid = (HPDF_UINT16)(attr->cmap.glyph_id_array[idx] + + attr->cmap.id_delta[i]); HPDF_PTRACE((" HPDF_TTFontDef_GetGlyphid idx=%u unicode=0x%04X " "id=%u\n", idx, unicode, gid)); return gid; @@ -1209,8 +1212,8 @@ HPDF_TTFontDef_GetCharWidth (HPDF_FontDef fontdef, CheckCompositGryph (fontdef, gid); } - advance_width = (HPDF_UINT)hmetrics.advance_width * 1000 / - attr->header.units_per_em; + advance_width = (HPDF_UINT16)((HPDF_UINT)hmetrics.advance_width * 1000 / + attr->header.units_per_em); return (HPDF_INT16)advance_width; } @@ -1222,7 +1225,7 @@ CheckCompositGryph (HPDF_FontDef fontdef, { HPDF_TTFontDefAttr attr = (HPDF_TTFontDefAttr)fontdef->attr; HPDF_UINT offset = attr->glyph_tbl.offsets[gid]; - // HPDF_UINT len = attr->glyph_tbl.offsets[gid + 1] - offset; + /* HPDF_UINT len = attr->glyph_tbl.offsets[gid + 1] - offset; */ HPDF_STATUS ret; HPDF_PTRACE ((" CheckCompositGryph\n")); @@ -1320,8 +1323,8 @@ HPDF_TTFontDef_GetGidWidth (HPDF_FontDef fontdef, hmetrics = attr->h_metric[gid]; - advance_width = (HPDF_UINT)hmetrics.advance_width * 1000 / - attr->header.units_per_em; + advance_width = (HPDF_UINT16)((HPDF_UINT)hmetrics.advance_width * 1000 / + attr->header.units_per_em); HPDF_PTRACE((" HPDF_TTFontDef_GetGidWidth gid=%u, width=%u\n", gid, advance_width)); @@ -1453,7 +1456,7 @@ ParseLoca (HPDF_FontDef fontdef) } -#ifdef HPDF_DEBUG +#ifdef LIBHPDF_DEBUG poffset = attr->glyph_tbl.offsets; for (i = 0; i <= attr->num_glyphs; i++) { HPDF_PTRACE((" ParseLOCA offset[%u]=%u\n", i, (HPDF_UINT)*poffset)); @@ -1608,7 +1611,7 @@ ParseName (HPDF_FontDef fontdef) HPDF_SEEK_SET)) != HPDF_OK) return ret; - if ((ret = HPDF_Stream_Read (attr->stream, attr->base_font, &len_id1)) + if ((ret = HPDF_Stream_Read (attr->stream, (HPDF_BYTE *)attr->base_font, &len_id1)) != HPDF_OK) return ret; } else { @@ -1624,7 +1627,7 @@ ParseName (HPDF_FontDef fontdef) != HPDF_OK) return ret; - if ((ret = HPDF_Stream_Read (attr->stream, tmp, &len_id2)) != HPDF_OK) + if ((ret = HPDF_Stream_Read (attr->stream, (HPDF_BYTE *)tmp, &len_id2)) != HPDF_OK) return ret; } else { if ((ret = LoadUnicodeName (attr->stream, offset_id2u, len_id2u, @@ -1639,7 +1642,7 @@ ParseName (HPDF_FontDef fontdef) * if subfamily name is "Bold" or "Italic" or "BoldItalic", set flags * attribute. */ - if (HPDF_MemCmp (tmp, "Regular", 7) != 0) { + if (HPDF_MemCmp ((HPDF_BYTE *)tmp, (HPDF_BYTE *)"Regular", 7) != 0) { char *dst = attr->base_font + len_id1; char *src = tmp; HPDF_UINT j; @@ -1662,8 +1665,7 @@ ParseName (HPDF_FontDef fontdef) fontdef->flags |= HPDF_FONT_ITALIC; } - HPDF_MemCpy (fontdef->base_font, attr->base_font, - HPDF_LIMIT_MAX_NAME_LEN + 1); + HPDF_MemCpy ((HPDF_BYTE *)fontdef->base_font, (HPDF_BYTE *)attr->base_font, HPDF_LIMIT_MAX_NAME_LEN + 1); HPDF_PTRACE((" ParseName() base_font=%s\n", attr->base_font)); @@ -1676,6 +1678,7 @@ ParseOS2 (HPDF_FontDef fontdef) HPDF_TTFontDefAttr attr = (HPDF_TTFontDefAttr)fontdef->attr; HPDF_TTFTable *tbl = FindTable (fontdef, "OS/2"); HPDF_STATUS ret; + HPDF_UINT16 version; HPDF_UINT len; HPDF_PTRACE ((" ParseOS2\n")); @@ -1683,11 +1686,19 @@ ParseOS2 (HPDF_FontDef fontdef) if (!tbl) return HPDF_SetError (fontdef->error, HPDF_TTF_MISSING_TABLE, 0); + /* get the number version. */ + ret = HPDF_Stream_Seek (attr->stream, tbl->offset, HPDF_SEEK_SET); + if (ret != HPDF_OK) + return ret; + + if ((ret = GetUINT16 (attr->stream, &version)) != HPDF_OK) + return ret; + + /* check whether the font is allowed to be embedded. */ ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 8, HPDF_SEEK_SET); if (ret != HPDF_OK) return ret; - /* check whether the font is allowed to be embedded. */ if ((ret = GetUINT16 (attr->stream, &attr->fs_type)) != HPDF_OK) return ret; @@ -1695,32 +1706,59 @@ ParseOS2 (HPDF_FontDef fontdef) return HPDF_SetError (fontdef->error, HPDF_TTF_CANNOT_EMBEDDING_FONT, 0); - if ((ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 20, HPDF_SEEK_SET)) + /* get fields sfamilyclass and panose. */ + if ((ret = HPDF_Stream_Seek (attr->stream, tbl->offset + 30, HPDF_SEEK_SET)) != HPDF_OK) return ret; - len = 12; + len = 2; + if ((ret = HPDF_Stream_Read (attr->stream, attr->sfamilyclass, &len)) != HPDF_OK) + return ret; + + len = 10; if ((ret = HPDF_Stream_Read (attr->stream, attr->panose, &len)) != HPDF_OK) return ret; - HPDF_PTRACE((" ParseOS2 PANOSE=%u-%u " - "%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n", + HPDF_PTRACE((" ParseOS2 sFamilyClass=%d-%d " + "Panose=%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X-%02X\n", + attr->sfamilyclass[0], attr->sfamilyclass[1], attr->panose[0], attr->panose[1], attr->panose[2], attr->panose[3], attr->panose[4], attr->panose[5], attr->panose[6], attr->panose[7], - attr->panose[8], attr->panose[9], attr->panose[10], attr->panose[11])); + attr->panose[8], attr->panose[9])); - if (attr->panose[0] == 1 || attr->panose[0] == 4) + /* Class ID = 1 Oldstyle Serifs + Class ID = 2 Transitional Serifs + Class ID = 3 Modern Serifs + Class ID = 4 Clarendon Serifs + Class ID = 5 Slab Serifs + Class ID = 6 (reserved for future use) + Class ID = 7 Freeform Serifs + Class ID = 8 Sans Serif + Class ID = 9 Ornamentals + Class ID = 10 Scripts + Class ID = 11 (reserved for future use) + Class ID = 12 Symbolic */ + if ((attr->sfamilyclass[0] > 0 && attr->sfamilyclass[0] < 6) + || (attr->sfamilyclass[0] == 7)) fontdef->flags = fontdef->flags | HPDF_FONT_SERIF; - /* get ulCodePageRange1 */ - if ((ret = HPDF_Stream_Seek (attr->stream, 78, HPDF_SEEK_CUR)) != HPDF_OK) - return ret; + if (attr->sfamilyclass[0] == 10) + fontdef->flags = fontdef->flags | HPDF_FONT_SCRIPT; - if ((ret = GetUINT32 (attr->stream, &attr->code_page_range1)) != HPDF_OK) - return ret; + if (attr->sfamilyclass[0] == 12) + fontdef->flags = fontdef->flags | HPDF_FONT_SYMBOLIC; - if ((ret = GetUINT32 (attr->stream, &attr->code_page_range2)) != HPDF_OK) - return ret; + /* get fields ulCodePageRange1 and ulCodePageRange2 */ + if(version > 0) { + if ((ret = HPDF_Stream_Seek (attr->stream, 36, HPDF_SEEK_CUR)) != HPDF_OK) + return ret; + + if ((ret = GetUINT32 (attr->stream, &attr->code_page_range1)) != HPDF_OK) + return ret; + + if ((ret = GetUINT32 (attr->stream, &attr->code_page_range2)) != HPDF_OK) + return ret; + } HPDF_PTRACE((" ParseOS2 CodePageRange1=%08X CodePageRange2=%08X\n", (HPDF_UINT)attr->code_page_range1, @@ -1843,11 +1881,11 @@ RecreateName (HPDF_FontDef fontdef, /* add suffix to font-name. */ if (name_rec->name_id == 1 || name_rec->name_id == 4) { if (name_rec->platform_id == 0 || name_rec->platform_id == 3) { - ret += HPDF_Stream_Write (tmp_stream, attr->tag_name2, + ret += HPDF_Stream_Write (tmp_stream, (HPDF_BYTE *)attr->tag_name2, sizeof(attr->tag_name2)); name_len += sizeof(attr->tag_name2); } else { - ret += HPDF_Stream_Write (tmp_stream, attr->tag_name, + ret += HPDF_Stream_Write (tmp_stream, (HPDF_BYTE *)attr->tag_name, sizeof(attr->tag_name)); name_len += sizeof(attr->tag_name); } @@ -1953,10 +1991,13 @@ HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, HPDF_Stream tmp_stream; HPDF_UINT32 *new_offsets; HPDF_UINT i; - HPDF_UINT32 check_sum_ptr; + HPDF_UINT32 check_sum_ptr = 0; HPDF_STATUS ret; HPDF_UINT32 offset_base; HPDF_UINT32 tmp_check_sum = 0xB1B0AFBA; + HPDF_TTFTable emptyTable; + emptyTable.length = 0; + emptyTable.offset = 0; HPDF_PTRACE ((" SaveFontData\n")); @@ -1989,6 +2030,12 @@ HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, HPDF_UINT32 *poffset; HPDF_UINT32 value; + if (!tbl) { + tbl = &emptyTable; + HPDF_MemCpy((HPDF_BYTE *)tbl->tag, + (const HPDF_BYTE *)REQUIRED_TAGS[i], 4); + } + if (!tbl) { ret = HPDF_SetError (fontdef->error, HPDF_TTF_MISSING_TABLE, i); goto Exit; @@ -2001,11 +2048,11 @@ HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, length = tbl->length; new_offset = tmp_stream->size; - if (HPDF_MemCmp (tbl->tag, "head", 4) == 0) { + if (HPDF_MemCmp ((HPDF_BYTE *)tbl->tag, (HPDF_BYTE *)"head", 4) == 0) { ret = WriteHeader (fontdef, tmp_stream, &check_sum_ptr); - } else if (HPDF_MemCmp (tbl->tag, "glyf", 4) == 0) { + } else if (HPDF_MemCmp ((HPDF_BYTE *)tbl->tag, (HPDF_BYTE *)"glyf", 4) == 0) { ret = RecreateGLYF (fontdef, new_offsets, tmp_stream); - } else if (HPDF_MemCmp (tbl->tag, "loca", 4) == 0) { + } else if (HPDF_MemCmp ((HPDF_BYTE *)tbl->tag, (HPDF_BYTE *)"loca", 4) == 0) { HPDF_UINT j; HPDF_MemSet (&value, 0, 4); @@ -2022,7 +2069,7 @@ HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, poffset++; } } - } else if (HPDF_MemCmp (tbl->tag, "name", 4) == 0) { + } else if (HPDF_MemCmp ((HPDF_BYTE *)tbl->tag, (HPDF_BYTE *)"name", 4) == 0) { ret = RecreateName (fontdef, tmp_stream); } else { HPDF_UINT size = 4; @@ -2081,7 +2128,7 @@ HPDF_TTFontDef_SaveFontData (HPDF_FontDef fontdef, REQUIRED_TAGS[i], (HPDF_UINT)tbl.check_sum, (HPDF_UINT)tbl.offset)); - ret += HPDF_Stream_Write (stream, REQUIRED_TAGS[i], 4); + ret += HPDF_Stream_Write (stream, (HPDF_BYTE *)REQUIRED_TAGS[i], 4); ret += WriteUINT32 (stream, tbl.check_sum); tbl.offset += offset_base; ret += WriteUINT32 (stream, tbl.offset); @@ -2155,7 +2202,7 @@ HPDF_TTFontDef_SetTagName (HPDF_FontDef fontdef, if (HPDF_StrLen (tag, HPDF_LIMIT_MAX_NAME_LEN) != HPDF_TTF_FONT_TAG_LEN) return; - HPDF_MemCpy (attr->tag_name, tag, HPDF_TTF_FONT_TAG_LEN); + HPDF_MemCpy ((HPDF_BYTE *)attr->tag_name, (HPDF_BYTE *)tag, HPDF_TTF_FONT_TAG_LEN); attr->tag_name[HPDF_TTF_FONT_TAG_LEN] = '+'; for (i = 0; i < HPDF_TTF_FONT_TAG_LEN + 1; i++) { @@ -2164,11 +2211,10 @@ HPDF_TTFontDef_SetTagName (HPDF_FontDef fontdef, } HPDF_MemSet (buf, 0, HPDF_LIMIT_MAX_NAME_LEN + 1); - HPDF_MemCpy (buf, attr->tag_name, HPDF_TTF_FONT_TAG_LEN + 1); - HPDF_MemCpy (buf + HPDF_TTF_FONT_TAG_LEN + 1, fontdef->base_font, - HPDF_LIMIT_MAX_NAME_LEN - HPDF_TTF_FONT_TAG_LEN - 1); + HPDF_MemCpy ((HPDF_BYTE *)buf, (HPDF_BYTE *)attr->tag_name, HPDF_TTF_FONT_TAG_LEN + 1); + HPDF_MemCpy ((HPDF_BYTE *)buf + HPDF_TTF_FONT_TAG_LEN + 1, (HPDF_BYTE *)fontdef->base_font, HPDF_LIMIT_MAX_NAME_LEN - HPDF_TTF_FONT_TAG_LEN - 1); - HPDF_MemCpy (attr->base_font, buf, HPDF_LIMIT_MAX_NAME_LEN + 1); + HPDF_MemCpy ((HPDF_BYTE *)attr->base_font, (HPDF_BYTE *)buf, HPDF_LIMIT_MAX_NAME_LEN + 1); } /* @@ -2188,7 +2234,7 @@ FindTable (HPDF_FontDef fontdef, HPDF_UINT i; for (i = 0; i < attr->offset_tbl.num_tables; i++, tbl++) { - if (HPDF_MemCmp (tbl->tag, tag, 4) == 0) { + if (HPDF_MemCmp ((HPDF_BYTE *)tbl->tag, (HPDF_BYTE *)tag, 4) == 0) { HPDF_PTRACE((" FindTable find table[%c%c%c%c]\n", tbl->tag[0], tbl->tag[1], tbl->tag[2], tbl->tag[3])); return tbl; @@ -2227,4 +2273,3 @@ INT16Swap (HPDF_INT16 *value) HPDF_MemCpy (b, (HPDF_BYTE *)value, 2); *value = (HPDF_INT16)((HPDF_INT16)b[0] << 8 | (HPDF_INT16)b[1]); } - diff --git a/PDF/src/hpdf_fontdef_type1.c b/PDF/src/hpdf_fontdef_type1.c index 8aa097098..499f52146 100644 --- a/PDF/src/hpdf_fontdef_type1.c +++ b/PDF/src/hpdf_fontdef_type1.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_fontdef_type1.c + * << Haru Free PDF Library >> -- hpdf_fontdef_type1.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -69,15 +72,12 @@ HPDF_Type1FontDef_New (HPDF_MMgr mmgr) if (!fontdef) return NULL; + HPDF_MemSet (fontdef, 0, sizeof (HPDF_FontDef_Rec)); fontdef->sig_bytes = HPDF_FONTDEF_SIG_BYTES; - fontdef->base_font[0] = 0; fontdef->mmgr = mmgr; fontdef->error = mmgr->error; fontdef->type = HPDF_FONTDEF_TYPE_TYPE1; - fontdef->clean_fn = NULL; fontdef->free_fn = FreeFunc; - fontdef->descriptor = NULL; - fontdef->valid = HPDF_FALSE; fontdef_attr = HPDF_GetMem (mmgr, sizeof(HPDF_Type1FontDefAttr_Rec)); if (!fontdef_attr) { @@ -106,7 +106,7 @@ GetKeyword (const char *src, *keyword = 0; - while (len > 0) { + while (len > 1) { if (HPDF_IS_WHITE_SPACE(*src)) { *keyword = 0; @@ -175,7 +175,7 @@ LoadAfm (HPDF_FontDef fontdef, } else if (HPDF_StrCmp (keyword, "ItalicAngle") == 0) { - fontdef->italic_angle = HPDF_AToI (s); + fontdef->italic_angle = (HPDF_INT16)HPDF_AToI (s); if (fontdef->italic_angle != 0) fontdef->flags |= HPDF_FONT_ITALIC; } else @@ -195,35 +195,35 @@ LoadAfm (HPDF_FontDef fontdef, char buf[HPDF_INT_LEN + 1]; s = GetKeyword (s, buf, HPDF_INT_LEN + 1); - fontdef->font_bbox.left = HPDF_AToI (buf); + fontdef->font_bbox.left = (HPDF_REAL)HPDF_AToI (buf); s = GetKeyword (s, buf, HPDF_INT_LEN + 1); - fontdef->font_bbox.bottom = HPDF_AToI (buf); + fontdef->font_bbox.bottom = (HPDF_REAL)HPDF_AToI (buf); s = GetKeyword (s, buf, HPDF_INT_LEN + 1); - fontdef->font_bbox.right = HPDF_AToI (buf); + fontdef->font_bbox.right = (HPDF_REAL)HPDF_AToI (buf); GetKeyword (s, buf, HPDF_INT_LEN + 1); - fontdef->font_bbox.top = HPDF_AToI (buf); + fontdef->font_bbox.top = (HPDF_REAL)HPDF_AToI (buf); } else if (HPDF_StrCmp (keyword, "EncodingScheme") == 0) { HPDF_StrCpy (attr->encoding_scheme, s, attr->encoding_scheme + HPDF_LIMIT_MAX_NAME_LEN); } else if (HPDF_StrCmp (keyword, "CapHeight") == 0) { - fontdef->cap_height = HPDF_AToI (s); + fontdef->cap_height = (HPDF_UINT16)HPDF_AToI (s); } else if (HPDF_StrCmp (keyword, "Ascender") == 0) { - fontdef->ascent = HPDF_AToI (s); + fontdef->ascent = (HPDF_INT16)HPDF_AToI (s); } else if (HPDF_StrCmp (keyword, "Descender") == 0) { - fontdef->descent = HPDF_AToI (s); + fontdef->descent = (HPDF_INT16)HPDF_AToI (s); } else if (HPDF_StrCmp (keyword, "STDHW") == 0) { - fontdef->stemh = HPDF_AToI (s); + fontdef->stemh = (HPDF_UINT16)HPDF_AToI (s); } else if (HPDF_StrCmp (keyword, "STDHV") == 0) { - fontdef->stemv = HPDF_AToI (s); + fontdef->stemv = (HPDF_UINT16)HPDF_AToI (s); } else if (HPDF_StrCmp (keyword, "StartCharMetrics") == 0) { attr->widths_count = HPDF_AToI (s); @@ -261,7 +261,7 @@ LoadAfm (HPDF_FontDef fontdef, s = GetKeyword (s, buf2, HPDF_LIMIT_MAX_NAME_LEN + 1); HPDF_AToI (buf2); - cdata->char_cd = HPDF_AToI (buf2); + cdata->char_cd = (HPDF_INT16)HPDF_AToI (buf2); } else return HPDF_SetError (fontdef->error, @@ -278,7 +278,7 @@ LoadAfm (HPDF_FontDef fontdef, if (buf2[0] == 0) return HPDF_SetError (fontdef->error, HPDF_INVALID_WX_DATA, 0); - cdata->width = HPDF_AToI (buf2); + cdata->width = (HPDF_INT16)HPDF_AToI (buf2); /* N PostScript language character name */ s = HPDF_StrStr (s, "N ", 0); @@ -316,14 +316,14 @@ LoadFontData (HPDF_FontDef fontdef, return HPDF_Error_GetCode (fontdef->error); len = 11; - ret = HPDF_Stream_Read (stream, pbuf, &len); + ret = HPDF_Stream_Read (stream, (HPDF_BYTE *)pbuf, &len); if (ret != HPDF_OK) return ret; pbuf += 11; for (;;) { len = HPDF_STREAM_BUF_SIZ - 11; - ret = HPDF_Stream_Read (stream, pbuf, &len); + ret = HPDF_Stream_Read (stream, (HPDF_BYTE *)pbuf, &len); if (ret == HPDF_STREAM_EOF) { end_flg = HPDF_TRUE; } else if (ret != HPDF_OK) @@ -354,16 +354,16 @@ LoadFontData (HPDF_FontDef fontdef, } if (end_flg) { - if ((ret = HPDF_Stream_Write (attr->font_data, buf, len + 11)) != + if ((ret = HPDF_Stream_Write (attr->font_data, (HPDF_BYTE *)buf, len + 11)) != HPDF_OK) return ret; break; } else { - if ((ret = HPDF_Stream_Write (attr->font_data, buf, len)) != + if ((ret = HPDF_Stream_Write (attr->font_data, (HPDF_BYTE *)buf, len)) != HPDF_OK) return ret; - HPDF_MemCpy (buf, buf + len, 11); + HPDF_MemCpy ((HPDF_BYTE *)buf, (HPDF_BYTE *)buf + len, 11); pbuf = buf + 11; } } @@ -424,8 +424,8 @@ HPDF_Type1FontDef_Duplicate (HPDF_MMgr mmgr, fontdef->type = src->type; fontdef->valid = src->valid; - // copy data of attr,widths - // attention to charset + /* copy data of attr,widths + attention to charset */ return NULL; } diff --git a/PDF/src/hpdf_gstate.c b/PDF/src/hpdf_gstate.c index 37860612c..c203c4d7f 100644 --- a/PDF/src/hpdf_gstate.c +++ b/PDF/src/hpdf_gstate.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_gstate.c + * << Haru Free PDF Library >> -- hpdf_gstate.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -59,6 +62,7 @@ HPDF_GState_New (HPDF_MMgr mmgr, gstate->font = current->font; gstate->font_size = current->font_size; + gstate->writing_mode = current->writing_mode; gstate->prev = current; gstate->depth = current->depth + 1; diff --git a/PDF/src/hpdf_image.c b/PDF/src/hpdf_image.c index 1e551eb79..eeec7c288 100644 --- a/PDF/src/hpdf_image.c +++ b/PDF/src/hpdf_image.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_image.c + * << Haru Free PDF Library >> -- hpdf_image.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,7 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.08.12 modified. */ #include "hpdf_conf.h" @@ -219,6 +221,36 @@ HPDF_Image_LoadJpegImage (HPDF_MMgr mmgr, return image; } +HPDF_Image +HPDF_Image_LoadJpegImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_UINT size, + HPDF_Xref xref) +{ + HPDF_Stream jpeg_data; + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_Image_LoadJpegImageFromMem\n")); + + jpeg_data = HPDF_MemStream_New(mmgr,size); + if (!HPDF_Stream_Validate (jpeg_data)) { + HPDF_RaiseError (mmgr->error, HPDF_INVALID_STREAM, 0); + return NULL; + } + + if (HPDF_Stream_Write (jpeg_data, buf, size) != HPDF_OK) { + HPDF_Stream_Free (jpeg_data); + return NULL; + } + + image = HPDF_Image_LoadJpegImage(mmgr,jpeg_data,xref); + + /* destroy file stream */ + HPDF_Stream_Free (jpeg_data); + + return image; +} + HPDF_Image HPDF_Image_LoadRawImage (HPDF_MMgr mmgr, @@ -297,12 +329,13 @@ HPDF_Image_LoadRawImageFromMem (HPDF_MMgr mmgr, { HPDF_Dict image; HPDF_STATUS ret = HPDF_OK; - HPDF_UINT size; + HPDF_UINT size=0; HPDF_PTRACE ((" HPDF_Image_LoadRawImageFromMem\n")); if (color_space != HPDF_CS_DEVICE_GRAY && - color_space != HPDF_CS_DEVICE_RGB) { + color_space != HPDF_CS_DEVICE_RGB && + color_space != HPDF_CS_DEVICE_CMYK) { HPDF_SetError (mmgr->error, HPDF_INVALID_COLOR_SPACE, 0); return NULL; } @@ -323,13 +356,22 @@ HPDF_Image_LoadRawImageFromMem (HPDF_MMgr mmgr, if (ret != HPDF_OK) return NULL; - if (color_space == HPDF_CS_DEVICE_GRAY) { - size = (HPDF_DOUBLE)width * height / (8 / bits_per_component) + 0.876; - ret = HPDF_Dict_AddName (image, "ColorSpace", COL_GRAY); - } else { - size = (HPDF_DOUBLE)width * height / (8 / bits_per_component) + 0.876; - size *= 3; - ret = HPDF_Dict_AddName (image, "ColorSpace", COL_RGB); + switch (color_space) { + case HPDF_CS_DEVICE_GRAY: + size = (HPDF_UINT)((HPDF_DOUBLE)width * height / (8 / bits_per_component) + 0.876); + ret = HPDF_Dict_AddName (image, "ColorSpace", COL_GRAY); + break; + case HPDF_CS_DEVICE_RGB: + size = (HPDF_UINT)((HPDF_DOUBLE)width * height / (8 / bits_per_component) + 0.876); + size *= 3; + ret = HPDF_Dict_AddName (image, "ColorSpace", COL_RGB); + break; + case HPDF_CS_DEVICE_CMYK: + size = (HPDF_UINT)((HPDF_DOUBLE)width * height / (8 / bits_per_component) + 0.876); + size *= 4; + ret = HPDF_Dict_AddName (image, "ColorSpace", COL_CMYK); + break; + default:; } if (ret != HPDF_OK) @@ -394,8 +436,8 @@ HPDF_Image_GetSize (HPDF_Image image) height = HPDF_Dict_GetItem (image, "Height", HPDF_OCLASS_NUMBER); if (width && height) { - ret.x = width->value; - ret.y = height->value; + ret.x = (HPDF_REAL)width->value; + ret.y = (HPDF_REAL)height->value; } return ret; @@ -418,8 +460,8 @@ HPDF_Image_GetSize2 (HPDF_Image image, HPDF_Point *size) height = HPDF_Dict_GetItem (image, "Height", HPDF_OCLASS_NUMBER); if (width && height) { - size->x = width->value; - size->y = height->value; + size->x = (HPDF_REAL)width->value; + size->y = (HPDF_REAL)height->value; } return HPDF_OK; @@ -446,30 +488,42 @@ HPDF_Image_GetBitsPerComponent (HPDF_Image image) HPDF_EXPORT(const char*) HPDF_Image_GetColorSpace (HPDF_Image image) { - HPDF_Name n; + HPDF_Name n; - HPDF_PTRACE ((" HPDF_Image_GetColorSpace\n")); + HPDF_PTRACE ((" HPDF_Image_GetColorSpace\n")); - n = HPDF_Dict_GetItem (image, "ColorSpace", HPDF_OCLASS_NAME); + n = HPDF_Dict_GetItem (image, "ColorSpace", HPDF_OCLASS_NAME); - if (!n) { - HPDF_CheckError (image->error); - return NULL; - } + if (!n) { + HPDF_Array a; - return n->value; + HPDF_Error_Reset(image->error); + + a = HPDF_Dict_GetItem (image, "ColorSpace", HPDF_OCLASS_ARRAY); + + if (a) { + n = HPDF_Array_GetItem (a, 0, HPDF_OCLASS_NAME); + } + } + + if (!n) { + HPDF_CheckError (image->error); + return NULL; + } + + return n->value; } HPDF_EXPORT(HPDF_UINT) HPDF_Image_GetWidth (HPDF_Image image) { - return HPDF_Image_GetSize (image).x; + return (HPDF_UINT)HPDF_Image_GetSize (image).x; } HPDF_EXPORT(HPDF_UINT) HPDF_Image_GetHeight (HPDF_Image image) { - return HPDF_Image_GetSize (image).y; + return (HPDF_UINT)HPDF_Image_GetSize (image).y; } HPDF_STATUS @@ -565,4 +619,46 @@ HPDF_Image_SetColorMask (HPDF_Image image, return HPDF_OK; } +HPDF_EXPORT(HPDF_STATUS) +HPDF_Image_AddSMask (HPDF_Image image, + HPDF_Image smask) +{ + + const char *name; + + if (!HPDF_Image_Validate (image)) + return HPDF_INVALID_IMAGE; + if (!HPDF_Image_Validate (smask)) + return HPDF_INVALID_IMAGE; + + if (HPDF_Dict_GetItem (image, "SMask", HPDF_OCLASS_BOOLEAN)) + return HPDF_RaiseError (image->error, HPDF_INVALID_OPERATION, 0); + + name = HPDF_Image_GetColorSpace (smask); + if (!name || HPDF_StrCmp (COL_GRAY, name) != 0) + return HPDF_RaiseError (smask->error, HPDF_INVALID_COLOR_SPACE, 0); + + return HPDF_Dict_Add (image, "SMask", smask); +} + +HPDF_STATUS +HPDF_Image_SetColorSpace (HPDF_Image image, + HPDF_Array colorspace) +{ + if (!HPDF_Image_Validate (image)) + return HPDF_INVALID_IMAGE; + + return HPDF_Dict_Add (image, "ColorSpace", colorspace); +} + + +HPDF_STATUS +HPDF_Image_SetRenderingIntent (HPDF_Image image, + const char* intent) +{ + if (!HPDF_Image_Validate (image)) + return HPDF_INVALID_IMAGE; + + return HPDF_Dict_AddName (image, "Intent", intent); +} diff --git a/PDF/src/hpdf_image_ccitt.c b/PDF/src/hpdf_image_ccitt.c new file mode 100644 index 000000000..86727637d --- /dev/null +++ b/PDF/src/hpdf_image_ccitt.c @@ -0,0 +1,797 @@ +/* + * << Haru Free PDF Library >> -- hpdf_image.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf.h" +#include +#include + +#define G3CODES +#include "t4.h" + +typedef unsigned int uint32; +typedef int int32; +typedef unsigned short uint16; +typedef int32 tsize_t; /* i/o size in bytes */ +/* + * Typedefs for ``method pointers'' used internally. + */ +typedef unsigned char tidataval_t; /* internal image data value type */ +typedef tidataval_t* tidata_t; /* reference to internal image data */ + +/* + * Compression+decompression state blocks are + * derived from this ``base state'' block. + */ +typedef struct { + /* int rw_mode; */ /* O_RDONLY for decode, else encode */ + int mode; /* operating mode */ + uint32 rowbytes; /* bytes in a decoded scanline */ + uint32 rowpixels; /* pixels in a scanline */ + + uint16 cleanfaxdata; /* CleanFaxData tag */ + uint32 badfaxrun; /* BadFaxRun tag */ + uint32 badfaxlines; /* BadFaxLines tag */ + uint32 groupoptions; /* Group 3/4 options tag */ + uint32 recvparams; /* encoded Class 2 session params */ + char* subaddress; /* subaddress string */ + uint32 recvtime; /* time spent receiving (secs) */ + char* faxdcs; /* Table 2/T.30 encoded session params */ +} HPDF_Fax3BaseState; + +typedef struct { + HPDF_Fax3BaseState b; + + /* Decoder state info */ + const unsigned char* bitmap; /* bit reversal table */ + uint32 data; /* current i/o byte/word */ + int bit; /* current i/o bit in byte */ + int EOLcnt; /* count of EOL codes recognized */ + /* TIFFFaxFillFunc fill;*/ /* fill routine */ + uint32* runs; /* b&w runs for current/previous row */ + uint32* refruns; /* runs for reference line */ + uint32* curruns; /* runs for current line */ + + /* Encoder state info */ + /* Ttag tag; */ /* encoding state */ + unsigned char* refline; /* reference line for 2d decoding */ + int k; /* #rows left that can be 2d encoded */ + int maxk; /* max #rows that can be 2d encoded */ + + int line; +} HPDF_Fax3CodecState; + +#define Fax3State(tif) (&(tif)->tif_data->b) +#define EncoderState(tif) ((tif)->tif_data) +#define isAligned(p,t) ((((unsigned long)(p)) & (sizeof (t)-1)) == 0) + +/* NB: the uint32 casts are to silence certain ANSI-C compilers */ +#define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) +#define TIFFhowmany8(x) (((x)&0x07)?((uint32)(x)>>3)+1:(uint32)(x)>>3) +#define TIFFroundup(x, y) (TIFFhowmany(x,y)*(y)) + + +/* +struct _HPDF_CCITT_Encoder { +} HPDF_CCITT_Encoder; +*/ + +struct _HPDF_CCITT_Data { + HPDF_Fax3CodecState *tif_data; + + HPDF_Stream dst; + + tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */ + tsize_t tif_rawcc; /* bytes unread from raw buffer */ + tidata_t tif_rawcp; /* current spot in raw buffer */ + tidata_t tif_rawdata; /* raw data buffer */ + +} HPDF_CCITT_Data; + +static HPDF_STATUS HPDF_InitCCITTFax3(struct _HPDF_CCITT_Data *pData) +{ + HPDF_Fax3BaseState* sp; + HPDF_Fax3CodecState* esp; + + /* + * Allocate state block so tag methods have storage to record values. + */ + pData->tif_data = (HPDF_Fax3CodecState *) + malloc(sizeof (HPDF_Fax3CodecState)); + + if (pData->tif_data == NULL) { + return 1; + } + + sp = Fax3State(pData); + /* sp->rw_mode = pData->tif_mode; */ + + /* + * Override parent get/set field methods. + */ + sp->groupoptions = 0; + sp->recvparams = 0; + sp->subaddress = NULL; + sp->faxdcs = NULL; + + esp = EncoderState(pData); + esp->refline = NULL; + esp->runs = NULL; + + return HPDF_OK; +} + +static HPDF_STATUS HPDF_FreeCCITTFax3(struct _HPDF_CCITT_Data *pData) +{ + if(pData->tif_data!=NULL) { + HPDF_Fax3CodecState* esp=pData->tif_data; + if(esp->refline!=NULL) { + free(esp->refline); + esp->refline=NULL; + } + if(esp->runs!=NULL) { + free(esp->runs); + esp->runs=NULL; + } + free(pData->tif_data); + pData->tif_data=NULL; + } + if(pData->tif_rawdata!=NULL) { + free(pData->tif_rawdata); + pData->tif_rawdata=NULL; + } + return HPDF_OK; +} + + +/* + * Setup G3/G4-related compression/decompression state + * before data is processed. This routine is called once + * per image -- it sets up different state based on whether + * or not decoding or encoding is being done and whether + * 1D- or 2D-encoded data is involved. + */ +static int +HPDF_Fax3SetupState(struct _HPDF_CCITT_Data *pData, HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width) +{ + HPDF_Fax3BaseState* sp = Fax3State(pData); + HPDF_Fax3CodecState* esp = EncoderState(pData); + uint32 rowbytes, rowpixels, nruns; + + HPDF_UNUSED (height); + + rowbytes = line_width; + rowpixels = width; + + sp->rowbytes = (uint32) rowbytes; + sp->rowpixels = (uint32) rowpixels; + + nruns = 2*TIFFroundup(rowpixels,32); + nruns += 3; + esp->runs = (uint32*) malloc(2*nruns * sizeof (uint32)); + if (esp->runs == NULL) + return 1; + esp->curruns = esp->runs; + esp->refruns = esp->runs + nruns; + + /* + * 2d encoding requires a scanline + * buffer for the ``reference line''; the + * scanline against which delta encoding + * is referenced. The reference line must + * be initialized to be ``white'' (done elsewhere). + */ + esp->refline = (unsigned char*) malloc(rowbytes); + if (esp->refline == NULL) { + return 1; + } + + return HPDF_OK; +} + +/* + * Reset encoding state at the start of a strip. + */ +static HPDF_STATUS +HPDF_Fax3PreEncode(struct _HPDF_CCITT_Data *pData/*, tsample_t s*/) +{ + HPDF_Fax3CodecState* sp = EncoderState(pData); + + /* assert(sp != NULL); */ + sp->bit = 8; + sp->data = 0; + /* sp->tag = G3_1D; */ + /* + * This is necessary for Group 4; otherwise it isn't + * needed because the first scanline of each strip ends + * up being copied into the refline. + */ + if (sp->refline) + memset(sp->refline, 0x00, sp->b.rowbytes); + sp->k = sp->maxk = 0; + sp->line = 0; + return HPDF_OK; +} + +static HPDF_STATUS +HPDF_CCITT_AppendToStream(HPDF_Stream dst, + tidata_t tif_rawdata, + tsize_t tif_rawcc) +{ + if(HPDF_Stream_Write(dst, tif_rawdata, tif_rawcc)!=HPDF_OK) + return 1; + return HPDF_OK; +} + +/* + * Internal version of TIFFFlushData that can be + * called by ``encodestrip routines'' w/o concern + * for infinite recursion. + */ +static HPDF_STATUS +HPDF_CCITT_FlushData(struct _HPDF_CCITT_Data *pData) +{ + if (pData->tif_rawcc > 0) { + /*if (!isFillOrder(tif, tif->tif_dir.td_fillorder) && + (tif->tif_flags & TIFF_NOBITREV) == 0) + TIFFReverseBits((unsigned char *pData->tif_rawdata, + pData->tif_rawcc);*/ + if (HPDF_CCITT_AppendToStream(pData->dst, + pData->tif_rawdata, pData->tif_rawcc)!=HPDF_OK) + return 1; + pData->tif_rawcc = 0; + pData->tif_rawcp = pData->tif_rawdata; + } + return HPDF_OK; +} + +#define HPDF_Fax3FlushBits(tif, sp) { \ + if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ + (void) HPDF_CCITT_FlushData(tif); \ + *(tif)->tif_rawcp++ = (tidataval_t) (sp)->data; \ + (tif)->tif_rawcc++; \ + (sp)->data = 0, (sp)->bit = 8; \ +} +#define _FlushBits(tif) { \ + if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize) \ + (void) HPDF_CCITT_FlushData(tif); \ + *(tif)->tif_rawcp++ = (tidataval_t) data; \ + (tif)->tif_rawcc++; \ + data = 0, bit = 8; \ +} +static const int _msbmask[9] = + { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff }; +#define _PutBits(tif, bits, length) { \ + while (length > bit) { \ + data |= bits >> (length - bit); \ + length -= bit; \ + _FlushBits(tif); \ + } \ + data |= (bits & _msbmask[length]) << (bit - length); \ + bit -= length; \ + if (bit == 0) \ + _FlushBits(tif); \ +} + +/* + * Write a variable-length bit-value to + * the output stream. Values are + * assumed to be at most 16 bits. + */ +static void +HPDF_Fax3PutBits(struct _HPDF_CCITT_Data *pData, unsigned int bits, unsigned int length) +{ + HPDF_Fax3CodecState* sp = EncoderState(pData); + unsigned int bit = sp->bit; + int data = sp->data; + + _PutBits(pData, bits, length); + + sp->data = data; + sp->bit = bit; +} + +/* + * Write a code to the output stream. + */ +#define putcode(tif, te) HPDF_Fax3PutBits(tif, (te)->code, (te)->length) + + +/* + * Write the sequence of codes that describes + * the specified span of zero's or one's. The + * appropriate table that holds the make-up and + * terminating codes is supplied. + */ +static void +putspan(struct _HPDF_CCITT_Data *pData, int32 span, const tableentry* tab) +{ + HPDF_Fax3CodecState* sp = EncoderState(pData); + unsigned int bit = sp->bit; + int data = sp->data; + unsigned int code, length; + + while (span >= 2624) { + const tableentry* te = &tab[63 + (2560>>6)]; + code = te->code, length = te->length; +#ifdef FAX3_DEBUG + DEBUG_PRINT("MakeUp", te->runlen); +#endif + _PutBits(pData, code, length); + span -= te->runlen; + } + if (span >= 64) { + const tableentry* te = &tab[63 + (span>>6)]; + assert(te->runlen == 64*(span>>6)); + code = te->code, length = te->length; +#ifdef FAX3_DEBUG + DEBUG_PRINT("MakeUp", te->runlen); +#endif + _PutBits(pData, code, length); + span -= te->runlen; + } + code = tab[span].code, length = tab[span].length; +#ifdef FAX3_DEBUG + DEBUG_PRINT(" Term", tab[span].runlen); +#endif + _PutBits(pData, code, length); + + sp->data = data; + sp->bit = bit; +} + +static const unsigned char zeroruns[256] = { + 8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, /* 0x00 - 0x0f */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0x10 - 0x1f */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x20 - 0x2f */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0x30 - 0x3f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 - 0x4f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 - 0x5f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 - 0x6f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x70 - 0x7f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 - 0xaf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 - 0xbf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 - 0xcf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 - 0xdf */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 - 0xef */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xf0 - 0xff */ +}; +static const unsigned char oneruns[256] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x0f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 - 0x1f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x2f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 - 0x3f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 - 0x4f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 - 0x5f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6f */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 - 0x8f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 - 0x9f */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 - 0xaf */ + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 - 0xbf */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xc0 - 0xcf */ + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, /* 0xd0 - 0xdf */ + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, /* 0xe0 - 0xef */ + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8, /* 0xf0 - 0xff */ +}; + +/* + * Find a span of ones or zeros using the supplied + * table. The ``base'' of the bit string is supplied + * along with the start+end bit indices. + */ +static /*inline*/ int32 find0span(unsigned char* bp, int32 bs, int32 be) +{ + int32 bits = be - bs; + int32 n, span; + + bp += bs>>3; + /* + * Check partial byte on lhs. + */ + if (bits > 0 && (n = (bs & 7))) { + span = zeroruns[(*bp << n) & 0xff]; + if (span > 8-n) /* table value too generous */ + span = 8-n; + if (span > bits) /* constrain span to bit range */ + span = bits; + if (n+span < 8) /* doesn't extend to edge of byte */ + return (span); + bits -= span; + bp++; + } else + span = 0; + if (bits >= (int32)(2 * 8 * sizeof(long))) { + long* lp; + /* + * Align to longword boundary and check longwords. + */ + while (!isAligned(bp, long)) { + if (*bp != 0x00) + return (span + zeroruns[*bp]); + span += 8, bits -= 8; + bp++; + } + lp = (long*) bp; + while ((bits >= (int32)(8 * sizeof(long))) && (0 == *lp)) { + span += 8*sizeof (long), bits -= 8*sizeof (long); + lp++; + } + bp = (unsigned char*) lp; + } + /* + * Scan full bytes for all 0's. + */ + while (bits >= 8) { + if (*bp != 0x00) /* end of run */ + return (span + zeroruns[*bp]); + span += 8, bits -= 8; + bp++; + } + /* + * Check partial byte on rhs. + */ + if (bits > 0) { + n = zeroruns[*bp]; + span += (n > bits ? bits : n); + } + return (span); +} + +static /*inline*/ int32 +find1span(unsigned char* bp, int32 bs, int32 be) +{ + int32 bits = be - bs; + int32 n, span; + + bp += bs>>3; + /* + * Check partial byte on lhs. + */ + if (bits > 0 && (n = (bs & 7))) { + span = oneruns[(*bp << n) & 0xff]; + if (span > 8-n) /* table value too generous */ + span = 8-n; + if (span > bits) /* constrain span to bit range */ + span = bits; + if (n+span < 8) /* doesn't extend to edge of byte */ + return (span); + bits -= span; + bp++; + } else + span = 0; + if (bits >= (int32)(2 * 8 * sizeof(long))) { + long* lp; + /* + * Align to longword boundary and check longwords. + */ + while (!isAligned(bp, long)) { + if (*bp != 0xff) + return (span + oneruns[*bp]); + span += 8, bits -= 8; + bp++; + } + lp = (long*) bp; + while ((bits >= (int32)(8 * sizeof(long))) && (~0 == *lp)) { + span += 8*sizeof (long), bits -= 8*sizeof (long); + lp++; + } + bp = (unsigned char*) lp; + } + /* + * Scan full bytes for all 1's. + */ + while (bits >= 8) { + if (*bp != 0xff) /* end of run */ + return (span + oneruns[*bp]); + span += 8, bits -= 8; + bp++; + } + /* + * Check partial byte on rhs. + */ + if (bits > 0) { + n = oneruns[*bp]; + span += (n > bits ? bits : n); + } + return (span); +} + +/* + * Return the offset of the next bit in the range + * [bs..be] that is different from the specified + * color. The end, be, is returned if no such bit + * exists. + */ +#define finddiff(_cp, _bs, _be, _color) \ + (_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be))) +/* + * Like finddiff, but also check the starting bit + * against the end in case start > end. + */ +#define finddiff2(_cp, _bs, _be, _color) \ + (_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be) + + +/* +void +HPDF_Fax3PostEncode(struct _HPDF_CCITT_Data *pData) +{ + HPDF_Fax3CodecState* sp = EncoderState(pData); + + if (sp->bit != 8) + HPDF_Fax3FlushBits(pData, sp); +} +*/ + +static const tableentry horizcode = + { 3, 0x1, 0 }; /* 001 */ +static const tableentry passcode = + { 4, 0x1, 0 }; /* 0001 */ +static const tableentry vcodes[7] = { + { 7, 0x03, 0 }, /* 0000 011 */ + { 6, 0x03, 0 }, /* 0000 11 */ + { 3, 0x03, 0 }, /* 011 */ + { 1, 0x1, 0 }, /* 1 */ + { 3, 0x2, 0 }, /* 010 */ + { 6, 0x02, 0 }, /* 0000 10 */ + { 7, 0x02, 0 } /* 0000 010 */ +}; + +/* + * 2d-encode a row of pixels. Consult the CCITT + * documentation for the algorithm. + */ +static HPDF_STATUS +HPDF_Fax3Encode2DRow(struct _HPDF_CCITT_Data *pData, unsigned char* bp, unsigned char* rp, uint32 bits) +{ +#define PIXEL(buf,ix) ((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1) + uint32 a0 = 0; + uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0)); + uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0)); + uint32 a2, b2; + + for (;;) { + b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1)); + if (b2 >= a1) { + int32 d = b1 - a1; + if (!(-3 <= d && d <= 3)) { /* horizontal mode */ + a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1)); + putcode(pData, &horizcode); + if (a0+a1 == 0 || PIXEL(bp, a0) == 0) { + putspan(pData, a1-a0, TIFFFaxWhiteCodes); + putspan(pData, a2-a1, TIFFFaxBlackCodes); + } else { + putspan(pData, a1-a0, TIFFFaxBlackCodes); + putspan(pData, a2-a1, TIFFFaxWhiteCodes); + } + a0 = a2; + } else { /* vertical mode */ + putcode(pData, &vcodes[d+3]); + a0 = a1; + } + } else { /* pass mode */ + putcode(pData, &passcode); + a0 = b2; + } + if (a0 >= bits) + break; + a1 = finddiff(bp, a0, bits, PIXEL(bp,a0)); + b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0)); + b1 = finddiff(rp, b1, bits, PIXEL(bp,a0)); + } + return HPDF_OK; +#undef PIXEL +} + +/* + * Encode the requested amount of data. + */ +static HPDF_STATUS +HPDF_Fax4Encode(struct _HPDF_CCITT_Data *pData, tidata_t bp, tsize_t cc/*, tsample_t s*/) +{ + HPDF_Fax3CodecState *sp = EncoderState(pData); + + /* (void) s; */ + while ((long)cc > 0) { + if (HPDF_Fax3Encode2DRow(pData, bp, sp->refline, sp->b.rowpixels)!=HPDF_OK) + return 1; + memcpy(sp->refline, bp, sp->b.rowbytes); + bp += sp->b.rowbytes; + cc -= sp->b.rowbytes; + } + return HPDF_OK; +} + +static void +HPDF_Fax4PostEncode(struct _HPDF_CCITT_Data *pData) +{ + /* HPDF_Fax3CodecState *sp = EncoderState(pData); */ + + /* terminate strip w/ EOFB */ + HPDF_Fax3PutBits(pData, EOL, 12); + HPDF_Fax3PutBits(pData, EOL, 12); + /*if (sp->bit != 8) + HPDF_Fax3FlushBits(pData, sp); + */ + HPDF_CCITT_FlushData(pData); +} + + + +HPDF_STATUS +HPDF_Stream_CcittToStream( const HPDF_BYTE *buf, + HPDF_Stream dst, + HPDF_Encrypt e, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL top_is_first) +{ + const HPDF_BYTE *pBufPos; + const HPDF_BYTE *pBufEnd; /* end marker */ + int lineIncrement; + struct _HPDF_CCITT_Data data; + + HPDF_UNUSED (e); + + if(height==0) return 1; + if(top_is_first) { + pBufPos = buf; + pBufEnd=buf+(line_width*height); + lineIncrement = line_width; + } else { + pBufPos = buf+(line_width*(height-1)); + pBufEnd= buf-line_width; + lineIncrement = -((int)line_width); + } + + memset(&data, 0, sizeof(struct _HPDF_CCITT_Data)); + data.dst = dst; + data.tif_rawdata = (tidata_t) malloc( 16384 ); /* 16 kb buffer */ + data.tif_rawdatasize = 16384; + data.tif_rawcc = 0; + data.tif_rawcp = data.tif_rawdata; + + if(HPDF_InitCCITTFax3(&data)!=HPDF_OK) + return 1; + + if(HPDF_Fax3SetupState(&data, width, height, line_width)!=HPDF_OK) + { + HPDF_FreeCCITTFax3(&data); + return 1; + } + + if(HPDF_Fax3PreEncode(&data)!=HPDF_OK) + { + HPDF_FreeCCITTFax3(&data); + return 1; + } + + /* encode data */ + while(pBufEnd!=pBufPos) + { + HPDF_Fax4Encode(&data, (tidata_t)pBufPos, line_width); + pBufPos+=lineIncrement; + } + + HPDF_Fax4PostEncode(&data); + + HPDF_FreeCCITTFax3(&data); + + return HPDF_OK; +} + +HPDF_Image +HPDF_Image_Load1BitImageFromMem (HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_Xref xref, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL top_is_first + ) +{ + HPDF_Dict image; + HPDF_STATUS ret = HPDF_OK; + /* HPDF_UINT size; */ + + HPDF_PTRACE ((" HPDF_Image_Load1BitImage\n")); + + image = HPDF_DictStream_New (mmgr, xref); + if (!image) + return NULL; + + image->header.obj_class |= HPDF_OSUBCLASS_XOBJECT; + ret += HPDF_Dict_AddName (image, "Type", "XObject"); + ret += HPDF_Dict_AddName (image, "Subtype", "Image"); + if (ret != HPDF_OK) + return NULL; + + /* size = width * height; */ + ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray"); + if (ret != HPDF_OK) + return NULL; + + if (HPDF_Dict_AddNumber (image, "Width", width) != HPDF_OK) + return NULL; + + if (HPDF_Dict_AddNumber (image, "Height", height) != HPDF_OK) + return NULL; + + if (HPDF_Dict_AddNumber (image, "BitsPerComponent", 1) != HPDF_OK) + return NULL; + + if (HPDF_Stream_CcittToStream (buf, image->stream, NULL, width, height, line_width, top_is_first) != HPDF_OK) + return NULL; + + return image; +} + +/* + * Load image from buffer + * line_width - width of the line in bytes + * top_is_first - image orientation: + * TRUE if image is oriented TOP-BOTTOM; + * FALSE if image is oriented BOTTOM-TOP + */ +HPDF_EXPORT(HPDF_Image) +HPDF_Image_LoadRaw1BitImageFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buf, + HPDF_UINT width, + HPDF_UINT height, + HPDF_UINT line_width, + HPDF_BOOL black_is1, + HPDF_BOOL top_is_first) +{ + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_Image_Load1BitImageFromMem\n")); + + if (!HPDF_HasDoc (pdf)) + return NULL; + + image = HPDF_Image_Load1BitImageFromMem(pdf->mmgr, buf, pdf->xref, width, + height, line_width, top_is_first); + + if (!image) + HPDF_CheckError (&pdf->error); + + if (pdf->compression_mode & HPDF_COMP_IMAGE) + { + image->filter = HPDF_STREAM_FILTER_CCITT_DECODE; + image->filterParams = HPDF_Dict_New(pdf->mmgr); + if(image->filterParams==NULL) { + return NULL; + } + + /* pure 2D encoding, default is 0 */ + HPDF_Dict_AddNumber (image->filterParams, "K", -1); + /* default is 1728 */ + HPDF_Dict_AddNumber (image->filterParams, "Columns", width); + /* default is 0 */ + HPDF_Dict_AddNumber (image->filterParams, "Rows", height); + HPDF_Dict_AddBoolean (image->filterParams, "BlackIs1", black_is1); + } + + return image; +} diff --git a/PDF/src/hpdf_image_png.c b/PDF/src/hpdf_image_png.c index 151e82978..3a35f5c3c 100644 --- a/PDF/src/hpdf_image_png.c +++ b/PDF/src/hpdf_image_png.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_image.c + * << Haru Free PDF Library >> -- hpdf_image.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -16,8 +19,9 @@ #include "hpdf_utils.h" #include "hpdf_image.h" -#ifndef HPDF_NOPNGLIB +#ifndef LIBHPDF_HAVE_NOPNGLIB #include +#include static void PngErrorFunc (png_structp png_ptr, @@ -38,6 +42,7 @@ PngReadFunc (png_structp png_ptr, static HPDF_STATUS LoadPngData (HPDF_Dict image, + HPDF_Xref xref, HPDF_Stream png_data, HPDF_BOOL delayed_loading); @@ -105,14 +110,15 @@ ReadPngData_Interlaced (HPDF_Dict image, png_infop info_ptr) { png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr); + png_uint_32 height = png_get_image_height(png_ptr, info_ptr); png_bytep* row_pointers = HPDF_GetMem (image->mmgr, - info_ptr->height * sizeof (png_bytep)); + height * sizeof (png_bytep)); if (row_pointers) { HPDF_UINT i; - HPDF_MemSet (row_pointers, 0, info_ptr->height * sizeof (png_bytep)); - for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) { + HPDF_MemSet (row_pointers, 0, height * sizeof (png_bytep)); + for (i = 0; i < (HPDF_UINT)height; i++) { row_pointers[i] = HPDF_GetMem (image->mmgr, len); if (image->error->error_no != HPDF_OK) @@ -120,11 +126,9 @@ ReadPngData_Interlaced (HPDF_Dict image, } if (image->error->error_no == HPDF_OK) { -/* } else { remove this line */ png_read_image(png_ptr, row_pointers); -/* if (image->error->error_no != HPDF_OK) { remove this line */ if (image->error->error_no == HPDF_OK) { /* add this line */ - for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) { + for (i = 0; i < (HPDF_UINT)height; i++) { if (HPDF_Stream_Write (image->stream, row_pointers[i], len) != HPDF_OK) break; @@ -133,9 +137,8 @@ ReadPngData_Interlaced (HPDF_Dict image, } /* clean up */ - for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) { + for (i = 0; i < (HPDF_UINT)height; i++) { HPDF_FreeMem (image->mmgr, row_pointers[i]); -/* i-- remove this line */ } HPDF_FreeMem (image->mmgr, row_pointers); @@ -150,12 +153,13 @@ ReadPngData (HPDF_Dict image, png_infop info_ptr) { png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr); + png_uint_32 height = png_get_image_height(png_ptr, info_ptr); png_bytep buf_ptr = HPDF_GetMem (image->mmgr, len); if (buf_ptr) { HPDF_UINT i; - for (i = 0; i < (HPDF_UINT)info_ptr->height; i++) { + for (i = 0; i < (HPDF_UINT)height; i++) { png_read_rows(png_ptr, (png_byte**)&buf_ptr, NULL, 1); if (image->error->error_no != HPDF_OK) break; @@ -170,6 +174,152 @@ ReadPngData (HPDF_Dict image, return image->error->error_no; } +static HPDF_STATUS +ReadTransparentPaletteData (HPDF_Dict image, + png_structp png_ptr, + png_infop info_ptr, + png_bytep smask_data, + png_bytep trans, + int num_trans) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_UINT i, j; + png_bytep *row_ptr; + png_uint_32 height = png_get_image_height(png_ptr, info_ptr); + png_uint_32 width = png_get_image_width(png_ptr, info_ptr); + + row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep)); + if (!row_ptr) { + return HPDF_FAILD_TO_ALLOC_MEM; + } else { + png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr); + + for (i = 0; i < (HPDF_UINT)height; i++) { + row_ptr[i] = HPDF_GetMem(image->mmgr, len); + if (!row_ptr[i]) { + for (; i > 0; i--) { + HPDF_FreeMem (image->mmgr, row_ptr[i]); + } + HPDF_FreeMem (image->mmgr, row_ptr); + return HPDF_FAILD_TO_ALLOC_MEM; + } + } + } + + png_read_image(png_ptr, row_ptr); + if (image->error->error_no != HPDF_OK) { + ret = HPDF_INVALID_PNG_IMAGE; + goto Error; + } + + for (j = 0; j < height; j++) { + for (i = 0; i < width; i++) { + smask_data[width * j + i] = (row_ptr[j][i] < num_trans) ? trans[row_ptr[j][i]] : 0xFF; + } + + if (HPDF_Stream_Write (image->stream, row_ptr[j], width) != HPDF_OK) { + ret = HPDF_FILE_IO_ERROR; + goto Error; + } + } + +Error: + for (i = 0; i < (HPDF_UINT)height; i++) { + HPDF_FreeMem (image->mmgr, row_ptr[i]); + } + + HPDF_FreeMem (image->mmgr, row_ptr); + return ret; +} + +static HPDF_STATUS +ReadTransparentPngData (HPDF_Dict image, + png_structp png_ptr, + png_infop info_ptr, + png_bytep smask_data) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_INT row_len; + HPDF_UINT i, j; + png_bytep *row_ptr, row; + png_byte color_type; + png_uint_32 height = png_get_image_height(png_ptr, info_ptr); + png_uint_32 width = png_get_image_width(png_ptr, info_ptr); + + color_type = png_get_color_type(png_ptr, info_ptr); + + if (!(color_type & PNG_COLOR_MASK_ALPHA)) { + return HPDF_INVALID_PNG_IMAGE; + } + + row_ptr = HPDF_GetMem (image->mmgr, height * sizeof(png_bytep)); + if (!row_ptr) { + return HPDF_FAILD_TO_ALLOC_MEM; + } else { + png_uint_32 len = png_get_rowbytes(png_ptr, info_ptr); + + for (i = 0; i < (HPDF_UINT)height; i++) { + row_ptr[i] = HPDF_GetMem(image->mmgr, len); + if (!row_ptr[i]) { + for (; i > 0; i--) { + HPDF_FreeMem (image->mmgr, row_ptr[i]); + } + HPDF_FreeMem (image->mmgr, row_ptr); + return HPDF_FAILD_TO_ALLOC_MEM; + } + } + } + + png_read_image(png_ptr, row_ptr); + if (image->error->error_no != HPDF_OK) { + ret = HPDF_INVALID_PNG_IMAGE; + goto Error; + } + + switch (color_type) { + case PNG_COLOR_TYPE_RGB_ALPHA: + row_len = 3 * width * sizeof(png_byte); + for (j = 0; j < height; j++) { + for (i = 0; i < width; i++) { + row = row_ptr[j]; + memmove(row + (3 * i), row + (4*i), 3); + smask_data[width * j + i] = row[4 * i + 3]; + } + + if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) { + ret = HPDF_FILE_IO_ERROR; + goto Error; + } + } + break; + case PNG_COLOR_TYPE_GRAY_ALPHA: + row_len = width * sizeof(png_byte); + for (j = 0; j < height; j++) { + for (i = 0; i < width; i++) { + row = row_ptr[j]; + row[i] = row[2 * i]; + smask_data[width * j + i] = row[2 * i + 1]; + } + + if (HPDF_Stream_Write (image->stream, row, row_len) != HPDF_OK) { + ret = HPDF_FILE_IO_ERROR; + goto Error; + } + } + break; + default: + ret = HPDF_INVALID_PNG_IMAGE; + goto Error; + } + +Error: + for (i = 0; i < (HPDF_UINT)height; i++) { + HPDF_FreeMem (image->mmgr, row_ptr[i]); + } + + HPDF_FreeMem (image->mmgr, row_ptr); + return ret; +} static HPDF_STATUS CreatePallet (HPDF_Dict image, @@ -257,7 +407,7 @@ HPDF_Image_LoadPngImage (HPDF_MMgr mmgr, if (ret != HPDF_OK) return NULL; - if (LoadPngData (image, png_data, delayed_loading) != HPDF_OK) + if (LoadPngData (image, xref, png_data, delayed_loading) != HPDF_OK) return NULL; return image; @@ -266,106 +416,241 @@ HPDF_Image_LoadPngImage (HPDF_MMgr mmgr, static HPDF_STATUS LoadPngData (HPDF_Dict image, + HPDF_Xref xref, HPDF_Stream png_data, HPDF_BOOL delayed_loading) { - HPDF_STATUS ret; - png_structp png_ptr = NULL; - png_infop info_ptr = NULL; + HPDF_STATUS ret = HPDF_OK; + png_uint_32 width, height; + int bit_depth, color_type; + png_structp png_ptr = NULL; + png_infop info_ptr = NULL; - HPDF_PTRACE ((" HPDF_Image_LoadPngImage\n")); + HPDF_PTRACE ((" HPDF_Image_LoadPngImage\n")); - /* create read_struct. */ - png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, - image->error, PngErrorFunc, PngErrorFunc); + /* create read_struct. */ + png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, + image->error, PngErrorFunc, PngErrorFunc); - if (png_ptr == NULL) { - HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0); - return HPDF_FAILD_TO_ALLOC_MEM; - } + if (png_ptr == NULL) { + HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0); + return HPDF_FAILD_TO_ALLOC_MEM; + } - /* create info-struct */ - info_ptr = png_create_info_struct (png_ptr); + /* create info-struct */ + info_ptr = png_create_info_struct (png_ptr); - if (info_ptr == NULL) { - HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0); - goto Exit; - } + if (info_ptr == NULL) { + HPDF_SetError (image->error, HPDF_FAILD_TO_ALLOC_MEM, 0); + goto Exit; + } - png_set_sig_bytes (png_ptr, HPDF_PNG_BYTES_TO_CHECK); - png_set_read_fn (png_ptr, (void *)png_data, (png_rw_ptr)&PngReadFunc); + png_set_sig_bytes (png_ptr, HPDF_PNG_BYTES_TO_CHECK); + png_set_read_fn (png_ptr, (void *)png_data, (png_rw_ptr)&PngReadFunc); - /* reading info structure. */ - png_read_info(png_ptr, info_ptr); - if (image->error->error_no != HPDF_OK) - goto Exit; + /* reading info structure. */ + png_read_info(png_ptr, info_ptr); + if (image->error->error_no != HPDF_OK) { + goto Exit; + } - /* 16bit image and alpha color type are not supported. */ - if (info_ptr->bit_depth == 16) - png_set_strip_16(png_ptr); + png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, NULL, NULL, NULL); - if (PNG_COLOR_MASK_ALPHA & info_ptr->color_type) { - /* png image with alpha chanel is not supported. */ - png_set_strip_alpha(png_ptr); - } + /* 16bit images are not supported. */ + if (bit_depth == 16) { + png_set_strip_16(png_ptr); + } - png_read_update_info(png_ptr, info_ptr); - if (image->error->error_no != HPDF_OK) - goto Exit; + png_read_update_info(png_ptr, info_ptr); + if (image->error->error_no != HPDF_OK) { + goto Exit; + } - /* if the image has color palette, copy the pallet of the image to - * create color map. - */ - if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) - ret = CreatePallet(image, png_ptr, info_ptr); - else if (info_ptr->color_type == PNG_COLOR_TYPE_GRAY) - ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray"); - else - ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB"); + /* check palette-based images for transparent areas and load them immediately if found */ + if (xref && PNG_COLOR_TYPE_PALETTE & color_type) { + png_bytep trans; + int num_trans; + HPDF_Dict smask; + png_bytep smask_data; - if (ret != HPDF_OK) - goto Exit; + if (!png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS) || + !png_get_tRNS(png_ptr, info_ptr, &trans, &num_trans, NULL)) { + goto no_transparent_color_in_palette; + } - /* read image-data - * if the image is interlaced, read whole image at once. - * if delayed_loading is HPDF_TRUE, the data does not load this phase. - */ - if (delayed_loading) { - image->before_write_fn = PngBeforeWrite; - image->after_write_fn = PngAfterWrite; - } else { - if (png_get_interlace_type(png_ptr, info_ptr) != PNG_INTERLACE_NONE) - ret = ReadPngData_Interlaced(image, png_ptr, info_ptr); - else - ret = ReadPngData(image, png_ptr, info_ptr); + smask = HPDF_DictStream_New (image->mmgr, xref); + if (!smask) { + ret = HPDF_FAILD_TO_ALLOC_MEM; + goto Exit; + } - if (ret != HPDF_OK) - goto Exit; - } + smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT; + ret = HPDF_Dict_AddName (smask, "Type", "XObject"); + ret += HPDF_Dict_AddName (smask, "Subtype", "Image"); + ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width); + ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height); + ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray"); + ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth); - /* setting the info of the image. */ - if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)info_ptr->width) - != HPDF_OK) - goto Exit; + if (ret != HPDF_OK) { + HPDF_Dict_Free(smask); + ret = HPDF_INVALID_PNG_IMAGE; + goto Exit; + } - if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)info_ptr->height) - != HPDF_OK) - goto Exit; + smask_data = HPDF_GetMem(image->mmgr, width * height); + if (!smask_data) { + HPDF_Dict_Free(smask); + ret = HPDF_FAILD_TO_ALLOC_MEM; + goto Exit; + } - if (HPDF_Dict_AddNumber (image, "BitsPerComponent", - (HPDF_UINT)info_ptr->bit_depth) != HPDF_OK) - goto Exit; + if (ReadTransparentPaletteData(image, png_ptr, info_ptr, smask_data, trans, num_trans) != HPDF_OK) { + HPDF_FreeMem(image->mmgr, smask_data); + HPDF_Dict_Free(smask); + ret = HPDF_INVALID_PNG_IMAGE; + goto Exit; + } - /* clean up */ - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) { + HPDF_FreeMem(image->mmgr, smask_data); + HPDF_Dict_Free(smask); + ret = HPDF_FILE_IO_ERROR; + goto Exit; + } + HPDF_FreeMem(image->mmgr, smask_data); - return HPDF_OK; + + ret += CreatePallet(image, png_ptr, info_ptr); + ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width); + ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height); + ret += HPDF_Dict_AddNumber (image, "BitsPerComponent", (HPDF_UINT)bit_depth); + ret += HPDF_Dict_Add (image, "SMask", smask); + + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + return HPDF_OK; + } + +no_transparent_color_in_palette: + + /* read images with alpha channel right away + we have to do this because image transparent mask must be added to the Xref */ + if (xref && PNG_COLOR_MASK_ALPHA & color_type) { + HPDF_Dict smask; + png_bytep smask_data; + + smask = HPDF_DictStream_New (image->mmgr, xref); + if (!smask) { + ret = HPDF_FAILD_TO_ALLOC_MEM; + goto Exit; + } + + smask->header.obj_class |= HPDF_OSUBCLASS_XOBJECT; + ret = HPDF_Dict_AddName (smask, "Type", "XObject"); + ret += HPDF_Dict_AddName (smask, "Subtype", "Image"); + ret += HPDF_Dict_AddNumber (smask, "Width", (HPDF_UINT)width); + ret += HPDF_Dict_AddNumber (smask, "Height", (HPDF_UINT)height); + ret += HPDF_Dict_AddName (smask, "ColorSpace", "DeviceGray"); + ret += HPDF_Dict_AddNumber (smask, "BitsPerComponent", (HPDF_UINT)bit_depth); + + if (ret != HPDF_OK) { + HPDF_Dict_Free(smask); + ret = HPDF_INVALID_PNG_IMAGE; + goto Exit; + } + + smask_data = HPDF_GetMem(image->mmgr, width * height); + if (!smask_data) { + HPDF_Dict_Free(smask); + ret = HPDF_FAILD_TO_ALLOC_MEM; + goto Exit; + } + + if (ReadTransparentPngData(image, png_ptr, info_ptr, smask_data) != HPDF_OK) { + HPDF_FreeMem(image->mmgr, smask_data); + HPDF_Dict_Free(smask); + ret = HPDF_INVALID_PNG_IMAGE; + goto Exit; + } + + if (HPDF_Stream_Write(smask->stream, smask_data, width * height) != HPDF_OK) { + HPDF_FreeMem(image->mmgr, smask_data); + HPDF_Dict_Free(smask); + ret = HPDF_FILE_IO_ERROR; + goto Exit; + } + HPDF_FreeMem(image->mmgr, smask_data); + + if (color_type == PNG_COLOR_TYPE_GRAY_ALPHA) { + ret += HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray"); + } else { + ret += HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB"); + } + ret += HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width); + ret += HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height); + ret += HPDF_Dict_AddNumber (image, "BitsPerComponent", (HPDF_UINT)bit_depth); + ret += HPDF_Dict_Add (image, "SMask", smask); + + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + return HPDF_OK; + } + + /* if the image has color palette, copy the pallet of the image to + * create color map. + */ + if (color_type == PNG_COLOR_TYPE_PALETTE) + ret = CreatePallet(image, png_ptr, info_ptr); + else if (color_type == PNG_COLOR_TYPE_GRAY) + ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceGray"); + else + ret = HPDF_Dict_AddName (image, "ColorSpace", "DeviceRGB"); + + if (ret != HPDF_OK) + goto Exit; + + /* read image-data + * if the image is interlaced, read whole image at once. + * if delayed_loading is HPDF_TRUE, the data does not load this phase. + */ + if (delayed_loading) { + image->before_write_fn = PngBeforeWrite; + image->after_write_fn = PngAfterWrite; + } else { + if (png_get_interlace_type(png_ptr, info_ptr) != PNG_INTERLACE_NONE) + ret = ReadPngData_Interlaced(image, png_ptr, info_ptr); + else + ret = ReadPngData(image, png_ptr, info_ptr); + + if (ret != HPDF_OK) + goto Exit; + } + + /* setting the info of the image. */ + if (HPDF_Dict_AddNumber (image, "Width", (HPDF_UINT)width) + != HPDF_OK) + goto Exit; + + if (HPDF_Dict_AddNumber (image, "Height", (HPDF_UINT)height) + != HPDF_OK) + goto Exit; + + if (HPDF_Dict_AddNumber (image, "BitsPerComponent", + (HPDF_UINT)bit_depth) != HPDF_OK) + goto Exit; + + /* clean up */ + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + + return HPDF_OK; Exit: - png_destroy_read_struct(&png_ptr, &info_ptr, NULL); + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); - return image->error->error_no; + if (ret != HPDF_OK) { + return ret; + } + return image->error->error_no; } @@ -386,7 +671,7 @@ PngBeforeWrite (HPDF_Dict obj) if (!s) return HPDF_SetError (obj->error, HPDF_MISSING_FILE_NAME_ENTRY, 0); - png_data = HPDF_FileReader_New (obj->mmgr, s->value); + png_data = HPDF_FileReader_New (obj->mmgr, (const char *)(s->value)); if (!HPDF_Stream_Validate (png_data)) return obj->error->error_no; @@ -398,7 +683,7 @@ PngBeforeWrite (HPDF_Dict obj) return HPDF_SetError (obj->error, HPDF_INVALID_PNG_IMAGE, 0); } - if ((ret = LoadPngData (obj, png_data, HPDF_FALSE)) != HPDF_OK) { + if ((ret = LoadPngData (obj, NULL, png_data, HPDF_FALSE)) != HPDF_OK) { HPDF_Stream_Free(png_data); return ret; } @@ -420,5 +705,5 @@ PngAfterWrite (HPDF_Dict obj) } -#endif /* HPDF_NOPNGLIB */ +#endif /* LIBHPDF_HAVE_NOPNGLIB */ diff --git a/PDF/src/hpdf_info.c b/PDF/src/hpdf_info.c index 5fac8a012..5fb601add 100644 --- a/PDF/src/hpdf_info.c +++ b/PDF/src/hpdf_info.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_info.c + * << Haru Free PDF Library >> -- hpdf_info.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -16,7 +19,7 @@ #include "hpdf_utils.h" #include "hpdf_info.h" -static const char *HPDF_INFO_ATTR_NAMES[] = { +static const char * const HPDF_INFO_ATTR_NAMES[] = { "CreationDate", "ModDate", "Author", @@ -25,6 +28,8 @@ static const char *HPDF_INFO_ATTR_NAMES[] = { "Title", "Subject", "Keywords", + "Trapped", + "GTS_PDFXVersion", NULL }; @@ -57,6 +62,9 @@ HPDF_Info_SetInfoAttr (HPDF_Dict info, if (type <= HPDF_INFO_MOD_DATE) return HPDF_SetError (info->error, HPDF_INVALID_PARAMETER, 0); + if (type == HPDF_INFO_TRAPPED) + return HPDF_Dict_AddName(info, name, value); + return HPDF_Dict_Add (info, name, HPDF_String_New (info->mmgr, value, encoder)); } @@ -79,7 +87,7 @@ HPDF_Info_GetInfoAttr (HPDF_Dict info, if (!s) return NULL; else - return s->value; + return (const char *)(s->value); } @@ -141,7 +149,7 @@ HPDF_Info_SetInfoDateAttr (HPDF_Dict info, return HPDF_SetError (info->error, HPDF_INVALID_DATE_TIME, 0); } - ptmp = HPDF_MemCpy (tmp, "D:", 2); + ptmp = (char *)HPDF_MemCpy ((HPDF_BYTE *)tmp, (HPDF_BYTE *)"D:", 2); ptmp = HPDF_IToA2 (ptmp, value.year, 5); ptmp = HPDF_IToA2 (ptmp, value.month, 3); ptmp = HPDF_IToA2 (ptmp, value.day, 3); diff --git a/PDF/src/hpdf_list.c b/PDF/src/hpdf_list.c index 1f26303d7..b90bf1bbe 100644 --- a/PDF/src/hpdf_list.c +++ b/PDF/src/hpdf_list.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_list.c + * << Haru Free PDF Library >> -- hpdf_list.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -272,7 +275,7 @@ HPDF_List_Clear (HPDF_List list) * */ -HPDF_STATUS +static HPDF_STATUS Resize (HPDF_List list, HPDF_UINT count) { diff --git a/PDF/src/hpdf_mmgr.c b/PDF/src/hpdf_mmgr.c index 90f4a9549..3069a0552 100644 --- a/PDF/src/hpdf_mmgr.c +++ b/PDF/src/hpdf_mmgr.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_mmgr.c + * << Haru Free PDF Library >> -- hpdf_mmgr.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -104,11 +107,15 @@ HPDF_MMgr_New (HPDF_Error error, } #ifdef HPDF_MEM_DEBUG - mmgr->alloc_cnt += 1; + if (mmgr) { + mmgr->alloc_cnt += 1; + } #endif } - mmgr->buf_size = buf_size; + if (mmgr) { + mmgr->buf_size = buf_size; + } } else HPDF_SetError(error, HPDF_FAILD_TO_ALLOC_MEM, HPDF_NOERROR); diff --git a/PDF/src/hpdf_name.c b/PDF/src/hpdf_name.c index 0c9074895..9c27fb0d6 100644 --- a/PDF/src/hpdf_name.c +++ b/PDF/src/hpdf_name.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_name.c + * << Haru Free PDF Library >> -- hpdf_name.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_namedict.c b/PDF/src/hpdf_namedict.c new file mode 100644 index 000000000..e259a3a42 --- /dev/null +++ b/PDF/src/hpdf_namedict.c @@ -0,0 +1,237 @@ +/* + * << Haru Free PDF Library >> -- hpdf_namedict.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ + +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf_consts.h" +#include "hpdf_namedict.h" + +#ifndef HPDF_UNUSED +#define HPDF_UNUSED(a) ((void)(a)) +#endif + +static const char * const HPDF_NAMEDICT_KEYS[] = { + "EmbeddedFiles" + }; + +HPDF_NameDict +HPDF_NameDict_New (HPDF_MMgr mmgr, + HPDF_Xref xref) +{ + HPDF_NameDict ndict; + + HPDF_PTRACE((" HPDF_NameDict_New\n")); + + ndict = HPDF_Dict_New (mmgr); + if (!ndict) + return NULL; + + if (HPDF_Xref_Add (xref, ndict) != HPDF_OK) + return NULL; + + ndict->header.obj_class |= HPDF_OSUBCLASS_NAMEDICT; + + return ndict; +} + +HPDF_NameTree +HPDF_NameDict_GetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key) +{ + if (!namedict) + return NULL; + return HPDF_Dict_GetItem (namedict, HPDF_NAMEDICT_KEYS[key], HPDF_OCLASS_DICT); +} + +HPDF_STATUS +HPDF_NameDict_SetNameTree (HPDF_NameDict namedict, + HPDF_NameDictKey key, + HPDF_NameTree ntree) +{ + return HPDF_Dict_Add (namedict, HPDF_NAMEDICT_KEYS[key], ntree); +} + +HPDF_BOOL +HPDF_NameDict_Validate (HPDF_NameDict namedict) +{ + if (!namedict) + return HPDF_FALSE; + + if (namedict->header.obj_class != (HPDF_OSUBCLASS_NAMEDICT | + HPDF_OCLASS_DICT)) { + HPDF_SetError (namedict->error, HPDF_INVALID_OBJECT, 0); + return HPDF_FALSE; + } + + return HPDF_TRUE; +} + + +/*------- NameTree -------*/ + +HPDF_NameTree +HPDF_NameTree_New (HPDF_MMgr mmgr, + HPDF_Xref xref) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_NameTree ntree; + HPDF_Array items; + + HPDF_PTRACE((" HPDF_NameTree_New\n")); + + ntree = HPDF_Dict_New (mmgr); + if (!ntree) + return NULL; + + if (HPDF_Xref_Add (xref, ntree) != HPDF_OK) + return NULL; + + ntree->header.obj_class |= HPDF_OSUBCLASS_NAMETREE; + + items = HPDF_Array_New (mmgr); + if (!ntree) + return NULL; + + ret += HPDF_Dict_Add (ntree, "Names", items); + if (ret != HPDF_OK) + return NULL; + + return ntree; +} + +HPDF_STATUS +HPDF_NameTree_Add (HPDF_NameTree tree, + HPDF_String name, + void *obj) +{ + HPDF_Array items; + HPDF_INT32 i, icount; + + if (!tree || !name) + return HPDF_INVALID_PARAMETER; + + items = HPDF_Dict_GetItem (tree, "Names", HPDF_OCLASS_ARRAY); + if (!items) + return HPDF_INVALID_OBJECT; + + /* "The keys shall be sorted in lexical order" -- 7.9.6, Name Trees. + * Since we store keys sorted, it's best to do a linear insertion sort + * Find the first element larger than 'key', and insert 'key' and then + * 'obj' into the items. */ + + icount = HPDF_Array_Items(items); + + /* If we're larger than the last element, append */ + if (icount) { + HPDF_String last = HPDF_Array_GetItem(items, icount - 2, HPDF_OCLASS_STRING); + + if (HPDF_String_Cmp(name, last) > 0) { + HPDF_Array_Add(items, name); + HPDF_Array_Add(items, obj); + return HPDF_OK; + } + } + + /* Walk backwards through the list until we're smaller than an element= + * That's the element to insert in front of. */ + for (i = icount - 4; i >= 0; i -= 2) { + HPDF_String elem = HPDF_Array_GetItem(items, i, HPDF_OCLASS_STRING); + + if (i == 0 || HPDF_String_Cmp(name, elem) < 0) { + HPDF_Array_Insert(items, elem, name); + HPDF_Array_Insert(items, elem, obj); + return HPDF_OK; + } + } + + /* Items list is empty */ + HPDF_Array_Add(items, name); + HPDF_Array_Add(items, obj); + return HPDF_OK; +} + +HPDF_BOOL +HPDF_NameTree_Validate (HPDF_NameTree nametree) +{ + if (!nametree) + return HPDF_FALSE; + + if (nametree->header.obj_class != (HPDF_OSUBCLASS_NAMETREE | + HPDF_OCLASS_DICT)) { + HPDF_SetError (nametree->error, HPDF_INVALID_OBJECT, 0); + return HPDF_FALSE; + } + + return HPDF_TRUE; +} + + +/*------- EmbeddedFile -------*/ + +HPDF_EmbeddedFile +HPDF_EmbeddedFile_New (HPDF_MMgr mmgr, + HPDF_Xref xref, + const char *file) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict ef; /* the dictionary for the embedded file: /Type /EF */ + HPDF_String name; /* the name of the file: /F (name) */ + HPDF_Dict eff; /* ef has an /EF <> key - this is it */ + HPDF_Dict filestream; /* the stream that /EF <> refers to */ + HPDF_Stream stream; + + ef = HPDF_Dict_New (mmgr); + if (!ef) + return NULL; + if (HPDF_Xref_Add (xref, ef) != HPDF_OK) + return NULL; + + filestream = HPDF_DictStream_New (mmgr, xref); + if (!filestream) + return NULL; + stream = HPDF_FileReader_New (mmgr, file); + if (!stream) + return NULL; + HPDF_Stream_Free(filestream->stream); + filestream->stream = stream; + filestream->filter = HPDF_STREAM_FILTER_FLATE_DECODE; + + eff = HPDF_Dict_New (mmgr); + if (!eff) + return NULL; + + name = HPDF_String_New (mmgr, file, NULL); + if (!name) + return NULL; + + ret += HPDF_Dict_AddName (ef, "Type", "F"); + ret += HPDF_Dict_Add (ef, "F", name); + ret += HPDF_Dict_Add (ef, "EF", eff); + ret += HPDF_Dict_Add (eff, "F", filestream); + + if (ret != HPDF_OK) + return NULL; + + return ef; +} + +HPDF_BOOL +HPDF_EmbeddedFile_Validate (HPDF_EmbeddedFile emfile) +{ + HPDF_UNUSED (emfile); + return HPDF_TRUE; +} diff --git a/PDF/src/hpdf_null.c b/PDF/src/hpdf_null.c index e088f4fd7..d9f5d29d4 100644 --- a/PDF/src/hpdf_null.c +++ b/PDF/src/hpdf_null.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_null.c + * << Haru Free PDF Library >> -- hpdf_null.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_number.c b/PDF/src/hpdf_number.c index 6f24aa320..ce8b3e17c 100644 --- a/PDF/src/hpdf_number.c +++ b/PDF/src/hpdf_number.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_number.c + * << Haru Free PDF Library >> -- hpdf_number.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_objects.c b/PDF/src/hpdf_objects.c index 094a24fe6..59b19588b 100644 --- a/PDF/src/hpdf_objects.c +++ b/PDF/src/hpdf_objects.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- HPDF_objects.c + * << Haru Free PDF Library >> -- hpdf_objects.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_outline.c b/PDF/src/hpdf_outline.c index 71857ef86..56ce5e38b 100644 --- a/PDF/src/hpdf_outline.c +++ b/PDF/src/hpdf_outline.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_outline.c + * << Haru Free PDF Library >> -- hpdf_outline.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -64,7 +67,7 @@ HPDF_OutlineRoot_New (HPDF_MMgr mmgr, open_flg->header.obj_id |= HPDF_OTYPE_HIDDEN; ret += HPDF_Dict_Add (outline, "_OPENED", open_flg); - ret += HPDF_Dict_AddName (outline, "Type", "Outline"); + ret += HPDF_Dict_AddName (outline, "Type", "Outlines"); if (ret != HPDF_OK) return NULL; @@ -114,7 +117,7 @@ HPDF_Outline_New (HPDF_MMgr mmgr, open_flg->header.obj_id |= HPDF_OTYPE_HIDDEN; ret += HPDF_Dict_Add (outline, "_OPENED", open_flg); - ret += HPDF_Dict_AddName (outline, "Type", "Outline"); + ret += HPDF_Dict_AddName (outline, "Type", "Outlines"); ret += AddChild (parent, outline); if (ret != HPDF_OK) @@ -232,7 +235,7 @@ BeforeWrite (HPDF_Dict obj) return HPDF_Dict_RemoveElement (obj, "Count"); if (!HPDF_Outline_GetOpened ((HPDF_Outline)obj)) - count *= -1; + count = count * -1; if (n) n->value = count; @@ -325,5 +328,3 @@ HPDF_Outline_SetOpened (HPDF_Outline outline, return HPDF_OK; } - - diff --git a/PDF/src/hpdf_page_label.c b/PDF/src/hpdf_page_label.c index 7df16a17e..125a4d8e9 100644 --- a/PDF/src/hpdf_page_label.c +++ b/PDF/src/hpdf_page_label.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_page_label.c + * << Haru Free PDF Library >> -- hpdf_page_label.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_page_operator.c b/PDF/src/hpdf_page_operator.c index cafe51c24..23f592077 100644 --- a/PDF/src/hpdf_page_operator.c +++ b/PDF/src/hpdf_page_operator.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_page_operator.c + * << Haru Free PDF Library >> -- hpdf_page_operator.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,7 +13,6 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2006.07.29 modified */ #include "hpdf_conf.h" @@ -65,12 +67,10 @@ HPDF_Page_SetLineWidth (HPDF_Page page, if (line_width < 0) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, - line_width)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, line_width) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, - " w\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " w\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->line_width = line_width; @@ -92,7 +92,7 @@ HPDF_Page_SetLineCap (HPDF_Page page, if (ret != HPDF_OK) return ret; - if (line_cap < 0 || line_cap >= HPDF_LINECAP_EOF) + if (line_cap >= HPDF_LINECAP_EOF) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, (HPDF_STATUS)line_cap); @@ -125,18 +125,16 @@ HPDF_Page_SetLineJoin (HPDF_Page page, if (ret != HPDF_OK) return ret; - if (line_join < 0 || line_join >= HPDF_LINEJOIN_EOF) + if (line_join >= HPDF_LINEJOIN_EOF) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, (HPDF_STATUS)line_join); attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteInt (attr->stream, - (HPDF_UINT)line_join)) != HPDF_OK) + if (HPDF_Stream_WriteInt (attr->stream, (HPDF_UINT)line_join) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, - " j\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " j\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->line_join = line_join; @@ -163,10 +161,10 @@ HPDF_Page_SetMiterLimit (HPDF_Page page, if (miter_limit < 1) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, miter_limit)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, miter_limit) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " M\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " M\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->miter_limit = miter_limit; @@ -265,12 +263,10 @@ HPDF_Page_SetFlat (HPDF_Page page, if (flatness > 100 || flatness < 0) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, - flatness)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, flatness) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, - " i\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " i\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->flatness = flatness; @@ -304,11 +300,10 @@ HPDF_Page_SetExtGState (HPDF_Page page, if (!local_name) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) != - HPDF_OK) + if (HPDF_Stream_WriteEscapeName (attr->stream, local_name) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " gs\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " gs\012") != HPDF_OK) return HPDF_CheckError (page->error); /* change objct class to read only. */ @@ -339,7 +334,7 @@ HPDF_Page_GSave (HPDF_Page page) if (!new_gstate) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, "q\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "q\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate = new_gstate; @@ -370,7 +365,7 @@ HPDF_Page_GRestore (HPDF_Page page) attr->gstate = new_gstate; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "Q\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "Q\012") != HPDF_OK) return HPDF_CheckError (page->error); return ret; @@ -415,7 +410,7 @@ HPDF_Page_Concat (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " cm\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); tm = attr->gstate->trans_matrix; @@ -459,7 +454,7 @@ HPDF_Page_MoveTo (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " m\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x; @@ -496,7 +491,7 @@ HPDF_Page_LineTo (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " l\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x; @@ -543,7 +538,7 @@ HPDF_Page_CurveTo (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y3, eptr); HPDF_StrCpy (pbuf, " c\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x3; @@ -584,7 +579,7 @@ HPDF_Page_CurveTo2 (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y3, eptr); HPDF_StrCpy (pbuf, " v\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x3; @@ -625,7 +620,7 @@ HPDF_Page_CurveTo3 (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y3, eptr); HPDF_StrCpy (pbuf, " y\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x3; @@ -648,7 +643,7 @@ HPDF_Page_ClosePath (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "h\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "h\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos = attr->str_pos; @@ -689,7 +684,7 @@ HPDF_Page_Rectangle (HPDF_Page page, pbuf = HPDF_FToA (pbuf, height, eptr); HPDF_StrCpy (pbuf, " re\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x; @@ -718,7 +713,7 @@ HPDF_Page_Stroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "S\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "S\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -742,7 +737,7 @@ HPDF_Page_ClosePathStroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "s\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "s\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -766,7 +761,7 @@ HPDF_Page_Fill (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "f\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "f\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -790,7 +785,7 @@ HPDF_Page_Eofill (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "f*\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "f*\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -814,7 +809,7 @@ HPDF_Page_FillStroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "B\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "B\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -838,7 +833,7 @@ HPDF_Page_EofillStroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "B*\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "B*\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -861,7 +856,7 @@ HPDF_Page_ClosePathFillStroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "b\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "b\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -885,7 +880,7 @@ HPDF_Page_ClosePathEofillStroke (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "b*\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "b*\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -909,7 +904,7 @@ HPDF_Page_EndPath (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "n\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "n\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_PAGE_DESCRIPTION; @@ -935,7 +930,7 @@ HPDF_Page_Clip (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "W\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "W\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_CLIPPING_PATH; @@ -957,7 +952,7 @@ HPDF_Page_Eoclip (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "W*\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "W*\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_CLIPPING_PATH; @@ -983,7 +978,7 @@ HPDF_Page_BeginText (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "BT\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "BT\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gmode = HPDF_GMODE_TEXT_OBJECT; @@ -1007,7 +1002,7 @@ HPDF_Page_EndText (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "ET\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "ET\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->text_pos = INIT_POS; @@ -1037,10 +1032,10 @@ HPDF_Page_SetCharSpace (HPDF_Page page, if (value < HPDF_MIN_CHARSPACE || value > HPDF_MAX_CHARSPACE) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, value) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tc\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Tc\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->char_space = value; @@ -1067,10 +1062,10 @@ HPDF_Page_SetWordSpace (HPDF_Page page, if (value < HPDF_MIN_WORDSPACE || value > HPDF_MAX_WORDSPACE) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, value) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tw\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Tw\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->word_space = value; @@ -1098,10 +1093,10 @@ HPDF_Page_SetHorizontalScalling (HPDF_Page page, value > HPDF_MAX_HORIZONTALSCALING) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, value) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tz\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Tz\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->h_scalling = value; @@ -1125,10 +1120,10 @@ HPDF_Page_SetTextLeading (HPDF_Page page, attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, value) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " TL\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " TL\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->text_leading = value; @@ -1160,7 +1155,7 @@ HPDF_Page_SetFontAndSize (HPDF_Page page, return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0); if (size <= 0 || size > HPDF_MAX_FONTSIZE) - return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT_SIZE, 0); + return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT_SIZE, size); if (page->mmgr != font->mmgr) return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0); @@ -1171,8 +1166,7 @@ HPDF_Page_SetFontAndSize (HPDF_Page page, if (!local_name) return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_FONT, 0); - if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) != - HPDF_OK) + if (HPDF_Stream_WriteEscapeName (attr->stream, local_name) != HPDF_OK) return HPDF_CheckError (page->error); HPDF_MemSet (buf, 0, HPDF_TMP_BUF_SIZ); @@ -1180,7 +1174,7 @@ HPDF_Page_SetFontAndSize (HPDF_Page page, pbuf = HPDF_FToA (pbuf, size, eptr); HPDF_StrCpy (pbuf, " Tf\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->font = font; @@ -1204,16 +1198,16 @@ HPDF_Page_SetTextRenderingMode (HPDF_Page page, if (ret != HPDF_OK) return ret; - if (mode < 0 || mode >= HPDF_RENDERING_MODE_EOF) + if (mode >= HPDF_RENDERING_MODE_EOF) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, (HPDF_STATUS)mode); attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteInt (attr->stream, (HPDF_INT)mode)) != HPDF_OK) + if (HPDF_Stream_WriteInt (attr->stream, (HPDF_INT)mode) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tr\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Tr\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->rendering_mode = mode; @@ -1245,10 +1239,10 @@ HPDF_Page_SetTextRise (HPDF_Page page, attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteReal (attr->stream, value)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, value) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Ts\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Ts\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->text_rise = value; @@ -1285,7 +1279,7 @@ HPDF_Page_MoveTextPos (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " Td\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->text_matrix.x += x * attr->text_matrix.a + y * attr->text_matrix.c; @@ -1322,7 +1316,7 @@ HPDF_Page_MoveTextPos2 (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " TD\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->text_matrix.x += x * attr->text_matrix.a + y * attr->text_matrix.c; @@ -1375,7 +1369,7 @@ HPDF_Page_SetTextMatrix (HPDF_Page page, pbuf = HPDF_FToA (pbuf, y, eptr); HPDF_StrCpy (pbuf, " Tm\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->text_matrix.a = a; @@ -1405,7 +1399,7 @@ HPDF_Page_MoveToNextLine (HPDF_Page page) attr = (HPDF_PageAttr)page->attr; - if ((ret = HPDF_Stream_WriteStr (attr->stream, "T*\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, "T*\012") != HPDF_OK) return HPDF_CheckError (page->error); /* calculate the reference point of text */ @@ -1444,10 +1438,10 @@ HPDF_Page_ShowText (HPDF_Page page, if (!tw) return ret; - if ((ret = InternalWriteText (attr, text)) != HPDF_OK) + if (InternalWriteText (attr, text) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Tj\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Tj\012") != HPDF_OK) return HPDF_CheckError (page->error); /* calculate the reference point of text */ @@ -1486,10 +1480,10 @@ HPDF_Page_ShowTextNextLine (HPDF_Page page, if (text == NULL || text[0] == 0) return HPDF_Page_MoveToNextLine(page); - if ((ret = InternalWriteText (attr, text)) != HPDF_OK) + if (InternalWriteText (attr, text) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " \'\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " \'\012") != HPDF_OK) return HPDF_CheckError (page->error); tw = HPDF_Page_TextWidth (page, text); @@ -1552,13 +1546,13 @@ HPDF_Page_ShowTextNextLineEx (HPDF_Page page, pbuf = HPDF_FToA (pbuf, char_space, eptr); *pbuf = ' '; - if ((ret = InternalWriteText (attr, buf)) != HPDF_OK) + if (InternalWriteText (attr, buf) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = InternalWriteText (attr, text)) != HPDF_OK) + if (InternalWriteText (attr, text) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " \"\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " \"\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->word_space = word_space; @@ -1614,10 +1608,10 @@ HPDF_Page_SetGrayFill (HPDF_Page page, if (gray < 0 || gray > 1) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, gray)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, gray) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " g\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " g\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->gray_fill = gray; @@ -1645,10 +1639,10 @@ HPDF_Page_SetGrayStroke (HPDF_Page page, if (gray < 0 || gray > 1) return HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); - if ((ret = HPDF_Stream_WriteReal (attr->stream, gray)) != HPDF_OK) + if (HPDF_Stream_WriteReal (attr->stream, gray) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " G\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " G\012") != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->gray_stroke = gray; @@ -1690,7 +1684,7 @@ HPDF_Page_SetRGBFill (HPDF_Page page, pbuf = HPDF_FToA (pbuf, b, eptr); HPDF_StrCpy (pbuf, " rg\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->rgb_fill.r = r; @@ -1734,7 +1728,7 @@ HPDF_Page_SetRGBStroke (HPDF_Page page, pbuf = HPDF_FToA (pbuf, b, eptr); HPDF_StrCpy (pbuf, " RG\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->rgb_stroke.r = r; @@ -1781,7 +1775,7 @@ HPDF_Page_SetCMYKFill (HPDF_Page page, pbuf = HPDF_FToA (pbuf, k, eptr); HPDF_StrCpy (pbuf, " k\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->cmyk_fill.c = c; @@ -1829,7 +1823,7 @@ HPDF_Page_SetCMYKStroke (HPDF_Page page, pbuf = HPDF_FToA (pbuf, k, eptr); HPDF_StrCpy (pbuf, " K\012", eptr); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->gstate->cmyk_stroke.c = c; @@ -1880,11 +1874,10 @@ HPDF_Page_ExecuteXObject (HPDF_Page page, if (!local_name) return HPDF_RaiseError (page->error, HPDF_PAGE_INVALID_XOBJECT, 0); - if ((ret = HPDF_Stream_WriteEscapeName (attr->stream, local_name)) != - HPDF_OK) + if (HPDF_Stream_WriteEscapeName (attr->stream, local_name) != HPDF_OK) return HPDF_CheckError (page->error); - if ((ret = HPDF_Stream_WriteStr (attr->stream, " Do\012")) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, " Do\012") != HPDF_OK) return HPDF_CheckError (page->error); return ret; @@ -1926,7 +1919,7 @@ QuarterCircleA (char *pbuf, pbuf = HPDF_FToA (pbuf, x, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y + ray, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -1947,7 +1940,7 @@ QuarterCircleB (char *pbuf, pbuf = HPDF_FToA (pbuf, x + ray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -1968,7 +1961,7 @@ QuarterCircleC (char *pbuf, pbuf = HPDF_FToA (pbuf, x, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y - ray, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -1989,7 +1982,7 @@ QuarterCircleD (char *pbuf, pbuf = HPDF_FToA (pbuf, x - ray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } HPDF_EXPORT(HPDF_STATUS) @@ -2017,14 +2010,14 @@ HPDF_Page_Circle (HPDF_Page page, pbuf = HPDF_FToA (pbuf, x - ray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - pbuf = HPDF_StrCpy (pbuf, " m\012", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, " m\012", eptr); pbuf = QuarterCircleA (pbuf, eptr, x, y, ray); pbuf = QuarterCircleB (pbuf, eptr, x, y, ray); pbuf = QuarterCircleC (pbuf, eptr, x, y, ray); QuarterCircleD (pbuf, eptr, x, y, ray); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x - ray; @@ -2055,7 +2048,7 @@ QuarterEllipseA (char *pbuf, pbuf = HPDF_FToA (pbuf, x, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y + yray, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -2077,7 +2070,7 @@ QuarterEllipseB (char *pbuf, pbuf = HPDF_FToA (pbuf, x + xray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -2099,7 +2092,7 @@ QuarterEllipseC (char *pbuf, pbuf = HPDF_FToA (pbuf, x, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y - yray, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } static char* @@ -2121,7 +2114,7 @@ QuarterEllipseD (char *pbuf, pbuf = HPDF_FToA (pbuf, x - xray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - return HPDF_StrCpy (pbuf, " c\012", eptr); + return (char *)HPDF_StrCpy (pbuf, " c\012", eptr); } HPDF_EXPORT(HPDF_STATUS) @@ -2150,14 +2143,14 @@ HPDF_Page_Ellipse (HPDF_Page page, pbuf = HPDF_FToA (pbuf, x - xray, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, y, eptr); - pbuf = HPDF_StrCpy (pbuf, " m\012", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, " m\012", eptr); pbuf = QuarterEllipseA (pbuf, eptr, x, y, xray, yray); pbuf = QuarterEllipseB (pbuf, eptr, x, y, xray, yray); pbuf = QuarterEllipseC (pbuf, eptr, x, y, xray, yray); QuarterEllipseD (pbuf, eptr, x, y, xray, yray); - if ((ret = HPDF_Stream_WriteStr (attr->stream, buf)) != HPDF_OK) + if (HPDF_Stream_WriteStr (attr->stream, buf) != HPDF_OK) return HPDF_CheckError (page->error); attr->cur_pos.x = x - xray; @@ -2190,7 +2183,7 @@ HPDF_Page_Arc (HPDF_Page page, HPDF_PTRACE ((" HPDF_Page_Arc\n")); - if (ang1 >= ang2 || (ang2 - ang1) >= 360) + if (fabs(ang2 - ang1) >= 360) HPDF_RaiseError (page->error, HPDF_PAGE_OUT_OF_RANGE, 0); if (ret != HPDF_OK) @@ -2203,10 +2196,10 @@ HPDF_Page_Arc (HPDF_Page page, for (;;) { - if (ang2 - ang1 <= 90) + if (fabs(ang2 - ang1) <= 90) return InternalArc (page, x, y, ray, ang1, ang2, cont_flg); else { - HPDF_REAL tmp_ang = ang1 + 90; + HPDF_REAL tmp_ang = (ang2 > ang1 ? ang1 + 90 : ang1 - 90); if ((ret = InternalArc (page, x, y, ray, ang1, tmp_ang, cont_flg)) != HPDF_OK) @@ -2215,7 +2208,7 @@ HPDF_Page_Arc (HPDF_Page page, ang1 = tmp_ang; } - if (ang1 >= ang2) + if (fabs(ang1 - ang2) < 0.1) break; cont_flg = HPDF_TRUE; @@ -2278,7 +2271,11 @@ InternalArc (HPDF_Page page, pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x0, eptr); *pbuf++ = ' '; pbuf = HPDF_FToA (pbuf, (HPDF_REAL)y0, eptr); - pbuf = HPDF_StrCpy (pbuf, " m\012", eptr); + + if (attr->gmode == HPDF_GMODE_PATH_OBJECT) + pbuf = (char *)HPDF_StrCpy (pbuf, " l\012", eptr); + else + pbuf = (char *)HPDF_StrCpy (pbuf, " m\012", eptr); } pbuf = HPDF_FToA (pbuf, (HPDF_REAL)x1, eptr); @@ -2340,13 +2337,34 @@ InternalWriteText (HPDF_PageAttr attr, if (font_attr->type == HPDF_FONT_TYPE0_TT || font_attr->type == HPDF_FONT_TYPE0_CID) { + HPDF_Encoder encoder; + HPDF_UINT len; + if ((ret = HPDF_Stream_WriteStr (attr->stream, "<")) != HPDF_OK) return ret; - if ((ret = HPDF_Stream_WriteBinary (attr->stream, text, - HPDF_StrLen (text, HPDF_LIMIT_MAX_STRING_LEN), NULL)) - != HPDF_OK) - return ret; + encoder = font_attr->encoder; + len = HPDF_StrLen (text, HPDF_LIMIT_MAX_STRING_LEN); + + if (encoder->encode_text_fn == NULL) { + if ((ret = HPDF_Stream_WriteBinary (attr->stream, (HPDF_BYTE *)text, + len, NULL)) + != HPDF_OK) + return ret; + } else { + char *encoded; + HPDF_UINT length; + + encoded = (encoder->encode_text_fn)(encoder, text, len, &length); + + ret = HPDF_Stream_WriteBinary (attr->stream, (HPDF_BYTE *)encoded, + length, NULL); + + free(encoded); + + if (ret != HPDF_OK) + return ret; + } return HPDF_Stream_WriteStr (attr->stream, ">"); } @@ -2355,6 +2373,33 @@ InternalWriteText (HPDF_PageAttr attr, } +/* + * Convert a user space text position from absolute to relative coordinates. + * Absolute values are passed in xAbs and yAbs, relative values are returned + * to xRel and yRel. The latter two must not be NULL. + */ +static void +TextPos_AbsToRel (HPDF_TransMatrix text_matrix, + HPDF_REAL xAbs, + HPDF_REAL yAbs, + HPDF_REAL *xRel, + HPDF_REAL *yRel) +{ + if (text_matrix.a == 0) { + *xRel = (yAbs - text_matrix.y - (xAbs - text_matrix.x) * + text_matrix.d / text_matrix.c) / text_matrix.b; + *yRel = (xAbs - text_matrix.x) / text_matrix.c; + } else { + HPDF_REAL y = (yAbs - text_matrix.y - (xAbs - text_matrix.x) * + text_matrix.b / text_matrix.a) / (text_matrix.d - + text_matrix.c * text_matrix.b / text_matrix.a); + *xRel = (xAbs - text_matrix.x - y * text_matrix.c) / + text_matrix.a; + *yRel = y; + } +} + + HPDF_EXPORT(HPDF_STATUS) HPDF_Page_TextOut (HPDF_Page page, HPDF_REAL xpos, @@ -2372,18 +2417,7 @@ HPDF_Page_TextOut (HPDF_Page page, return ret; attr = (HPDF_PageAttr)page->attr; - - if (attr->text_matrix.a == 0) { - y = (xpos - attr->text_matrix.x) / attr->text_matrix.c; - x = (ypos - attr->text_matrix.y - (xpos - attr->text_matrix.x) * attr->text_matrix.d / attr->text_matrix.c) / attr->text_matrix.b; - } else { - y = (ypos - attr->text_matrix.y - (xpos - attr->text_matrix.x) * - attr->text_matrix.b / attr->text_matrix.a) / (attr->text_matrix.d - - attr->text_matrix.c * attr->text_matrix.b / attr->text_matrix.a); - x = (xpos - attr->text_matrix.x - y * attr->text_matrix.c) / - attr->text_matrix.a; - } - + TextPos_AbsToRel (attr->text_matrix, xpos, ypos, &x, &y); if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) return ret; @@ -2403,17 +2437,16 @@ HPDF_Page_TextRect (HPDF_Page page, ) { HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_TEXT_OBJECT); - HPDF_REAL x; - HPDF_REAL y; HPDF_PageAttr attr; const char *ptr = text; + HPDF_BOOL pos_initialized = HPDF_FALSE; HPDF_REAL save_char_space = 0; HPDF_BOOL is_insufficient_space = HPDF_FALSE; HPDF_UINT num_rest; HPDF_Box bbox; HPDF_BOOL char_space_changed = HPDF_FALSE; - HPDF_PTRACE ((" HPDF_Page_TextOutEx\n")); + HPDF_PTRACE ((" HPDF_Page_TextRect\n")); if (ret != HPDF_OK) return ret; @@ -2444,120 +2477,112 @@ HPDF_Page_TextRect (HPDF_Page page, attr->gstate->text_leading; bottom = bottom - bbox.bottom / 1000 * attr->gstate->font_size; - if (attr->text_matrix.a == 0) { - y = (left - attr->text_matrix.x) / attr->text_matrix.c; - x = (top - attr->text_matrix.y - (left - attr->text_matrix.x) * attr->text_matrix.d / attr->text_matrix.c) / attr->text_matrix.b; - } else { - y = (top - attr->text_matrix.y - (left - attr->text_matrix.x) * - attr->text_matrix.b / attr->text_matrix.a) / (attr->text_matrix.d - - attr->text_matrix.c * attr->text_matrix.b / attr->text_matrix.a); - x = (left - attr->text_matrix.x - y * attr->text_matrix.c) / - attr->text_matrix.a; - } - - if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) - return ret; - if (align == HPDF_TALIGN_JUSTIFY) { save_char_space = attr->gstate->char_space; attr->gstate->char_space = 0; } for (;;) { - HPDF_UINT tmp_len; + HPDF_REAL x, y; + HPDF_UINT line_len, tmp_len; HPDF_REAL rw; - HPDF_REAL x_adjust; - const char *tmp_ptr; - HPDF_UINT num_char; - HPDF_ParseText_Rec state; - HPDF_Encoder encoder; - HPDF_UINT i; + HPDF_BOOL LineBreak; - tmp_len = HPDF_Page_MeasureText (page, ptr, right - left, HPDF_TRUE, &rw); - if (tmp_len == 0) { + attr->gstate->char_space = 0; + line_len = tmp_len = HPDF_Page_MeasureText (page, ptr, right - left, HPDF_TRUE, &rw); + if (line_len == 0) { is_insufficient_space = HPDF_TRUE; break; } if (len) - *len += tmp_len; + *len += line_len; + num_rest -= line_len; + + /* Shorten tmp_len by trailing whitespace and control characters. */ + LineBreak = HPDF_FALSE; + while (tmp_len > 0 && HPDF_IS_WHITE_SPACE(ptr[tmp_len - 1])) { + tmp_len--; + if (ptr[tmp_len] == 0x0A || ptr[tmp_len] == 0x0D) { + LineBreak = HPDF_TRUE; + } + } switch (align) { + case HPDF_TALIGN_RIGHT: - x_adjust = right - left - rw; - if ((ret = HPDF_Page_MoveTextPos (page, x_adjust, 0)) != HPDF_OK) - return ret; - - if ((ret = InternalShowTextNextLine (page, ptr, tmp_len)) - != HPDF_OK) - return HPDF_CheckError (page->error); - - if ((ret = HPDF_Page_MoveTextPos (page, -x_adjust, 0)) != HPDF_OK) + TextPos_AbsToRel (attr->text_matrix, right - rw, top, &x, &y); + if (!pos_initialized) { + pos_initialized = HPDF_TRUE; + } else { + y = 0; + } + if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) return ret; break; + case HPDF_TALIGN_CENTER: - x_adjust = (right - left - rw) / 2; - if ((ret = HPDF_Page_MoveTextPos (page, x_adjust, 0)) != HPDF_OK) - return ret; - - if ((ret = InternalShowTextNextLine (page, ptr, tmp_len)) - != HPDF_OK) - return HPDF_CheckError (page->error); - - if ((ret = HPDF_Page_MoveTextPos (page, -x_adjust, 0)) != HPDF_OK) + TextPos_AbsToRel (attr->text_matrix, left + (right - left - rw) / 2, top, &x, &y); + if (!pos_initialized) { + pos_initialized = HPDF_TRUE; + } else { + y = 0; + } + if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) return ret; break; + case HPDF_TALIGN_JUSTIFY: - num_char = 0; - encoder = ((HPDF_FontAttr)attr->gstate->font->attr)->encoder; - tmp_ptr = ptr; - HPDF_Encoder_SetParseText (encoder, &state, tmp_ptr, tmp_len); - i = 0; - while (*tmp_ptr) { - HPDF_ByteType btype = HPDF_Encoder_ByteType (encoder, &state); - if (btype != HPDF_BYTE_TYPE_TRIAL) - num_char++; - - i++; - if (i >= tmp_len) - break; - - tmp_ptr++; + if (!pos_initialized) { + pos_initialized = HPDF_TRUE; + TextPos_AbsToRel (attr->text_matrix, left, top, &x, &y); + if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) + return ret; } - if (HPDF_IS_WHITE_SPACE(*tmp_ptr)) - num_char--; - - if (num_char > 1) - x_adjust = (right - left - rw) / (num_char - 1); - else - x_adjust = 0; - - if (num_rest == tmp_len) { + /* Do not justify last line of paragraph or text. */ + if (LineBreak || num_rest <= 0) { if ((ret = HPDF_Page_SetCharSpace (page, save_char_space)) != HPDF_OK) return ret; char_space_changed = HPDF_FALSE; } else { - if ((ret = HPDF_Page_SetCharSpace (page, x_adjust)) - != HPDF_OK) + HPDF_REAL x_adjust; + HPDF_ParseText_Rec state; + HPDF_UINT i = 0; + HPDF_UINT num_char = 0; + HPDF_Encoder encoder = ((HPDF_FontAttr)attr->gstate->font->attr)->encoder; + const char *tmp_ptr = ptr; + HPDF_Encoder_SetParseText (encoder, &state, (HPDF_BYTE *)tmp_ptr, tmp_len); + while (*tmp_ptr) { + HPDF_ByteType btype = HPDF_Encoder_ByteType (encoder, &state); + if (btype != HPDF_BYTE_TYPE_TRIAL) + num_char++; + i++; + if (i >= tmp_len) + break; + tmp_ptr++; + } + + x_adjust = num_char == 0 ? 0 : (right - left - rw) / (num_char - 1); + if ((ret = HPDF_Page_SetCharSpace (page, x_adjust)) != HPDF_OK) return ret; char_space_changed = HPDF_TRUE; } - - if ((ret = InternalShowTextNextLine (page, ptr, tmp_len)) - != HPDF_OK) - return HPDF_CheckError (page->error); - - attr->gstate->char_space = 0; break; + default: - if ((ret = InternalShowTextNextLine (page, ptr, tmp_len)) - != HPDF_OK) - return HPDF_CheckError (page->error); + if (!pos_initialized) { + pos_initialized = HPDF_TRUE; + TextPos_AbsToRel (attr->text_matrix, left, top, &x, &y); + if ((ret = HPDF_Page_MoveTextPos (page, x, y)) != HPDF_OK) + return ret; + } } - num_rest -= tmp_len; + if (InternalShowTextNextLine (page, ptr, tmp_len) != HPDF_OK) + return HPDF_CheckError (page->error); + if (num_rest <= 0) break; @@ -2566,10 +2591,10 @@ HPDF_Page_TextRect (HPDF_Page page, break; } - ptr += tmp_len; + ptr += line_len; } - if (char_space_changed) { + if (char_space_changed && save_char_space != attr->gstate->char_space) { if ((ret = HPDF_Page_SetCharSpace (page, save_char_space)) != HPDF_OK) return ret; } @@ -2598,12 +2623,28 @@ InternalShowTextNextLine (HPDF_Page page, if (font_attr->type == HPDF_FONT_TYPE0_TT || font_attr->type == HPDF_FONT_TYPE0_CID) { + HPDF_Encoder encoder = font_attr->encoder; + if ((ret = HPDF_Stream_WriteStr (attr->stream, "<")) != HPDF_OK) return ret; - if ((ret = HPDF_Stream_WriteBinary (attr->stream, text, len, NULL)) - != HPDF_OK) - return ret; + if (encoder->encode_text_fn == NULL) { + if ((ret = HPDF_Stream_WriteBinary (attr->stream, (HPDF_BYTE *)text, + len, NULL)) + != HPDF_OK) + return ret; + } else { + char *encoded; + HPDF_UINT length; + + encoded = (encoder->encode_text_fn)(encoder, text, len, &length); + ret = HPDF_Stream_WriteBinary (attr->stream, (HPDF_BYTE *)encoded, + length, NULL); + free(encoded); + + if (ret != HPDF_OK) + return ret; + } if ((ret = HPDF_Stream_WriteStr (attr->stream, ">")) != HPDF_OK) return ret; @@ -2665,11 +2706,10 @@ HPDF_Page_SetSlideShow (HPDF_Page page, if (!dict) return HPDF_Error_GetCode (page->error); - if ((ret = HPDF_Dict_AddName (dict, "Type", "Trans")) != HPDF_OK) + if (HPDF_Dict_AddName (dict, "Type", "Trans") != HPDF_OK) goto Fail; - if ((ret = HPDF_Dict_AddReal (dict, "D", trans_time)) != - HPDF_OK) + if (HPDF_Dict_AddReal (dict, "D", trans_time) != HPDF_OK) goto Fail; switch (type) { @@ -2744,13 +2784,13 @@ HPDF_Page_SetSlideShow (HPDF_Page page, ret += HPDF_Dict_AddName (dict, "S", "R"); break; default: - ret = HPDF_INVALID_PAGE_SLIDESHOW_TYPE; + ret += HPDF_SetError(page->error, HPDF_INVALID_PAGE_SLIDESHOW_TYPE, 0); } if (ret != HPDF_OK) goto Fail; - if ((ret = HPDF_Dict_AddReal (page, "Dur", disp_time)) != HPDF_OK) + if (HPDF_Dict_AddReal (page, "Dur", disp_time) != HPDF_OK) goto Fail; if ((ret = HPDF_Dict_Add (page, "Trans", dict)) != HPDF_OK) @@ -2762,3 +2802,100 @@ Fail: HPDF_Dict_Free (dict); return HPDF_Error_GetCode (page->error); } + + +/* + * This function is contributed by Finn Arildsen. + */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_New_Content_Stream (HPDF_Page page, + HPDF_Dict* new_stream) +{ + /* Call this function to start a new content stream on a page. The + handle is returned to new_stream. + new_stream can later be used on other pages as a shared content stream; + insert using HPDF_Page_Insert_Shared_Content_Stream */ + + HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION | + HPDF_GMODE_TEXT_OBJECT); + HPDF_PageAttr attr; + HPDF_UINT filter; + HPDF_Array contents_array; + + HPDF_PTRACE((" HPDF_Page_New_Content_Stream\n")); + + attr = (HPDF_PageAttr)page->attr; + filter = attr->contents->filter; + + /* check if there is already an array of contents */ + contents_array = (HPDF_Array) HPDF_Dict_GetItem(page,"Contents", HPDF_OCLASS_ARRAY); + if (!contents_array) { + HPDF_Error_Reset (page->error); + /* no contents_array already -- create one + and replace current single contents item */ + contents_array = HPDF_Array_New(page->mmgr); + if (!contents_array) + return HPDF_Error_GetCode (page->error); + ret += HPDF_Array_Add(contents_array,attr->contents); + ret += HPDF_Dict_Add (page, "Contents", contents_array); + } + + /* create new contents stream and add it to the page's contents array */ + attr->contents = HPDF_DictStream_New (page->mmgr, attr->xref); + attr->contents->filter = filter; + attr->stream = attr->contents->stream; + + if (!attr->contents) + return HPDF_Error_GetCode (page->error); + + ret += HPDF_Array_Add (contents_array,attr->contents); + + /* return the value of the new stream, so that + the application can use it as a shared contents stream */ + if (ret == HPDF_OK && new_stream != NULL) + *new_stream = attr->contents; + + return ret; +} + + +/* + * This function is contributed by Finn Arildsen. + */ + +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_Insert_Shared_Content_Stream (HPDF_Page page, + HPDF_Dict shared_stream) +{ + /* Call this function to insert a previously (with HPDF_New_Content_Stream) created content stream + as a shared content stream on this page */ + + HPDF_STATUS ret = HPDF_Page_CheckState (page, HPDF_GMODE_PAGE_DESCRIPTION | + HPDF_GMODE_TEXT_OBJECT); + HPDF_Array contents_array; + + HPDF_PTRACE((" HPDF_Page_Insert_Shared_Content_Stream\n")); + + /* check if there is already an array of contents */ + contents_array = (HPDF_Array) HPDF_Dict_GetItem(page,"Contents", HPDF_OCLASS_ARRAY); + if (!contents_array) { + HPDF_PageAttr attr; + HPDF_Error_Reset (page->error); + /* no contents_array already -- create one + and replace current single contents item */ + contents_array = HPDF_Array_New(page->mmgr); + if (!contents_array) + return HPDF_Error_GetCode (page->error); + attr = (HPDF_PageAttr)page->attr; + ret += HPDF_Array_Add(contents_array,attr->contents); + ret += HPDF_Dict_Add (page, "Contents", contents_array); + } + + ret += HPDF_Array_Add (contents_array,shared_stream); + + /* Continue with a new stream */ + ret += HPDF_Page_New_Content_Stream (page, NULL); + + return ret; +} diff --git a/PDF/src/hpdf_pages.c b/PDF/src/hpdf_pages.c index 4d8f50dec..fcc9b5cc4 100644 --- a/PDF/src/hpdf_pages.c +++ b/PDF/src/hpdf_pages.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_pages.c + * << Haru Free PDF Library >> -- hpdf_pages.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -17,6 +20,9 @@ #include "hpdf.h" #include "hpdf_annotation.h" #include "hpdf_destination.h" +#include "hpdf_3dmeasure.h" +#include "hpdf_exdata.h" +#include "hpdf_u3d.h" /*----------------------------------------------------------------------------*/ @@ -25,14 +31,14 @@ typedef struct _HPDF_PageSizeValue { HPDF_REAL y; } HPDF_PageSizeValue; -static HPDF_PageSizeValue HPDF_PREDEFINED_PAGE_SIZES[] = { +static const HPDF_PageSizeValue HPDF_PREDEFINED_PAGE_SIZES[] = { {612, 792}, /* HPDF_PAGE_SIZE_LETTER */ {612, 1008}, /* HPDF_PAGE_SIZE_LEGAL */ - {841.89, 1199.551}, /* HPDF_PAGE_SIZE_A3 */ - {595.276, 841.89}, /* HPDF_PAGE_SIZE_A4 */ - {419.528, 595.276}, /* HPDF_PAGE_SIZE_A5 */ - {708.661, 1000.63}, /* HPDF_PAGE_SIZE_B4 */ - {498.898, 708.661}, /* HPDF_PAGE_SIZE_B5 */ + {(HPDF_REAL)841.89, (HPDF_REAL)1190.551}, /* HPDF_PAGE_SIZE_A3 */ + {(HPDF_REAL)595.276, (HPDF_REAL)841.89}, /* HPDF_PAGE_SIZE_A4 */ + {(HPDF_REAL)419.528, (HPDF_REAL)595.276}, /* HPDF_PAGE_SIZE_A5 */ + {(HPDF_REAL)708.661, (HPDF_REAL)1000.63}, /* HPDF_PAGE_SIZE_B4 */ + {(HPDF_REAL)498.898, (HPDF_REAL)708.661}, /* HPDF_PAGE_SIZE_B5 */ {522, 756}, /* HPDF_PAGE_SIZE_EXECUTIVE */ {288, 432}, /* HPDF_PAGE_SIZE_US4x6 */ {288, 576}, /* HPDF_PAGE_SIZE_US4x8 */ @@ -71,7 +77,7 @@ AddAnnotation (HPDF_Page page, static HPDF_UINT GetPageCount (HPDF_Dict pages); -static const char *HPDF_INHERITABLE_ENTRIES[5] = { +static const char * const HPDF_INHERITABLE_ENTRIES[5] = { "Resources", "MediaBox", "CropBox", @@ -159,11 +165,14 @@ HPDF_Page_InsertBefore (HPDF_Page page, HPDF_PTRACE((" HPDF_Page_InsertBefore\n")); + if (!target) + return HPDF_INVALID_PARAMETER; + attr = (HPDF_PageAttr )target->attr; parent = attr->parent; if (!parent) - return HPDF_SetError (parent->error, HPDF_PAGE_CANNOT_SET_PARENT, 0); + return HPDF_PAGE_CANNOT_SET_PARENT; if (HPDF_Dict_GetItem (page, "Parent", HPDF_OCLASS_DICT)) return HPDF_SetError (parent->error, HPDF_PAGE_CANNOT_SET_PARENT, 0); @@ -337,7 +346,7 @@ HPDF_Page_New (HPDF_MMgr mmgr, /* add requiered elements */ ret += HPDF_Dict_AddName (page, "Type", "Page"); ret += HPDF_Dict_Add (page, "MediaBox", HPDF_Box_Array_New (page->mmgr, - HPDF_ToBox (0, 0, HPDF_DEF_PAGE_WIDTH, HPDF_DEF_PAGE_HEIGHT))); + HPDF_ToBox (0, 0, (HPDF_INT16)(HPDF_DEF_PAGE_WIDTH), (HPDF_INT16)(HPDF_DEF_PAGE_HEIGHT)))); ret += HPDF_Dict_Add (page, "Contents", attr->contents); ret += AddResource (page); @@ -454,14 +463,19 @@ AddResource (HPDF_Page page) if (!procset) return HPDF_Error_GetCode (page->error); - ret += HPDF_Dict_Add (resource, "ProcSet", procset); + if (HPDF_Dict_Add (resource, "ProcSet", procset) != HPDF_OK) + return HPDF_Error_GetCode (resource->error); + ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "PDF")); ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "Text")); ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageB")); ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageC")); ret += HPDF_Array_Add (procset, HPDF_Name_New (page->mmgr, "ImageI")); - return ret; + if (ret != HPDF_OK) + return HPDF_Error_GetCode (procset->error); + + return HPDF_OK; } @@ -507,7 +521,7 @@ HPDF_Page_GetLocalFontName (HPDF_Page page, char *ptr; char *end_ptr = fontName + HPDF_LIMIT_MAX_NAME_LEN; - ptr = HPDF_StrCpy (fontName, "F", end_ptr); + ptr = (char *)HPDF_StrCpy (fontName, "F", end_ptr); HPDF_IToA (ptr, attr->fonts->list->count + 1, end_ptr); if (HPDF_Dict_Add (attr->fonts, fontName, font) != HPDF_OK) @@ -596,7 +610,7 @@ HPDF_Page_GetXObjectName (HPDF_Page page, char *ptr; char *end_ptr = xobj_name + HPDF_LIMIT_MAX_NAME_LEN; - ptr = HPDF_StrCpy (xobj_name, "X", end_ptr); + ptr = (char *)HPDF_StrCpy (xobj_name, "X", end_ptr); HPDF_IToA (ptr, attr->xobjects->list->count + 1, end_ptr); if (HPDF_Dict_Add (attr->xobjects, xobj_name, xobj) != HPDF_OK) @@ -647,7 +661,7 @@ HPDF_Page_GetExtGStateName (HPDF_Page page, char *ptr; char *end_ptr = ext_gstate_name + HPDF_LIMIT_MAX_NAME_LEN; - ptr = HPDF_StrCpy (ext_gstate_name, "E", end_ptr); + ptr = (char *)HPDF_StrCpy (ext_gstate_name, "E", end_ptr); HPDF_IToA (ptr, attr->ext_gstates->list->count + 1, end_ptr); if (HPDF_Dict_Add (attr->ext_gstates, ext_gstate_name, state) != HPDF_OK) @@ -665,7 +679,7 @@ AddAnnotation (HPDF_Page page, HPDF_Annotation annot) { HPDF_Array array; - HPDF_STATUS ret; + HPDF_STATUS ret = HPDF_OK; HPDF_PTRACE((" HPDF_Pages\n")); @@ -681,8 +695,14 @@ AddAnnotation (HPDF_Page page, if (ret != HPDF_OK) return ret; } + + if ((ret = HPDF_Array_Add (array, annot)) != HPDF_OK) + return ret; - return HPDF_Array_Add (array, annot); + /* Add Parent to the annotation */ + ret = HPDF_Dict_Add( annot, "P", page); + + return ret; } @@ -708,7 +728,7 @@ HPDF_Page_TextWidth (HPDF_Page page, return 0; } - tw = HPDF_Font_TextWidth (attr->gstate->font, text, len); + tw = HPDF_Font_TextWidth (attr->gstate->font, (HPDF_BYTE *)text, len); ret += attr->gstate->word_space * tw.numspace; ret += tw.width * attr->gstate->font_size / 1000; @@ -744,7 +764,7 @@ HPDF_Page_MeasureText (HPDF_Page page, return 0; } - ret = HPDF_Font_MeasureText (attr->gstate->font, text, len, width, + ret = HPDF_Font_MeasureText (attr->gstate->font, (HPDF_BYTE *)text, len, width, attr->gstate->font_size, attr->gstate->char_space, attr->gstate->word_space, wordwrap, real_width); @@ -971,7 +991,7 @@ HPDF_Page_GetTextRenderingMode (HPDF_Page page) HPDF_EXPORT(HPDF_REAL) HPDF_Page_GetTextRaise (HPDF_Page page) { - return HPDF_Page_GetTextRise (page); + return HPDF_Page_GetTextRise (page); } HPDF_EXPORT(HPDF_REAL) @@ -1259,7 +1279,6 @@ HPDF_Page_SetBoxValue (HPDF_Page page, return HPDF_OK; } - HPDF_EXPORT(HPDF_STATUS) HPDF_Page_SetRotate (HPDF_Page page, HPDF_UINT16 angle) @@ -1286,6 +1305,25 @@ HPDF_Page_SetRotate (HPDF_Page page, return ret; } +HPDF_EXPORT(HPDF_STATUS) +HPDF_Page_SetZoom (HPDF_Page page, + HPDF_REAL zoom) +{ + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE((" HPDF_Page_SetZoom\n")); + + if (!HPDF_Page_Validate (page)) { + return HPDF_INVALID_PAGE; + } + + if (zoom < 0.08 || zoom > 32) { + return HPDF_RaiseError (page->error, HPDF_INVALID_PARAMETER, 0); + } + + ret = HPDF_Dict_AddReal (page, "PZ", zoom); + return ret; +} HPDF_EXPORT(HPDF_STATUS) HPDF_Page_SetWidth (HPDF_Page page, @@ -1394,6 +1432,33 @@ HPDF_Page_CreateDestination (HPDF_Page page) } +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_Create3DAnnot (HPDF_Page page, + HPDF_Rect rect, + HPDF_U3D u3d) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_Create3DAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + annot = HPDF_3DAnnot_New (page->mmgr, attr->xref, rect, u3d); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + HPDF_EXPORT(HPDF_Annotation) HPDF_Page_CreateTextAnnot (HPDF_Page page, HPDF_Rect rect, @@ -1415,7 +1480,7 @@ HPDF_Page_CreateTextAnnot (HPDF_Page page, return NULL; } - annot = HPDF_TextAnnot_New (page->mmgr, attr->xref, rect, text, encoder); + annot = HPDF_MarkupAnnot_New (page->mmgr, attr->xref, rect, text, encoder, HPDF_ANNOT_TEXT_NOTES); if (annot) { if (AddAnnotation (page, annot) != HPDF_OK) { HPDF_CheckError (page->error); @@ -1427,6 +1492,71 @@ HPDF_Page_CreateTextAnnot (HPDF_Page page, return annot; } +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateFreeTextAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateFreeTextAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + if (encoder && !HPDF_Encoder_Validate (encoder)) { + HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0); + return NULL; + } + + annot = HPDF_MarkupAnnot_New (page->mmgr, attr->xref, rect, text, encoder, HPDF_ANNOT_FREE_TEXT); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateLineAnnot (HPDF_Page page, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + HPDF_Rect rect = {0,0,0,0}; + + HPDF_PTRACE((" HPDF_Page_CreateLineAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + if (encoder && !HPDF_Encoder_Validate (encoder)) { + HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0); + return NULL; + } + + annot = HPDF_MarkupAnnot_New (page->mmgr, attr->xref, rect, text, encoder, HPDF_ANNOT_LINE); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} HPDF_EXPORT(HPDF_Annotation) HPDF_Page_CreateLinkAnnot (HPDF_Page page, @@ -1493,6 +1623,343 @@ HPDF_Page_CreateURILinkAnnot (HPDF_Page page, return annot; } +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateCircleAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateCircleAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + if (encoder && !HPDF_Encoder_Validate (encoder)) { + HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0); + return NULL; + } + + annot = HPDF_MarkupAnnot_New (page->mmgr, attr->xref, rect, text, encoder, HPDF_ANNOT_CIRCLE); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquareAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateCircleAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + if (encoder && !HPDF_Encoder_Validate (encoder)) { + HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0); + return NULL; + } + + annot = HPDF_MarkupAnnot_New (page->mmgr, attr->xref, rect, text, encoder, HPDF_ANNOT_SQUARE); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + +HPDF_EXPORT(HPDF_Dict) +HPDF_Page_Create3DView (HPDF_Page page, + HPDF_U3D u3d, + HPDF_Annotation annot3d, + const char *name) +{ + HPDF_PageAttr attr; + HPDF_Dict view; + + HPDF_PTRACE((" HPDF_Page_Create3DView\n")); + HPDF_UNUSED(annot3d); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + view = HPDF_3DView_New( page->mmgr, attr->xref, u3d, name); + if (!view) { + HPDF_CheckError (page->error); + } + return view; +} + +HPDF_Annotation +HPDF_Page_CreateTextMarkupAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder, + HPDF_AnnotType subType) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateTextMarkupAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + if (encoder && !HPDF_Encoder_Validate (encoder)) { + HPDF_RaiseError (page->error, HPDF_INVALID_ENCODER, 0); + return NULL; + } + + annot = HPDF_MarkupAnnot_New ( page->mmgr, attr->xref, rect, text, encoder, subType); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateHighlightAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PTRACE((" HPDF_Page_CreateHighlightAnnot\n")); + + return HPDF_Page_CreateTextMarkupAnnot( page, rect, text, encoder, HPDF_ANNOT_HIGHTLIGHT); +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateSquigglyAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PTRACE((" HPDF_Page_CreateSquigglyAnnot\n")); + + return HPDF_Page_CreateTextMarkupAnnot( page, rect, text, encoder, HPDF_ANNOT_SQUIGGLY); +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateUnderlineAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PTRACE((" HPDF_Page_CreateUnderlineAnnot\n")); + + return HPDF_Page_CreateTextMarkupAnnot( page, rect, text, encoder, HPDF_ANNOT_UNDERLINE); +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStrikeOutAnnot (HPDF_Page page, + HPDF_Rect rect, + const char *text, + HPDF_Encoder encoder) +{ + HPDF_PTRACE((" HPDF_Page_CreateStrikeOutAnnot\n")); + + return HPDF_Page_CreateTextMarkupAnnot( page, rect, text, encoder, HPDF_ANNOT_STRIKE_OUT); +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreatePopupAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_Annotation parent) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreatePopupAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + annot = HPDF_PopupAnnot_New ( page->mmgr, attr->xref, rect, parent); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateStampAnnot ( HPDF_Page page, + HPDF_Rect rect, + HPDF_StampAnnotName name, + const char* text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateStampAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + annot = HPDF_StampAnnot_New ( page->mmgr, attr->xref, rect, name, text, encoder); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + +HPDF_EXPORT(HPDF_Annotation) +HPDF_Page_CreateProjectionAnnot(HPDF_Page page, + HPDF_Rect rect, + const char* text, + HPDF_Encoder encoder) +{ + HPDF_PageAttr attr; + HPDF_Annotation annot; + + HPDF_PTRACE((" HPDF_Page_CreateProjectionAnnot\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + annot = HPDF_ProjectionAnnot_New (page->mmgr, attr->xref, rect, text, encoder); + if (annot) { + if (AddAnnotation (page, annot) != HPDF_OK) { + HPDF_CheckError (page->error); + annot = NULL; + } + } else + HPDF_CheckError (page->error); + + return annot; +} + + +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_Create3DC3DMeasure(HPDF_Page page, + HPDF_Point3D firstanchorpoint, + HPDF_Point3D textanchorpoint) +{ + HPDF_PageAttr attr; + HPDF_Annotation measure; + + HPDF_PTRACE((" HPDF_Page_Create3DC3DMeasure\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + measure = HPDF_3DC3DMeasure_New(page->mmgr, attr->xref, firstanchorpoint, textanchorpoint); + if ( !measure) + HPDF_CheckError (page->error); + + return measure; +} + +HPDF_EXPORT(HPDF_3DMeasure) +HPDF_Page_CreatePD33DMeasure(HPDF_Page page, + HPDF_Point3D annotationPlaneNormal, + HPDF_Point3D firstAnchorPoint, + HPDF_Point3D secondAnchorPoint, + HPDF_Point3D leaderLinesDirection, + HPDF_Point3D measurementValuePoint, + HPDF_Point3D textYDirection, + HPDF_REAL value, + const char* unitsString + ) +{ + HPDF_PageAttr attr; + HPDF_Annotation measure; + + HPDF_PTRACE((" HPDF_Page_CreatePD33DMeasure\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + measure = HPDF_PD33DMeasure_New(page->mmgr, + attr->xref, + annotationPlaneNormal, + firstAnchorPoint, + secondAnchorPoint, + leaderLinesDirection, + measurementValuePoint, + textYDirection, + value, + unitsString + ); + if ( !measure) + HPDF_CheckError (page->error); + + return measure; +} + + +HPDF_EXPORT(HPDF_ExData) +HPDF_Page_Create3DAnnotExData(HPDF_Page page) +{ + HPDF_PageAttr attr; + HPDF_Annotation exData; + + HPDF_PTRACE((" HPDF_Page_Create3DAnnotExData\n")); + + if (!HPDF_Page_Validate (page)) + return NULL; + + attr = (HPDF_PageAttr)page->attr; + + exData = HPDF_3DAnnotExData_New(page->mmgr, attr->xref); + if ( !exData) + HPDF_CheckError (page->error); + + return exData; +} + + void HPDF_Page_SetFilter (HPDF_Page page, diff --git a/PDF/src/hpdf_pdfa.c b/PDF/src/hpdf_pdfa.c new file mode 100644 index 000000000..df06d1c13 --- /dev/null +++ b/PDF/src/hpdf_pdfa.c @@ -0,0 +1,386 @@ +/* + * << Haru Free PDF Library >> -- hpdf_pdfa.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ +/* This is used to avoid warnings on 'ctime' when compiling in MSVC 9 */ +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include "hpdf_utils.h" +#include "hpdf.h" +#include + + +#define HEADER "" +#define DC_HEADER "" +#define DC_TITLE_STARTTAG "" +#define DC_TITLE_ENDTAG "" +#define DC_CREATOR_STARTTAG "" +#define DC_CREATOR_ENDTAG "" +#define DC_DESCRIPTION_STARTTAG "" +#define DC_DESCRIPTION_ENDTAG "" +#define DC_FOOTER "" +#define XMP_HEADER "" +#define XMP_CREATORTOOL_STARTTAG "" +#define XMP_CREATORTOOL_ENDTAG "" +#define XMP_CREATE_DATE_STARTTAG "" +#define XMP_CREATE_DATE_ENDTAG "" +#define XMP_MOD_DATE_STARTTAG "" +#define XMP_MOD_DATE_ENDTAG "" +#define XMP_FOOTER "" +#define PDF_HEADER "" +#define PDF_KEYWORDS_STARTTAG "" +#define PDF_KEYWORDS_ENDTAG "" +#define PDF_PRODUCER_STARTTAG "" +#define PDF_PRODUCER_ENDTAG "" +#define PDF_FOOTER "" +#define PDFAID_PDFA1A "" +#define PDFAID_PDFA1B "" +#define FOOTER "" + + +/* + * Convert date in PDF specific format: D:YYYYMMDDHHmmSS + * to XMP value in format YYYY-MM-DDTHH:mm:SS+offH:offMin + */ +HPDF_STATUS ConvertDateToXMDate(HPDF_Stream stream, const char *pDate) +{ + HPDF_STATUS ret; + + if(pDate==NULL) return HPDF_INVALID_PARAMETER; + if(strlen(pDate)<16) return HPDF_INVALID_PARAMETER; + if(pDate[0]!='D'|| + pDate[1]!=':') return HPDF_INVALID_PARAMETER; + pDate+=2; + /* Copy YYYY */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 4); + if (ret != HPDF_OK) + return ret; + pDate+=4; + /* Write -MM */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)"-", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + pDate+=2; + /* Write -DD */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)"-", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + pDate+=2; + /* Write THH */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)"T", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + pDate+=2; + /* Write :mm */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)":", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + pDate+=2; + /* Write :SS */ + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)":", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + pDate+=2; + /* Write +... */ + if(pDate[0]==0) { + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)"Z", 1); + return ret; + } + if(pDate[0]=='+'||pDate[0]=='-') { + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 3); + if (ret != HPDF_OK) + return ret; + pDate+=4; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)":", 1); + if (ret != HPDF_OK) + return ret; + ret = HPDF_Stream_Write(stream, (const HPDF_BYTE*)pDate, 2); + if (ret != HPDF_OK) + return ret; + return ret; + } + return HPDF_SetError (stream->error, HPDF_INVALID_PARAMETER, 0); +} + +/* Write XMP Metadata for PDF/A */ + +HPDF_STATUS +HPDF_PDFA_SetPDFAConformance (HPDF_Doc pdf,HPDF_PDFAType pdfatype) +{ + HPDF_OutputIntent xmp; + HPDF_STATUS ret; + + const char *dc_title = NULL; + const char *dc_creator = NULL; + const char *dc_description = NULL; + + const char *xmp_CreatorTool = NULL; + const char *xmp_CreateDate = NULL; + const char *xmp_ModifyDate = NULL; + + const char *pdf_Keywords = NULL; + const char *pdf_Producer = NULL; + + const char *info = NULL; + + if (!HPDF_HasDoc(pdf)) { + return HPDF_INVALID_DOCUMENT; + } + + dc_title = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_TITLE); + dc_creator = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_AUTHOR); + dc_description = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_SUBJECT); + + xmp_CreateDate = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_CREATION_DATE); + xmp_ModifyDate = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_MOD_DATE); + xmp_CreatorTool = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_CREATOR); + + pdf_Keywords = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_KEYWORDS); + pdf_Producer = (const char *)HPDF_GetInfoAttr(pdf, HPDF_INFO_PRODUCER); + + if((dc_title != NULL) || (dc_creator != NULL) || (dc_description != NULL) + || (xmp_CreateDate != NULL) || (xmp_ModifyDate != NULL) || (xmp_CreatorTool != NULL) + || (pdf_Keywords != NULL)) { + + xmp = HPDF_DictStream_New(pdf->mmgr,pdf->xref); + if (!xmp) { + return HPDF_INVALID_STREAM; + } + + /* Update the PDF number version */ + pdf->pdf_version = HPDF_VER_14; + + HPDF_Dict_AddName(xmp,"Type","Metadata"); + HPDF_Dict_AddName(xmp,"SubType","XML"); + + ret = HPDF_OK; + ret += HPDF_Stream_WriteStr(xmp->stream, HEADER); + + /* Add the dc block */ + if((dc_title != NULL) || (dc_creator != NULL) || (dc_description != NULL)) { + ret += HPDF_Stream_WriteStr(xmp->stream, DC_HEADER); + + if(dc_title != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, DC_TITLE_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, dc_title); + ret += HPDF_Stream_WriteStr(xmp->stream, DC_TITLE_ENDTAG); + } + + if(dc_creator != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, DC_CREATOR_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, dc_creator); + ret += HPDF_Stream_WriteStr(xmp->stream, DC_CREATOR_ENDTAG); + } + + if(dc_description != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, DC_DESCRIPTION_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, dc_description); + ret += HPDF_Stream_WriteStr(xmp->stream, DC_DESCRIPTION_ENDTAG); + } + + ret += HPDF_Stream_WriteStr(xmp->stream, DC_FOOTER); + } + + /* Add the xmp block */ + if((xmp_CreateDate != NULL) || (xmp_ModifyDate != NULL) || (xmp_CreatorTool != NULL)) { + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_HEADER); + + /* Add CreateDate, ModifyDate, and CreatorTool */ + if(xmp_CreatorTool != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_CREATORTOOL_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, xmp_CreatorTool); + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_CREATORTOOL_ENDTAG); + } + + if(xmp_CreateDate != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_CREATE_DATE_STARTTAG); + /* Convert date to XMP compatible format */ + ret += ConvertDateToXMDate(xmp->stream, xmp_CreateDate); + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_CREATE_DATE_ENDTAG); + } + + if(xmp_ModifyDate != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_MOD_DATE_STARTTAG); + ret += ConvertDateToXMDate(xmp->stream, xmp_ModifyDate); + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_MOD_DATE_ENDTAG); + } + + ret += HPDF_Stream_WriteStr(xmp->stream, XMP_FOOTER); + } + + /* Add the pdf block */ + if((pdf_Keywords != NULL) || (pdf_Producer != NULL)) { + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_HEADER); + + if(pdf_Keywords != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_KEYWORDS_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, pdf_Keywords); + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_KEYWORDS_ENDTAG); + } + + if(pdf_Producer != NULL) { + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_PRODUCER_STARTTAG); + ret += HPDF_Stream_WriteStr(xmp->stream, pdf_Producer); + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_PRODUCER_ENDTAG); + } + + ret += HPDF_Stream_WriteStr(xmp->stream, PDF_FOOTER); + } + + /* Add the pdfaid block */ + switch(pdfatype) { + case HPDF_PDFA_1A: + ret += HPDF_Stream_WriteStr(xmp->stream, PDFAID_PDFA1A); + break; + case HPDF_PDFA_1B: + ret += HPDF_Stream_WriteStr(xmp->stream, PDFAID_PDFA1B); + break; + } + + ret += HPDF_Stream_WriteStr(xmp->stream, FOOTER); + + if (ret != HPDF_OK) { + return HPDF_INVALID_STREAM; + } + + if ((ret = HPDF_Dict_Add(pdf->catalog, "Metadata", xmp)) != HPDF_OK) { + return ret; + } + + return HPDF_PDFA_GenerateID(pdf); + } + + return HPDF_OK; +} + +/* Generate an ID for the trailer dict, PDF/A needs this. + TODO: Better algorithm for generate unique ID. +*/ +HPDF_STATUS +HPDF_PDFA_GenerateID(HPDF_Doc pdf) +{ + HPDF_Array id; + HPDF_BYTE *currentTime; + HPDF_BYTE idkey[HPDF_MD5_KEY_LEN]; + HPDF_MD5_CTX md5_ctx; + time_t ltime; + + ltime = time(NULL); + currentTime = (HPDF_BYTE *)ctime(<ime); + + id = HPDF_Dict_GetItem(pdf->trailer, "ID", HPDF_OCLASS_ARRAY); + if (!id) { + id = HPDF_Array_New(pdf->mmgr); + + if (!id || HPDF_Dict_Add(pdf->trailer, "ID", id) != HPDF_OK) + return pdf->error.error_no; + + HPDF_MD5Init(&md5_ctx); + HPDF_MD5Update(&md5_ctx, (HPDF_BYTE *) "libHaru", sizeof("libHaru") - 1); + HPDF_MD5Update(&md5_ctx, currentTime, HPDF_StrLen((const char *)currentTime, -1)); + HPDF_MD5Final(idkey, &md5_ctx); + + if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr, idkey, HPDF_MD5_KEY_LEN)) != HPDF_OK) + return pdf->error.error_no; + + if (HPDF_Array_Add (id, HPDF_Binary_New (pdf->mmgr,idkey,HPDF_MD5_KEY_LEN)) != HPDF_OK) + return pdf->error.error_no; + + return HPDF_OK; + } + + return HPDF_OK; +} + +/* Function to add one outputintents to the PDF + * iccname - name of default ICC profile + * iccdict - dictionary containing number of components + * and stream with ICC profile + * + * How to use: + * 1. Create dictionary with ICC profile + * HPDF_Dict icc = HPDF_DictStream_New (pDoc->mmgr, pDoc->xref); + * if(icc==NULL) return false; + * HPDF_Dict_AddNumber (icc, "N", 3); + * HPDF_STATUS ret = HPDF_Stream_Write (icc->stream, (const HPDF_BYTE *)pICCData, dwICCSize); + * if(ret!=HPDF_OK) { + * HPDF_Dict_Free(icc); + * return false; + * } + * + * 2. Call this function + */ + +HPDF_STATUS +HPDF_PDFA_AppendOutputIntents(HPDF_Doc pdf, const char *iccname, HPDF_Dict iccdict) +{ + HPDF_Array intents; + HPDF_Dict intent; + HPDF_STATUS ret; + if (!HPDF_HasDoc (pdf)) + return HPDF_INVALID_DOCUMENT; + + /* prepare intent */ + intent = HPDF_Dict_New (pdf->mmgr); + ret = HPDF_Xref_Add (pdf->xref, intent); + if ( ret != HPDF_OK) { + HPDF_Dict_Free(intent); + return ret; + } + ret += HPDF_Dict_AddName (intent, "Type", "OutputIntent"); + ret += HPDF_Dict_AddName (intent, "S", "GTS_PDFA1"); + ret += HPDF_Dict_Add (intent, "OutputConditionIdentifier", HPDF_String_New (pdf->mmgr, iccname, NULL)); + ret += HPDF_Dict_Add (intent, "OutputCondition", HPDF_String_New (pdf->mmgr, iccname,NULL)); + ret += HPDF_Dict_Add (intent, "Info", HPDF_String_New (pdf->mmgr, iccname, NULL)); + ret += HPDF_Dict_Add (intent, "DestOutputProfile ", iccdict); + if ( ret != HPDF_OK) { + HPDF_Dict_Free(intent); + return ret; + } + + /* Copied from HPDF_AddIntent - not public function */ + intents = HPDF_Dict_GetItem (pdf->catalog, "OutputIntents", HPDF_OCLASS_ARRAY); + if (intents == NULL) { + intents = HPDF_Array_New (pdf->mmgr); + if (intents) { + HPDF_STATUS ret = HPDF_Dict_Add (pdf->catalog, "OutputIntents", intents); + if (ret != HPDF_OK) { + HPDF_CheckError (&pdf->error); + return HPDF_Error_GetDetailCode (&pdf->error); + } + } + } + + HPDF_Array_Add(intents,intent); + return HPDF_Error_GetDetailCode (&pdf->error); +} diff --git a/PDF/src/hpdf_real.c b/PDF/src/hpdf_real.c index 3fd7e72b7..f686918f9 100644 --- a/PDF/src/hpdf_real.c +++ b/PDF/src/hpdf_real.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_real.c + * << Haru Free PDF Library >> -- hpdf_real.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, diff --git a/PDF/src/hpdf_streams.c b/PDF/src/hpdf_streams.c index fed91c933..d73c1fc90 100644 --- a/PDF/src/hpdf_streams.c +++ b/PDF/src/hpdf_streams.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_streams.h + * << Haru Free PDF Library >> -- hpdf_streams.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -10,22 +13,28 @@ * in supporting documentation. * It is provided "as is" without express or implied warranty. * - * 2005.12.20 Created. - * */ +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif +#ifndef UNDER_CE #include - -#ifndef HPDF_NOZLIB -#include -#include -#endif /* HPDF_NOZLIB */ +#endif +#ifndef HPDF_UNUSED +#define HPDF_UNUSED(a) ((void)(a)) +#endif #include "hpdf_conf.h" #include "hpdf_consts.h" #include "hpdf_utils.h" #include "hpdf_streams.h" +#ifndef LIBHPDF_HAVE_NOZLIB +#include +#include +#endif /* LIBHPDF_HAVE_NOZLIB */ + HPDF_STATUS HPDF_MemStream_WriteFunc (HPDF_Stream stream, const HPDF_BYTE *ptr, @@ -147,7 +156,10 @@ HPDF_Stream_ReadLn (HPDF_Stream stream, HPDF_PTRACE((" HPDF_Stream_ReadLn\n")); - if (!stream || !s || *size == 0) + if (!stream) + return HPDF_INVALID_PARAMETER; + + if (!s || *size == 0) return HPDF_SetError (stream->error, HPDF_INVALID_PARAMETER, 0); if (!(stream->seek_fn) || !(stream->read_fn)) @@ -160,7 +172,7 @@ HPDF_Stream_ReadLn (HPDF_Stream stream, while (r_size > 1) { char *pbuf = buf; - HPDF_STATUS ret = HPDF_Stream_Read (stream, buf, &read_size); + HPDF_STATUS ret = HPDF_Stream_Read (stream, (HPDF_BYTE *)buf, &read_size); if (ret != HPDF_OK && read_size == 0) return ret; @@ -250,7 +262,7 @@ HPDF_STATUS HPDF_Stream_WriteChar (HPDF_Stream stream, char value) { - return HPDF_Stream_Write(stream, &value, sizeof(char)); + return HPDF_Stream_Write(stream, (HPDF_BYTE *)&value, sizeof(char)); } @@ -260,7 +272,7 @@ HPDF_Stream_WriteStr (HPDF_Stream stream, { HPDF_UINT len = HPDF_StrLen(value, -1); - return HPDF_Stream_Write(stream, value, len); + return HPDF_Stream_Write(stream, (HPDF_BYTE *)value, len); } HPDF_STATUS @@ -278,7 +290,7 @@ HPDF_Stream_WriteInt (HPDF_Stream stream, char* p = HPDF_IToA(buf, value, buf + HPDF_INT_LEN); - return HPDF_Stream_Write(stream, buf, (HPDF_UINT)(p - buf)); + return HPDF_Stream_Write(stream, (HPDF_BYTE *)buf, (HPDF_UINT)(p - buf)); } HPDF_STATUS @@ -296,7 +308,7 @@ HPDF_Stream_WriteReal (HPDF_Stream stream, char* p = HPDF_FToA(buf, value, buf + HPDF_REAL_LEN); - return HPDF_Stream_Write(stream, buf, (HPDF_UINT)(p - buf)); + return HPDF_Stream_Write(stream, (HPDF_BYTE *)buf, (HPDF_UINT)(p - buf)); } void @@ -404,7 +416,7 @@ HPDF_Stream_WriteEscapeName (HPDF_Stream stream, } *pos2 = 0; - return HPDF_Stream_Write (stream, tmp_char, HPDF_StrLen(tmp_char, -1)); + return HPDF_Stream_Write (stream, (HPDF_BYTE *)tmp_char, HPDF_StrLen(tmp_char, -1)); } HPDF_STATUS @@ -420,23 +432,29 @@ HPDF_Stream_WriteEscapeText2 (HPDF_Stream stream, HPDF_PTRACE((" HPDF_Stream_WriteEscapeText2\n")); + /* The following block is commented out because it violates "PDF Spec 7.3.4.2 Literal Strings". + * It states that the two matching parentheses must still be present to represent an empty + * string of zero length. + */ + /* if (!len) return HPDF_OK; + */ buf[idx++] = '('; - for (i = 0; i < len; i++) { + for (i = 0; i < (HPDF_INT)len; i++) { HPDF_BYTE c = (HPDF_BYTE)*p++; if (HPDF_NEEDS_ESCAPE(c)) { buf[idx++] = '\\'; - buf[idx] = c >> 6; + buf[idx] = (char)(c >> 6); buf[idx] += 0x30; idx++; - buf[idx] = (c & 0x38) >> 3; + buf[idx] = (char)((c & 0x38) >> 3); buf[idx] += 0x30; idx++; - buf[idx] = (c & 0x07); + buf[idx] = (char)(c & 0x07); buf[idx] += 0x30; idx++; } @@ -444,7 +462,7 @@ HPDF_Stream_WriteEscapeText2 (HPDF_Stream stream, buf[idx++] = c; if (idx > HPDF_TEXT_DEFAULT_LEN - 4) { - ret = HPDF_Stream_Write (stream, buf, idx); + ret = HPDF_Stream_Write (stream, (HPDF_BYTE *)buf, idx); if (ret != HPDF_OK) return ret; idx = 0; @@ -452,7 +470,7 @@ HPDF_Stream_WriteEscapeText2 (HPDF_Stream stream, } buf[idx++] = ')'; - ret = HPDF_Stream_Write (stream, buf, idx); + ret = HPDF_Stream_Write (stream, (HPDF_BYTE *)buf, idx); return ret; } @@ -502,7 +520,7 @@ HPDF_Stream_WriteBinary (HPDF_Stream stream, } for (i = 0; i < len; i++, p++) { - char c = *p >> 4; + char c = (char)(*p >> 4); if (c <= 9) c += 0x30; @@ -510,7 +528,7 @@ HPDF_Stream_WriteBinary (HPDF_Stream stream, c += 0x41 - 10; buf[idx++] = c; - c = *p & 0x0f; + c = (char)(*p & 0x0f); if (c <= 9) c += 0x30; else @@ -518,7 +536,7 @@ HPDF_Stream_WriteBinary (HPDF_Stream stream, buf[idx++] = c; if (idx > HPDF_TEXT_DEFAULT_LEN - 2) { - ret = HPDF_Stream_Write (stream, buf, idx); + ret = HPDF_Stream_Write (stream, (HPDF_BYTE *)buf, idx); if (ret != HPDF_OK) { if (flg) HPDF_FreeMem (stream->mmgr, pbuf); @@ -529,7 +547,7 @@ HPDF_Stream_WriteBinary (HPDF_Stream stream, } if (idx > 0) { - ret = HPDF_Stream_Write (stream, buf, idx); + ret = HPDF_Stream_Write (stream, (HPDF_BYTE *)buf, idx); } if (flg) @@ -544,7 +562,7 @@ HPDF_Stream_WriteToStreamWithDeflate (HPDF_Stream src, HPDF_Stream dst, HPDF_Encrypt e) { -#ifndef HPDF_NOZLIB +#ifndef LIBHPDF_HAVE_NOZLIB #define DEFLATE_BUF_SIZ ((HPDF_INT)(HPDF_STREAM_BUF_SIZ * 1.1) + 13) @@ -658,9 +676,12 @@ HPDF_Stream_WriteToStreamWithDeflate (HPDF_Stream src, deflateEnd(&strm); return HPDF_OK; -#else /* HPDF_NOZLIB */ +#else /* LIBHPDF_HAVE_NOZLIB */ + HPDF_UNUSED (e); + HPDF_UNUSED (dst); + HPDF_UNUSED (src); return HPDF_UNSUPPORTED_FUNC; -#endif /* HPDF_NOZLIB */ +#endif /* LIBHPDF_HAVE_NOZLIB */ } HPDF_STATUS @@ -675,6 +696,7 @@ HPDF_Stream_WriteToStream (HPDF_Stream src, HPDF_BOOL flg; HPDF_PTRACE((" HPDF_Stream_WriteToStream\n")); + HPDF_UNUSED (filter); if (!dst || !(dst->write_fn)) { HPDF_SetError (src->error, HPDF_INVALID_OBJECT, 0); @@ -685,15 +707,15 @@ HPDF_Stream_WriteToStream (HPDF_Stream src, HPDF_Error_GetCode (dst->error) != HPDF_NOERROR) return HPDF_THIS_FUNC_WAS_SKIPPED; -#ifndef HPDF_NOZLIB - if (filter & HPDF_STREAM_FILTER_FLATE_DECODE) - return HPDF_Stream_WriteToStreamWithDeflate (src, dst, e); -#endif /* HPDF_NOZLIB */ - /* initialize input stream */ if (HPDF_Stream_Size (src) == 0) return HPDF_OK; +#ifndef LIBHPDF_HAVE_NOZLIB + if (filter & HPDF_STREAM_FILTER_FLATE_DECODE) + return HPDF_Stream_WriteToStreamWithDeflate (src, dst, e); +#endif /* LIBHPDF_HAVE_NOZLIB */ + ret = HPDF_Stream_Seek (src, 0, HPDF_SEEK_SET); if (ret != HPDF_OK) return ret; @@ -741,7 +763,11 @@ HPDF_FileReader_New (HPDF_MMgr mmgr, HPDF_PTRACE((" HPDF_FileReader_New\n")); if (!fp) { +#ifdef UNDER_CE + HPDF_SetError (mmgr->error, HPDF_FILE_OPEN_ERROR, GetLastError()); +#else HPDF_SetError (mmgr->error, HPDF_FILE_OPEN_ERROR, errno); +#endif return NULL; } @@ -913,7 +939,11 @@ HPDF_FileWriter_New (HPDF_MMgr mmgr, HPDF_PTRACE((" HPDF_FileWriter_New\n")); if (!fp) { +#ifdef UNDER_CE + HPDF_SetError (mmgr->error, HPDF_FILE_OPEN_ERROR, GetLastError()); +#else HPDF_SetError (mmgr->error, HPDF_FILE_OPEN_ERROR, errno); +#endif return NULL; } @@ -1071,8 +1101,13 @@ HPDF_MemStream_SeekFunc (HPDF_Stream stream, } else if (mode == HPDF_SEEK_END) pos = stream->size - pos; - if (pos > stream->size || stream->size == 0) + if (pos > (HPDF_INT)stream->size) { return HPDF_SetError (stream->error, HPDF_STREAM_EOF, 0); + } + + if (stream->size == 0) { + return HPDF_OK; + } attr->r_ptr_idx = pos / attr->buf_siz; attr->r_pos = pos % attr->buf_siz; @@ -1163,11 +1198,11 @@ HPDF_MemStream_New (HPDF_MMgr mmgr, HPDF_PTRACE((" HPDF_MemStream_New\n")); - // Create new HPDF_Stream object. + /* Create new HPDF_Stream object. */ stream = (HPDF_Stream)HPDF_GetMem (mmgr, sizeof(HPDF_Stream_Rec)); if (stream) { - // Create attribute struct. + /* Create attribute struct. */ HPDF_MemStreamAttr attr = (HPDF_MemStreamAttr)HPDF_GetMem (mmgr, sizeof(HPDF_MemStreamAttr_Rec)); diff --git a/PDF/src/hpdf_string.c b/PDF/src/hpdf_string.c index ca4418376..f915093d7 100644 --- a/PDF/src/hpdf_string.c +++ b/PDF/src/hpdf_string.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- hpdf_string.h + * << Haru Free PDF Library >> -- hpdf_string.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -12,6 +15,7 @@ * */ +#include #include "hpdf_conf.h" #include "hpdf_utils.h" #include "hpdf_objects.h" @@ -70,11 +74,11 @@ HPDF_String_SetValue (HPDF_String obj, if (len > HPDF_LIMIT_MAX_STRING_LEN) return HPDF_SetError (obj->error, HPDF_STRING_OUT_OF_RANGE, 0); - obj->value = (char *)HPDF_GetMem (obj->mmgr, len + 1); + obj->value = HPDF_GetMem (obj->mmgr, len + 1); if (!obj->value) return HPDF_Error_GetCode (obj->error); - HPDF_StrCpy (obj->value, value, obj->value + len); + HPDF_StrCpy ((char *)obj->value, value, (char *)obj->value + len); obj->len = len; return ret; @@ -116,12 +120,12 @@ HPDF_String_Write (HPDF_String obj, return ret; if ((ret = HPDF_Stream_WriteBinary (stream, obj->value, - HPDF_StrLen (obj->value, -1), e)) != HPDF_OK) + HPDF_StrLen ((char *)obj->value, -1), e)) != HPDF_OK) return ret; return HPDF_Stream_WriteChar (stream, '>'); } else { - return HPDF_Stream_WriteEscapeText (stream, obj->value); + return HPDF_Stream_WriteEscapeText (stream, (char *)obj->value); } } else { HPDF_BYTE* src = obj->value; @@ -141,7 +145,7 @@ HPDF_String_Write (HPDF_String obj, HPDF_Encoder_SetParseText (obj->encoder, &parse_state, src, len); - for (i = 0; i < len; i++) { + for (i = 0; (HPDF_INT32)i < len; i++) { HPDF_BYTE b = src[i]; HPDF_UNICODE tmp_unicode; HPDF_ByteType btype = HPDF_Encoder_ByteType (obj->encoder, @@ -159,7 +163,7 @@ HPDF_String_Write (HPDF_String obj, if (btype != HPDF_BYTE_TYPE_TRIAL) { if (btype == HPDF_BYTE_TYPE_LEAD) { HPDF_BYTE b2 = src[i + 1]; - HPDF_UINT16 char_code = (HPDF_UINT) b * 256 + b2; + HPDF_UINT16 char_code = (HPDF_UINT16)((HPDF_UINT) b * 256 + b2); tmp_unicode = HPDF_Encoder_ToUnicode (obj->encoder, char_code); @@ -187,3 +191,12 @@ HPDF_String_Write (HPDF_String obj, return HPDF_OK; } + +HPDF_INT32 +HPDF_String_Cmp (HPDF_String s1, + HPDF_String s2) +{ + if (s1->len < s2->len) return -1; + if (s1->len > s2->len) return +1; + return memcmp(s1->value, s2->value, s1->len); +} diff --git a/PDF/src/hpdf_u3d.c b/PDF/src/hpdf_u3d.c new file mode 100644 index 000000000..a028f6115 --- /dev/null +++ b/PDF/src/hpdf_u3d.c @@ -0,0 +1,880 @@ +/* + * << Haru Free PDF Library >> -- hpdf_u3d.c + * + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear + * in supporting documentation. + * It is provided "as is" without express or implied warranty. + * + */ +#include "hpdf_conf.h" +#include "hpdf_utils.h" +#include "hpdf.h" + +#include + +#ifndef M_PI +/* Not defined in MSVC6 */ +#define M_PI 3.14159265358979323846 +#endif + +HPDF_U3D +HPDF_U3D_LoadU3D (HPDF_MMgr mmgr, + HPDF_Stream u3d_data, + HPDF_Xref xref); + +static const char u3d[] = "U3D"; +static const char prc[] = "PRC"; + +static HPDF_STATUS Get3DStreamType (HPDF_Stream stream, const char **type) +{ + HPDF_BYTE tag[4]; + HPDF_UINT len; + + HPDF_PTRACE ((" HPDF_U3D_Get3DStreamType\n")); + + len = 4; + if (HPDF_Stream_Read (stream, tag, &len) != HPDF_OK) { + return HPDF_Error_GetCode (stream->error); + } + + if (HPDF_Stream_Seek (stream, 0, HPDF_SEEK_SET) != HPDF_OK) { + return HPDF_Error_GetCode (stream->error); + } + + if (HPDF_MemCmp(tag, (HPDF_BYTE *)u3d, 4/* yes, \0 is required */) == 0) { + *type = u3d; + return HPDF_OK; + } + + if (HPDF_MemCmp(tag, (HPDF_BYTE *)prc, 3) == 0) { + *type = prc; + return HPDF_OK; + } + + return HPDF_INVALID_U3D_DATA; +} + + +HPDF_U3D +HPDF_U3D_LoadU3DFromMem ( HPDF_MMgr mmgr, + const HPDF_BYTE *buf, + HPDF_UINT size, + HPDF_Xref xref ) +{ + HPDF_Dict image; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_U3D_LoadU3DFromMem\n")); + + image = HPDF_DictStream_New (mmgr, xref); + if (!image) { + return NULL; + } + + image->header.obj_class |= HPDF_OSUBCLASS_XOBJECT; + ret = HPDF_Dict_AddName (image, "Type", "XObject"); + if (ret != HPDF_OK) { + HPDF_Dict_Free(image); + return NULL; + } + + ret = HPDF_Dict_AddName (image, "Subtype", "Image"); + if (ret != HPDF_OK) { + HPDF_Dict_Free(image); + return NULL; + } + + if (HPDF_Stream_Write (image->stream, buf, size) != HPDF_OK) { + HPDF_Dict_Free(image); + return NULL; + } + + return image; +} + + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadU3DFromFile (HPDF_Doc pdf, + const char *filename) +{ + HPDF_Stream imagedata; + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_LoadU3DFromFile\n")); + + if (!HPDF_HasDoc (pdf)) { + return NULL; + } + + /* create file stream */ + imagedata = HPDF_FileReader_New (pdf->mmgr, filename); + + if (HPDF_Stream_Validate (imagedata)) { + image = HPDF_U3D_LoadU3D (pdf->mmgr, imagedata, pdf->xref); + } else { + image = NULL; + } + + /* destroy file stream */ + HPDF_Stream_Free (imagedata); + + if (!image) { + HPDF_CheckError (&pdf->error); + } + return image; +} + +HPDF_EXPORT(HPDF_Image) +HPDF_LoadU3DFromMem (HPDF_Doc pdf, + const HPDF_BYTE *buffer, + HPDF_UINT size) +{ + HPDF_Stream imagedata; + HPDF_Image image; + + HPDF_PTRACE ((" HPDF_LoadU3DFromMem\n")); + + if (!HPDF_HasDoc (pdf)) { + return NULL; + } + + /* create file stream */ + imagedata = HPDF_MemStream_New (pdf->mmgr, size); + + if (!HPDF_Stream_Validate (imagedata)) { + HPDF_RaiseError (&pdf->error, HPDF_INVALID_STREAM, 0); + return NULL; + } + + if (HPDF_Stream_Write (imagedata, buffer, size) != HPDF_OK) { + HPDF_Stream_Free (imagedata); + return NULL; + } + + if (HPDF_Stream_Validate (imagedata)) { + image = HPDF_U3D_LoadU3D (pdf->mmgr, imagedata, pdf->xref); + } else { + image = NULL; + } + + /* destroy file stream */ + HPDF_Stream_Free (imagedata); + + if (!image) { + HPDF_CheckError (&pdf->error); + } + return image; +} + +HPDF_U3D +HPDF_U3D_LoadU3D (HPDF_MMgr mmgr, + HPDF_Stream u3d_data, + HPDF_Xref xref) +{ + HPDF_Dict u3d; + const char *type; + + HPDF_PTRACE ((" HPDF_U3D_LoadU3D\n")); + + u3d = HPDF_DictStream_New (mmgr, xref); + if (!u3d) { + return NULL; + } + + u3d->header.obj_class |= HPDF_OSUBCLASS_XOBJECT; + + /* add required elements */ + u3d->filter = HPDF_STREAM_FILTER_NONE; + + if (HPDF_Dict_AddName (u3d, "Type", "3D") != HPDF_OK) { + HPDF_Dict_Free(u3d); + return NULL; + } + + if (Get3DStreamType (u3d_data, &type) != HPDF_OK) { + HPDF_Dict_Free(u3d); + return NULL; + } + + if (HPDF_Dict_AddName (u3d, "Subtype", type) != HPDF_OK) { + HPDF_Dict_Free(u3d); + return NULL; + } + + for (;;) { + HPDF_BYTE buf[HPDF_STREAM_BUF_SIZ]; + HPDF_UINT len = HPDF_STREAM_BUF_SIZ; + HPDF_STATUS ret = HPDF_Stream_Read (u3d_data, buf, &len); + + if (ret != HPDF_OK) { + if (ret == HPDF_STREAM_EOF) { + if (len > 0) { + ret = HPDF_Stream_Write (u3d->stream, buf, len); + if (ret != HPDF_OK) { + HPDF_Dict_Free(u3d); + return NULL; + } + } + break; + } else { + HPDF_Dict_Free(u3d); + return NULL; + } + } + + if (HPDF_Stream_Write (u3d->stream, buf, len) != HPDF_OK) { + HPDF_Dict_Free(u3d); + return NULL; + } + } + + return u3d; +} + +HPDF_EXPORT(HPDF_Dict) HPDF_Create3DView(HPDF_MMgr mmgr, const char *name) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict view; + + HPDF_PTRACE ((" HPDF_Create3DView\n")); + + if (name == NULL || name[0] == '\0') { + return NULL; + } + + view = HPDF_Dict_New (mmgr); + if (!view) { + return NULL; + } + + ret = HPDF_Dict_AddName (view, "TYPE", "3DView"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + ret = HPDF_Dict_Add (view, "XN", HPDF_String_New (mmgr, name, NULL)); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + ret = HPDF_Dict_Add (view, "IN", HPDF_String_New (mmgr, name, NULL)); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + return view; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_Add3DView(HPDF_U3D u3d, HPDF_Dict view) +{ + HPDF_Array views = NULL; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_Add3DView\n")); + + if (u3d == NULL || view == NULL) { + return HPDF_INVALID_U3D_DATA; + } + + views = (HPDF_Array)HPDF_Dict_GetItem (u3d, "VA", HPDF_OCLASS_ARRAY); + if (views == NULL) { + views = HPDF_Array_New (u3d->mmgr); + if (!views) { + return HPDF_Error_GetCode (u3d->error); + } + + ret = HPDF_Dict_Add (u3d, "VA", views); + if (ret == HPDF_OK) { + ret = HPDF_Dict_AddNumber (u3d, "DV", 0); + } else { + HPDF_Array_Free (views); + return ret; + } + } + + if (ret == HPDF_OK) { + ret = HPDF_Array_Add( views, view); + } + + return ret; +} + + +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_AddOnInstanciate(HPDF_U3D u3d, HPDF_JavaScript javascript) +{ + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_U3D_AddOnInstanciate\n")); + + if (u3d == NULL || javascript == NULL) { + return HPDF_INVALID_U3D_DATA; + } + + ret = HPDF_Dict_Add(u3d, "OnInstantiate", javascript); + + return ret; +} + + +HPDF_EXPORT(HPDF_STATUS) HPDF_U3D_SetDefault3DView(HPDF_U3D u3d, const char *name) +{ + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_U3D_SetDefault3DView\n")); + + if (u3d == NULL || name == NULL || name[0] == '\0') { + return HPDF_INVALID_U3D_DATA; + } + + ret = HPDF_Dict_Add (u3d, "DV", HPDF_String_New (u3d->mmgr, name, NULL)); + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_AddNode(HPDF_Dict view, const char *name, HPDF_REAL opacity, HPDF_BOOL visible) +{ + HPDF_Array nodes = NULL; + HPDF_Dict node; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_3DView_AddNode\n")); + + if (view == NULL || opacity < 0 || opacity > 1 || name == NULL || name[0] == '\0') { + return HPDF_INVALID_U3D_DATA; + } + + nodes = (HPDF_Array)HPDF_Dict_GetItem (view, "NA", HPDF_OCLASS_ARRAY); + if (nodes == NULL) { + nodes = HPDF_Array_New (view->mmgr); + if (!nodes) { + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Dict_Add (view, "NA", nodes); + if (ret != HPDF_OK) { + HPDF_Array_Free (nodes); + return ret; + } + } + + node = HPDF_Dict_New (view->mmgr); + if (!node) { + HPDF_Array_Free (nodes); + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Dict_AddName (node, "Type", "3DNode"); + if (ret != HPDF_OK) { + HPDF_Array_Free (nodes); + HPDF_Dict_Free (node); + return ret; + } + + ret = HPDF_Dict_Add (node, "N", HPDF_String_New (view->mmgr, name, NULL)); + if (ret != HPDF_OK) { + HPDF_Array_Free (nodes); + HPDF_Dict_Free (node); + return ret; + } + + ret = HPDF_Dict_AddReal (node, "O", opacity); + if (ret != HPDF_OK) { + HPDF_Array_Free (nodes); + HPDF_Dict_Free (node); + return ret; + } + + ret = HPDF_Dict_AddBoolean (node, "V", visible); + if (ret != HPDF_OK) { + HPDF_Dict_Free (node); + HPDF_Array_Free (nodes); + return ret; + } + + ret = HPDF_Array_Add(nodes, node); + if (ret != HPDF_OK) { + HPDF_Dict_Free (node); + HPDF_Array_Free (nodes); + return ret; + } + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetLighting(HPDF_Dict view, const char *scheme) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict lighting; + int i; + static const char * const schemes[] = + { "Artwork", "None", "White", "Day", "Night", "Hard", "Primary", "Blue", "Red", "Cube", "CAD", "Headlamp" }; + + HPDF_PTRACE ((" HPDF_3DView_SetLighting\n")); + + if (view == NULL || scheme == NULL || scheme[0] == '\0') { + return HPDF_INVALID_U3D_DATA; + } + + for (i = 0; i < 12; i++) { + if (!strcmp(scheme, schemes[i])) { + break; + } + } + + if (i == 12) { + return HPDF_INVALID_U3D_DATA; + } + + lighting = HPDF_Dict_New (view->mmgr); + if (!lighting) { + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Dict_AddName (lighting, "Type", "3DLightingScheme"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (lighting); + return ret; + } + + ret = HPDF_Dict_AddName (lighting, "Subtype", scheme); + if (ret != HPDF_OK) { + HPDF_Dict_Free (lighting); + return ret; + } + + ret = HPDF_Dict_Add (view, "LS", lighting); + if (ret != HPDF_OK) { + HPDF_Dict_Free (lighting); + return ret; + } + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetBackgroundColor(HPDF_Dict view, HPDF_REAL r, HPDF_REAL g, HPDF_REAL b) +{ + HPDF_Array color; + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict background; + + HPDF_PTRACE ((" HPDF_3DView_SetBackgroundColor\n")); + + if (view == NULL || r < 0 || r > 1 || g < 0 || g > 1 || b < 0 || b > 1) { + return HPDF_INVALID_U3D_DATA; + } + + background = HPDF_Dict_New (view->mmgr); + if (!background) { + return HPDF_Error_GetCode (view->error); + } + + color = HPDF_Array_New (view->mmgr); + if (!color) { + HPDF_Dict_Free (background); + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Array_AddReal (color, r); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + + ret = HPDF_Array_AddReal (color, g); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + + ret = HPDF_Array_AddReal (color, b); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + + + ret = HPDF_Dict_AddName (background, "Type", "3DBG"); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + + ret = HPDF_Dict_Add (background, "C", color); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + + ret = HPDF_Dict_Add (view, "BG", background); + if (ret != HPDF_OK) { + HPDF_Array_Free (color); + HPDF_Dict_Free (background); + return ret; + } + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetPerspectiveProjection(HPDF_Dict view, HPDF_REAL fov) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict projection; + + HPDF_PTRACE ((" HPDF_3DView_SetPerspectiveProjection\n")); + + if (view == NULL || fov < 0 || fov > 180) { + return HPDF_INVALID_U3D_DATA; + } + + projection = HPDF_Dict_New (view->mmgr); + if (!projection) { + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Dict_AddName (projection, "Subtype", "P"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + + ret = HPDF_Dict_AddName (projection, "PS", "Min"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + + ret = HPDF_Dict_AddReal (projection, "FOV", fov); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + + ret = HPDF_Dict_Add (view, "P", projection); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + return ret; +} + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetOrthogonalProjection(HPDF_Dict view, HPDF_REAL mag) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict projection; + + HPDF_PTRACE ((" HPDF_3DView_SetOrthogonalProjection\n")); + + if (view == NULL || mag <= 0) { + return HPDF_INVALID_U3D_DATA; + } + + projection = HPDF_Dict_New (view->mmgr); + if (!projection) { + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Dict_AddName (projection, "Subtype", "O"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + + ret = HPDF_Dict_AddReal (projection, "OS", mag); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + + ret = HPDF_Dict_Add (view, "P", projection); + if (ret != HPDF_OK) { + HPDF_Dict_Free (projection); + return ret; + } + return ret; +} + +#define normalize(x, y, z) \ +{ \ + HPDF_REAL modulo; \ + modulo = (float)sqrt((float)(x*x) + (float)(y*y) + (float)(z*z)); \ + if (modulo != 0.0) \ + { \ + x = x/modulo; \ + y = y/modulo; \ + z = z/modulo; \ + } \ +} + +/* building the transformation matrix*/ +/* #1,#2,#3 centre of orbit coordinates (coo)*/ +/* #4,#5,#6 centre of orbit to camera direction vector (c2c)*/ +/* #7 orbital radius (roo)*/ +/* #8 camera roll (roll)*/ + +HPDF_EXPORT(HPDF_STATUS) HPDF_3DView_SetCamera(HPDF_Dict view, HPDF_REAL coox, HPDF_REAL cooy, HPDF_REAL cooz, HPDF_REAL c2cx, HPDF_REAL c2cy, HPDF_REAL c2cz, HPDF_REAL roo, HPDF_REAL roll) +{ + HPDF_REAL viewx, viewy, viewz; + HPDF_REAL leftx, lefty, leftz; + HPDF_REAL upx, upy, upz; + HPDF_REAL transx, transy, transz; + + HPDF_Array matrix; + HPDF_STATUS ret = HPDF_OK; + + HPDF_PTRACE ((" HPDF_3DView_SetCamera\n")); + + if (view == NULL) { + return HPDF_INVALID_U3D_DATA; + } + + /* view vector (opposite to c2c) */ + viewx = -c2cx; + viewy = -c2cy; + viewz = -c2cz; + + /* c2c = (0, -1, 0) by default */ + if (viewx == 0.0 && viewy == 0.0 && viewz == 0.0) { + viewy = 1.0; + } + /* normalize view vector */ + normalize(viewx, viewy, viewz); + + /* rotation matrix */ + + /* top and bottom views */ + leftx = -1.0f; + lefty = 0.0f; + leftz = 0.0f; + + /* up-vector */ + if (viewz < 0.0) /* top view*/ + { + upx = 0.0f; + upy = 1.0f; + upz = 0.0f; + } + else /* bottom view*/ + { + upx = 0.0f; + upy =-1.0f; + upz = 0.0f; + } + + if ( fabs(viewx) + fabs(viewy) != 0.0f) /* other views than top and bottom*/ + { + /* up-vector = up_world - (up_world dot view) view*/ + upx = -viewz*viewx; + upy = -viewz*viewy; + upz = -viewz*viewz + 1.0f; + /* normalize up-vector*/ + normalize(upx, upy, upz); + /* left vector = up x view*/ + leftx = viewz*upy - viewy*upz; + lefty = viewx*upz - viewz*upx; + leftz = viewy*upx - viewx*upy; + /* normalize left vector*/ + normalize(leftx, lefty, leftz); + } + /* apply camera roll*/ + { + HPDF_REAL leftxprime, leftyprime, leftzprime; + HPDF_REAL upxprime, upyprime, upzprime; + HPDF_REAL sinroll, cosroll; + + sinroll = (HPDF_REAL)sin((roll/180.0f)*M_PI); + cosroll = (HPDF_REAL)cos((roll/180.0f)*M_PI); + leftxprime = leftx*cosroll + upx*sinroll; + leftyprime = lefty*cosroll + upy*sinroll; + leftzprime = leftz*cosroll + upz*sinroll; + upxprime = upx*cosroll + leftx*sinroll; + upyprime = upy*cosroll + lefty*sinroll; + upzprime = upz*cosroll + leftz*sinroll; + leftx = leftxprime; + lefty = leftyprime; + leftz = leftzprime; + upx = upxprime; + upy = upyprime; + upz = upzprime; + } + + /* translation vector*/ + roo = (HPDF_REAL)fabs(roo); + if (roo == 0.0) { + roo = (HPDF_REAL)0.000000000000000001; + } + transx = coox - roo*viewx; + transy = cooy - roo*viewy; + transz = cooz - roo*viewz; + + /* transformation matrix*/ + matrix = HPDF_Array_New (view->mmgr); + if (!matrix) { + return HPDF_Error_GetCode (view->error); + } + + ret = HPDF_Array_AddReal (matrix, leftx); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, lefty); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, leftz); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, upx); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, upy); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, upz); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, viewx); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, viewy); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, viewz); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, transx); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, transy); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Array_AddReal (matrix, transz); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Dict_AddName (view, "MS", "M"); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Dict_Add (view, "C2W", matrix); + if (ret != HPDF_OK) goto failed; + + ret = HPDF_Dict_AddNumber (view, "CO", (HPDF_INT32)roo); + +failed: + if (ret != HPDF_OK) { + HPDF_Array_Free (matrix); + return ret; + } + return ret; +} + +HPDF_Dict HPDF_3DView_New( HPDF_MMgr mmgr, HPDF_Xref xref, HPDF_U3D u3d, const char *name) +{ + HPDF_STATUS ret = HPDF_OK; + HPDF_Dict view; + + HPDF_PTRACE ((" HPDF_3DView_New\n")); + + if (name == NULL || name[0] == '\0') { + return NULL; + } + + view = HPDF_Dict_New (mmgr); + if (!view) { + return NULL; + } + + if (HPDF_Xref_Add (xref, view) != HPDF_OK) + return NULL; + + ret = HPDF_Dict_AddName (view, "TYPE", "3DView"); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + ret = HPDF_Dict_Add (view, "XN", HPDF_String_New (mmgr, name, NULL)); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + ret = HPDF_Dict_Add (view, "IN", HPDF_String_New (mmgr, name, NULL)); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + ret = HPDF_U3D_Add3DView( u3d, view); + if (ret != HPDF_OK) { + HPDF_Dict_Free (view); + return NULL; + } + + return view; +} + + +HPDF_EXPORT(HPDF_STATUS) +HPDF_3DView_Add3DC3DMeasure(HPDF_Dict view, + HPDF_3DMeasure measure) +{ + + HPDF_STATUS ret = HPDF_OK; + HPDF_Array array; + void* a; + + a = HPDF_Dict_GetItem (view, "MA", HPDF_OCLASS_ARRAY); + + if ( a ) + { + array = (HPDF_Array)a; + } + else + { + array = HPDF_Array_New (view->mmgr); + if (!array) + return 0; + + if (HPDF_Dict_Add (view, "MA", array) != HPDF_OK) + return 0; + } + + ret = HPDF_Array_Add(array, measure); + + return ret; +} + + +HPDF_EXPORT(HPDF_JavaScript) HPDF_CreateJavaScript( HPDF_Doc pdf, const char *code ) +{ + HPDF_JavaScript javaScript; + int len ; + + HPDF_PTRACE ((" HPDF_CreateJavaScript\n")); + + javaScript = (HPDF_JavaScript) HPDF_DictStream_New(pdf->mmgr, pdf->xref); + if (!javaScript) { + return NULL; + } + + len = (HPDF_UINT)strlen(code); + if (HPDF_Stream_Write (javaScript->stream, (HPDF_BYTE *)code, len) != HPDF_OK) { + HPDF_Dict_Free(javaScript); + return NULL; + } + + return javaScript; +} + + +#undef normalize + diff --git a/PDF/src/hpdf_utils.c b/PDF/src/hpdf_utils.c index ec28b5244..728da5a8b 100644 --- a/PDF/src/hpdf_utils.c +++ b/PDF/src/hpdf_utils.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.0 >> -- HPDF_utils.c + * << Haru Free PDF Library >> -- hpdf_utils.c * - * Copyright (c) 1999-2004 Takeshi Kanno + * URL: http://libharu.org + * + * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -24,6 +27,10 @@ HPDF_AToI (const char *s) HPDF_BOOL flg = HPDF_FALSE; HPDF_INT v = 0; + if (!s) { + return 0; + } + /* increment pointer until the charactor of 's' is not * white-space-charactor. */ @@ -129,7 +136,7 @@ HPDF_IToA (char *s, *t-- = 0; while (val > 0) { - *t = (char)(val % 10) + '0'; + *t = (char)((char)(val % 10) + '0'); val /= 10; t--; } @@ -158,7 +165,7 @@ HPDF_IToA2 (char *s, *u = 0; t = u - 1; while (val > 0 && t >= s) { - *t = (char)(val % 10) + '0'; + *t = (char)((char)(val % 10) + '0'); val /= 10; t--; } @@ -202,7 +209,7 @@ HPDF_FToA (char *s, /* process decimal part */ for (i = 0; i < 5; i++) { - *t = (char)(fpart_val % 10) + '0'; + *t = (char)((char)(fpart_val % 10) + '0'); fpart_val /= 10; t--; } @@ -214,7 +221,7 @@ HPDF_FToA (char *s, t--; while (int_val > 0) { - *t = (char)(int_val % 10) + '0'; + *t = (char)((char)(int_val % 10) + '0'); int_val /= 10; t--; } @@ -266,7 +273,7 @@ HPDF_StrCpy (char *out, *out = 0; - return out; + return (HPDF_BYTE *)out; } @@ -370,7 +377,7 @@ HPDF_StrStr (const char *s1, maxlen++; while (maxlen > 0) { - if (HPDF_MemCmp (s1, s2, len) == 0) + if (HPDF_MemCmp ((HPDF_BYTE *)s1, (HPDF_BYTE *)s2, len) == 0) return s1; s1++; diff --git a/PDF/src/hpdf_xref.c b/PDF/src/hpdf_xref.c index 19ff93563..8a88ca57f 100644 --- a/PDF/src/hpdf_xref.c +++ b/PDF/src/hpdf_xref.c @@ -1,7 +1,10 @@ /* - * << Haru Free PDF Library 2.0.3 >> -- hpdf_xref.h + * << Haru Free PDF Library >> -- hpdf_xref.c + * + * URL: http://libharu.org * * Copyright (c) 1999-2006 Takeshi Kanno + * Copyright (c) 2007-2009 Antony Dovgal * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, @@ -276,7 +279,7 @@ HPDF_Xref_WriteToStream (HPDF_Xref xref, tmp_xref->addr = stream->size; pbuf = buf; - pbuf = HPDF_StrCpy (pbuf, "xref\012", eptr); + pbuf = (char *)HPDF_StrCpy (pbuf, "xref\012", eptr); pbuf = HPDF_IToA (pbuf, tmp_xref->start_offset, eptr); *pbuf++ = ' '; pbuf = HPDF_IToA (pbuf, tmp_xref->entries->count, eptr); @@ -295,7 +298,7 @@ HPDF_Xref_WriteToStream (HPDF_Xref xref, pbuf = HPDF_IToA2 (pbuf, entry->gen_no, HPDF_GEN_NO_LEN + 1); *pbuf++ = ' '; *pbuf++ = entry->entry_typ; - HPDF_StrCpy (pbuf, "\015\012", eptr); + HPDF_StrCpy (pbuf, "\015\012", eptr); /* Acrobat 8.15 requires both \r and \n here */ ret = HPDF_Stream_WriteStr (stream, buf); if (ret != HPDF_OK) return ret; diff --git a/PDF/src/t4.h b/PDF/src/t4.h new file mode 100644 index 000000000..f306e155d --- /dev/null +++ b/PDF/src/t4.h @@ -0,0 +1,285 @@ +/* $Id: t4.h,v 1.20 2007/11/10 18:40:44 drolon Exp $ */ + +/* + * Copyright (c) 1988-1997 Sam Leffler + * Copyright (c) 1991-1997 Silicon Graphics, Inc. + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation for any purpose is hereby granted without fee, provided + * that (i) the above copyright notices and this permission notice appear in + * all copies of the software and related documentation, and (ii) the names of + * Sam Leffler and Silicon Graphics may not be used in any advertising or + * publicity relating to the software without the specific, prior written + * permission of Sam Leffler and Silicon Graphics. + * + * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * + * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR + * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, + * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF + * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE + * OF THIS SOFTWARE. + */ + +#ifndef _T4_ +#define _T4_ +/* + * CCITT T.4 1D Huffman runlength codes and + * related definitions. Given the small sizes + * of these tables it does not seem + * worthwhile to make code & length 8 bits. + */ +typedef struct tableentry { + unsigned short length; /* bit length of g3 code */ + unsigned short code; /* g3 code */ + short runlen; /* run length in bits */ +} tableentry; + +#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ + +/* status values returned instead of a run length */ +#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ +#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ +#define G3CODE_EOF -3 /* end of input data */ +#define G3CODE_INCOMP -4 /* incomplete run code */ + +/* + * Note that these tables are ordered such that the + * index into the table is known to be either the + * run length, or (run length / 64) + a fixed offset. + * + * NB: The G3CODE_INVALID entries are only used + * during state generation (see mkg3states.c). + */ +#ifdef G3CODES +const tableentry TIFFFaxWhiteCodes[] = { + { 8, 0x35, 0 }, /* 0011 0101 */ + { 6, 0x7, 1 }, /* 0001 11 */ + { 4, 0x7, 2 }, /* 0111 */ + { 4, 0x8, 3 }, /* 1000 */ + { 4, 0xB, 4 }, /* 1011 */ + { 4, 0xC, 5 }, /* 1100 */ + { 4, 0xE, 6 }, /* 1110 */ + { 4, 0xF, 7 }, /* 1111 */ + { 5, 0x13, 8 }, /* 1001 1 */ + { 5, 0x14, 9 }, /* 1010 0 */ + { 5, 0x7, 10 }, /* 0011 1 */ + { 5, 0x8, 11 }, /* 0100 0 */ + { 6, 0x8, 12 }, /* 0010 00 */ + { 6, 0x3, 13 }, /* 0000 11 */ + { 6, 0x34, 14 }, /* 1101 00 */ + { 6, 0x35, 15 }, /* 1101 01 */ + { 6, 0x2A, 16 }, /* 1010 10 */ + { 6, 0x2B, 17 }, /* 1010 11 */ + { 7, 0x27, 18 }, /* 0100 111 */ + { 7, 0xC, 19 }, /* 0001 100 */ + { 7, 0x8, 20 }, /* 0001 000 */ + { 7, 0x17, 21 }, /* 0010 111 */ + { 7, 0x3, 22 }, /* 0000 011 */ + { 7, 0x4, 23 }, /* 0000 100 */ + { 7, 0x28, 24 }, /* 0101 000 */ + { 7, 0x2B, 25 }, /* 0101 011 */ + { 7, 0x13, 26 }, /* 0010 011 */ + { 7, 0x24, 27 }, /* 0100 100 */ + { 7, 0x18, 28 }, /* 0011 000 */ + { 8, 0x2, 29 }, /* 0000 0010 */ + { 8, 0x3, 30 }, /* 0000 0011 */ + { 8, 0x1A, 31 }, /* 0001 1010 */ + { 8, 0x1B, 32 }, /* 0001 1011 */ + { 8, 0x12, 33 }, /* 0001 0010 */ + { 8, 0x13, 34 }, /* 0001 0011 */ + { 8, 0x14, 35 }, /* 0001 0100 */ + { 8, 0x15, 36 }, /* 0001 0101 */ + { 8, 0x16, 37 }, /* 0001 0110 */ + { 8, 0x17, 38 }, /* 0001 0111 */ + { 8, 0x28, 39 }, /* 0010 1000 */ + { 8, 0x29, 40 }, /* 0010 1001 */ + { 8, 0x2A, 41 }, /* 0010 1010 */ + { 8, 0x2B, 42 }, /* 0010 1011 */ + { 8, 0x2C, 43 }, /* 0010 1100 */ + { 8, 0x2D, 44 }, /* 0010 1101 */ + { 8, 0x4, 45 }, /* 0000 0100 */ + { 8, 0x5, 46 }, /* 0000 0101 */ + { 8, 0xA, 47 }, /* 0000 1010 */ + { 8, 0xB, 48 }, /* 0000 1011 */ + { 8, 0x52, 49 }, /* 0101 0010 */ + { 8, 0x53, 50 }, /* 0101 0011 */ + { 8, 0x54, 51 }, /* 0101 0100 */ + { 8, 0x55, 52 }, /* 0101 0101 */ + { 8, 0x24, 53 }, /* 0010 0100 */ + { 8, 0x25, 54 }, /* 0010 0101 */ + { 8, 0x58, 55 }, /* 0101 1000 */ + { 8, 0x59, 56 }, /* 0101 1001 */ + { 8, 0x5A, 57 }, /* 0101 1010 */ + { 8, 0x5B, 58 }, /* 0101 1011 */ + { 8, 0x4A, 59 }, /* 0100 1010 */ + { 8, 0x4B, 60 }, /* 0100 1011 */ + { 8, 0x32, 61 }, /* 0011 0010 */ + { 8, 0x33, 62 }, /* 0011 0011 */ + { 8, 0x34, 63 }, /* 0011 0100 */ + { 5, 0x1B, 64 }, /* 1101 1 */ + { 5, 0x12, 128 }, /* 1001 0 */ + { 6, 0x17, 192 }, /* 0101 11 */ + { 7, 0x37, 256 }, /* 0110 111 */ + { 8, 0x36, 320 }, /* 0011 0110 */ + { 8, 0x37, 384 }, /* 0011 0111 */ + { 8, 0x64, 448 }, /* 0110 0100 */ + { 8, 0x65, 512 }, /* 0110 0101 */ + { 8, 0x68, 576 }, /* 0110 1000 */ + { 8, 0x67, 640 }, /* 0110 0111 */ + { 9, 0xCC, 704 }, /* 0110 0110 0 */ + { 9, 0xCD, 768 }, /* 0110 0110 1 */ + { 9, 0xD2, 832 }, /* 0110 1001 0 */ + { 9, 0xD3, 896 }, /* 0110 1001 1 */ + { 9, 0xD4, 960 }, /* 0110 1010 0 */ + { 9, 0xD5, 1024 }, /* 0110 1010 1 */ + { 9, 0xD6, 1088 }, /* 0110 1011 0 */ + { 9, 0xD7, 1152 }, /* 0110 1011 1 */ + { 9, 0xD8, 1216 }, /* 0110 1100 0 */ + { 9, 0xD9, 1280 }, /* 0110 1100 1 */ + { 9, 0xDA, 1344 }, /* 0110 1101 0 */ + { 9, 0xDB, 1408 }, /* 0110 1101 1 */ + { 9, 0x98, 1472 }, /* 0100 1100 0 */ + { 9, 0x99, 1536 }, /* 0100 1100 1 */ + { 9, 0x9A, 1600 }, /* 0100 1101 0 */ + { 6, 0x18, 1664 }, /* 0110 00 */ + { 9, 0x9B, 1728 }, /* 0100 1101 1 */ + { 11, 0x8, 1792 }, /* 0000 0001 000 */ + { 11, 0xC, 1856 }, /* 0000 0001 100 */ + { 11, 0xD, 1920 }, /* 0000 0001 101 */ + { 12, 0x12, 1984 }, /* 0000 0001 0010 */ + { 12, 0x13, 2048 }, /* 0000 0001 0011 */ + { 12, 0x14, 2112 }, /* 0000 0001 0100 */ + { 12, 0x15, 2176 }, /* 0000 0001 0101 */ + { 12, 0x16, 2240 }, /* 0000 0001 0110 */ + { 12, 0x17, 2304 }, /* 0000 0001 0111 */ + { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ + { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ + { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ + { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ + { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ + { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ + { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ + { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ + { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ +}; + +const tableentry TIFFFaxBlackCodes[] = { + { 10, 0x37, 0 }, /* 0000 1101 11 */ + { 3, 0x2, 1 }, /* 010 */ + { 2, 0x3, 2 }, /* 11 */ + { 2, 0x2, 3 }, /* 10 */ + { 3, 0x3, 4 }, /* 011 */ + { 4, 0x3, 5 }, /* 0011 */ + { 4, 0x2, 6 }, /* 0010 */ + { 5, 0x3, 7 }, /* 0001 1 */ + { 6, 0x5, 8 }, /* 0001 01 */ + { 6, 0x4, 9 }, /* 0001 00 */ + { 7, 0x4, 10 }, /* 0000 100 */ + { 7, 0x5, 11 }, /* 0000 101 */ + { 7, 0x7, 12 }, /* 0000 111 */ + { 8, 0x4, 13 }, /* 0000 0100 */ + { 8, 0x7, 14 }, /* 0000 0111 */ + { 9, 0x18, 15 }, /* 0000 1100 0 */ + { 10, 0x17, 16 }, /* 0000 0101 11 */ + { 10, 0x18, 17 }, /* 0000 0110 00 */ + { 10, 0x8, 18 }, /* 0000 0010 00 */ + { 11, 0x67, 19 }, /* 0000 1100 111 */ + { 11, 0x68, 20 }, /* 0000 1101 000 */ + { 11, 0x6C, 21 }, /* 0000 1101 100 */ + { 11, 0x37, 22 }, /* 0000 0110 111 */ + { 11, 0x28, 23 }, /* 0000 0101 000 */ + { 11, 0x17, 24 }, /* 0000 0010 111 */ + { 11, 0x18, 25 }, /* 0000 0011 000 */ + { 12, 0xCA, 26 }, /* 0000 1100 1010 */ + { 12, 0xCB, 27 }, /* 0000 1100 1011 */ + { 12, 0xCC, 28 }, /* 0000 1100 1100 */ + { 12, 0xCD, 29 }, /* 0000 1100 1101 */ + { 12, 0x68, 30 }, /* 0000 0110 1000 */ + { 12, 0x69, 31 }, /* 0000 0110 1001 */ + { 12, 0x6A, 32 }, /* 0000 0110 1010 */ + { 12, 0x6B, 33 }, /* 0000 0110 1011 */ + { 12, 0xD2, 34 }, /* 0000 1101 0010 */ + { 12, 0xD3, 35 }, /* 0000 1101 0011 */ + { 12, 0xD4, 36 }, /* 0000 1101 0100 */ + { 12, 0xD5, 37 }, /* 0000 1101 0101 */ + { 12, 0xD6, 38 }, /* 0000 1101 0110 */ + { 12, 0xD7, 39 }, /* 0000 1101 0111 */ + { 12, 0x6C, 40 }, /* 0000 0110 1100 */ + { 12, 0x6D, 41 }, /* 0000 0110 1101 */ + { 12, 0xDA, 42 }, /* 0000 1101 1010 */ + { 12, 0xDB, 43 }, /* 0000 1101 1011 */ + { 12, 0x54, 44 }, /* 0000 0101 0100 */ + { 12, 0x55, 45 }, /* 0000 0101 0101 */ + { 12, 0x56, 46 }, /* 0000 0101 0110 */ + { 12, 0x57, 47 }, /* 0000 0101 0111 */ + { 12, 0x64, 48 }, /* 0000 0110 0100 */ + { 12, 0x65, 49 }, /* 0000 0110 0101 */ + { 12, 0x52, 50 }, /* 0000 0101 0010 */ + { 12, 0x53, 51 }, /* 0000 0101 0011 */ + { 12, 0x24, 52 }, /* 0000 0010 0100 */ + { 12, 0x37, 53 }, /* 0000 0011 0111 */ + { 12, 0x38, 54 }, /* 0000 0011 1000 */ + { 12, 0x27, 55 }, /* 0000 0010 0111 */ + { 12, 0x28, 56 }, /* 0000 0010 1000 */ + { 12, 0x58, 57 }, /* 0000 0101 1000 */ + { 12, 0x59, 58 }, /* 0000 0101 1001 */ + { 12, 0x2B, 59 }, /* 0000 0010 1011 */ + { 12, 0x2C, 60 }, /* 0000 0010 1100 */ + { 12, 0x5A, 61 }, /* 0000 0101 1010 */ + { 12, 0x66, 62 }, /* 0000 0110 0110 */ + { 12, 0x67, 63 }, /* 0000 0110 0111 */ + { 10, 0xF, 64 }, /* 0000 0011 11 */ + { 12, 0xC8, 128 }, /* 0000 1100 1000 */ + { 12, 0xC9, 192 }, /* 0000 1100 1001 */ + { 12, 0x5B, 256 }, /* 0000 0101 1011 */ + { 12, 0x33, 320 }, /* 0000 0011 0011 */ + { 12, 0x34, 384 }, /* 0000 0011 0100 */ + { 12, 0x35, 448 }, /* 0000 0011 0101 */ + { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ + { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ + { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ + { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ + { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ + { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ + { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ + { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ + { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ + { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ + { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ + { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ + { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ + { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ + { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ + { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ + { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ + { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ + { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ + { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ + { 11, 0x8, 1792 }, /* 0000 0001 000 */ + { 11, 0xC, 1856 }, /* 0000 0001 100 */ + { 11, 0xD, 1920 }, /* 0000 0001 101 */ + { 12, 0x12, 1984 }, /* 0000 0001 0010 */ + { 12, 0x13, 2048 }, /* 0000 0001 0011 */ + { 12, 0x14, 2112 }, /* 0000 0001 0100 */ + { 12, 0x15, 2176 }, /* 0000 0001 0101 */ + { 12, 0x16, 2240 }, /* 0000 0001 0110 */ + { 12, 0x17, 2304 }, /* 0000 0001 0111 */ + { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ + { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ + { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ + { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ + { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ + { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ + { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ + { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ + { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ +}; +#else +extern const tableentry TIFFFaxWhiteCodes[]; +extern const tableentry TIFFFaxBlackCodes[]; +#endif +#endif /* _T4_ */