From bb044f6f954b407f4272097ede46c92846422a71 Mon Sep 17 00:00:00 2001 From: Alex Fabijanic Date: Tue, 19 Dec 2017 12:13:03 +0100 Subject: [PATCH] move upgraded PDF from 1.8 --- PDF/CMakeLists.txt | 4 +- PDF/Makefile | 12 +- PDF/PDF.progen | 16 - PDF/PDF_vs140.vcxproj | 15 +- PDF/PDF_vs140.vcxproj.filters | 63 +- PDF/PDF_vs150.vcxproj | 15 +- PDF/PDF_vs150.vcxproj.filters | 63 +- PDF/PDF_x64_vs140.vcxproj | 15 +- PDF/PDF_x64_vs140.vcxproj.filters | 63 +- PDF/PDF_x64_vs150.vcxproj | 15 +- PDF/PDF_x64_vs150.vcxproj.filters | 63 +- PDF/build.gradle | 39 + PDF/include/Poco/PDF/Destination.h | 4 +- PDF/include/Poco/PDF/Document.h | 68 +- PDF/include/Poco/PDF/Encoder.h | 6 +- PDF/include/Poco/PDF/Font.h | 4 +- PDF/include/Poco/PDF/PDF.h | 2 +- PDF/include/Poco/PDF/Page.h | 75 +- PDF/include/Poco/PDF/Resource.h | 4 +- PDF/include/Poco/PDF/deflate.h | 2 +- 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 | 7 +- PDF/include/Poco/PDF/hpdf_font.h | 7 +- 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 | 7 +- PDF/include/Poco/PDF/hpdf_pdfa.h | 43 + PDF/include/Poco/PDF/hpdf_streams.h | 10 +- PDF/include/Poco/PDF/hpdf_types.h | 87 +- 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/include/Poco/PDF/png.h | 8 +- PDF/include/Poco/PDF/pngconf.h | 28 +- PDF/samples/Image/Image.pdf | Bin 0 -> 4367 bytes PDF/samples/Image/Image.progen | 10 - PDF/samples/Image/Image_vs140.vcxproj.filters | 4 +- PDF/samples/Image/Image_vs150.vcxproj.filters | 4 +- .../Image/Image_x64_vs140.vcxproj.filters | 4 +- .../Image/Image_x64_vs150.vcxproj.filters | 4 +- PDF/samples/Image/src/Image.cpp | 13 +- PDF/samples/Text/DejaVuLGCSans.ttf | Bin 0 -> 488968 bytes PDF/samples/Text/Text.pdf | Bin 0 -> 63197 bytes PDF/samples/Text/Text.progen | 10 - PDF/samples/Text/Text_vs140.vcxproj.filters | 4 +- PDF/samples/Text/Text_vs150.vcxproj.filters | 4 +- .../Text/Text_x64_vs140.vcxproj.filters | 4 +- .../Text/Text_x64_vs150.vcxproj.filters | 4 +- PDF/samples/Text/src/Text.cpp | 23 +- PDF/samples/build.gradle | 34 + PDF/samples/samples.progen | 6 - PDF/src/Destination.cpp | 2 +- PDF/src/Document.cpp | 50 +- PDF/src/Encoder.cpp | 2 +- PDF/src/Font.cpp | 2 +- PDF/src/Image.cpp | 2 +- PDF/src/LinkAnnotation.cpp | 2 +- PDF/src/Outline.cpp | 2 +- PDF/src/PDFException.cpp | 38 +- PDF/src/Page.cpp | 78 +- PDF/src/TextAnnotation.cpp | 2 +- PDF/src/gzio.c | 4 +- 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 | 93 +- 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 | 31 +- 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 | 54 +- 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 | 513 +++++++++- PDF/src/hpdf_pdfa.c | 386 ++++++++ PDF/src/hpdf_real.c | 5 +- PDF/src/hpdf_streams.c | 109 ++- PDF/src/hpdf_string.c | 27 +- PDF/src/hpdf_u3d.c | 880 ++++++++++++++++++ PDF/src/hpdf_utils.c | 27 +- PDF/src/hpdf_xref.c | 15 +- PDF/src/pngget.c | 2 +- PDF/src/pngmem.c | 4 +- PDF/src/pngpread.c | 2 +- PDF/src/pngrtran.c | 4 +- PDF/src/pngrutil.c | 2 +- PDF/src/pngset.c | 4 +- PDF/src/pngtest.c | 2 +- PDF/src/pngwutil.c | 2 +- PDF/src/t4.h | 285 ++++++ PDF/testsuite/CMakeLists.txt | 2 +- PDF/testsuite/Makefile | 2 +- PDF/testsuite/TestSuite.progen | 9 - PDF/testsuite/TestSuite_vs140.vcxproj | 12 +- PDF/testsuite/TestSuite_vs140.vcxproj.filters | 16 +- PDF/testsuite/TestSuite_vs150.vcxproj | 12 +- PDF/testsuite/TestSuite_vs150.vcxproj.filters | 16 +- PDF/testsuite/TestSuite_x64_vs140.vcxproj | 12 +- .../TestSuite_x64_vs140.vcxproj.filters | 16 +- PDF/testsuite/TestSuite_x64_vs150.vcxproj | 12 +- .../TestSuite_x64_vs150.vcxproj.filters | 16 +- PDF/testsuite/build.gradle | 61 ++ PDF/testsuite/src/Driver.cpp | 2 +- PDF/testsuite/src/PDFTest.cpp | 4 +- PDF/testsuite/src/PDFTest.h | 2 +- PDF/testsuite/src/PDFTestSuite.h | 2 +- 165 files changed, 8195 insertions(+), 1287 deletions(-) delete mode 100644 PDF/PDF.progen create mode 100644 PDF/build.gradle 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 delete mode 100644 PDF/samples/Image/Image.progen create mode 100644 PDF/samples/Text/DejaVuLGCSans.ttf create mode 100644 PDF/samples/Text/Text.pdf delete mode 100644 PDF/samples/Text/Text.progen create mode 100644 PDF/samples/build.gradle delete mode 100644 PDF/samples/samples.progen 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 delete mode 100644 PDF/testsuite/TestSuite.progen create mode 100644 PDF/testsuite/build.gradle diff --git a/PDF/CMakeLists.txt b/PDF/CMakeLists.txt index 876dd0986..3ecb9574a 100644 --- a/PDF/CMakeLists.txt +++ b/PDF/CMakeLists.txt @@ -136,9 +136,7 @@ POCO_INSTALL("${LIBNAME}") POCO_GENERATE_PACKAGE("${LIBNAME}") if (ENABLE_TESTS) + add_subdirectory(samples) add_subdirectory(testsuite) endif () -if (ENABLE_SAMPLES) - add_subdirectory(samples) -endif () diff --git a/PDF/Makefile b/PDF/Makefile index 24f5796be..250d01310 100644 --- a/PDF/Makefile +++ b/PDF/Makefile @@ -10,17 +10,17 @@ INCLUDE += -I $(POCO_BASE)/PDF/include/Poco/PDF objects = Destination Document Encoder Font Image Outline \ LinkAnnotation Page PDFException TextAnnotation \ - hpdf_annotation hpdf_array hpdf_binary hpdf_boolean \ + hpdf_3dmeasure hpdf_annotation hpdf_array hpdf_binary hpdf_boolean \ hpdf_catalog hpdf_destination hpdf_dict hpdf_doc hpdf_doc_png \ hpdf_encoder hpdf_encoder_cns hpdf_encoder_cnt hpdf_encoder_jp \ - hpdf_encoder_kr hpdf_encrypt hpdf_encryptdict hpdf_error \ - hpdf_ext_gstate hpdf_font hpdf_font_cid hpdf_font_tt \ + hpdf_encoder_kr hpdf_encoder_utf hpdf_encrypt hpdf_encryptdict hpdf_error \ + hpdf_exdata hpdf_ext_gstate hpdf_font hpdf_font_cid hpdf_font_tt \ hpdf_font_type1 hpdf_fontdef hpdf_fontdef_base14 hpdf_fontdef_cid \ hpdf_fontdef_cns hpdf_fontdef_cnt hpdf_fontdef_jp hpdf_fontdef_kr \ - hpdf_fontdef_tt hpdf_fontdef_type1 hpdf_gstate hpdf_image \ - hpdf_image_png hpdf_info hpdf_list hpdf_mmgr hpdf_name hpdf_null \ + hpdf_fontdef_tt hpdf_fontdef_type1 hpdf_gstate hpdf_image hpdf_image_ccitt \ + hpdf_image_png hpdf_info hpdf_list hpdf_mmgr hpdf_name hpdf_namedict hpdf_null \ hpdf_number hpdf_objects hpdf_outline hpdf_page_label hpdf_page_operator \ - hpdf_pages hpdf_real hpdf_streams hpdf_string hpdf_utils hpdf_xref \ + hpdf_pages hpdf_pdfa hpdf_real hpdf_streams hpdf_string hpdf_u3d hpdf_utils hpdf_xref \ adler32 compress crc32 deflate gzio \ infback inffast inflate inftrees trees zutil \ png pngerror pnggccrd pngget pngmem pngpread \ diff --git a/PDF/PDF.progen b/PDF/PDF.progen deleted file mode 100644 index 6c71e3a49..000000000 --- a/PDF/PDF.progen +++ /dev/null @@ -1,16 +0,0 @@ -vc.project.guid = E12E5C71-79A4-495A-848F-F1710111E610 -vc.project.name = PDF -vc.project.target = Poco${vc.project.name} -vc.project.type = library -vc.project.pocobase = .. -vc.project.outdir = ${vc.project.pocobase} -vc.project.platforms = Win32, x64 -vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md -vc.project.prototype = ${vc.project.name}_vs90.vcproj -vc.project.compiler.include = .\\include\\Poco\\PDF;..\\Foundation\\include -vc.project.compiler.defines = -vc.project.compiler.defines.shared = _CRT_SECURE_NO_WARNINGS;${vc.project.name}_EXPORTS -vc.project.compiler.defines.debug_shared = ${vc.project.compiler.defines.shared} -vc.project.compiler.defines.release_shared = ${vc.project.compiler.defines.shared} -vc.solution.create = true -vc.solution.include = testsuite\\TestSuite diff --git a/PDF/PDF_vs140.vcxproj b/PDF/PDF_vs140.vcxproj index c2b2e7ed6..dc4cdbc8a 100644 --- a/PDF/PDF_vs140.vcxproj +++ b/PDF/PDF_vs140.vcxproj @@ -85,7 +85,7 @@ - <_ProjectFileVersion>14.0.23107.0 + <_ProjectFileVersion>14.0.25123.0 PocoPDFd PocoPDFmdd PocoPDFmtd @@ -285,6 +285,7 @@ + @@ -299,9 +300,11 @@ + + @@ -318,11 +321,13 @@ + + @@ -330,9 +335,11 @@ + + @@ -374,6 +381,7 @@ + @@ -384,6 +392,7 @@ + @@ -392,13 +401,17 @@ + + + + diff --git a/PDF/PDF_vs140.vcxproj.filters b/PDF/PDF_vs140.vcxproj.filters index 4d4223fb9..a06348825 100644 --- a/PDF/PDF_vs140.vcxproj.filters +++ b/PDF/PDF_vs140.vcxproj.filters @@ -2,40 +2,40 @@ - {552b2e5f-04fb-49a7-9baa-fc20dec46757} + {a0634ffa-18a6-4b8a-8d5e-5cd8ce33b3b9} - {fbdf7c26-cd16-4fb5-8263-3c8c8937cb6e} + {dae3dec4-c110-4a31-abfe-7b05f6994293} - {a1e7aa4e-57ce-46a0-a4ee-9347a029644e} + {fc45a0d4-71df-43a3-ae23-fc8b286967d1} - {c8a86f54-496a-4723-9752-b3e396279c25} + {a2b94263-66a3-49b7-a2fe-628dcb08086f} - {2178eb18-6fec-48fd-be75-fb129252b779} + {1cf26a6b-6de8-4233-ba72-b8e675ef99ff} - {680b8a32-17ff-4995-8249-29b8ce94495c} + {9af04267-b18c-467d-94a7-62e8304a81d5} - {167c8e35-db84-4fa9-b4d5-c86c44e73328} + {5b4bc72c-9f7c-4eb9-bdda-158488b0cb55} - {9223eee0-9b19-4491-a792-8eec0aa1e3f8} + {feeea5e8-7e0c-4c7c-a79d-2cf804cc1378} - {25c72362-48e2-42c2-ad81-a40c21d29019} + {43e6cf89-8985-4fb4-82c7-43631868160c} - {18792256-b2da-4e92-af96-372efd5b5af0} + {88ecf0b8-8a16-42c6-ae45-9360156c820f} - {df66f277-6850-453f-833a-c70d9d8163b2} + {8aa5e5a1-2d95-4cf3-af8e-05c1f7186560} - {834e052d-ee19-4d73-a11d-9a895a46e672} + {eb00e13a-2cc3-48f1-8c6f-9aef394cea8e} @@ -156,6 +156,9 @@ 3rd Party\zlib\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -198,6 +201,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -207,6 +213,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -255,6 +264,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -270,6 +282,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -291,6 +306,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -300,6 +318,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -383,6 +404,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -413,6 +437,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -437,6 +464,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -449,14 +479,23 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + \ No newline at end of file diff --git a/PDF/PDF_vs150.vcxproj b/PDF/PDF_vs150.vcxproj index 0af3b2ccc..5f26e8f40 100644 --- a/PDF/PDF_vs150.vcxproj +++ b/PDF/PDF_vs150.vcxproj @@ -85,7 +85,7 @@ - <_ProjectFileVersion>14.0.23107.0 + <_ProjectFileVersion>15.0.26919.1 PocoPDFd PocoPDFmdd PocoPDFmtd @@ -285,6 +285,7 @@ + @@ -299,9 +300,11 @@ + + @@ -318,11 +321,13 @@ + + @@ -330,9 +335,11 @@ + + @@ -374,6 +381,7 @@ + @@ -384,6 +392,7 @@ + @@ -392,13 +401,17 @@ + + + + diff --git a/PDF/PDF_vs150.vcxproj.filters b/PDF/PDF_vs150.vcxproj.filters index 4d4223fb9..e4349e1d6 100644 --- a/PDF/PDF_vs150.vcxproj.filters +++ b/PDF/PDF_vs150.vcxproj.filters @@ -2,40 +2,40 @@ - {552b2e5f-04fb-49a7-9baa-fc20dec46757} + {b68a3217-8ff9-46ca-a852-8b1e07294baa} - {fbdf7c26-cd16-4fb5-8263-3c8c8937cb6e} + {e6d1bded-3e36-4697-9415-08ab4087e8d1} - {a1e7aa4e-57ce-46a0-a4ee-9347a029644e} + {7e9ec59d-5949-40da-a626-eb61afb42605} - {c8a86f54-496a-4723-9752-b3e396279c25} + {c182269e-b546-45bc-b7bb-9d0b14ce8e9c} - {2178eb18-6fec-48fd-be75-fb129252b779} + {42b61af5-6dee-4824-969f-27d4e331fe01} - {680b8a32-17ff-4995-8249-29b8ce94495c} + {b1d7126a-3efe-49b7-8651-b7c4d821982d} - {167c8e35-db84-4fa9-b4d5-c86c44e73328} + {64d9fbb5-225f-4ce4-b74e-9893ad90a3e8} - {9223eee0-9b19-4491-a792-8eec0aa1e3f8} + {6bdc4af3-ac04-48be-8376-190eaeb3a58a} - {25c72362-48e2-42c2-ad81-a40c21d29019} + {fa7dd6a4-5f9f-4ddf-99a7-66e71be030a3} - {18792256-b2da-4e92-af96-372efd5b5af0} + {83f468fb-aaff-4e4c-bbe7-29a342e3d43c} - {df66f277-6850-453f-833a-c70d9d8163b2} + {72418292-af6e-457e-9554-e51c88511e83} - {834e052d-ee19-4d73-a11d-9a895a46e672} + {2d406545-c655-475f-9063-512d54f2ebf9} @@ -156,6 +156,9 @@ 3rd Party\zlib\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -198,6 +201,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -207,6 +213,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -255,6 +264,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -270,6 +282,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -291,6 +306,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -300,6 +318,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -383,6 +404,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -413,6 +437,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -437,6 +464,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -449,14 +479,23 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + \ No newline at end of file diff --git a/PDF/PDF_x64_vs140.vcxproj b/PDF/PDF_x64_vs140.vcxproj index b228be9ab..7673c258c 100644 --- a/PDF/PDF_x64_vs140.vcxproj +++ b/PDF/PDF_x64_vs140.vcxproj @@ -85,7 +85,7 @@ - <_ProjectFileVersion>14.0.23107.0 + <_ProjectFileVersion>14.0.25123.0 PocoPDF64d PocoPDFmdd PocoPDFmtd @@ -284,6 +284,7 @@ + @@ -298,9 +299,11 @@ + + @@ -317,11 +320,13 @@ + + @@ -329,9 +334,11 @@ + + @@ -373,6 +380,7 @@ + @@ -383,6 +391,7 @@ + @@ -391,13 +400,17 @@ + + + + diff --git a/PDF/PDF_x64_vs140.vcxproj.filters b/PDF/PDF_x64_vs140.vcxproj.filters index debbb97d4..e9154cad6 100644 --- a/PDF/PDF_x64_vs140.vcxproj.filters +++ b/PDF/PDF_x64_vs140.vcxproj.filters @@ -2,40 +2,40 @@ - {9b9727fd-a481-4c26-b106-71b32d6581c9} + {663ad107-137d-4e9a-93c4-ed94a22a8f17} - {8e4910d6-6b5e-467d-a958-facb4307f176} + {d4c6356e-4a4c-4c45-a6bc-7ccd406ae1ec} - {773a9037-c0f0-4c82-878e-7b917ccd4702} + {e4d66d23-45e3-427d-9c70-8282ba04665b} - {14ba9203-6ef5-4b1e-ba46-fd3c2d0774f9} + {60a90041-e161-42f0-9a77-e9d89c12433e} - {508fe1e7-e52c-4c17-aec8-47be2e5ee440} + {6c42c33a-60f7-4c5c-b2af-55b120a6f4b0} - {ed67d70f-0df4-4ae3-bf37-22427e92610d} + {0cfb430f-7053-4c6e-84fe-d0aed378c2c6} - {b3b98a78-bd86-43aa-a584-40985c225bef} + {b740ca59-9742-4a13-9f02-d4e547c2a358} - {3937fed9-a1bf-490f-8431-c874e977d843} + {9c88a241-c59c-4b5d-bc0a-b808fa732c60} - {b1a48f23-1603-4c99-8f0c-dd02ca41808c} + {419ca7b8-c305-4951-a78d-cbceed8a9d4d} - {da93ca46-eede-4412-94e0-55406bd16454} + {473ad912-8d9d-482d-bd17-f5323b1211b4} - {cb425dfd-52a1-4a94-90b2-f4eb26046d27} + {d6a021c3-53f4-4e0d-a471-9724e44eacef} - {25dc74ff-9a19-46ba-931f-8e700ef382ca} + {a085d8cd-ef46-4637-9250-40524294edb9} @@ -156,6 +156,9 @@ 3rd Party\zlib\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -198,6 +201,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -207,6 +213,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -255,6 +264,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -270,6 +282,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -291,6 +306,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -300,6 +318,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -383,6 +404,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -413,6 +437,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -437,6 +464,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -449,14 +479,23 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + \ No newline at end of file diff --git a/PDF/PDF_x64_vs150.vcxproj b/PDF/PDF_x64_vs150.vcxproj index 7d03f7cac..621be2459 100644 --- a/PDF/PDF_x64_vs150.vcxproj +++ b/PDF/PDF_x64_vs150.vcxproj @@ -85,7 +85,7 @@ - <_ProjectFileVersion>14.0.23107.0 + <_ProjectFileVersion>15.0.26919.1 PocoPDF64d PocoPDFmdd PocoPDFmtd @@ -284,6 +284,7 @@ + @@ -298,9 +299,11 @@ + + @@ -317,11 +320,13 @@ + + @@ -329,9 +334,11 @@ + + @@ -373,6 +380,7 @@ + @@ -383,6 +391,7 @@ + @@ -391,13 +400,17 @@ + + + + diff --git a/PDF/PDF_x64_vs150.vcxproj.filters b/PDF/PDF_x64_vs150.vcxproj.filters index debbb97d4..b97ecd8ce 100644 --- a/PDF/PDF_x64_vs150.vcxproj.filters +++ b/PDF/PDF_x64_vs150.vcxproj.filters @@ -2,40 +2,40 @@ - {9b9727fd-a481-4c26-b106-71b32d6581c9} + {158681b8-3d0f-48d4-9e20-022f918cb49f} - {8e4910d6-6b5e-467d-a958-facb4307f176} + {788a6650-ce51-4888-8a04-d4109b42f1ef} - {773a9037-c0f0-4c82-878e-7b917ccd4702} + {0b0476a8-8ff4-4cba-9507-f488c8b436e0} - {14ba9203-6ef5-4b1e-ba46-fd3c2d0774f9} + {bab965de-6f10-457a-b9ec-1f2384a49c01} - {508fe1e7-e52c-4c17-aec8-47be2e5ee440} + {7507cc7b-ab50-4e91-bb88-99ae6c8cf6f9} - {ed67d70f-0df4-4ae3-bf37-22427e92610d} + {47d12286-96c7-4925-8629-07ba46a79210} - {b3b98a78-bd86-43aa-a584-40985c225bef} + {f5f3d108-67e3-4327-b79c-3ccc2eb32c41} - {3937fed9-a1bf-490f-8431-c874e977d843} + {b0f93f9e-d388-4405-b70b-8ad39e0e2e53} - {b1a48f23-1603-4c99-8f0c-dd02ca41808c} + {e31c78a9-a0d0-4e51-877c-851f1ecca957} - {da93ca46-eede-4412-94e0-55406bd16454} + {c154e88e-4512-49c2-81e7-fc920914df61} - {cb425dfd-52a1-4a94-90b2-f4eb26046d27} + {8f761097-8d0a-4f44-a339-0e2db5234cbf} - {25dc74ff-9a19-46ba-931f-8e700ef382ca} + {81381f47-d176-4840-8203-a5275893306a} @@ -156,6 +156,9 @@ 3rd Party\zlib\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -198,6 +201,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -207,6 +213,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -255,6 +264,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -270,6 +282,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -291,6 +306,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -300,6 +318,9 @@ 3rd Party\HARU\Source Files + + 3rd Party\HARU\Source Files + 3rd Party\HARU\Source Files @@ -383,6 +404,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -413,6 +437,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -437,6 +464,9 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files @@ -449,14 +479,23 @@ 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + 3rd Party\HARU\Header Files + + 3rd Party\HARU\Header Files + \ No newline at end of file diff --git a/PDF/build.gradle b/PDF/build.gradle new file mode 100644 index 000000000..3fecdb3b5 --- /dev/null +++ b/PDF/build.gradle @@ -0,0 +1,39 @@ +project(":PDF") { + model { + components { + PDF(NativeLibrarySpec) { + sources { + c { + source { + srcDir 'src' + include '**/*.c' + } + exportedHeaders { + srcDirs 'include', 'include/Poco/PDF' + } + } + cpp { + source { + srcDir 'src' + include '**/*.cpp' + } + exportedHeaders { + srcDirs 'include', 'include/Poco/PDF' + } + lib project: ':Util', library: 'Util' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + binaries { + withType(SharedLibraryBinarySpec) { + if (toolChain in VisualCpp) { + cppCompiler.define "PDF_EXPORTS" + } + } + } + } +} +task poco { dependsOn "assemble" } + diff --git a/PDF/include/Poco/PDF/Destination.h b/PDF/include/Poco/PDF/Destination.h index 4a1665ea2..bc37b5a0c 100644 --- a/PDF/include/Poco/PDF/Destination.h +++ b/PDF/include/Poco/PDF/Destination.h @@ -40,7 +40,7 @@ public: /// Sets the position and zoom for destination. void fit(); - /// Sets the appearance of the page to displaying entire page within the window. + /// Sets the appearance of the page to displaying entire page within the window. void fitHorizontal(float top); /// Defines the appearance of a page to magnifying to fit the height of the @@ -58,7 +58,7 @@ public: void fitWindow(); /// Sets the appearance of the page to magnifying to fit the bounding box of - /// the page within the window. + /// the page within the window. void fitWindowHorizontal(float top); /// Defines the appearance of a page to magnifying to fit the width of the diff --git a/PDF/include/Poco/PDF/Document.h b/PDF/include/Poco/PDF/Document.h index a6c8389dd..c9ea94668 100644 --- a/PDF/include/Poco/PDF/Document.h +++ b/PDF/include/Poco/PDF/Document.h @@ -74,26 +74,26 @@ public: enum PageLayout { - PAGE_LAYOUT_SINGLE = HPDF_PAGE_LAYOUT_SINGLE, + PAGE_LAYOUT_SINGLE = HPDF_PAGE_LAYOUT_SINGLE, /// Only one page is displayed. PAGE_LAYOUT_ONE_COLUMN = HPDF_PAGE_LAYOUT_ONE_COLUMN, /// Display the pages in one column. PAGE_LAYOUT_TWO_COLUMN_LEFT = HPDF_PAGE_LAYOUT_TWO_COLUMN_LEFT, - /// Display the pages in two column. The page of the odd number is displayed left. + /// Display the pages in two column. The page of the odd number is displayed left. PAGE_LAYOUT_TWO_COLUMN_RIGHT = HPDF_PAGE_LAYOUT_TWO_COLUMN_RIGHT - /// Display the pages in two column. The page of the odd number is displayed right. + /// Display the pages in two column. The page of the odd number is displayed right. }; enum PageMode { - PAGE_MODE_USE_NONE = HPDF_PAGE_MODE_USE_NONE, - /// Display the document with neither outline nor thumbnail. + PAGE_MODE_USE_NONE = HPDF_PAGE_MODE_USE_NONE, + /// Display the document with neither outline nor thumbnail. PAGE_MODE_USE_OUTLINE = HPDF_PAGE_MODE_USE_OUTLINE, /// Display the document with outline pain. PAGE_MODE_USE_THUMBS = HPDF_PAGE_MODE_USE_THUMBS, ///Display the document with thumbnail pain. PAGE_MODE_FULL_SCREEN = HPDF_PAGE_MODE_FULL_SCREEN - /// Display the document with full screen mode. + /// Display the document with full screen mode. }; enum Compression @@ -101,13 +101,13 @@ public: COMPRESSION_NONE = HPDF_COMP_NONE, /// All contents are not compressed. COMPRESSION_TEXT = HPDF_COMP_TEXT, - /// Compress the contents stream of the page. + /// Compress the contents stream of the page. COMPRESSION_IMAGE = HPDF_COMP_IMAGE, - /// Compress the streams of the image objects. + /// Compress the streams of the image objects. COMPRESSION_METADATA = HPDF_COMP_METADATA, /// Other stream datas (fonts, cmaps and so on) are compressed. COMPRESSION_ALL = HPDF_COMP_ALL - /// All stream datas are compressed. + /// All stream datas are compressed. /// (Same as HPDF_COMP_TEXT | HPDF_COMP_IMAGE | HPDF_COMP_METADATA) }; @@ -118,7 +118,7 @@ public: /// The length of key is automatically set to 5(40bit). ENCRYPT_R3 = HPDF_ENCRYPT_R3 /// Use "Revision 3" algorithm. - /// Between 5(40bit) and 16(128bit) can be specified for length of the key. + /// Between 5(40bit) and 16(128bit) can be specified for length of the key. }; enum PageNumberStyle @@ -167,11 +167,11 @@ public: /// the sz argument. SizeType size(); - /// Resets the document stream, reads the document into the stream and + /// Resets the document stream, reads the document into the stream and /// returns the document data size. void setPages(std::size_t pagePerPages); - /// Sets the number of pages per page. + /// Sets the number of pages per page. /// See HARU library HPDF_SetPagesConfiguration API call /// documentation for detailed explanation. @@ -218,9 +218,9 @@ public: std::string loadType1Font(const std::string& afmFileName, const std::string& pfmFileName); /// 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. - /// If the embedding parameter is true, the glyph data of the font is embedded, + std::string loadTTFont(const std::string& fileName, bool embed, int index = -1); + /// Loads true type font from file. Returns font name. + /// If the embed parameter is true, the glyph data of the font is embedded, /// otherwise only the matrix data is included in PDF file. const Image& loadPNGImage(const std::string& fileName); @@ -228,9 +228,9 @@ public: const Image& loadPNGImageInfo(const std::string& fileName); /// Loads the specified PNG image information from the file and returns reference to it. - /// Unlike loadPNGImage, this function does not load the whole data immediately. - /// Only size and color properties are loaded. The image data is loaded just before the - /// image object is written to PDF, and the loaded data is deleted immediately. + /// Unlike loadPNGImage, this function does not load the whole data immediately. + /// Only size and color properties are loaded. The image data is loaded just before the + /// image object is written to PDF, and the loaded data is deleted immediately. const Image& loadJPEGImage(const std::string& fileName); /// Loads the specified PNG image from the file and returns reference to it. @@ -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. @@ -281,7 +284,7 @@ public: /// Creates extended graphic state object. /// Bumps up the version of PDF to 1.4. /// NOTE: - /// In Acrobat Reader 5.0, when ExtGState object is used combined with HPDF_Page_Concat(), + /// In Acrobat Reader 5.0, when ExtGState object is used combined with HPDF_Page_Concat(), /// there is a case that cannot be correctly displayed. const Outline& createOutline(const std::string& title, const Outline& outline, const Encoder& encoder); @@ -289,9 +292,9 @@ public: void setInfo(Info info, const std::string& value); /// Sets the document info. - + void setInfo(Info info, const LocalDateTime& dt); - /// Sets the document creation or modification date. + /// Sets the document creation or moidification date. std::string getInfo(Info info); /// Returns the document info. @@ -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/Encoder.h b/PDF/include/Poco/PDF/Encoder.h index 31494c969..5ef334ab6 100644 --- a/PDF/include/Poco/PDF/Encoder.h +++ b/PDF/include/Poco/PDF/Encoder.h @@ -73,10 +73,10 @@ public: /// Returns the type of an encoding object. ByteType getByteType(const std::string& text, int index = 0) const; - /// Returns the type of byte in the text at position index + /// Returns the type of byte in the text at position index WriteMode writeMode(); - /// Returns the writing mode for the encoding object. + /// Returns the writing mode for the encoding object. }; @@ -95,7 +95,7 @@ inline Encoder::ByteType Encoder::getByteType(const std::string& text, int index if (index < 0) throw InvalidArgumentException("Negative values not allowed."); - return static_cast(HPDF_Encoder_GetByteType(handle(), + return static_cast(HPDF_Encoder_GetByteType(handle(), text.c_str(), static_cast(index))); } diff --git a/PDF/include/Poco/PDF/Font.h b/PDF/include/Poco/PDF/Font.h index 1000fb481..796024032 100644 --- a/PDF/include/Poco/PDF/Font.h +++ b/PDF/include/Poco/PDF/Font.h @@ -118,8 +118,8 @@ inline int Font::upperHeight() const inline TextWidth Font::textWidth(const std::string& text) { - return HPDF_Font_TextWidth(handle(), - reinterpret_cast(text.data()), + return HPDF_Font_TextWidth(handle(), + reinterpret_cast(text.data()), static_cast(text.size())); } diff --git a/PDF/include/Poco/PDF/PDF.h b/PDF/include/Poco/PDF/PDF.h index cf5e6d7af..c591540c4 100644 --- a/PDF/include/Poco/PDF/PDF.h +++ b/PDF/include/Poco/PDF/PDF.h @@ -37,7 +37,7 @@ // from a DLL simpler. All files within this DLL are compiled with the PDF_EXPORTS // symbol defined on the command line. this symbol should not be defined on any project // that uses this DLL. This way any other project whose source files include this file see -// PDF_API functions as being imported from a DLL, whereas this DLL sees symbols +// PDF_API functions as being imported from a DLL, wheras this DLL sees symbols // defined with this macro as being exported. // #if defined(_WIN32) && defined(POCO_DLL) diff --git a/PDF/include/Poco/PDF/Page.h b/PDF/include/Poco/PDF/Page.h index 54091148b..a249fcf91 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. { @@ -45,7 +48,7 @@ public: enum Size { - PAGE_SIZE_LETTER = HPDF_PAGE_SIZE_LETTER, + PAGE_SIZE_LETTER = HPDF_PAGE_SIZE_LETTER, /// 8½ x 11 (Inches), 612 x 792 px PAGE_SIZE_LEGAL = HPDF_PAGE_SIZE_LEGAL, /// 8½ x 14 (Inches), 612 x 1008 px @@ -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,13 @@ 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. The name must be a valid Base14 PDF internal font. + + void setTTFont(const std::string& name, float size, const std::string& encoding = "UTF-8", bool embed = true); + /// Sets the external true type font. Name must be a valid path to .ttf file. + /// If embed is tru, font will be embedded int othe document. + float textWidth(const std::string& text); /// Returns the width of the supplied text. @@ -222,7 +232,7 @@ public: /// prints the text at the current position on the page. void writeNextLineEx(float wordSpace, float charSpace, const std::string& text); - /// Moves the current text position to the start of the next line, sets the word spacing, + /// Moves the current text position to the start of the next line, sets the word spacing, /// character spacing and prints the text at the current position on the page. int writeOnceInRectangle(float left, @@ -231,7 +241,7 @@ public: float bottom, const std::string& text, TextAlignment align = TEXT_ALIGN_LEFT); - /// Begins, writes and ends text objectinside the specified region. + /// Begins, writes and ends text objectinside the specified region. /// Returns the number of characters written. int writeInRectangle(float left, @@ -240,7 +250,7 @@ public: float bottom, const std::string& text, TextAlignment align); - /// Writes the text inside the specified region. + /// Writes the text inside the specified region. /// Returns the number of characters written. void drawImage(Image image, float x, float y, float width, float height); @@ -249,18 +259,18 @@ public: const Destination& createDestination(const std::string& name); /// Creates ad returns reference to destination. - const TextAnnotation& createTextAnnotation(const std::string& name, + const TextAnnotation& createTextAnnotation(const std::string& name, const Rectangle& rect, const std::string& text, const Encoder& encoder); /// Creates ad returns reference to text annotation. - const LinkAnnotation& createLinkAnnotation(const std::string& name, + const LinkAnnotation& createLinkAnnotation(const std::string& name, const Rectangle& rect, const Destination& dest); /// Creates ad returns reference to destination link annotation. - const LinkAnnotation& createURILinkAnnotation(const std::string& name, + const LinkAnnotation& createURILinkAnnotation(const std::string& name, const Rectangle& rect, const std::string& uri); /// Creates ad returns reference to URI annotation. @@ -292,22 +302,22 @@ public: void curveTo(const std::vector& values); /// Appends a Bézier curve to the current path using two specified points. - /// The point (x1, y1) and the point (x2, y2) are used as the control points + /// The point (x1, y1) and the point (x2, y2) are used as the control points /// for a Bézier curve and current point is moved to the point (x3, y3) void curveToRight(float x2, float y2, float x3, float y3); /// Appends a Bézier curve to the right of the current point using two specified points. - /// The current point and the point (x2, y2) are used as the control points + /// The current point and the point (x2, y2) are used as the control points /// for a Bézier curve and current point is moved to the point (x3, y3) void curveToLeft(float x2, float y2, float x3, float y3); /// Appends a Bézier curve to the left of the current point using two specified points. - /// The current point and the point (x2, y2) are used as the control points + /// The current point and the point (x2, y2) are used as the control points /// for a Bézier curve and current point is moved to the point (x3, y3) void closePath(); /// Appends a straight line from the current point to the start point of sub path. - /// The current point is moved to the start point of sub path. + /// The current point is moved to the start point of sub path. void rectangle(float x, float y, float width, float height); /// Draws a rectangle. @@ -319,7 +329,7 @@ public: /// Draws an arc. void ellipse(float x, float y, float xRadius, float yRadius); - /// Draws an ellipse. + /// Draws an ellips. void stroke(); /// Paints the current path. @@ -340,7 +350,7 @@ public: /// Fills the current path using the even-odd rule and then paints it. void closeFillAndStroke(); - /// Closes the current path, fills the current path using the nonzero winding number + /// Closes the current path, fills the current path using the nonzero winding number /// rule and then paints it. void closeFillAndEOStroke(); @@ -363,22 +373,22 @@ public: void moveTextPos(float x, float y); /// Moves the current text position to the start of the next line - /// using specified offset values. If the start position of the current + /// using specified offset values. If the start position of the current /// line is (x1, y1), the start of the next line is (x1 + x, y1 + y). void moveTextNextLine(float x, float y); - /// Moves the current text position to the start of the next line - /// using specified offset values, and sets the text leading to -y. - /// If the start position of the current line is (x1, y1), the start - /// of the next line is (x1 + x, y1 + y). + /// Moves the current text position to the start of the next line + /// using specified offset values, and sets the text leading to -y. + /// If the start position of the current line is (x1, y1), the start + /// of the next line is (x1 + x, y1 + y). void moveTextNextLine(); /// Moves the current text position to the start of the next line. - /// If the start position of the current line is (x1, y1), the start of + /// If the start position of the current line is (x1, y1), the start of /// the next line is (x1, y1 - text leading). /// /// NOTE: - /// Since the default value of Text Leading is 0, an application has to + /// Since the default value of Text Leading is 0, an application has to /// invoke HPDF_Page_SetTextLeading() before HPDF_Page_MoveTextPos2() to set /// text leading. @@ -422,7 +432,7 @@ public: /// Returns current dash mode. void setDashMode(const PatternVec& pattern, int paramNo, int phase) const; - /// Sets the dash mode. + /// Sets teh dash mode. float getFlatness() const; /// Returns the current flatness. @@ -511,7 +521,7 @@ public: private: Page(); - HPDF_Doc* _pPDF; + Document* _pDocument; HPDF_Page _page; Size _size; Orientation _orientation; @@ -533,12 +543,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); @@ -635,7 +639,7 @@ inline void Page::restoreGraphics() inline void Page::concatenate(const std::vector& values) { - if (values.size() < 6) + if (values.size() < 6) throw InvalidArgumentException("Needs six values"); HPDF_Page_Concat(_page, @@ -662,7 +666,7 @@ inline void Page::lineTo(float x, float y) inline void Page::curveTo(const std::vector& values) { - if (values.size() < 6) + if (values.size() < 6) throw InvalidArgumentException("Needs six values"); HPDF_Page_CurveTo(_page, @@ -795,13 +799,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); @@ -876,7 +873,7 @@ inline DashMode Page::getDashMode() const inline void Page::setDashMode(const PatternVec& pattern, int paramNo, int phase) const { - HPDF_Page_SetDash(_page, &pattern[0], + HPDF_Page_SetDash(_page, &pattern[0], static_cast(paramNo), static_cast(phase)); } diff --git a/PDF/include/Poco/PDF/Resource.h b/PDF/include/Poco/PDF/Resource.h index db0db81c1..d020fa645 100644 --- a/PDF/include/Poco/PDF/Resource.h +++ b/PDF/include/Poco/PDF/Resource.h @@ -33,7 +33,7 @@ class Resource public: typedef R Type; - Resource(HPDF_Doc* pPDF, const R& resource, const std::string& name = ""): + Resource(HPDF_Doc* pPDF, const R& resource, const std::string& name = ""): _pPDF(pPDF), _resource(resource), _name(name) @@ -41,7 +41,7 @@ public: { } - Resource(const Resource& other): + Resource(const Resource& other): _pPDF(other._pPDF), _resource(other._resource), _name(other._name) diff --git a/PDF/include/Poco/PDF/deflate.h b/PDF/include/Poco/PDF/deflate.h index 0bfed3b3f..4caad87f4 100644 --- a/PDF/include/Poco/PDF/deflate.h +++ b/PDF/include/Poco/PDF/deflate.h @@ -188,7 +188,7 @@ typedef struct internal_state { int nice_match; /* Stop searching when current match exceeds this */ /* used by trees.c: */ - /* Didn't use ct_data typedef below to suppress compiler warning */ + /* Didn't use ct_data typedef below to supress compiler warning */ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */ 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 4d54aab19..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, @@ -22,7 +25,7 @@ extern "C" { #endif HPDF_Dict -HPDF_ExtGState_New (HPDF_MMgr mmgr, +HPDF_ExtGState_New (HPDF_MMgr mmgr, HPDF_Xref xref); diff --git a/PDF/include/Poco/PDF/hpdf_font.h b/PDF/include/Poco/PDF/hpdf_font.h index 84a486485..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, @@ -69,7 +72,7 @@ typedef struct _HPDF_FontAttr_Rec { HPDF_Encoder encoder; /* if the encoding-type is HPDF_ENCODER_TYPE_SINGLE_BYTE, the width of - * each characters are cashed in 'widths'. + * each charactors are cashed in 'widths'. * when HPDF_ENCODER_TYPE_DOUBLE_BYTE the width is calculate each time. */ HPDF_INT16* widths; 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 df355ab6d..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, @@ -62,7 +65,7 @@ typedef struct _HPDF_PageAttr_Rec { HPDF_Stream stream; HPDF_Xref xref; HPDF_UINT compression_mode; - HPDF_PDFVer *ver; + HPDF_PDFVer *ver; } HPDF_PageAttr_Rec; 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 6d94546ad..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 --------------------------------------------------------*/ @@ -430,7 +499,7 @@ typedef enum _HPDF_TransitionStyle { HPDF_TS_GLITTER_TOP_LEFT_TO_BOTTOM_RIGHT, HPDF_TS_REPLACE, HPDF_TS_EOF -} HPDF_TransitionStyle; +} HPDF_TransitionStyle; /*----------------------------------------------------------------------------*/ @@ -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/include/Poco/PDF/png.h b/PDF/include/Poco/PDF/png.h index 47fa026a2..3ac393ea3 100644 --- a/PDF/include/Poco/PDF/png.h +++ b/PDF/include/Poco/PDF/png.h @@ -400,7 +400,7 @@ #define PNG_LIBPNG_BUILD_RC 3 #define PNG_LIBPNG_BUILD_STABLE 4 #define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7 - + /* Release-Specific Flags */ #define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with PNG_LIBPNG_BUILD_STABLE only */ @@ -431,12 +431,12 @@ /* Ref MSDN: Private as priority over Special * VS_FF_PRIVATEBUILD File *was not* built using standard release * procedures. If this value is given, the StringFileInfo block must - * contain a PrivateBuild string. + * contain a PrivateBuild string. * * VS_FF_SPECIALBUILD File *was* built by the original company using * standard release procedures but is a variation of the standard * file of the same version number. If this value is given, the - * StringFileInfo block must contain a SpecialBuild string. + * StringFileInfo block must contain a SpecialBuild string. */ #if defined(PNG_USER_PRIVATEBUILD) @@ -911,7 +911,7 @@ defined(PNG_READ_BACKGROUND_SUPPORTED) /* The sCAL chunk describes the actual physical dimensions of the * subject matter of the graphic. The chunk contains a unit specification * a byte value, and two ASCII strings representing floating-point - * values. The values are width and height corresponding to one pixel + * values. The values are width and height corresponsing to one pixel * in the image. This external representation is converted to double * here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero. */ diff --git a/PDF/include/Poco/PDF/pngconf.h b/PDF/include/Poco/PDF/pngconf.h index 9fbae8b61..c40507446 100644 --- a/PDF/include/Poco/PDF/pngconf.h +++ b/PDF/include/Poco/PDF/pngconf.h @@ -19,7 +19,7 @@ #define PNG_1_2_X -/* +/* * PNG_USER_CONFIG has to be defined on the compiler command line. This * includes the resource compiler for Windows DLL configurations. */ @@ -39,7 +39,7 @@ /* * Added at libpng-1.2.8 - * + * * If you create a private DLL you need to define in "pngusr.h" the followings: * #define PNG_USER_PRIVATEBUILD @@ -50,8 +50,8 @@ * number and must match your private DLL name> * e.g. // private DLL "libpng13gx.dll" * #define PNG_USER_DLLFNAME_POSTFIX "gx" - * - * The following macros are also at your disposal if you want to complete the + * + * The following macros are also at your disposal if you want to complete the * DLL VERSIONINFO structure. * - PNG_USER_VERSIONINFO_COMMENTS * - PNG_USER_VERSIONINFO_COMPANYNAME @@ -147,9 +147,9 @@ * 'Cygwin' defines/defaults: * PNG_BUILD_DLL -- (ignored) building the dll * (no define) -- (ignored) building an application, linking to the dll - * PNG_STATIC -- (ignored) building the static lib, or building an + * PNG_STATIC -- (ignored) building the static lib, or building an * application that links to the static lib. - * ALL_STATIC -- (ignored) building various static libs, or building an + * ALL_STATIC -- (ignored) building various static libs, or building an * application that links to the static libs. * Thus, * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and @@ -162,12 +162,12 @@ * PNG_BUILD_DLL * PNG_STATIC * (nothing) == PNG_USE_DLL - * + * * CYGWIN (2002-01-20): The preceding is now obsolete. With the advent - * of auto-import in binutils, we no longer need to worry about + * of auto-import in binutils, we no longer need to worry about * __declspec(dllexport) / __declspec(dllimport) and friends. Therefore, * we don't need to worry about PNG_STATIC or ALL_STATIC when it comes - * to __declspec() stuff. However, we DO need to worry about + * to __declspec() stuff. However, we DO need to worry about * PNG_BUILD_DLL and PNG_STATIC because those change some defaults * such as CONSOLE_IO and whether GLOBAL_ARRAYS are allowed. */ @@ -211,8 +211,8 @@ # if !defined(PNG_DLL) # define PNG_DLL # endif -# endif -# endif +# endif +# endif # endif #endif @@ -731,7 +731,7 @@ # define PNG_EASY_ACCESS_SUPPORTED #endif -/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 +/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0 * and removed from version 1.2.20. The following will be removed * from libpng-1.4.0 */ @@ -829,7 +829,7 @@ */ /* Any chunks you are not interested in, you can undef here. The - * ones that allocate memory may be especially important (hIST, + * ones that allocate memory may be expecially important (hIST, * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info * a bit smaller. */ @@ -1306,7 +1306,7 @@ typedef z_stream FAR * png_zstreamp; # define PNGAPI __cdecl # undef PNG_IMPEXP # define PNG_IMPEXP -#endif +#endif /* If you define PNGAPI, e.g., with compiler option "-DPNGAPI=__stdcall", * you may get warnings regarding the linkage of png_zalloc and png_zfree. 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/Image/Image.progen b/PDF/samples/Image/Image.progen deleted file mode 100644 index 8749e7c75..000000000 --- a/PDF/samples/Image/Image.progen +++ /dev/null @@ -1,10 +0,0 @@ -vc.project.guid = ${vc.project.guidFromName} -vc.project.name = ${vc.project.baseName} -vc.project.target = ${vc.project.name} -vc.project.type = executable -vc.project.pocobase = ..\\..\\.. -vc.project.platforms = Win32, x64 -vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md -vc.project.prototype = ${vc.project.name}_vs90.vcproj -vc.project.compiler.include = ..\\..\\..\\Foundation\\include;..\\..\\..\\PDF\\include -vc.project.linker.dependencies = diff --git a/PDF/samples/Image/Image_vs140.vcxproj.filters b/PDF/samples/Image/Image_vs140.vcxproj.filters index c6c313737..1f507eb04 100644 --- a/PDF/samples/Image/Image_vs140.vcxproj.filters +++ b/PDF/samples/Image/Image_vs140.vcxproj.filters @@ -2,10 +2,10 @@ - {3e187bb0-1d2b-4a01-ba2b-3675ce2c1c84} + {2e38e39e-14e5-4544-be3f-1903c2fa8fa5} - {98c2cbaf-7e65-4bce-add0-cc6b755fd70e} + {d4825186-6266-4146-9a77-b4fb64b2d0ba} diff --git a/PDF/samples/Image/Image_vs150.vcxproj.filters b/PDF/samples/Image/Image_vs150.vcxproj.filters index c6c313737..1f507eb04 100644 --- a/PDF/samples/Image/Image_vs150.vcxproj.filters +++ b/PDF/samples/Image/Image_vs150.vcxproj.filters @@ -2,10 +2,10 @@ - {3e187bb0-1d2b-4a01-ba2b-3675ce2c1c84} + {2e38e39e-14e5-4544-be3f-1903c2fa8fa5} - {98c2cbaf-7e65-4bce-add0-cc6b755fd70e} + {d4825186-6266-4146-9a77-b4fb64b2d0ba} diff --git a/PDF/samples/Image/Image_x64_vs140.vcxproj.filters b/PDF/samples/Image/Image_x64_vs140.vcxproj.filters index ab12fa327..952dde03f 100644 --- a/PDF/samples/Image/Image_x64_vs140.vcxproj.filters +++ b/PDF/samples/Image/Image_x64_vs140.vcxproj.filters @@ -2,10 +2,10 @@ - {04d30b11-8aca-41d2-92dc-bdd1e46f2d2e} + {77c73edd-e907-4bfa-9faa-ea733f5f76d9} - {caa26a08-07f7-41eb-b223-2d2aa5e686f8} + {0531a35b-9ad3-4753-aded-84ca49e9d694} diff --git a/PDF/samples/Image/Image_x64_vs150.vcxproj.filters b/PDF/samples/Image/Image_x64_vs150.vcxproj.filters index ab12fa327..952dde03f 100644 --- a/PDF/samples/Image/Image_x64_vs150.vcxproj.filters +++ b/PDF/samples/Image/Image_x64_vs150.vcxproj.filters @@ -2,10 +2,10 @@ - {04d30b11-8aca-41d2-92dc-bdd1e46f2d2e} + {77c73edd-e907-4bfa-9faa-ea733f5f76d9} - {caa26a08-07f7-41eb-b223-2d2aa5e686f8} + {0531a35b-9ad3-4753-aded-84ca49e9d694} diff --git a/PDF/samples/Image/src/Image.cpp b/PDF/samples/Image/src/Image.cpp index ca9fcc300..e5854ecd4 100644 --- a/PDF/samples/Image/src/Image.cpp +++ b/PDF/samples/Image/src/Image.cpp @@ -1,16 +1,13 @@ // // Image.cpp // -// This sample demonstrates the Data library. +// This sample demonstrates the generation and saving of a PDF +// document that contains an mbedded image loaded from external file. // -// Copyright (c) 2007, Applied Informatics Software Engineering GmbH. -// All rights reserved. +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. // -// This is unpublished proprietary source code of Applied Informatics -// Software Engineering GmbH. -// The contents of this pdfFile may not be disclosed to third parties, -// copied or duplicated in any form, in whole or in part, without -// prior written permission from Applied Informatics. +// SPDX-License-Identifier: BSL-1.0 // #include "Poco/PDF/Document.h" diff --git a/PDF/samples/Text/DejaVuLGCSans.ttf b/PDF/samples/Text/DejaVuLGCSans.ttf new file mode 100644 index 0000000000000000000000000000000000000000..0cf18a8b15aaea52b87bba89b95d7e552710223b GIT binary patch literal 488968 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 z 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
PetuEa9#3-}by~A&JwC**5pIQ}av-bHZ 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 oqUwW!zV& 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 literal 0 HcmV?d00001 diff --git a/PDF/samples/Text/Text.pdf b/PDF/samples/Text/Text.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f8f746dddaf9c1b9c484295aa79e245f1f275e47 GIT binary patch literal 63197 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 literal 0 HcmV?d00001 diff --git a/PDF/samples/Text/Text.progen b/PDF/samples/Text/Text.progen deleted file mode 100644 index 8749e7c75..000000000 --- a/PDF/samples/Text/Text.progen +++ /dev/null @@ -1,10 +0,0 @@ -vc.project.guid = ${vc.project.guidFromName} -vc.project.name = ${vc.project.baseName} -vc.project.target = ${vc.project.name} -vc.project.type = executable -vc.project.pocobase = ..\\..\\.. -vc.project.platforms = Win32, x64 -vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md -vc.project.prototype = ${vc.project.name}_vs90.vcproj -vc.project.compiler.include = ..\\..\\..\\Foundation\\include;..\\..\\..\\PDF\\include -vc.project.linker.dependencies = diff --git a/PDF/samples/Text/Text_vs140.vcxproj.filters b/PDF/samples/Text/Text_vs140.vcxproj.filters index 9bad9d4f8..5a7180933 100644 --- a/PDF/samples/Text/Text_vs140.vcxproj.filters +++ b/PDF/samples/Text/Text_vs140.vcxproj.filters @@ -2,10 +2,10 @@ - {c3ea6789-01d4-4bcf-9fe7-c011c458e565} + {4c4db3d3-ea83-4452-8c9f-b73ebbafe843} - {6f12f7ad-3ab0-4ce8-b573-8c77781dff88} + {31d158d4-1a35-4d7a-a9eb-1447d82290f6} diff --git a/PDF/samples/Text/Text_vs150.vcxproj.filters b/PDF/samples/Text/Text_vs150.vcxproj.filters index 9bad9d4f8..5a7180933 100644 --- a/PDF/samples/Text/Text_vs150.vcxproj.filters +++ b/PDF/samples/Text/Text_vs150.vcxproj.filters @@ -2,10 +2,10 @@ - {c3ea6789-01d4-4bcf-9fe7-c011c458e565} + {4c4db3d3-ea83-4452-8c9f-b73ebbafe843} - {6f12f7ad-3ab0-4ce8-b573-8c77781dff88} + {31d158d4-1a35-4d7a-a9eb-1447d82290f6} diff --git a/PDF/samples/Text/Text_x64_vs140.vcxproj.filters b/PDF/samples/Text/Text_x64_vs140.vcxproj.filters index 7c71a2053..9479c1270 100644 --- a/PDF/samples/Text/Text_x64_vs140.vcxproj.filters +++ b/PDF/samples/Text/Text_x64_vs140.vcxproj.filters @@ -2,10 +2,10 @@ - {e9f525fd-6b5c-4c75-b127-151e5723b951} + {03d7e5f2-118d-4ff0-ae9a-8ea1c05b9580} - {a4fb5caa-2dbd-481c-bade-9b11ea193129} + {fa61639f-1a64-4692-b040-e61923e163cf} diff --git a/PDF/samples/Text/Text_x64_vs150.vcxproj.filters b/PDF/samples/Text/Text_x64_vs150.vcxproj.filters index 7c71a2053..9479c1270 100644 --- a/PDF/samples/Text/Text_x64_vs150.vcxproj.filters +++ b/PDF/samples/Text/Text_x64_vs150.vcxproj.filters @@ -2,10 +2,10 @@ - {e9f525fd-6b5c-4c75-b127-151e5723b951} + {03d7e5f2-118d-4ff0-ae9a-8ea1c05b9580} - {a4fb5caa-2dbd-481c-bade-9b11ea193129} + {fa61639f-1a64-4692-b040-e61923e163cf} diff --git a/PDF/samples/Text/src/Text.cpp b/PDF/samples/Text/src/Text.cpp index f26398d66..a6f75a07a 100644 --- a/PDF/samples/Text/src/Text.cpp +++ b/PDF/samples/Text/src/Text.cpp @@ -1,16 +1,12 @@ -// // Text.cpp // -// This sample demonstrates the Data library. +// This sample demonstrates the generation and saving of a text PDF +// document, using external TTF font and UTF-8 encoding. // -// Copyright (c) 2007, Applied Informatics Software Engineering GmbH. -// All rights reserved. +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. // -// This is unpublished proprietary source code of Applied Informatics -// Software Engineering GmbH. -// The contents of this file may not be disclosed to third parties, -// copied or duplicated in any form, in whole or in part, without -// prior written permission from Applied Informatics. +// SPDX-License-Identifier: BSL-1.0 // #include "Poco/PDF/Document.h" @@ -39,13 +35,16 @@ int main(int argc, char** argv) Document document(file.path()); - Font helv = document.font("Helvetica"); + Font font = document.font(document.loadTTFont("DejaVuLGCSans.ttf", true), "UTF-8"); Page page = document[0]; - page.setFont(helv, 24); + page.setFont(font, 24); std::string hello = "Hello PDF World from C++ Portable Components"; float tw = page.textWidth(hello); page.writeOnce((page.getWidth() - tw) / 2, page.getHeight() - 50, hello); - + page.setFont(font, 14); + hello = "~ Courtesy of G\xC3\xBCnter Obiltschnig & Aleksandar Fabijani\xC4\x87 ~"; + tw = page.textWidth(hello); + page.writeOnce((page.getWidth() - tw) / 2, page.getHeight() - 100, hello); document.save(); return 0; } diff --git a/PDF/samples/build.gradle b/PDF/samples/build.gradle new file mode 100644 index 000000000..f76ecb555 --- /dev/null +++ b/PDF/samples/build.gradle @@ -0,0 +1,34 @@ +model { + components { + Image(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Image/src' include '**/*.cpp' } + cpp.lib project: ':PDF', library: 'PDF' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + Text(NativeExecutableSpec) { + sources { + cpp.source { srcDir 'Image/src' include '**/*.cpp' } + cpp.lib project: ':PDF', library: 'PDF' + cpp.lib project: ':Foundation', library: 'Foundation' + } + } + } + binaries { + all { + } + withType(SharedLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'shared' + } + withType(StaticLibraryBinarySpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + withType(NativeExecutableSpec) { + lib project: ':Foundation', library: 'Foundation', linkage: 'static' + } + } +} +task samples { dependsOn "assemble" } + + diff --git a/PDF/samples/samples.progen b/PDF/samples/samples.progen deleted file mode 100644 index 1af0b9211..000000000 --- a/PDF/samples/samples.progen +++ /dev/null @@ -1,6 +0,0 @@ -vc.project.platforms = Win32, x64 -vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md -vc.solution.create = true -vc.solution.include = \ - Image\\Image;\ - Text\\Text; diff --git a/PDF/src/Destination.cpp b/PDF/src/Destination.cpp index 192f6eab5..ddfef4d8d 100644 --- a/PDF/src/Destination.cpp +++ b/PDF/src/Destination.cpp @@ -21,7 +21,7 @@ namespace PDF { Destination::Destination(HPDF_Doc* pPDF, const HPDF_Destination& destination, - const std::string& name): + const std::string& name): Resource(pPDF, destination, name) { } diff --git a/PDF/src/Document.cpp b/PDF/src/Document.cpp index c225a0c27..a96a219ed 100644 --- a/PDF/src/Document.cpp +++ b/PDF/src/Document.cpp @@ -30,28 +30,24 @@ namespace PDF { Document::Document(const std::string fileName, Poco::UInt32 pageCount, Page::Size pageSize, - Page::Orientation orientation): + Page::Orientation orientation): _pdf(HPDF_New(HPDF_Error_Handler, 0)), _fileName(fileName), _pRawData(0), _size(0) { - compression(COMPRESSION_ALL); - for (Poco::UInt32 i = 0; i < pageCount; ++i) - addPage(pageSize, orientation); + init(pageCount, pageSize, orientation); } Document::Document(Poco::UInt32 pageCount, Page::Size pageSize, - Page::Orientation orientation): + Page::Orientation orientation): _pdf(HPDF_New(HPDF_Error_Handler, 0)), _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) @@ -136,7 +142,7 @@ const Page& Document::getCurrentPage() const Font& Document::loadFont(const std::string& name, const std::string& encoding) { Font font(&_pdf, HPDF_GetFont(_pdf, name.c_str(), encoding.empty() ? 0 : encoding.c_str())); - std::pair ret = + std::pair ret = _fonts.insert(FontContainer::value_type(name, font)); if (ret.second) return ret.first->second; @@ -149,7 +155,7 @@ const Font& Document::font(const std::string& name, const std::string& encoding) { FontContainer::iterator it = _fonts.find(name); if (_fonts.end() != it) return it->second; - + return loadFont(name, encoding); } @@ -160,20 +166,20 @@ std::string Document::loadType1Font(const std::string& afmFileName, const std::s } -std::string Document::loadTTFont(const std::string& fileName, bool embedding, int index) +std::string Document::loadTTFont(const std::string& fileName, bool embed, int index) { if (-1 == index) { return HPDF_LoadTTFontFromFile(_pdf, fileName.c_str(), - embedding ? HPDF_TRUE : HPDF_FALSE); + embed ? HPDF_TRUE : HPDF_FALSE); } else if (index >= 0) { - return HPDF_LoadTTFontFromFile2(_pdf, - fileName.c_str(), - static_cast(index), - embedding ? HPDF_TRUE : HPDF_FALSE); + return HPDF_LoadTTFontFromFile2(_pdf, + fileName.c_str(), + static_cast(index), + embed ? HPDF_TRUE : HPDF_FALSE); } else throw InvalidArgumentException("Invalid font index."); @@ -200,7 +206,7 @@ const Image& Document::loadPNGImageImpl(const std::string& fileName, bool doLoad if (it.second) return it.first->second; else throw IllegalStateException("Could not insert image."); } - else + else throw NotFoundException("File not found: " + fileName); } @@ -217,7 +223,7 @@ const Image& Document::loadJPEGImage(const std::string& fileName) if (it.second) return it.first->second; else throw IllegalStateException("Could not insert image."); } - else + else throw NotFoundException("File not found: " + fileName); } @@ -239,7 +245,7 @@ const Encoder& Document::loadEncoder(const std::string& name) if (_encoders.end() == it) return it->second; Encoder enc(&_pdf, HPDF_GetEncoder(_pdf, name.c_str()), name); - std::pair ret = + std::pair ret = _encoders.insert(EncoderContainer::value_type(name, enc)); if (ret.second) return ret.first->second; diff --git a/PDF/src/Encoder.cpp b/PDF/src/Encoder.cpp index d4bc352ba..1d05fc246 100644 --- a/PDF/src/Encoder.cpp +++ b/PDF/src/Encoder.cpp @@ -21,7 +21,7 @@ namespace PDF { Encoder::Encoder(HPDF_Doc* pPDF, const HPDF_Encoder& encoder, - const std::string& name): + const std::string& name): Resource(pPDF, encoder, name) { } diff --git a/PDF/src/Font.cpp b/PDF/src/Font.cpp index 08ad85cbc..27d3131b3 100644 --- a/PDF/src/Font.cpp +++ b/PDF/src/Font.cpp @@ -19,7 +19,7 @@ namespace Poco { namespace PDF { -Font::Font(HPDF_Doc* pPDF, const HPDF_Font& font): +Font::Font(HPDF_Doc* pPDF, const HPDF_Font& font): Resource(pPDF, font, HPDF_Font_GetFontName(font)) { } diff --git a/PDF/src/Image.cpp b/PDF/src/Image.cpp index 760f96db7..dcd05970b 100644 --- a/PDF/src/Image.cpp +++ b/PDF/src/Image.cpp @@ -19,7 +19,7 @@ namespace Poco { namespace PDF { -Image::Image(HPDF_Doc* pPDF, const HPDF_Image& resource, const std::string& name): +Image::Image(HPDF_Doc* pPDF, const HPDF_Image& resource, const std::string& name): Resource(pPDF, resource, name) { } diff --git a/PDF/src/LinkAnnotation.cpp b/PDF/src/LinkAnnotation.cpp index e95ba78a2..a0390214e 100644 --- a/PDF/src/LinkAnnotation.cpp +++ b/PDF/src/LinkAnnotation.cpp @@ -22,7 +22,7 @@ namespace PDF { LinkAnnotation::LinkAnnotation(HPDF_Doc* pPDF, const HPDF_Annotation& annotation, - const std::string& name): + const std::string& name): Resource(pPDF, annotation, name) { } diff --git a/PDF/src/Outline.cpp b/PDF/src/Outline.cpp index 7500bd301..69a874033 100644 --- a/PDF/src/Outline.cpp +++ b/PDF/src/Outline.cpp @@ -20,7 +20,7 @@ namespace Poco { namespace PDF { -Outline::Outline(HPDF_Doc* pPDF, const HPDF_Outline& outline, const std::string& name): +Outline::Outline(HPDF_Doc* pPDF, const HPDF_Outline& outline, const std::string& name): Resource(pPDF, outline, name) { open(); diff --git a/PDF/src/PDFException.cpp b/PDF/src/PDFException.cpp index f192bde33..7f109faaf 100644 --- a/PDF/src/PDFException.cpp +++ b/PDF/src/PDFException.cpp @@ -26,20 +26,20 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ { switch (error_no) { - case HPDF_ARRAY_COUNT_ERR: + case HPDF_ARRAY_COUNT_ERR: throw InvalidArgumentException("Internal error. The consistency of the data was lost."); - case HPDF_ARRAY_ITEM_NOT_FOUND: + case HPDF_ARRAY_ITEM_NOT_FOUND: throw NotFoundException("Internal error. The consistency of the data was lost."); case HPDF_ARRAY_ITEM_UNEXPECTED_TYPE: throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_BINARY_LENGTH_ERR: throw InvalidArgumentException("The length of the data exceeds HPDF_LIMIT_MAX_STRING_LEN."); case HPDF_CANNOT_GET_PALLET: - throw NotFoundException("Cannot get a pallet data from PNG image."); + throw NotFoundException("Cannot get a pallet data from PNG image."); case HPDF_DICT_COUNT_ERR: throw InvalidArgumentException("The count of elements of a dictionary exceeds HPDF_LIMIT_MAX_DICT_ELEMENT"); case HPDF_DICT_ITEM_NOT_FOUND: - throw NotFoundException("Internal error. The consistency of the data was lost."); + throw NotFoundException("Internal error. The consistency of the data was lost."); case HPDF_DICT_ITEM_UNEXPECTED_TYPE: throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_DICT_STREAM_LENGTH_NOT_FOUND: @@ -47,7 +47,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_DOC_ENCRYPTDICT_NOT_FOUND: throw NotFoundException("HPDF_SetPermission() OR HPDF_SetEncryptMode() was called before a password is set."); case HPDF_DOC_INVALID_OBJECT: - throw IllegalStateException("Internal error. The consistency of the data was lost."); + throw IllegalStateException("Internal error. The consistency of the data was lost."); case HPDF_DUPLICATE_REGISTRATION: throw IllegalStateException("Tried to register a font that has been registered."); case HPDF_EXCEED_JWW_CODE_NUM_LIMIT: @@ -55,7 +55,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_ENCRYPT_INVALID_PASSWORD: throw IllegalStateException("Tried to set the owner password to NULL."); case HPDF_ERR_UNKNOWN_CLASS: - throw InvalidArgumentException("Internal error. The consistency of the data was lost."); + throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_EXCEED_GSTATE_LIMIT: throw IllegalStateException("The depth of the stack exceeded HPDF_LIMIT_MAX_GSTATE."); case HPDF_FAILD_TO_ALLOC_MEM: @@ -65,13 +65,13 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_FILE_OPEN_ERROR: throw IOException("Cannot open a file. (A detailed code is set.)"); case HPDF_FONT_EXISTS: - throw IllegalStateException("Tried to load a font that has been registered."); + throw IllegalStateException("Tried to load a font that has been registered."); case HPDF_FONT_INVALID_WIDTHS_TABLE: - throw IllegalStateException("The format of a font-file is invalid. Internal error. The consistency of the data was lost."); + throw IllegalStateException("The format of a font-file is invalid. Internal error. The consistency of the data was lost."); case HPDF_INVALID_AFM_HEADER: throw IllegalStateException("Cannot recognize a header of an afm file."); case HPDF_INVALID_ANNOTATION: - throw IllegalStateException("The specified annotation handle is invalid."); + throw IllegalStateException("The specified annotation handle is invalid."); case HPDF_INVALID_BIT_PER_COMPONENT: throw IllegalStateException("Bit-per-component of a image which was set as mask-image is invalid."); case HPDF_INVALID_CHAR_MATRICS_DATA: @@ -79,11 +79,11 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_INVALID_COLOR_SPACE: switch (detail_no) { - case 1: + case 1: throw InvalidArgumentException("The color_space parameter of HPDF_LoadRawImage is invalid."); - case 2: + case 2: throw InvalidArgumentException("Color-space of a image which was set as mask-image is invalid."); - case 3: + case 3: throw InvalidArgumentException("The function which is invalid in the present color-space was invoked."); default: throw PDFException(); @@ -109,7 +109,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_INVALID_FONTDEF_DATA: switch (detail_no) { - case 1: + case 1: throw InvalidArgumentException("An invalid font handle was set."); case 2: throw InvalidArgumentException("Unsupported font format."); @@ -131,7 +131,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ { case 1: throw IllegalStateException("An invalid object is set."); - case 2: + case 2: throw IllegalStateException("Internal error. The consistency of the data was lost."); default: throw PDFException(); @@ -167,15 +167,15 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_INVALID_WX_DATA: throw IOException("Cannot read a width-data from an afm file."); case HPDF_ITEM_NOT_FOUND: - throw NotFoundException("Internal error. The consistency of the data was lost."); + throw NotFoundException("Internal error. The consistency of the data was lost."); case HPDF_LIBPNG_ERROR: throw IOException("An error has returned from PNGLIB while loading an image."); case HPDF_NAME_INVALID_VALUE: throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_NAME_OUT_OF_RANGE: - throw InvalidArgumentException("Internal error. The consistency of the data was lost."); + throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_PAGES_MISSING_KIDS_ENTRY: - throw IllegalStateException("Internal error. The consistency of the data was lost."); + throw IllegalStateException("Internal error. The consistency of the data was lost."); case HPDF_PAGE_CANNOT_FIND_OBJECT: throw NotFoundException("Internal error. The consistency of the data was lost."); case HPDF_PAGE_CANNOT_GET_ROOT_PAGES: @@ -197,7 +197,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_PAGE_INVALID_ROTATE_VALUE: throw InvalidArgumentException("The specified value is not a multiple of 90."); case HPDF_PAGE_INVALID_SIZE: - throw InvalidArgumentException("An invalid page-size was set."); + throw InvalidArgumentException("An invalid page-size was set."); case HPDF_PAGE_INVALID_XOBJECT: throw InvalidArgumentException("An invalid image-handle was set."); case HPDF_PAGE_OUT_OF_RANGE: @@ -219,7 +219,7 @@ void HPDF_Error_Handler(HPDF_STATUS error_no, HPDF_STATUS detail_no, void* user_ case HPDF_TTF_INVALID_FOMAT: throw InvalidArgumentException("Unsupported ttf format."); case HPDF_TTF_MISSING_TABLE: - throw InvalidArgumentException("Unsupported ttf format. (cannot find a necessary table)"); + throw InvalidArgumentException("Unsupported ttf format. (cannot find a necessary table)"); case HPDF_UNSUPPORTED_FONT_TYPE: throw InvalidArgumentException("Internal error. The consistency of the data was lost."); case HPDF_UNSUPPORTED_FUNC: diff --git a/PDF/src/Page.cpp b/PDF/src/Page.cpp index e2c3f0b0e..a02d717ff 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) + _pDocument(pDocument), + _page(page), + _size(pageSize), + _orientation(orientation), + _pCurrentFont(0) { } Page::Page(const Page& other): - _pPDF(other._pPDF), + _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,25 @@ float Page::textWidth(const std::string& text) } +void Page::setFont(const std::string& name, float size, const std::string& encoding) +{ + setFont(_pDocument->font(name, encoding), size); +} + + +void Page::setTTFont(const std::string& name, float size, const std::string& encoding, bool embed) +{ + setFont(_pDocument->font(_pDocument->loadTTFont(name, embed), encoding), 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()) @@ -109,11 +137,11 @@ void Page::setRotation(int angle) const Destination& Page::createDestination(const std::string& name) { DestinationContainer::iterator it = _destinations.find(name); - if (_destinations.end() != it) + if (_destinations.end() != it) throw InvalidArgumentException("Destination already exists."); - Destination dest(_pPDF, HPDF_Page_CreateDestination(_page), name); - std::pair ret = + Destination dest(&_pDocument->handle(), HPDF_Page_CreateDestination(_page), name); + std::pair ret = _destinations.insert(DestinationContainer::value_type(name, dest)); if (ret.second) return ret.first->second; @@ -122,20 +150,20 @@ const Destination& Page::createDestination(const std::string& name) } -const TextAnnotation& Page::createTextAnnotation(const std::string& name, +const TextAnnotation& Page::createTextAnnotation(const std::string& name, const Rectangle& rect, const std::string& text, const Encoder& encoder) { TextAnnotationContainer::iterator it = _textAnnotations.find(name); - if (_textAnnotations.end() != it) + 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); - std::pair ret = + std::pair ret = _textAnnotations.insert(TextAnnotationContainer::value_type(name, ann)); if (ret.second) return ret.first->second; @@ -144,18 +172,18 @@ const TextAnnotation& Page::createTextAnnotation(const std::string& name, } -const LinkAnnotation& Page::createLinkAnnotation(const std::string& name, +const LinkAnnotation& Page::createLinkAnnotation(const std::string& name, const Rectangle& rect, const Destination& dest) { LinkAnnotationContainer::iterator it = _linkAnnotations.find(name); - if (_linkAnnotations.end() != it) + 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 = + std::pair ret = _linkAnnotations.insert(LinkAnnotationContainer::value_type(name, ann)); if (ret.second) return ret.first->second; @@ -164,18 +192,18 @@ const LinkAnnotation& Page::createLinkAnnotation(const std::string& name, } -const LinkAnnotation& Page::createURILinkAnnotation(const std::string& name, +const LinkAnnotation& Page::createURILinkAnnotation(const std::string& name, const Rectangle& rect, const std::string& uri) { LinkAnnotationContainer::iterator it = _linkAnnotations.find(name); - if (_linkAnnotations.end() != it) + 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 = + std::pair ret = _linkAnnotations.insert(LinkAnnotationContainer::value_type(name, ann)); if (ret.second) return ret.first->second; diff --git a/PDF/src/TextAnnotation.cpp b/PDF/src/TextAnnotation.cpp index d2e9f3d9c..0b8d7f132 100644 --- a/PDF/src/TextAnnotation.cpp +++ b/PDF/src/TextAnnotation.cpp @@ -22,7 +22,7 @@ namespace PDF { TextAnnotation::TextAnnotation(HPDF_Doc* pPDF, const HPDF_Annotation& annotation, - const std::string& name): + const std::string& name): Resource(pPDF, annotation, name) { open(); diff --git a/PDF/src/gzio.c b/PDF/src/gzio.c index cce085734..2354bc5ba 100644 --- a/PDF/src/gzio.c +++ b/PDF/src/gzio.c @@ -256,7 +256,7 @@ int ZEXPORT gzsetparams (file, level, strategy) /* =========================================================================== Read a byte from a gz_stream; update next_in and avail_in. Return EOF for end of file. - IN assertion: the stream s has been successfully opened for reading. + IN assertion: the stream s has been sucessfully opened for reading. */ local int get_byte(s) gz_stream *s; @@ -281,7 +281,7 @@ local int get_byte(s) mode to transparent if the gzip magic header is not present; set s->err to Z_DATA_ERROR if the magic header is present but the rest of the header is incorrect. - IN assertion: the stream s has already been created successfully; + IN assertion: the stream s has already been created sucessfully; s->stream.avail_in is zero for the first time, but may be non-zero for concatenated .gz files. */ 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 16b4e9bef..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; @@ -2573,7 +2577,7 @@ HPDF_CMapEncoder_InitAttr (HPDF_Encoder encoder) for (i = 0; i <= 255; i++) { for (j = 0; j <= 255; j++) { - /* undefined characters are replaced to square */ + /* undefined charactors are replaced to square */ encoder_attr->unicode_map[i][j] = 0x25A1; } } @@ -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 812fb4b40..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", @@ -36,7 +39,7 @@ const static char *HPDF_BM_NAMES[] = { HPDF_BOOL HPDF_ExtGState_Validate (HPDF_ExtGState ext_gstate) { - if (!ext_gstate || (ext_gstate->header.obj_class != + if (!ext_gstate || (ext_gstate->header.obj_class != (HPDF_OSUBCLASS_EXT_GSTATE | HPDF_OCLASS_DICT) && ext_gstate->header.obj_class != (HPDF_OSUBCLASS_EXT_GSTATE_R | HPDF_OCLASS_DICT))) @@ -51,8 +54,8 @@ ExtGState_Check (HPDF_ExtGState ext_gstate) { if (!HPDF_ExtGState_Validate (ext_gstate)) return HPDF_INVALID_OBJECT; - - if (ext_gstate->header.obj_class == + + if (ext_gstate->header.obj_class == (HPDF_OSUBCLASS_EXT_GSTATE_R | HPDF_OCLASS_DICT)) return HPDF_RaiseError (ext_gstate->error, HPDF_EXT_GSTATE_READ_ONLY, 0); @@ -62,7 +65,7 @@ ExtGState_Check (HPDF_ExtGState ext_gstate) HPDF_Dict -HPDF_ExtGState_New (HPDF_MMgr mmgr, +HPDF_ExtGState_New (HPDF_MMgr mmgr, HPDF_Xref xref) { HPDF_Dict obj = HPDF_Dict_New (mmgr); @@ -89,12 +92,12 @@ HPDF_ExtGState_SetAlphaStroke (HPDF_ExtGState ext_gstate, HPDF_REAL value) { HPDF_STATUS ret = ExtGState_Check (ext_gstate); - + if (ret != HPDF_OK) return ret; - + if (value < 0 || value > 1.0f) - return HPDF_RaiseError (ext_gstate->error, + return HPDF_RaiseError (ext_gstate->error, HPDF_EXT_GSTATE_OUT_OF_RANGE, 0); return HPDF_Dict_AddReal (ext_gstate, "CA", value); @@ -106,12 +109,12 @@ HPDF_ExtGState_SetAlphaFill (HPDF_ExtGState ext_gstate, HPDF_REAL value) { HPDF_STATUS ret = ExtGState_Check (ext_gstate); - + if (ret != HPDF_OK) return ret; if (value < 0 || value > 1.0f) - return HPDF_RaiseError (ext_gstate->error, + return HPDF_RaiseError (ext_gstate->error, HPDF_EXT_GSTATE_OUT_OF_RANGE, 0); return HPDF_Dict_AddReal (ext_gstate, "ca", value); @@ -123,12 +126,12 @@ HPDF_ExtGState_SetBlendMode (HPDF_ExtGState ext_gstate, HPDF_BlendMode bmode) { HPDF_STATUS ret = ExtGState_Check (ext_gstate); - + if (ret != HPDF_OK) return ret; if ((int)bmode < 0 || (int)bmode > (int)HPDF_BM_EOF) - return HPDF_RaiseError (ext_gstate->error, + return HPDF_RaiseError (ext_gstate->error, HPDF_EXT_GSTATE_OUT_OF_RANGE, 0); return HPDF_Dict_AddName (ext_gstate, "BM", HPDF_BM_NAMES[(int)bmode]); @@ -140,7 +143,7 @@ HPDF_ExtGState_SetStrokeAdjustment (HPDF_ExtGState ext_gstate, HPDF_BOOL value) { HPDF_STATUS ret = ExtGState_Check (ext_gstate); - + if (ret != HPDF_OK) return ret; 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 ca8b80218..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; } } @@ -401,7 +401,7 @@ HPDF_Type1FontDef_Load (HPDF_MMgr mmgr, return NULL; } - /* if font-data is specified, the font data is embedded */ + /* if font-data is specified, the font data is embeded */ if (font_data) { ret = LoadFontData (fontdef, font_data); if (ret != HPDF_OK) { @@ -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 885008c1a..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) @@ -1205,7 +1225,7 @@ HPDF_Page_GetCurrentTextPos (HPDF_Page page) if (attr->gmode & HPDF_GMODE_TEXT_OBJECT) pos = attr->text_pos; } - + return pos; } @@ -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 05a5c3690..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, @@ -132,7 +141,7 @@ HPDF_Stream_Read (HPDF_Stream stream, * s : Pointer to a buffer to copy read data. * size : buffer-size of s. * - * Read from stream until the buffer is exhausted or line-feed character is + * Read from stream until the buffer is exhausted or line-feed charactor is * read. * */ @@ -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 cd4ba345a..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,7 +27,11 @@ HPDF_AToI (const char *s) HPDF_BOOL flg = HPDF_FALSE; HPDF_INT v = 0; - /* increment pointer until the character of 's' is not + if (!s) { + return 0; + } + + /* increment pointer until the charactor of 's' is not * white-space-charactor. */ while (*s) { @@ -60,7 +67,7 @@ HPDF_AToF (const char *s) HPDF_DOUBLE v; HPDF_INT tmp = 1; - /* increment pointer until the character of 's' is not + /* increment pointer until the charactor of 's' is not * white-space-charactor. */ while (*s) { @@ -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 205129487..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, @@ -132,8 +135,8 @@ HPDF_Xref_Add (HPDF_Xref xref, header = (HPDF_Obj_Header *)obj; - if ((header->obj_id & HPDF_OTYPE_DIRECT) || - (header->obj_id & HPDF_OTYPE_INDIRECT)) + if (header->obj_id & HPDF_OTYPE_DIRECT || + header->obj_id & HPDF_OTYPE_INDIRECT) return HPDF_SetError(xref->error, HPDF_INVALID_OBJECT, 0); if (xref->entries->count >= HPDF_LIMIT_MAX_XREF_ELEMENT) { @@ -142,7 +145,7 @@ HPDF_Xref_Add (HPDF_Xref xref, } /* in the following, we have to dispose the object when an error is - * occurred. + * occured. */ entry = (HPDF_XrefEntry)HPDF_GetMem (xref->mmgr, @@ -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/pngget.c b/PDF/src/pngget.c index 0b2a69515..a0e90bb6a 100644 --- a/PDF/src/pngget.c +++ b/PDF/src/pngget.c @@ -896,6 +896,6 @@ png_get_user_height_max (png_structp png_ptr) return (png_ptr? png_ptr->user_height_max : 0); } #endif /* ?PNG_SET_USER_LIMITS_SUPPORTED */ - + #endif /* PNG_READ_SUPPORTED || PNG_WRITE_SUPPORTED */ diff --git a/PDF/src/pngmem.c b/PDF/src/pngmem.c index 8af365850..248060f38 100644 --- a/PDF/src/pngmem.c +++ b/PDF/src/pngmem.c @@ -327,7 +327,7 @@ png_free_default(png_structp png_ptr, png_voidp ptr) /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought - to improve performance noticeably. */ + to improve performance noticably. */ png_voidp /* PRIVATE */ png_create_struct(int type) { @@ -337,7 +337,7 @@ png_create_struct(int type) /* Allocate memory for a png_struct or a png_info. The malloc and memset can be replaced by a single call to calloc() if this is thought - to improve performance noticeably. */ + to improve performance noticably. */ png_voidp /* PRIVATE */ png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr) { diff --git a/PDF/src/pngpread.c b/PDF/src/pngpread.c index c5ad75c33..8f4b7d179 100644 --- a/PDF/src/pngpread.c +++ b/PDF/src/pngpread.c @@ -1491,7 +1491,7 @@ png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 } #endif png_memcpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, + (png_charp)png_ptr->chunk_name, png_sizeof(png_ptr->unknown_chunk.name)); png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1]='\0'; diff --git a/PDF/src/pngrtran.c b/PDF/src/pngrtran.c index 96ca4a146..cda392154 100644 --- a/PDF/src/pngrtran.c +++ b/PDF/src/pngrtran.c @@ -1319,7 +1319,7 @@ png_do_read_transformations(png_structp png_ptr) if(rgb_error) { png_ptr->rgb_to_gray_status=1; - if((png_ptr->transformations & PNG_RGB_TO_GRAY) == + if((png_ptr->transformations & PNG_RGB_TO_GRAY) == PNG_RGB_TO_GRAY_WARN) png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel"); if((png_ptr->transformations & PNG_RGB_TO_GRAY) == @@ -3824,7 +3824,7 @@ png_do_expand(png_row_infop row_info, png_bytep row, dp = row + (row_info->rowbytes << 1) - 1; for (i = 0; i < row_width; i++) { - if (*(sp-1) == gray_high && *(sp) == gray_low) + if (*(sp-1) == gray_high && *(sp) == gray_low) { *dp-- = 0; *dp-- = 0; diff --git a/PDF/src/pngrutil.c b/PDF/src/pngrutil.c index dfb2365da..5e40aca48 100644 --- a/PDF/src/pngrutil.c +++ b/PDF/src/pngrutil.c @@ -2224,7 +2224,7 @@ png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length) } #endif png_memcpy((png_charp)png_ptr->unknown_chunk.name, - (png_charp)png_ptr->chunk_name, + (png_charp)png_ptr->chunk_name, png_sizeof(png_ptr->unknown_chunk.name)); png_ptr->unknown_chunk.name[png_sizeof(png_ptr->unknown_chunk.name)-1] = '\0'; png_ptr->unknown_chunk.data = (png_bytep)png_malloc(png_ptr, length); diff --git a/PDF/src/pngset.c b/PDF/src/pngset.c index d598d4d1b..f8f9b7e3b 100644 --- a/PDF/src/pngset.c +++ b/PDF/src/pngset.c @@ -1040,8 +1040,8 @@ png_set_unknown_chunks(png_structp png_ptr, png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i; png_unknown_chunkp from = unknowns + i; - png_memcpy((png_charp)to->name, - (png_charp)from->name, + png_memcpy((png_charp)to->name, + (png_charp)from->name, png_sizeof(from->name)); to->name[png_sizeof(to->name)-1] = '\0'; diff --git a/PDF/src/pngtest.c b/PDF/src/pngtest.c index 7abd8a2c5..dd2946bf4 100644 --- a/PDF/src/pngtest.c +++ b/PDF/src/pngtest.c @@ -1007,7 +1007,7 @@ test_one_file(PNG_CONST char *inname, PNG_CONST char *outname) pointed to by png_convert_to_rfc1123() gets free'ed before we use it */ png_memcpy(tIME_string, - png_convert_to_rfc1123(read_ptr, mod_time), + png_convert_to_rfc1123(read_ptr, mod_time), png_sizeof(tIME_string)); tIME_string[png_sizeof(tIME_string)-1] = '\0'; tIME_chunk_present++; diff --git a/PDF/src/pngwutil.c b/PDF/src/pngwutil.c index 96bdfd7f8..fef38aef9 100644 --- a/PDF/src/pngwutil.c +++ b/PDF/src/pngwutil.c @@ -466,7 +466,7 @@ png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height, interlace_type=PNG_INTERLACE_NONE; #endif - /* save off the relevant information */ + /* save off the relevent information */ png_ptr->bit_depth = (png_byte)bit_depth; png_ptr->color_type = (png_byte)color_type; png_ptr->interlaced = (png_byte)interlace_type; 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_ */ diff --git a/PDF/testsuite/CMakeLists.txt b/PDF/testsuite/CMakeLists.txt index 6ccf6b057..79ca02515 100644 --- a/PDF/testsuite/CMakeLists.txt +++ b/PDF/testsuite/CMakeLists.txt @@ -14,4 +14,4 @@ POCO_SOURCES_AUTO_PLAT( TEST_SRCS OFF add_executable( ${TESTUNIT} ${TEST_SRCS} ) add_test(NAME ${LIBNAME} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMAND ${TESTUNIT} -all) -target_link_libraries( ${TESTUNIT} PocoPDF PocoFoundation PocoCppUnit ) +target_link_libraries( ${TESTUNIT} PocoPDF PocoFoundation CppUnit ) diff --git a/PDF/testsuite/Makefile b/PDF/testsuite/Makefile index 7b73890b6..0c66dedc9 100644 --- a/PDF/testsuite/Makefile +++ b/PDF/testsuite/Makefile @@ -10,6 +10,6 @@ objects = PDFTestSuite Driver PDFTest target = testrunner target_version = 1 -target_libs = PocoPDF PocoFoundation PocoCppUnit +target_libs = PocoPDF PocoFoundation CppUnit include $(POCO_BASE)/build/rules/exec diff --git a/PDF/testsuite/TestSuite.progen b/PDF/testsuite/TestSuite.progen deleted file mode 100644 index 682c09fae..000000000 --- a/PDF/testsuite/TestSuite.progen +++ /dev/null @@ -1,9 +0,0 @@ -vc.project.guid = 24134877-368D-11DB-9FBC-00123FC423B5 -vc.project.name = TestSuite -vc.project.target = TestSuite -vc.project.type = testsuite -vc.project.pocobase = ..\\.. -vc.project.platforms = Win32, x64 -vc.project.configurations = debug_shared, release_shared, debug_static_mt, release_static_mt, debug_static_md, release_static_md -vc.project.prototype = TestSuite_vs90.vcproj -vc.project.compiler.include = ..\\..\\Foundation\\include diff --git a/PDF/testsuite/TestSuite_vs140.vcxproj b/PDF/testsuite/TestSuite_vs140.vcxproj index 35718961d..e855fcaf6 100644 --- a/PDF/testsuite/TestSuite_vs140.vcxproj +++ b/PDF/testsuite/TestSuite_vs140.vcxproj @@ -142,7 +142,7 @@ Default
- PocoCppUnitd.lib;%(AdditionalDependencies) + CppUnitd.lib;%(AdditionalDependencies) bin\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -173,7 +173,7 @@ Default
- PocoCppUnit.lib;%(AdditionalDependencies) + CppUnit.lib;%(AdditionalDependencies) bin\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false @@ -202,7 +202,7 @@ Default
- PocoCppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_mt\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -233,7 +233,7 @@ Default
- PocoCppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_mt\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false @@ -262,7 +262,7 @@ Default
- PocoCppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_md\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -293,7 +293,7 @@ Default
- PocoCppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_md\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false diff --git a/PDF/testsuite/TestSuite_vs140.vcxproj.filters b/PDF/testsuite/TestSuite_vs140.vcxproj.filters index 9942bca40..e469bc918 100644 --- a/PDF/testsuite/TestSuite_vs140.vcxproj.filters +++ b/PDF/testsuite/TestSuite_vs140.vcxproj.filters @@ -2,28 +2,28 @@ - {25224422-bc70-4739-b840-3e08a99ec929} + {49cee8e1-befc-4292-b5de-22410187a085} - {e22606c8-c256-4d05-9968-d184c3399837} + {efa63a14-8941-42c2-a23c-9aa4076bfdac} - {1b7784a8-92b7-4ce7-b3c7-cef91500ae09} + {39121e4b-82f7-44eb-8558-3784d8a2b81e} - {138815ba-9e02-43f5-8843-1acf933ed81a} + {636cf943-9472-4f68-9e1e-827308d7a9fd} - {bd0629a8-9245-4be4-8f90-ad22ffdb180f} + {dd2e56ad-cc6d-4755-98be-6d091ade745b} - {e7e8908b-8c3b-4aa7-a4cf-84f183606941} + {365cf1a4-c73c-43da-bea5-a8dd5d0d22d2} - {ee919c41-6966-4205-a6e2-1b5e31023006} + {8a4c5937-c511-4d90-a94d-7992e302159a} - {af3de670-5332-47d0-bbab-ed080d716ef4} + {3ab94302-7103-431f-a3bf-6e77171d0c27} diff --git a/PDF/testsuite/TestSuite_vs150.vcxproj b/PDF/testsuite/TestSuite_vs150.vcxproj index df0731671..2177fe5d7 100644 --- a/PDF/testsuite/TestSuite_vs150.vcxproj +++ b/PDF/testsuite/TestSuite_vs150.vcxproj @@ -142,7 +142,7 @@ Default
- PocoCppUnitd.lib;%(AdditionalDependencies) + CppUnitd.lib;%(AdditionalDependencies) bin\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -173,7 +173,7 @@ Default
- PocoCppUnit.lib;%(AdditionalDependencies) + CppUnit.lib;%(AdditionalDependencies) bin\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false @@ -202,7 +202,7 @@ Default
- PocoCppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_mt\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -233,7 +233,7 @@ Default
- PocoCppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_mt\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false @@ -262,7 +262,7 @@ Default
- PocoCppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_md\TestSuited.exe ..\..\lib;%(AdditionalLibraryDirectories) true @@ -293,7 +293,7 @@ Default
- PocoCppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin\static_md\TestSuite.exe ..\..\lib;%(AdditionalLibraryDirectories) false diff --git a/PDF/testsuite/TestSuite_vs150.vcxproj.filters b/PDF/testsuite/TestSuite_vs150.vcxproj.filters index 9942bca40..e469bc918 100644 --- a/PDF/testsuite/TestSuite_vs150.vcxproj.filters +++ b/PDF/testsuite/TestSuite_vs150.vcxproj.filters @@ -2,28 +2,28 @@ - {25224422-bc70-4739-b840-3e08a99ec929} + {49cee8e1-befc-4292-b5de-22410187a085} - {e22606c8-c256-4d05-9968-d184c3399837} + {efa63a14-8941-42c2-a23c-9aa4076bfdac} - {1b7784a8-92b7-4ce7-b3c7-cef91500ae09} + {39121e4b-82f7-44eb-8558-3784d8a2b81e} - {138815ba-9e02-43f5-8843-1acf933ed81a} + {636cf943-9472-4f68-9e1e-827308d7a9fd} - {bd0629a8-9245-4be4-8f90-ad22ffdb180f} + {dd2e56ad-cc6d-4755-98be-6d091ade745b} - {e7e8908b-8c3b-4aa7-a4cf-84f183606941} + {365cf1a4-c73c-43da-bea5-a8dd5d0d22d2} - {ee919c41-6966-4205-a6e2-1b5e31023006} + {8a4c5937-c511-4d90-a94d-7992e302159a} - {af3de670-5332-47d0-bbab-ed080d716ef4} + {3ab94302-7103-431f-a3bf-6e77171d0c27} diff --git a/PDF/testsuite/TestSuite_x64_vs140.vcxproj b/PDF/testsuite/TestSuite_x64_vs140.vcxproj index aa964aa2a..21581cf88 100644 --- a/PDF/testsuite/TestSuite_x64_vs140.vcxproj +++ b/PDF/testsuite/TestSuite_x64_vs140.vcxproj @@ -142,7 +142,7 @@ Default
- PocoCppUnitd.lib;%(AdditionalDependencies) + CppUnitd.lib;%(AdditionalDependencies) bin64\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -173,7 +173,7 @@ Default
- PocoCppUnit.lib;%(AdditionalDependencies) + CppUnit.lib;%(AdditionalDependencies) bin64\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false @@ -202,7 +202,7 @@ Default
- PocoCppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_mt\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -233,7 +233,7 @@ Default
- PocoCppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_mt\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false @@ -262,7 +262,7 @@ Default
- PocoCppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_md\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -293,7 +293,7 @@ Default
- PocoCppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_md\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false diff --git a/PDF/testsuite/TestSuite_x64_vs140.vcxproj.filters b/PDF/testsuite/TestSuite_x64_vs140.vcxproj.filters index a56964be3..83935d411 100644 --- a/PDF/testsuite/TestSuite_x64_vs140.vcxproj.filters +++ b/PDF/testsuite/TestSuite_x64_vs140.vcxproj.filters @@ -2,28 +2,28 @@ - {46aeef0c-236d-4b80-b19a-6d95d6018adf} + {ff51531f-0e9c-4846-bb61-d374b91cba75} - {0ee1a14c-e5b4-42ef-a22a-94bc7e084a8f} + {0f2e5c9e-a179-40de-8ab5-b94b1398a39b} - {062ef8fd-0428-43cd-92dd-1305cec8efaa} + {00734402-fb83-4814-8e5a-4bfd862224f6} - {c763312c-d2e8-4d01-9db2-5cfacc7e323e} + {10b3aae1-bd2b-427d-8415-260439d74543} - {205c9a02-4115-460d-9af3-1ec93d338655} + {4edadfd7-bd68-4701-ae71-800eb9851118} - {b9ddae48-eca1-47db-b62c-f2728e4720d9} + {f869f09e-4a61-48e1-9f5c-1d7f00e1f642} - {516d20f3-9515-4715-aaad-d142294945af} + {29acf815-1b49-4b1e-a346-a99929eadd32} - {b601a474-682a-40e0-849f-602bbbdac6e2} + {2bb4acb2-2dea-487a-bd87-70428ebff560} diff --git a/PDF/testsuite/TestSuite_x64_vs150.vcxproj b/PDF/testsuite/TestSuite_x64_vs150.vcxproj index 97e3c19e8..bea89ab13 100644 --- a/PDF/testsuite/TestSuite_x64_vs150.vcxproj +++ b/PDF/testsuite/TestSuite_x64_vs150.vcxproj @@ -142,7 +142,7 @@ Default
- PocoCppUnitd.lib;%(AdditionalDependencies) + CppUnitd.lib;%(AdditionalDependencies) bin64\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -173,7 +173,7 @@ Default
- PocoCppUnit.lib;%(AdditionalDependencies) + CppUnit.lib;%(AdditionalDependencies) bin64\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false @@ -202,7 +202,7 @@ Default
- PocoCppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmtd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_mt\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -233,7 +233,7 @@ Default
- PocoCppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmt.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_mt\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false @@ -262,7 +262,7 @@ Default
- PocoCppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmdd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_md\TestSuited.exe ..\..\lib64;%(AdditionalLibraryDirectories) true @@ -293,7 +293,7 @@ Default
- PocoCppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) + CppUnitmd.lib;iphlpapi.lib;winmm.lib;%(AdditionalDependencies) bin64\static_md\TestSuite.exe ..\..\lib64;%(AdditionalLibraryDirectories) false diff --git a/PDF/testsuite/TestSuite_x64_vs150.vcxproj.filters b/PDF/testsuite/TestSuite_x64_vs150.vcxproj.filters index a56964be3..83935d411 100644 --- a/PDF/testsuite/TestSuite_x64_vs150.vcxproj.filters +++ b/PDF/testsuite/TestSuite_x64_vs150.vcxproj.filters @@ -2,28 +2,28 @@ - {46aeef0c-236d-4b80-b19a-6d95d6018adf} + {ff51531f-0e9c-4846-bb61-d374b91cba75} - {0ee1a14c-e5b4-42ef-a22a-94bc7e084a8f} + {0f2e5c9e-a179-40de-8ab5-b94b1398a39b} - {062ef8fd-0428-43cd-92dd-1305cec8efaa} + {00734402-fb83-4814-8e5a-4bfd862224f6} - {c763312c-d2e8-4d01-9db2-5cfacc7e323e} + {10b3aae1-bd2b-427d-8415-260439d74543} - {205c9a02-4115-460d-9af3-1ec93d338655} + {4edadfd7-bd68-4701-ae71-800eb9851118} - {b9ddae48-eca1-47db-b62c-f2728e4720d9} + {f869f09e-4a61-48e1-9f5c-1d7f00e1f642} - {516d20f3-9515-4715-aaad-d142294945af} + {29acf815-1b49-4b1e-a346-a99929eadd32} - {b601a474-682a-40e0-849f-602bbbdac6e2} + {2bb4acb2-2dea-487a-bd87-70428ebff560} diff --git a/PDF/testsuite/build.gradle b/PDF/testsuite/build.gradle new file mode 100644 index 000000000..725c1d1bd --- /dev/null +++ b/PDF/testsuite/build.gradle @@ -0,0 +1,61 @@ +import org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec + +model { + components { + withType(NativeComponentSpec) { + binaries.withType(NativeBinarySpec) { + if (buildType == buildTypes.debug) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(appendDebugSuffix(executable.file), targetPlatform) + } + } else + if (buildType == buildTypes.release) { + if (it instanceof NativeExecutableBinarySpec) { + executable.file = toLocalBin(executable.file, targetPlatform) + } + } + } + } + TestSuite(NativeLibrarySpec) { + sources { + cpp { + source { + srcDir 'src' + include '**/*.cpp' + exclude '*Driver.cpp' + } + exportedHeaders { + srcDir 'src' + } + lib project: ':CppUnit', library: 'CppUnit' + lib project: ':Foundation', library: 'Foundation' + } + } + } + } + testSuites { + PDFTestSuite(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteSpec) { + testing $.components.TestSuite + } + } + binaries { + withType(org.gradle.nativeplatform.test.cppunit.CppUnitTestSuiteBinarySpec) { + lib project: ':CppUnit', library: 'CppUnit', linkage: 'shared' + if (toolChain in VisualCpp) { + if (buildType == buildTypes.debug) { + cCompiler.args "/MDd" + cppCompiler.args "/MDd" + } else + if (buildType == buildTypes.release) { + cCompiler.args "/MD" + cppCompiler.args "/MD" + } else { + throw new GradleException("Unknown buildType" + buildType) + } + } + if (toolChain in Gcc) { + } + } + } +} +task testsuite { dependsOn "assemble" } diff --git a/PDF/testsuite/src/Driver.cpp b/PDF/testsuite/src/Driver.cpp index 1e554694b..44d1a3ffd 100644 --- a/PDF/testsuite/src/Driver.cpp +++ b/PDF/testsuite/src/Driver.cpp @@ -10,7 +10,7 @@ // -#include "Poco/CppUnit/TestRunner.h" +#include "CppUnit/TestRunner.h" #include "PDFTestSuite.h" diff --git a/PDF/testsuite/src/PDFTest.cpp b/PDF/testsuite/src/PDFTest.cpp index 93f0a1051..09b14154c 100644 --- a/PDF/testsuite/src/PDFTest.cpp +++ b/PDF/testsuite/src/PDFTest.cpp @@ -9,8 +9,8 @@ #include "PDFTest.h" -#include "Poco/CppUnit/TestCaller.h" -#include "Poco/CppUnit/TestSuite.h" +#include "CppUnit/TestCaller.h" +#include "CppUnit/TestSuite.h" PDFTest::PDFTest(const std::string& name): CppUnit::TestCase(name) diff --git a/PDF/testsuite/src/PDFTest.h b/PDF/testsuite/src/PDFTest.h index 1fdbbeb7c..9075cba1b 100644 --- a/PDF/testsuite/src/PDFTest.h +++ b/PDF/testsuite/src/PDFTest.h @@ -15,7 +15,7 @@ #include "Poco/PDF/PDF.h" -#include "Poco/CppUnit/TestCase.h" +#include "CppUnit/TestCase.h" class PDFTest: public CppUnit::TestCase diff --git a/PDF/testsuite/src/PDFTestSuite.h b/PDF/testsuite/src/PDFTestSuite.h index 1bbb35c5d..779302794 100644 --- a/PDF/testsuite/src/PDFTestSuite.h +++ b/PDF/testsuite/src/PDFTestSuite.h @@ -14,7 +14,7 @@ #define PDFTestSuite_INCLUDED -#include "Poco/CppUnit/TestSuite.h" +#include "CppUnit/TestSuite.h" class PDFTestSuite